caddoc.cpp

来自「故障诊断工作涉及的领域相当广泛」· C++ 代码 · 共 1,099 行 · 第 1/2 页

CPP
1,099
字号
// CadDoc.cpp : implementation of the CCadDoc class
//

#include "stdafx.h"
#include "Cad.h"
#include "CadDoc.h"
#include "CadView.h"

#include <math.h>

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

/////////////////////////////////////////////////////////////////////////////
// CCadDoc

IMPLEMENT_DYNCREATE(CCadDoc, CDocument)

BEGIN_MESSAGE_MAP(CCadDoc, CDocument)
	//{{AFX_MSG_MAP(CCadDoc)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCadDoc construction/destruction
CRichEditCntrItem* CCadDoc::CreateClientItem(REOBJECT* preo) const
{
	// cast away constness of this
	return new CRichEditCntrItem(preo, (CCadDoc*) this);
}

/////////////////////////////////////////////////////////////////////////////
// CRichtestDoc server implementation

COleServerItem* CCadDoc::OnGetEmbeddedItem()
{
	// OnGetEmbeddedItem is called by the framework to get the COleServerItem
	//  that is associated with the document.  It is only called when necessary.

//	COleServerItem* pItem = new COleServerItem(this);
//	ASSERT_VALID(pItem);
	return NULL;
}



CCadDoc::CCadDoc()
{
	//创建链表
	m_pEntityHead=new CEntity;
	m_pEntityTail=m_pEntityHead;
	m_pCurEntity=m_pEntityHead;
	
	//设置当前选择集中实体的数目
	m_nEntitySelCnt=0;
	m_nTotal_cnt=0;
}

CCadDoc::~CCadDoc()
{
	//释放实体链表所占内存
	CEntity*	pEntity=m_pEntityHead;
	while(m_pEntityHead!=m_pEntityTail)
	{
		pEntity=m_pEntityHead;
		m_pEntityHead=pEntity->m_pNext;
		switch(pEntity->m_nType)
		{
		case ID_DRAW_LINE:
			((CLine*) pEntity)->~CLine();
			break;
		case ID_DRAW_CIRCLE:
		case ID_DRAW_ARC:
		case ID_DRAW_FILLED_CIRCLE:
			((CCircle*) pEntity)->~CCircle();
			break;
		case ID_DRAW_RECTANGLE:
		case ID_DRAW_FILLED_RECTANGLE:
			((CRectangle*) pEntity)->~CRectangle();
			break;
		case ID_DRAW_POINT:
			((CPnt*) pEntity)->~CPnt();
			break;
		case ID_DRAW_TEXT:
			((CText*) pEntity)->~CText();
			break;
		default:
			break;
		}
	}
	delete m_pEntityTail;
}

BOOL CCadDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)

	return TRUE;
}



/////////////////////////////////////////////////////////////////////////////
// CCadDoc serialization

void CCadDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
		ar<<m_nTotal_cnt;
		CEntity* pEntity=m_pEntityHead;
	while(pEntity!=m_pEntityTail)
	{	ar<<pEntity->m_nType;
		switch(pEntity->m_nType)
		{
		case ID_DRAW_LINE:
			((CLine*) pEntity)->Serialize(ar);
			break;
		case ID_DRAW_CIRCLE:
		case ID_DRAW_ARC:
		case ID_DRAW_FILLED_CIRCLE:
			((CCircle*) pEntity)->Serialize(ar);
			break;
		case ID_DRAW_RECTANGLE:
		case ID_DRAW_FILLED_RECTANGLE:
			((CRectangle*) pEntity)->Serialize(ar);
			break;
		case ID_DRAW_POINT:
			((CPnt*) pEntity)->Serialize(ar);
			break;
		case ID_DRAW_TEXT:
			((CText*) pEntity)->Serialize(ar);
			break;
		default:
			break;
		}
		pEntity=pEntity->m_pNext;
	}

	}
	else
	{
		// TODO: add loading code here
		ar>>m_nTotal_cnt;
	int type;	

	//在链表头部添加新实体链节
	for(unsigned int i=0;i<m_nTotal_cnt;i++)
	{	CEntity* pNewEntity=NULL;
		ar>>type;
		switch(type)
		{
		case ID_DRAW_LINE:
			{
			CLine* pNewLine=new CLine;
			pNewLine->Serialize(ar);
			pNewEntity=(CEntity*) pNewLine;		
			break;
			}
		case ID_DRAW_CIRCLE:
		case ID_DRAW_ARC:
		case ID_DRAW_FILLED_CIRCLE:
			{
			CCircle* pNewCircle=new CCircle;
			pNewCircle->Serialize(ar);
			pNewEntity=(CEntity*) pNewCircle;		
			break;
			}
		case ID_DRAW_RECTANGLE:
		case ID_DRAW_FILLED_RECTANGLE:
			{
			CRectangle* pNewRectangle=new CRectangle;
			pNewRectangle->Serialize(ar);	
			pNewEntity=(CEntity*) pNewRectangle;		
			break;
			}
		case ID_DRAW_POINT:
			{
			CPnt* pNewPnt=new CPnt;
			pNewPnt->Serialize(ar);
			pNewEntity=(CEntity*) pNewPnt;		
			break;
			}
		case ID_DRAW_TEXT:
			{
			CText* pNewText=new CText;
			pNewText->Serialize(ar);
			pNewEntity=(CEntity*) pNewText;		
			break;
			}
		default:
			break;
		}
			
		pNewEntity->m_pNext=m_pEntityHead;
		m_pEntityHead->m_pPre=pNewEntity;
		m_pEntityHead=pNewEntity;
	}
	}
	int c=0;
}

