circle.cpp

来自「故障诊断工作涉及的领域相当广泛」· C++ 代码 · 共 346 行

CPP
346
字号
// Circle.cpp: implementation of the CCircle class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Cad.h"

#include "Entity.h"
#include "Circle.h"
#include "CadDoc.h"
#include "CadView.h"

#include "FillDlg.h"
#include <math.h>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

_declspec(dllexport) CCircle::CCircle()
{
	m_dCenterX=m_dCenterY=0;
	m_dR=0;
	m_dSx=m_dSy=0;
	m_dEx=m_dEy=0;

	m_nType=ID_DRAW_CIRCLE;
	m_nColor=RGB(0,0,0);
	m_nLineType=PS_SOLID;
}

_declspec(dllexport)  CCircle::CCircle(double x,double y,double r,double sx,double sy,double ex,double ey)
{
	m_dCenterX=x;
	m_dCenterY=y;
	m_dR=r;
	m_dSx=sx;
	m_dSy=sy;
	m_dEx=ex;
	m_dEy=ey;

	m_nType=g_nCurTask;
	m_nColor=g_nCurColor;
	m_nLineType=g_nCurLineType;
}

_declspec(dllexport) CCircle::CCircle(double x,double y,double r,UINT nFillPattern)
{
	m_dCenterX=x;
	m_dCenterY=y;
	m_dR=r;
	m_dSx=m_dSy=0;
	m_dEx=m_dEy=0;
	m_nFillPattern=nFillPattern;

	m_nType=g_nCurTask;
	m_nColor=g_nCurColor;
	m_nLineType=g_nCurLineType;
}

_declspec(dllexport) CCircle::~CCircle()
{

}

_declspec(dllexport) BOOL CCircle::Create(CDC* pDC,BOOL bSure)
{
	BOOL	ret=FALSE;

	if(bSure==TRUE)
	{
		CStatusBar* pStatus=(CStatusBar*)
			AfxGetApp()->m_pMainWnd->GetDescendantWindow(ID_VIEW_STATUS_BAR);
		ASSERT(pStatus);

		switch(g_nStep)
		{
		case 0:
			m_dCenterX=g_dCurX;
			m_dCenterY=g_dCurY;
			g_nStep++;
			pStatus->SetPaneText(0,"Enter the radius");
			break;
		case 1:
			m_dR=sqrt((g_dCurX-m_dCenterX)*(g_dCurX-m_dCenterX)
				+(g_dCurY-m_dCenterY)*(g_dCurY-m_dCenterY));
			if(g_nCurTask==ID_DRAW_CIRCLE)
			{
				g_nStep=0;
				pStatus->SetPaneText(0,"Enter the center");
				ret=TRUE;
			}
			else if(g_nCurTask==ID_DRAW_FILLED_CIRCLE)
			{
				CFillDlg	dlg;
				dlg.DoModal();
				m_nFillPattern=dlg.m_nCurPattern;

				g_nStep=0;
				pStatus->SetPaneText(0,"Enter the center");
				ret=TRUE;
			}
			else
			{
				g_nStep++;
				pStatus->SetPaneText(0,"Enter the start point");
			}
			break;
		case 2:
			{
			double x=g_dCurX-m_dCenterX;
			double y=g_dCurY-m_dCenterY;
			double r=sqrt(x*x+y*y);
			m_dSx=m_dR*x/r+m_dCenterX;
			m_dSy=m_dR*y/r+m_dCenterY;
			pStatus->SetPaneText(0,"Enter the end point");
			g_nStep++;
			break;
			}
		case 3:
			{
			double x=g_dCurX-m_dCenterX;
			double y=g_dCurY-m_dCenterY;
			double r=sqrt(x*x+y*y);
			m_dEx=m_dR*x/r+m_dCenterX;
			m_dEy=m_dR*y/r+m_dCenterY;
			pStatus->SetPaneText(0,"Enter the center");
			g_nStep=0;
			ret=TRUE;
			break;
			}
		default:
			break;
		}
	}
	else
	{
		if(g_nStep!=1) return FALSE;
		//设置R2_NOT的绘图方式
		int nDrawMode=pDC->SetROP2(R2_NOT);

		CPoint	orgPoint,curPoint,prePoint;
		g_pCurView->WorldToScreen(orgPoint,g_dOrgX,g_dOrgY);
		//覆盖先前的线
		double dR=sqrt((g_dPreX-m_dCenterX)*(g_dPreX-m_dCenterX)
					+(g_dPreY-m_dCenterY)*(g_dPreY-m_dCenterY));
		int		r=(int) g_pCurView->m_dWorldToScreen*dR;
		pDC->Arc(orgPoint.x-r,orgPoint.y-r,orgPoint.x+r,orgPoint.y+r,0,0,0,0);

		//绘制新的线
		dR=sqrt((g_dCurX-m_dCenterX)*(g_dCurX-m_dCenterX)
					+(g_dCurY-m_dCenterY)*(g_dCurY-m_dCenterY));
		r=(int) dR*g_pCurView->m_dWorldToScreen;
		pDC->Arc(orgPoint.x-r,orgPoint.y-r,orgPoint.x+r,orgPoint.y+r,0,0,0,0);

		//设置先前的绘图方式
		pDC->SetROP2(nDrawMode); 
	}
	return ret;
}

