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 + -
显示快捷键?