/////////////////////////////////////////////////////////////////////////////
// CCadDoc diagnostics

#ifdef _DEBUG
void CCadDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CCadDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CCadDoc commands
//创建新实体
void CCadDoc::Create(CDC * pDC,BOOL bSure)
{
	BOOL		bIsCreated=FALSE;
	CEntity*	pNewEntity=NULL;
	double		x[16],y[16];
	int			cnt=0;

	switch(g_nCurTask)
	{
	case ID_DRAW_LINE:
		bIsCreated=m_Line.Create(pDC,bSure);
		if(bIsCreated==TRUE)
		{
			CLine* pNewLine=new CLine(m_Line.m_dSx,m_Line.m_dSy,
									 m_Line.m_dEx,m_Line.m_dEy);
			pNewEntity=(CEntity*) pNewLine;		
			pNewLine->Draw(pDC);

			x[cnt]=m_Line.m_dSx;
			y[cnt]=m_Line.m_dSy;
			cnt++;
			x[cnt]=m_Line.m_dEx;
			y[cnt]=m_Line.m_dEy;
			cnt++;
		}
		break;
	case ID_DRAW_CIRCLE:
	case ID_DRAW_ARC:
	case ID_DRAW_FILLED_CIRCLE:
		bIsCreated=m_Circle.Create(pDC,bSure);
		if(bIsCreated==TRUE)
		{
			CCircle* pNewCircle;
			if(g_nCurTask==ID_DRAW_CIRCLE)
			{
				pNewCircle=new CCircle(m_Circle.m_dCenterX,
								m_Circle.m_dCenterY,m_Circle.m_dR);
			}
			else if(g_nCurTask==ID_DRAW_ARC)
			{
				pNewCircle=new CCircle(m_Circle.m_dCenterX,
							m_Circle.m_dCenterY,m_Circle.m_dR,
							m_Circle.m_dSx,m_Circle.m_dSy,
							m_Circle.m_dEx,m_Circle.m_dEy);
			}
			else
			{
				pNewCircle=new CCircle(m_Circle.m_dCenterX,
								m_Circle.m_dCenterY,m_Circle.m_dR,
								m_Circle.m_nFillPattern);
			}
			pNewEntity=(CEntity*) pNewCircle;		
			pNewCircle->Draw(pDC);

			x[cnt]=m_Circle.m_dCenterX+m_Circle.m_dR;
			y[cnt]=m_Circle.m_dCenterY+m_Circle.m_dR;
			cnt++;
			x[cnt]=m_Circle.m_dCenterX-m_Circle.m_dR;
			y[cnt]=m_Circle.m_dCenterY-m_Circle.m_dR;
			cnt++;
		}
		break;
	case ID_DRAW_RECTANGLE:
	case ID_DRAW_FILLED_RECTANGLE:
		bIsCreated=m_Rectangle.Create(pDC,bSure);
		if(bIsCreated==TRUE)
		{
			CRectangle* pNewRectangle;
			if(g_nCurTask==ID_DRAW_RECTANGLE)
			{
				pNewRectangle=new CRectangle(m_Rectangle.m_dLeft,
							m_Rectangle.m_dTop,m_Rectangle.m_dRight,
							m_Rectangle.m_dBottom);
			}
			else
			{
				pNewRectangle=new CRectangle(m_Rectangle.m_dLeft,
							m_Rectangle.m_dTop,m_Rectangle.m_dRight,
							m_Rectangle.m_dBottom,m_Rectangle.m_nFillPattern);
			}
			pNewEntity=(CEntity*) pNewRectangle;		
			pNewRectangle->Draw(pDC);

			x[cnt]=m_Rectangle.m_dLeft;
			y[cnt]=m_Rectangle.m_dTop;
			cnt++;
			x[cnt]=m_Rectangle.m_dRight;
			y[cnt]=m_Rectangle.m_dBottom;
			cnt++;
		}
		break;
	case ID_DRAW_POINT:
		bIsCreated=m_Pnt.Create(pDC,bSure);
		if(bIsCreated==TRUE)
		{
			CPnt* pNewPnt=new CPnt(m_Pnt.m_dX,m_Pnt.m_dY);
			pNewEntity=(CEntity*) pNewPnt;		
			pNewPnt->Draw(pDC);

			x[cnt]=m_Pnt.m_dX;
			y[cnt]=m_Pnt.m_dY;
			cnt++;
		}
		break;
	case ID_DRAW_TEXT:
		bIsCreated=m_Text.Create(pDC,bSure);
		if(bIsCreated==TRUE)
		{
			CText* pNewText=new CText(m_Text.m_dX,m_Text.m_dY,
									m_Text.m_strText);
			pNewEntity=(CEntity*) pNewText;		
			pNewText->Draw(pDC);

			x[cnt]=m_Text.m_dX;
			y[cnt]=m_Text.m_dY;
			cnt++;
		}
		break;
	default:
		break;
	}

	if(bIsCreated==TRUE&&pNewEntity!=NULL)
	{
		pNewEntity->m_pNext=m_pEntityHead;
		m_pEntityHead->m_pPre=pNewEntity;
		m_pEntityHead=pNewEntity;
		m_nTotal_cnt++;
		//获取当前图形所在空间大小
		for(int i=0;i<cnt;i++)
		{
			if(x[i]>g_dMaxX) g_dMaxX=x[i];
			if(x[i]<g_dMinX) g_dMinX=x[i];
			if(y[i]>g_dMaxY) g_dMaxY=y[i];
			if(y[i]<g_dMinY) g_dMinY=y[i];
		}			
	}		
}