_declspec(dllexport) void CCircle::Draw(CDC* pDC,UINT nColor,UINT nLineType)
{
	CPen*	pNewPen=new CPen; 
	if(nColor==0&&nLineType==0)
		pNewPen->CreatePen(m_nLineType,1,m_nColor);
	else
		pNewPen->CreatePen(nLineType,1,nColor);
	CPen*	pOldPen = pDC->SelectObject( pNewPen );
	
	CPoint	cPnt,sPnt,ePnt;
	g_pCurView->WorldToScreen(cPnt,m_dCenterX,m_dCenterY);
	g_pCurView->WorldToScreen(sPnt,m_dSx,m_dSy);
	g_pCurView->WorldToScreen(ePnt,m_dEx,m_dEy);
	int	r=(int) m_dR*g_pCurView->m_dWorldToScreen;

	if(m_nType==ID_DRAW_CIRCLE||m_nType==ID_DRAW_ARC)
	{
		pDC->Arc(cPnt.x-r,cPnt.y-r,cPnt.x+r,cPnt.y+r,
				sPnt.x,sPnt.y,ePnt.x,ePnt.y);
	}
	else
	{
		CBrush* pNewBrush=new CBrush;
		if(nColor==0&&nLineType==0)
			pNewBrush->CreateHatchBrush(m_nFillPattern,m_nColor);
		else
			pNewBrush->CreateHatchBrush(m_nFillPattern,nColor);
		CBrush* pOldBrush=pDC->SelectObject(pNewBrush);
		pDC->Pie(cPnt.x-r,cPnt.y-r,cPnt.x+r,cPnt.y+r,
				sPnt.x,sPnt.y,ePnt.x,ePnt.y);
		pDC->SelectObject(pOldBrush);
		delete	pNewBrush;	
	}
	pDC->SelectObject( pOldPen );
}

