caddoc.cpp

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

CPP
1,099
字号
			}
			if(bSelected==TRUE)	break;

			m_pEntitySelected[m_nEntitySelCnt]=m_pCurEntity;
			m_nEntitySelCnt++;
			if(m_nEntitySelCnt>MAXSELECT_CNT)
			{
				AfxMessageBox("选择实体数量超过最大值!");
				g_nStep++;
			}
			break;
		}
		m_pCurEntity=m_pCurEntity->m_pNext;
	}
}

//在实体链表中添加实体
void CCadDoc::AddEntity()
{
	CEntity*	pNewEntity=NULL;

	//在链表头部添加新实体链节
	for(int i=m_nEntitySelCnt-1;i>=0;i--)
	{
		switch(m_pEntitySelected[i]->m_nType)
		{
		case ID_DRAW_LINE:
			{
			CLine* pNewLine=new CLine;
			*pNewLine=*((CLine *)m_pEntitySelected[i]);
			pNewEntity=(CEntity*) pNewLine;		
			break;
			}
		case ID_DRAW_CIRCLE:
		case ID_DRAW_ARC:
		case ID_DRAW_FILLED_CIRCLE:
			{
			CCircle* pNewCircle=new CCircle;
			pNewEntity=(CEntity*) pNewCircle;		
			*pNewCircle=*((CCircle *)m_pEntitySelected[i]);
			break;
			}
		case ID_DRAW_RECTANGLE:
		case ID_DRAW_FILLED_RECTANGLE:
			{
			CRectangle* pNewRectangle=new CRectangle;
			*pNewRectangle=*((CRectangle *)m_pEntitySelected[i]);
			pNewEntity=(CEntity*) pNewRectangle;		
			break;
			}
		case ID_DRAW_POINT:
			{
			CPnt* pNewPnt=new CPnt;
			*pNewPnt=*((CPnt *)m_pEntitySelected[i]);
			pNewEntity=(CEntity*) pNewPnt;		
			break;
			}
		case ID_DRAW_TEXT:
			{
			CText* pNewText=new CText;
			*pNewText=*((CText *)m_pEntitySelected[i]);
			pNewEntity=(CEntity*) pNewText;		
			break;
			}
		default:
			break;
		}
			
		pNewEntity->m_pNext=m_pEntityHead;
		m_pEntityHead->m_pPre=pNewEntity;
		m_pEntityHead=pNewEntity;
	}
}

//在实体链表中删除实体
void CCadDoc::DeleteEntity(CDC* pDC)
{
	CEntity* pEntity=NULL;
	CEntity* pEntity2=NULL;

	//删除实体链表中选择集记录的实体链节
	for(int i=0;i<m_nEntitySelCnt;i++)
	{
		pEntity=m_pEntitySelected[i];

		switch(pEntity->m_nType)
		{
		case ID_DRAW_LINE:
			((CLine *)pEntity)->Draw(pDC,RGB(255,255,255),PS_SOLID);
			break;
		case ID_DRAW_CIRCLE:
		case ID_DRAW_ARC:
		case ID_DRAW_FILLED_CIRCLE:
			((CCircle *)pEntity)->Draw(pDC,RGB(255,255,255),PS_SOLID);
			break;
		case ID_DRAW_RECTANGLE:
		case ID_DRAW_FILLED_RECTANGLE:
			((CRectangle *)pEntity)->Draw(pDC,RGB(255,255,255),PS_SOLID);
			break;
		case ID_DRAW_POINT:
			((CPnt *)pEntity)->Draw(pDC,RGB(255,255,255),PS_SOLID);
			break;
		case ID_DRAW_TEXT:
			((CText *)pEntity)->Draw(pDC,RGB(255,255,255),PS_SOLID);
			break;
		default:
			break;
		}

		if(pEntity!=m_pEntityHead)
		{
			pEntity2=pEntity->m_pNext;
			pEntity2->m_pPre=pEntity->m_pPre;
			pEntity2=pEntity->m_pPre;
			pEntity2->m_pNext=pEntity->m_pNext;
		}
		else
		{
			m_pEntityHead=m_pEntityHead->m_pNext;
		}

		delete pEntity;
		m_nTotal_cnt--;
	}

	m_pCurEntity=m_pEntityHead;
	m_nEntitySelCnt=0;
}