//绘制系统中的所有实体
void CCadDoc::Draw(CDC * pDC)
{
	//遍历实体链表绘图
	CEntity* pEntity=m_pEntityHead;
	while(pEntity!=m_pEntityTail)
	{
		switch(pEntity->m_nType)
		{
		case ID_DRAW_LINE:
			((CLine*) pEntity)->Draw(pDC);
			break;
		case ID_DRAW_CIRCLE:
		case ID_DRAW_ARC:
		case ID_DRAW_FILLED_CIRCLE:
			((CCircle*) pEntity)->Draw(pDC);
			break;
		case ID_DRAW_RECTANGLE:
		case ID_DRAW_FILLED_RECTANGLE:
			((CRectangle*) pEntity)->Draw(pDC);
			break;
		case ID_DRAW_POINT:
			((CPnt*) pEntity)->Draw(pDC);
			break;
		case ID_DRAW_TEXT:
			((CText*) pEntity)->Draw(pDC);
			break;
		default:
			break;
		}
		pEntity=pEntity->m_pNext;
	}
}

//对象捕捉
void CCadDoc::OSnap(CDC * pDC, BOOL bSure)
{
	//捕捉到对象了
	if(bSure==TRUE&&g_bOSnapped==TRUE)
	{
		DrawOSnapPnt(pDC,FALSE);
		g_dCurX=g_dPreX;
		g_dCurY=g_dPreY;
		g_nOpqTask=0;
		return ;
	}

	//遍历实体链表查看是否捕捉到对象
	if(m_pCurEntity==NULL||m_pCurEntity==m_pEntityTail)
	{
		m_pCurEntity=m_pEntityHead;
	}
	BOOL bOSnapped=FALSE;
	while(m_pCurEntity!=m_pEntityTail&&bOSnapped==FALSE)
	{
		switch(m_pCurEntity->m_nType)
		{
		case ID_DRAW_LINE:
			bOSnapped=((CLine*) m_pCurEntity)->OSnap();
			break;
		case ID_DRAW_CIRCLE:
		case ID_DRAW_ARC:
		case ID_DRAW_FILLED_CIRCLE:
			bOSnapped=((CCircle*) m_pCurEntity)->OSnap();
			break;
		case ID_DRAW_RECTANGLE:
		case ID_DRAW_FILLED_RECTANGLE:
			bOSnapped=((CRectangle*) m_pCurEntity)->OSnap();
			break;
		case ID_DRAW_POINT:
			bOSnapped=((CPnt*) m_pCurEntity)->OSnap();
			break;
		case ID_DRAW_TEXT:
			bOSnapped=((CText*) m_pCurEntity)->OSnap();
			break;
		default:
			break;
		}
		m_pCurEntity=m_pCurEntity->m_pNext;
	}
	//绘制捕捉点
	DrawOSnapPnt(pDC,bOSnapped);
}