_declspec(dllexport) BOOL CCircle::OSnap()
{
	double	d;
	double	sd=g_nOSnapSize*g_pCurView->m_dScreenToWorld;
	double	x[7],y[7];
	int		cnt=0;	
	BOOL	ret=FALSE;
	
	switch(g_nOpqTask)
	{
	case ID_OSNAP_ENDPOINT:
		if(m_nType==ID_DRAW_ARC)
		{
			x[cnt]=m_dSx;
			y[cnt]=m_dSy;
			cnt++;
			x[cnt]=m_dEx;
			y[cnt]=m_dEy;
			cnt++;
		}
		break;
	case ID_OSNAP_CENTER:
		x[cnt]=m_dCenterX;
		y[cnt]=m_dCenterY;
		cnt++;
		break;
	case ID_OSNAP_QUARDANT:
		if(m_nType==ID_DRAW_CIRCLE||m_nType==ID_DRAW_FILLED_CIRCLE)
		{
			x[cnt]=m_dCenterX+m_dR;
			y[cnt]=m_dCenterY;
			cnt++;
			x[cnt]=m_dCenterX-m_dR;
			y[cnt]=m_dCenterY;
			cnt++;
			x[cnt]=m_dCenterX;
			y[cnt]=m_dCenterY+m_dR;
			cnt++;
			x[cnt]=m_dCenterX;
			y[cnt]=m_dCenterY-m_dR;
			cnt++;
		}
		break;
	default:
		if((g_nOSnapType&1)==1&&m_nType==ID_DRAW_ARC)
		{
			x[cnt]=m_dSx;
			y[cnt]=m_dSy;
			cnt++;
			x[cnt]=m_dEx;
			y[cnt]=m_dEy;
			cnt++;
		}
		if((g_nOSnapType&4)==4)
		{
			x[cnt]=m_dCenterX;
			y[cnt]=m_dCenterY;
			cnt++;
		}
		if((g_nOSnapType&8)==8&&(m_nType==ID_DRAW_CIRCLE||m_nType==ID_DRAW_FILLED_CIRCLE))
		{
			x[cnt]=m_dCenterX+m_dR;
			y[cnt]=m_dCenterY;
			cnt++;
			x[cnt]=m_dCenterX-m_dR;
			y[cnt]=m_dCenterY;
			cnt++;
			x[cnt]=m_dCenterX;
			y[cnt]=m_dCenterY+m_dR;
			cnt++;
			x[cnt]=m_dCenterX;
			y[cnt]=m_dCenterY-m_dR;
			cnt++;
		}
		break;
	}

	for(int i=0;i<cnt;i++)
	{
		d=GetTwoPntDis2(g_dCurX,g_dCurY,x[i],y[i]);
		if(d<sd*sd)
		{
			g_dCurX=x[i];
			g_dCurY=y[i];
			ret=TRUE;
			break;
		}
	}

	return ret;
}

_declspec(dllexport) BOOL CCircle::Pick()
{
	double sd=5.0*g_pCurView->m_dScreenToWorld;
	double d=GetTwoPntDis2(g_dCurX,g_dCurY,m_dCenterX,m_dCenterY);
	BOOL   ret=FALSE;

	if(fabs(sqrt(d)-m_dR)<sd)
	{
		ret=TRUE;			
	}

	if(ret==TRUE&&m_nType==ID_DRAW_ARC)
	{
		ret=FALSE;
	}

	return ret;
}
 _declspec(dllexport) void operator <<(CArchive& ar,CCircle& it)
{	
	ar<<it.m_dCenterX;
	ar<<it.m_dCenterY;
	ar<<it.m_dEx;
	ar<<it.m_dEy;
	ar<<it.m_dSx;
	ar<<it.m_dSy;
	ar<<it.m_dR;
	ar<<it.m_nFillPattern;
}
  _declspec(dllexport) void operator >>(CArchive& ar,CCircle& it)
{	ar>>it.m_dCenterX;
	ar>>it.m_dCenterY;
	ar>>it.m_dEx;
	ar>>it.m_dEy;
	ar>>it.m_dSx;
	ar>>it.m_dSy;
	ar>>it.m_dR;
	ar>>it.m_nFillPattern;	
}
_declspec(dllexport) void CCircle::Serialize(CArchive&  ar)
{AFX_MANAGE_STATE(AfxGetStaticModuleState());
	CEntity::Serialize(ar);
if(ar.IsStoring())
 ar<<*this;
else
 ar>>*this;
}
_declspec(dllexport) CCircle& CCircle::operator=(CCircle& in)
{
return in;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?