//修改对象时按下鼠标左键时的操作
void CCadDoc::ModifyLButton(CDC* pDC)
{
	switch(g_nStep)
	{
	case 0:
		PickEntity(pDC);
		break;
	case 1:
		g_nStep++;
		break;
	case 2:
		{
		g_nStep=0;
		g_nCurTask=0;

		//设置R2_NOT的绘图方式
		int nDrawMode=pDC->SetROP2(R2_NOT);
		CPoint	orgPoint,prePoint;
		g_pCurView->WorldToScreen(orgPoint,g_dOrgX,g_dOrgY);
		g_pCurView->WorldToScreen(prePoint,g_dPreX,g_dPreY);
		//覆盖先前的线
		pDC->MoveTo(orgPoint);
		pDC->LineTo(prePoint);
		//设置先前的绘图方式                
		pDC->SetROP2(nDrawMode); 

		DeleteEntity(pDC);
		Draw(pDC);
		break;
		}
	default:
		break;
	}
}

//修改对象时按下鼠标左键时的操作
void CCadDoc::ModifyRButton(CDC* pDC)
{
	if(g_nStep==0)
	{
		switch(g_nCurTask)
		{
		case ID_MODIFY_ERASE:
			DeleteEntity(pDC);
			g_nStep=0;
			g_nCurTask=0;
			break;
		case ID_MODIFY_MIRROR:
		case ID_MODIFY_MOVE:
		case ID_MODIFY_ROTATE:
		case ID_MODIFY_SCALE:
			AddEntity();
			g_nStep++;
			break;
		default:
			break;
		}
	}
}

//实体平移,旋转,缩放时设置变换坐标矩阵
void CCadDoc::ModifyMove(CDC* pDC)
{
	if(g_nStep==0) return;

	switch(g_nCurTask)
	{
	case ID_MODIFY_MIRROR:
		if(g_nStep==2)
		{
			InitChgA();
			double a=g_dCurX-g_dOrgX;
			double b=g_dCurY-g_dOrgY;
			double c=sqrt(a*a+b*b);
			double sin_theta=b/c;
			double cos_theta=a/c;

			m_dChgA[0][0]=cos_theta*cos_theta-sin_theta*sin_theta;
			m_dChgA[0][1]=2*sin_theta*cos_theta;
			m_dChgA[1][0]=m_dChgA[0][1];;
			m_dChgA[1][1]=-m_dChgA[0][0];
			m_dChgA[2][0]=g_dOrgX*m_dChgA[1][1]-g_dOrgY*m_dChgA[0][1]+g_dOrgX;
			m_dChgA[2][1]=-g_dOrgX*m_dChgA[0][1]+g_dOrgY*m_dChgA[0][0]+g_dOrgY;
			ChangeEntity(pDC);
		}
		break;
	case ID_MODIFY_MOVE:
		if(g_nStep==2)
		{
			InitChgA();
			m_dChgA[2][0]=g_dCurX-g_dOrgX;
			m_dChgA[2][1]=g_dCurY-g_dOrgY;

			ChangeEntity(pDC);
		}
		break;			
	case ID_MODIFY_ROTATE:
		if(g_nStep==2)
		{
			InitChgA();
			double a=g_dCurX-g_dOrgX;
			double b=g_dCurY-g_dOrgY;
			double c=sqrt(a*a+b*b);
			double sin_theta=b/c;
			double cos_theta=a/c;

			m_dChgA[0][0]=cos_theta;
			m_dChgA[0][1]=sin_theta;
			m_dChgA[1][0]=-sin_theta;
			m_dChgA[1][1]=cos_theta;
			m_dChgA[2][0]=(1.0-cos_theta)*g_dOrgX+sin_theta*g_dOrgY;
			m_dChgA[2][1]=(1.0-cos_theta)*g_dOrgY-sin_theta*g_dOrgX;
			ChangeEntity(pDC);
		}
		break;
	case ID_MODIFY_SCALE:
		if(g_nStep==2)
		{
			double scaleX=fabs(g_dCurX-g_dOrgX)/(20*g_pCurView->m_dScreenToWorld);
			double scaleY=fabs(g_dCurY-g_dOrgY)/(20*g_pCurView->m_dScreenToWorld);
			
			if(scaleX>scaleY) scaleY=scaleX;
			else	scaleX=scaleY;

			InitChgA();
			m_dChgA[0][0]=scaleX;
			m_dChgA[1][1]=scaleY;
			m_dChgA[2][0]=(1.0-scaleX)*g_dOrgX;
			m_dChgA[2][1]=(1.0-scaleY)*g_dOrgY;

			ChangeEntity(pDC);
		}
		break;
	default:
		break;
	}
}