//绘制对象捕捉点
void CCadDoc::DrawOSnapPnt(CDC * pDC,BOOL bOSnapped)
{
	static double dPreX,dPreY;

	//设置R2_NOT的绘图方式
	int nDrawMode=pDC->SetROP2(R2_NOT);

	//覆盖先前的捕捉标记
	if(g_bOSnapped==TRUE)
	{
		CPoint	point;
		g_pCurView->WorldToScreen(point,dPreX,dPreY);
		pDC->MoveTo(point.x-4,point.y-4);
		pDC->LineTo(point.x+4,point.y-4);
		pDC->LineTo(point.x+4,point.y+4);
		pDC->LineTo(point.x-4,point.y+4);
		pDC->LineTo(point.x-4,point.y-4);
	}

	//绘制新的捕捉标记
	if(bOSnapped==TRUE)
	{
		CPoint	point;
		g_pCurView->WorldToScreen(point,g_dCurX,g_dCurY);
		pDC->MoveTo(point.x-4,point.y-4);
		pDC->LineTo(point.x+4,point.y-4);
		pDC->LineTo(point.x+4,point.y+4);
		pDC->LineTo(point.x-4,point.y+4);
		pDC->LineTo(point.x-4,point.y-4);
		dPreX=g_dCurX;
		dPreY=g_dCurY;
	}
	//设置先前的绘图方式
	pDC->SetROP2(nDrawMode); 

	g_bOSnapped=bOSnapped;
	return ;
}

//拾取实体
void CCadDoc::PickEntity(CDC* pDC)
{
	BOOL	bPicked=FALSE;

	if(m_pCurEntity==NULL||m_pCurEntity==m_pEntityTail)
	{
		m_pCurEntity=m_pEntityHead;
	}

	//遍历实体链表查看是否拾取到实体
	while(m_pCurEntity!=m_pEntityTail)
	{
		switch(m_pCurEntity->m_nType)
		{
		case ID_DRAW_LINE:
			bPicked=((CLine*) m_pCurEntity)->Pick();
			if(bPicked==TRUE)
				((CLine *)m_pCurEntity)->Draw(pDC,RGB(255,0,0),PS_DASHDOT);
			break;
		case ID_DRAW_CIRCLE:
		case ID_DRAW_ARC:
		case ID_DRAW_FILLED_CIRCLE:
			bPicked=((CCircle*) m_pCurEntity)->Pick();
			if(bPicked==TRUE)
				((CCircle *)m_pCurEntity)->Draw(pDC,RGB(255,0,0),PS_DASHDOT);
			break;
		case ID_DRAW_RECTANGLE:
		case ID_DRAW_FILLED_RECTANGLE:
			bPicked=((CRectangle*) m_pCurEntity)->Pick();
			if(bPicked==TRUE)
				((CRectangle *)m_pCurEntity)->Draw(pDC,RGB(255,0,0),PS_DASHDOT);
			break;
		case ID_DRAW_POINT:
			bPicked=((CPnt*) m_pCurEntity)->Pick();
			if(bPicked==TRUE)
				((CPnt *)m_pCurEntity)->Draw(pDC,RGB(255,0,0),PS_DASHDOT);
			break;
		case ID_DRAW_TEXT:
			bPicked=((CText*) m_pCurEntity)->Pick();
			if(bPicked==TRUE)
				((CText *)m_pCurEntity)->Draw(pDC,RGB(255,0,0),PS_DASHDOT);
			break;
		default:
			break;
		}

		if(bPicked==TRUE) 
		{
			BOOL	bSelected=FALSE;
			for(int i=0;i<m_nEntitySelCnt;i++)
			{
				if(m_pEntitySelected[m_nEntitySelCnt]==m_pCurEntity)
				{
					bSelected=TRUE;
					break;
				}

⌨️ 快捷键说明

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