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