//对选择集中的实体进行变换
void CCadDoc::ChangeEntity(CDC* pDC)
{
	CEntity* pEntity;
	//设置R2_NOT的绘图方式
	int nDrawMode=pDC->SetROP2(R2_NOT);

	CPoint	orgPoint,curPoint,prePoint;
	g_pCurView->WorldToScreen(orgPoint,g_dOrgX,g_dOrgY);
	g_pCurView->WorldToScreen(curPoint,g_dCurX,g_dCurY);
	g_pCurView->WorldToScreen(prePoint,g_dPreX,g_dPreY);
	//覆盖先前的线
	pDC->MoveTo(orgPoint);
	pDC->LineTo(prePoint);
	//绘制新的线
	pDC->MoveTo(orgPoint);
	pDC->LineTo(curPoint);

	pEntity=m_pEntityHead;
	for(int i=0;i<m_nEntitySelCnt;i++)
	{
		switch(m_pEntitySelected[i]->m_nType)
		{
		case ID_DRAW_LINE:
			{
			CLine* pLine=(CLine *)m_pEntitySelected[i];
			CLine* pNewLine;

			if(pEntity->m_nType==ID_DRAW_LINE)
			{
				pNewLine=(CLine *)pEntity;
			}
			else
			{
				AfxMessageBox("Error in MoveEntity()!");
				break;
			}
	
			pNewLine->Draw(pDC);
			ChangeLine(pNewLine,pLine);
			pNewLine->Draw(pDC);
			break;
			}
		case ID_DRAW_CIRCLE:
		case ID_DRAW_ARC:
		case ID_DRAW_FILLED_CIRCLE:
			{
			CCircle* pCircle=(CCircle *)m_pEntitySelected[i];
			CCircle* pNewCircle;

			if(pEntity->m_nType==ID_DRAW_CIRCLE
				||pEntity->m_nType==ID_DRAW_ARC
				||pEntity->m_nType==ID_DRAW_FILLED_CIRCLE)
			{
				pNewCircle=(CCircle *)pEntity;
			}
			else
			{
				AfxMessageBox("Error in MoveEntity()!");
				break;
			}
	
			pNewCircle->Draw(pDC);
			ChangeCircle(pNewCircle,pCircle);
			pNewCircle->Draw(pDC);
			break;
			}
		case ID_DRAW_RECTANGLE:
		case ID_DRAW_FILLED_RECTANGLE:
			{
			CRectangle* pRectangle=(CRectangle *)m_pEntitySelected[i];
			CRectangle* pNewRectangle;

			if(pEntity->m_nType==ID_DRAW_RECTANGLE
				||pEntity->m_nType==ID_DRAW_FILLED_RECTANGLE)
			{
				pNewRectangle=(CRectangle *)pEntity;
			}
			else
			{
				AfxMessageBox("Error in MoveEntity()!");
				break;
			}
	
			pNewRectangle->Draw(pDC);
			ChangeRectangle(pNewRectangle,pRectangle);
			pNewRectangle->Draw(pDC);
			break;
			}
		case ID_DRAW_POINT:
			{
			CPnt* pPnt=(CPnt *)m_pEntitySelected[i];
			CPnt* pNewPnt;

			if(pEntity->m_nType==ID_DRAW_POINT)
			{
				pNewPnt=(CPnt *)pEntity;
			}
			else
			{
				AfxMessageBox("Error in MoveEntity()!");
				break;
			}
	
			pNewPnt->Draw(pDC);
			ChangePnt(pNewPnt,pPnt);
			pNewPnt->Draw(pDC);
			break;
			}
		case ID_DRAW_TEXT:
			{
			CText* pText=(CText *)m_pEntitySelected[i];
			CText* pNewText;

			if(pEntity->m_nType==ID_DRAW_TEXT)
			{
				pNewText=(CText *)pEntity;
			}
			else
			{
				AfxMessageBox("Error in MoveEntity()!");
				break;
			}
	
			pNewText->Draw(pDC);
			ChangeText(pNewText,pText);
			pNewText->Draw(pDC);
			break;
			}
		default:
			break;
		}

		pEntity=pEntity->m_pNext;
	}
	//设置先前的绘图方式
	pDC->SetROP2(nDrawMode); 
}

//初始化坐标变换矩阵
void CCadDoc::InitChgA()
{
	for(int i=0;i<3;i++)
	{
		for(int j=0;j<3;j++)
		{
			if(i==j) 
				m_dChgA[i][j]=1.0;
			else
				m_dChgA[i][j]=0;
		}
	}
}

//对点进行坐标变换
void CCadDoc::ChangePoint(double& x,double& y,double sx,double sy)
{
	x=sx*m_dChgA[0][0]+sy*m_dChgA[1][0]+m_dChgA[2][0];
	y=sx*m_dChgA[0][1]+sy*m_dChgA[1][1]+m_dChgA[2][1];
}

//对线进行坐标变换
void CCadDoc::ChangeLine(CLine* pNewLine,CLine* pLine)
{
	ChangePoint(pNewLine->m_dSx,pNewLine->m_dSy,
				pLine->m_dSx,pLine->m_dSy);
	ChangePoint(pNewLine->m_dEx,pNewLine->m_dEy,
				pLine->m_dEx,pLine->m_dEy);
}

//对圆进行坐标变换
void CCadDoc::ChangeCircle(CCircle* pNewCircle,CCircle* pCircle)
{
	ChangePoint(pNewCircle->m_dSx,pNewCircle->m_dSy,
				pCircle->m_dSx, pCircle->m_dSy);	
	ChangePoint(pNewCircle->m_dEx,pNewCircle->m_dEy,
				pCircle->m_dEx,	pCircle->m_dEy);
	ChangePoint(pNewCircle->m_dCenterX,pNewCircle->m_dCenterY,
				pCircle->m_dCenterX,pCircle->m_dCenterY);
	double dx=pNewCircle->m_dSx-pNewCircle->m_dCenterX;
	double dy=pNewCircle->m_dSy-pNewCircle->m_dCenterY;
	pNewCircle->m_dR=sqrt(dx*dx+dy*dy);
}

//对矩形进行坐标变换
void CCadDoc::ChangeRectangle(CRectangle* pNewRectangle,CRectangle* pRectangle)
{
	ChangePoint(pNewRectangle->m_dLeft,pNewRectangle->m_dTop,
				pRectangle->m_dLeft,pRectangle->m_dTop);
	ChangePoint(pNewRectangle->m_dRight,pNewRectangle->m_dBottom,
				pRectangle->m_dRight,pRectangle->m_dBottom);	
}

//对点进行坐标变换
void CCadDoc::ChangePnt(CPnt* pNewPnt,CPnt* pPnt)
{
	ChangePoint(pNewPnt->m_dX,pNewPnt->m_dY,
				pPnt->m_dX,pPnt->m_dY);
}

//对文字进行坐标变换
void CCadDoc::ChangeText(CText* pNewText,CText* pText)
{
	ChangePoint(pNewText->m_dX,pNewText->m_dY,
				pText->m_dX,pText->m_dY);	
}


BOOL CCadDoc::OnOpenDocument(LPCTSTR lpszPathName) 
{CRichEditView* editor=(CRichEditView*)geteditor();
	cmd_text=CString(lpszPathName);
	this->lpszPathName=cmd_text;
	CString cmd_text_name=cmd_text+".txt";
		CFile* filebin=new CFile(cmd_text_name,CFile::modeRead);
		int lth=filebin->GetLength();
		CArchive ar1(filebin,CArchive::load);
		
	if (!CRichEditDoc::OnOpenDocument(lpszPathName))
		return FALSE;
	

	// TODO: Add your specialized creation code here
	if(editor)
	{CRichEditCtrl& edit=editor->GetRichEditCtrl();
				CString line;
				char buffer[300];
				int line_count;
				ar1>>line_count;
					for(int i=0;i<line_count;i++)
					{
						CString theline;
						ar1>>theline;
						line+=theline+'\n';

					}
					edit.SetSel(0,100);
					edit.ReplaceSel(line.GetBuffer(4),FALSE);
					int c=0;
	}

		ar1.Close();
		filebin->Close();// loading code	
	return CDocument::OnOpenDocument(lpszPathName);
}
CRichEditView* CCadDoc::geteditor()
{POSITION head=this->GetFirstViewPosition();
	CRichEditView* editor=(CRichEditView*)this->GetNextView(head);
	 editor=(CRichEditView*)this->GetNextView(head);
		return editor;
}
BOOL CCadDoc::OnSaveDocument(LPCTSTR lpszPathName) 
{
	// TODO: Add your specialized code here and/or call the base class
	cmd_text=CString(lpszPathName);
	this->lpszPathName=cmd_text;
	CInputView* editor=(CInputView*)geteditor();		
	// TODO: Add your specialized code here and/or call the base class
	CString cmd_text_name=cmd_text+".txt";	
		CFile* filebin=new CFile(cmd_text_name,CFile::modeCreate|CFile::modeWrite);	
		CArchive ar1(filebin,CArchive::store);
		if(editor)
		{		CRichEditCtrl& edit=editor->GetRichEditCtrl();
				CString line;
				char buffer[300];
				int line_count=edit.GetLineCount();
				ar1<<line_count;
					for(int i=0;i<line_count;i++)
					{
					edit.GetLine(i,buffer);
					line=CString(buffer);
					ar1<<line;
					
					}
					int c=0;
		}
		ar1.Close();
		filebin->Close();
	
	return CDocument::OnSaveDocument(lpszPathName);
}

⌨️ 快捷键说明

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