cadview.cpp
来自「故障诊断工作涉及的领域相当广泛」· C++ 代码 · 共 1,156 行 · 第 1/2 页
CPP
1,156 行
"Enter the first point",
"Enter the center",
"Enter the first point",
"Enter the point",
"Enter the insert point",
};
CStatusBar* pStatus=(CStatusBar*)
AfxGetApp()->m_pMainWnd->GetDescendantWindow(ID_VIEW_STATUS_BAR);
ASSERT(pStatus);
pStatus->SetPaneText(0,prompt[wParam-ID_DRAW_LINE]);
if(wParam==ID_DRAW_CIRCLE)
bgraph=TRUE;
}
void CCadView::OnModifyCommand(DWORD wParam,LPARAM lParam)
{
g_nCurTask=wParam;
g_nStep=0;
CRichtestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// pDoc->m_nEntitySelCnt=0;
char* prompt[]={"Pick entities to erase",
"Pick entities to mirror",
"Pick entities to move",
"Pick entities to rotate",
"Pick entities to scale",
};
CStatusBar* pStatus=(CStatusBar*)
AfxGetApp()->m_pMainWnd->GetDescendantWindow(ID_VIEW_STATUS_BAR);
ASSERT(pStatus);
pStatus->SetPaneText(0,prompt[wParam-ID_MODIFY_ERASE]);
}
void CCadView::OnOSnapCommand(DWORD wParam,LPARAM lParam)
{
g_nOpqTask=wParam;
g_bOSnapped=FALSE;
g_nOpqStep=0;
char* prompt[]={"Snap end point",
"Snap middle point",
"Snap center",
"Snap quardant point",
};
CStatusBar* pStatus=(CStatusBar*)
AfxGetApp()->m_pMainWnd->GetDescendantWindow(ID_VIEW_STATUS_BAR);
ASSERT(pStatus);
pStatus->SetPaneText(0,prompt[wParam-ID_OSNAP_ENDPOINT]);
}
void CCadView::OnZoomCommand(DWORD wParam,LPARAM lParam)
{
g_nOpqStep=0;
if(wParam==ID_ZOOM_WINDOW)
{
g_nOpqTask=wParam;
g_nCurTask=0;
CStatusBar* pStatus=(CStatusBar*)
AfxGetApp()->m_pMainWnd->GetDescendantWindow(ID_VIEW_STATUS_BAR);
ASSERT(pStatus);
pStatus->SetPaneText(0,"Enter the first conner point");
}
else if(wParam==ID_ZOOM_IN)
{
SendMessage(WM_KEYDOWN,VK_NEXT);
g_nOpqTask=0;
}
else if(wParam==ID_ZOOM_OUT)
{
SendMessage(WM_KEYDOWN,VK_PRIOR);
g_nOpqTask=0;
}
else
{
m_dOrgX=(g_dMaxX+g_dMinX)/2.0;
m_dOrgY=(g_dMaxY+g_dMinY)/2.0;
//获取当前客户区的大小
CRect rect;
GetClientRect(rect);
double dStoW_X=fabs((g_dMaxX-g_dMinX)/(rect.right-rect.left));
double dStoW_Y=fabs((g_dMaxY-g_dMinY)/(rect.bottom-rect.top));
if(dStoW_X>dStoW_Y)
m_dScreenToWorld=dStoW_X;
else
m_dScreenToWorld=dStoW_Y;
if(fabs(m_dScreenToWorld)<1e-10)
m_dScreenToWorld=1.0;
m_dWorldToScreen=1/m_dScreenToWorld;
CDC* pDC=GetDC();
pDC->Rectangle(rect);
OnDraw(pDC);
}
}
void CCadView::OnNotFinishCommand(DWORD wParam,LPARAM lParam)
{
AfxMessageBox("Sorry! This function is not finished!");
}
void CCadView::ScreenToWorld(double& x, double& y, CPoint& point)
{
//获取当前客户区的大小
CRect rect;
GetClientRect(rect);
int nSOrgX=rect.left;//(+rect.right)/2;
int nSOrgY=rect.top;//(+rect.bottom)/2;
x=(point.x-nSOrgX)*m_dScreenToWorld+m_dOrgX;
y=(nSOrgY-point.y)*m_dScreenToWorld+m_dOrgY;
if(g_bSnap==TRUE)
{
if(g_dSnap<1e-10) g_dSnap=0.5;
long n;
n=x/g_dSnap;
x=n*g_dSnap;
n=y/g_dSnap;
y=n*g_dSnap;
WorldToScreen(point,x,y);
}
if(g_bOrtho==TRUE&&g_nStep!=0)
{
if(fabs(g_dCurX-g_dOrgX)>fabs(g_dCurY-g_dOrgY))
y=g_dOrgY;
else
x=g_dOrgX;
}
}
void CCadView::WorldToScreen(CPoint& point, double x, double y)
{
//获取当前客户区的大小
CRect rect;
GetClientRect(rect);
int nSOrgX=rect.left;//(+rect.right)/2;
int nSOrgY=rect.top;//(+rect.bottom)/2;
point.x=(int) (x-m_dOrgX)*m_dWorldToScreen+nSOrgX;
point.y=(int) nSOrgY-(y-m_dOrgY)*m_dWorldToScreen;
}
void CCadView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
//获取当前客户区的大小
CRect rect;
GetClientRect(rect);
//获得偏移变量
double delta_x=(rect.right-rect.left)*m_dScreenToWorld/6;
double delta_y=(rect.bottom-rect.top)*m_dScreenToWorld/6;
switch(nChar)
{
case VK_LEFT://图形向左移
m_dOrgX+=delta_x;
break;
case VK_RIGHT://图形向右移
m_dOrgX-=delta_x;
break;
case VK_UP://图形向上移
m_dOrgY-=delta_y;
break;
case VK_DOWN://图形向下移
m_dOrgY+=delta_y;
break;
case VK_NEXT://图形放大
m_dWorldToScreen*=0.618;
if(m_dWorldToScreen<1e-10) m_dWorldToScreen=1.0;
m_dScreenToWorld=1.0/m_dWorldToScreen;
break;
case VK_PRIOR://图形缩小
m_dScreenToWorld*=0.618;
if(m_dScreenToWorld<1e-10) m_dScreenToWorld=1.0;
m_dWorldToScreen=1.0/m_dScreenToWorld;
break;
default:
break;
}
CDC* pDC=GetDC();
pDC->Rectangle(rect);
//draw_bp_net(CPoint(-1,-1));
OnDraw(pDC);
}
void CCadView::ZoomWindow(CDC * pDC, BOOL bSure)
{
if(bSure==TRUE)
{
CStatusBar* pStatus=(CStatusBar*)
AfxGetApp()->m_pMainWnd->GetDescendantWindow(ID_VIEW_STATUS_BAR);
ASSERT(pStatus);
switch(g_nOpqStep)
{
case 0:
pStatus->SetPaneText(0,"Enter the other corner");
g_nOpqStep++;
break;
case 1:
{
m_dOrgX=(g_dOrgX+g_dCurX)/2.0;
m_dOrgY=(g_dOrgY+g_dCurY)/2.0;
//获取当前客户区的大小
CRect rect;
GetClientRect(rect);
double dStoW_X=fabs((g_dCurX-g_dOrgX)/(rect.right-rect.left));
double dStoW_Y=fabs((g_dCurY-g_dOrgY)/(rect.bottom-rect.top));
if(dStoW_X>dStoW_Y)
m_dScreenToWorld=dStoW_X;
else
m_dScreenToWorld=dStoW_Y;
if(fabs(m_dScreenToWorld)<1e-10)
m_dScreenToWorld=1.0;
m_dWorldToScreen=1/m_dScreenToWorld;
CDC* pDC=GetDC();
pDC->Rectangle(rect);
OnDraw(pDC);
g_nOpqStep=0;
g_nOpqTask=0;
break;
}
default:
break;
}
}
else
{
if(g_nOpqStep!=1) return ;
//设置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(orgPoint.x,prePoint.y);
pDC->LineTo(prePoint);
pDC->LineTo(prePoint.x,orgPoint.y);
pDC->LineTo(orgPoint);
//绘制新的线
pDC->MoveTo(orgPoint);
pDC->LineTo(orgPoint.x,curPoint.y);
pDC->LineTo(curPoint);
pDC->LineTo(curPoint.x,orgPoint.y);
pDC->LineTo(orgPoint);
//设置先前的绘图方式
pDC->SetROP2(nDrawMode);
}
return ;
}
void CCadView::DrawGrid(CDC * pDC)
{
//获取当前客户区的大小
CRect rect;
GetClientRect(rect);
CPoint orgPoint;
WorldToScreen(orgPoint,0,0);
int nDistance=g_dGrid*m_dWorldToScreen;
if(nDistance<5) return;
int n,x,y;
n=(rect.left-orgPoint.x)/nDistance;
x=orgPoint.x+n*nDistance;
n=(rect.top-orgPoint.y)/nDistance;
y=orgPoint.y+n*nDistance;
UINT color;
if(g_bGrid==TRUE) color=RGB(0,0,0);
else color=RGB(255,255,255);
for(int j=y;j<rect.bottom;j=j+nDistance)
{
for(int i=x;i<rect.right;i=i+nDistance)
{
pDC->SetPixel(i,j,color);
}
}
}
extern double g_length;
void CCadView::draw_bp_net(bp_net* pbnet,CPoint point)
{ CPen* pNewPen=new CPen;
pNewPen->CreatePen(0,5,RGB(50,50,255));
CDC* pdc=GetDC();
CRect rect;
GetClientRect(rect);
CPoint view_center=CPoint(rect.Width()/2,rect.Height()/2);
pdc->PatBlt(rect.left,rect.top,rect.Width(),rect.Height(),RGB(255,255,255));//清除旧显示
CPoint orgPoint,prePoint;
WorldToScreen(orgPoint,0,0);
int nDistance=g_length*m_dWorldToScreen;
int dx,*dy=new int[pbnet->nlayer+2];
//dx=(rect.right-rect.left-(pbnet->nlayer+2)*nDistance)/(pbnet->nlayer+3);
dx=50*m_dWorldToScreen;;
//dy[0]=(rect.bottom-rect.top-pbnet->nin*nDistance)/(pbnet->nin+1);
dy[0]=50*rect.Height()/(50*pbnet->nin+(pbnet->nin+1)*g_length)*m_dWorldToScreen;
for(unsigned int i=0;i<pbnet->nlayer;i++)
//dy[i+1]=(rect.bottom-rect.top-pbnet->player[i].nnode*nDistance)/(pbnet->player[i].nnode+1);
dy[i+1]=dy[0]*pbnet->nin/pbnet->player[i].nnode*m_dWorldToScreen;;
// dy[pbnet->nlayer+1]=(rect.bottom-rect.top-pbnet->nout*nDistance)/(pbnet->nout+1);
dy[pbnet->nlayer+1]=pbnet->nin*dy[0]/pbnet->nout*m_dWorldToScreen;;
UINT color=RGB(0,0,255);
pbnet->layin.dipan=CRect(nDistance*.5+dx,nDistance*.5,2.5*nDistance+dx,rect.Height()*m_dWorldToScreen-nDistance*.5);
pbnet->layout.dipan=CRect((nDistance+dx)*(pbnet->nlayer+2)-nDistance*.5,nDistance*.5,\
(nDistance+dx)*(pbnet->nlayer+2)+nDistance*1.5,rect.Height()*m_dWorldToScreen-nDistance*.5);
pbnet->dipan=CRect(pbnet->layin.dipan.left-5,pbnet->layin.dipan.top-5,pbnet->layout.dipan.right+5,pbnet->layout.dipan.bottom+5);
CPoint net_center=CPoint(pbnet->dipan.left+pbnet->dipan.Width()/2,pbnet->dipan.top+pbnet->dipan.Height()/2);
CPoint offset=view_center-net_center;
retan_cen_mov(pbnet->dipan,offset);
retan_cen_mov(pbnet->layin.dipan,offset);
retan_cen_mov(pbnet->layout.dipan,offset);
if(pbnet->layin.frenew)
{ pdc->SelectObject(pNewPen);
pbnet->layin.draw_area(pdc,TRUE);
//pbnet->layin.frenew=FALSE;
}
if(pbnet->layout.frenew)
{ pdc->SelectObject(pNewPen);
pbnet->layout.draw_area(pdc,TRUE);
}
CPen* pNewPen1=new CPen;
pNewPen1->CreatePen(0,1,color);
CPen* pOldPen = pdc->SelectObject(pNewPen1 );
for(i=0;i<pbnet->nin;i++)//画输入节点
{ //pdc->Rectangle(nDistance+dx,nDistance+dy[0]*(i+1),2*nDistance+dx,nDistance*2+dy[0]*(i+1));
pdc->Ellipse(nDistance+dx+offset.x,nDistance+dy[0]*(i+1)+offset.y,2*nDistance+dx+offset.x,nDistance*2+dy[0]*(i+1)+offset.y);
pbnet->layin.pbn[i].dipan=CRect(nDistance*.5+dx,nDistance*.5+dy[0]*(i+1),2.5*nDistance+dx,nDistance*2.5+dy[0]*(i+1));
retan_cen_mov(pbnet->layin.pbn[i].dipan,offset);
}
for(i=0;i<pbnet->nlayer;i++)//画隐层节点
{ pbnet->player[i].dipan=CRect((nDistance+dx)*(i+2)-nDistance*.5,nDistance*.5,(nDistance+dx)*(i+2)+nDistance*1.5,rect.Height()*m_dWorldToScreen-nDistance*.5);
retan_cen_mov(pbnet->player[i].dipan,offset);
if(pbnet->player[i].frenew)
{pdc->SelectObject(pNewPen);
pbnet->player[i].draw_area(pdc,TRUE);
}
color=RGB(255,0,0);
CPen* pNewPen2=new CPen;
pNewPen2->CreatePen(0,3,color);
pdc->SelectObject(pNewPen2 );
for(unsigned int j=0;j<pbnet->player[i].nnode;j++)
{pdc->Ellipse((nDistance+dx)*(i+2)+offset.x,nDistance+dy[i+1]*(j+1)+offset.y,\
(nDistance+dx)*(i+2)+nDistance+offset.x,nDistance*2+dy[i+1]*(j+1)+offset.y);
pbnet->player[i].pbn[j].dipan=CRect((nDistance+dx)*(i+2)-nDistance*.5,nDistance*.5+dy[i+1]*(j+1),\
(nDistance+dx)*(i+2)+nDistance*1.5,nDistance*2.5+dy[i+1]*(j+1));
retan_cen_mov(pbnet->player[i].pbn[j].dipan,offset);
}
}
color=RGB(0,255,0);
CPen* pNewPen3=new CPen;
pNewPen3->CreatePen(0,2,color);
pdc->SelectObject(pNewPen3 );
for(i=0;i<pbnet->nout;i++)//画输出节点
{pdc->Ellipse((nDistance+dx)*(pbnet->nlayer+2)+offset.x,nDistance+dy[pbnet->nlayer+1]*(i+1)+offset.y,\
(nDistance+dx)*(pbnet->nlayer+2)+nDistance+offset.x,nDistance*2+dy[pbnet->nlayer+1]*(i+1)+offset.y);
pbnet->layout.pbn[i].dipan=CRect((nDistance+dx)*(pbnet->nlayer+2)-nDistance*.5,nDistance*.5+dy[pbnet->nlayer+1]*(i+1),\
(nDistance+dx)*(pbnet->nlayer+2)+nDistance*1.5,nDistance*2.5+dy[pbnet->nlayer+1]*(i+1));
retan_cen_mov(pbnet->layin.pbn[i].dipan,offset);
}
if(pbnet->frenew)
{ pdc->SelectObject(pNewPen);
pbnet->draw_area(pdc,TRUE);
}
delete[] dy;
pdc->SelectObject(pOldPen);
int nDrawMode=pdc->SetROP2(R2_NOT);//设置R2_NOT的绘图方式
pdc->MoveTo(rect.left,point.y);
pdc->LineTo(rect.right,point.y);
pdc->MoveTo(point.x,rect.top);
pdc->LineTo(point.x,rect.bottom);//覆盖先前的光标线
pdc->SetROP2(nDrawMode);
}
BOOL CCadView::create_bp_net(int net_type,CPoint point)
{ g_nCurTask=0;//任务标志复员
CRichtestDoc* pDoc = GetDocument();
unsigned int type=0;
bpinfodlg dlg;
if(dlg.DoModal()==IDOK)
{
dlg.pinfo=new unsigned int[4+dlg.nlayer];
dlg.pinfo[0]=dlg.nin;
dlg.pinfo[1]=dlg.nout;
dlg.pinfo[2]=dlg.nlayer;
dlg.pinfo[3]=dlg.type;
for(unsigned u=4;u<dlg.nlayer+4;u++)
dlg.pinfo[u]=dlg.nin-1;
unsigned npage=(dlg.nlayer-1)/10+1;
for(unsigned int c=0;c<npage;c++)
{ unsigned cnt=10;
if(c==npage-1)
cnt=dlg.nlayer-(npage-1)*10;
bphidenodecntdlg ndlg(cnt,4+c*10,(unsigned int*)dlg.pinfo);
if(!(ndlg.DoModal()==IDOK))
goto endp;
}
if(pDoc->create(net_type,type,dlg.stderror,dlg.pinfo))
{ CRichtestDoc* pdoc=GetDocument();
pbnet=&pdoc->bpnet;
char *errorinfo;
if(pbnet->read_samp(&pbnet->ibag,&errorinfo))//获得样本数据
{
draw_bp_net(pbnet,point); //显示网络
bnest=TRUE;
return TRUE;
}
else
{if(errorinfo)
AfxMessageBox(errorinfo);
return FALSE;
}
}
else return FALSE;
}
endp:
return FALSE;
}
void CCadView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CRichtestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CDC* pDC=GetDC();
if(bnest)
{ bp_net* pbnet=&pDoc->bpnet;
pbnet->renew_layer(pDC,point);
pbnet->renew_net(pDC,point);
}
else if(bgraph)
{
pgraph->renew_node(pDC,point);
pgraph->renew_graph(pDC,point);
}
}
BOOL CCadView::OnMouseWheel(UINT nFlags, short zDelta, CPoint point)
{
// TODO: Add your message handler code here and/or call default
bmousewheel=TRUE;
CDC* pDC=GetDC();
CRect rect;
GetClientRect(rect);
g_nFlags=nFlags;
CPoint pt;
double x,y;
ClientToScreen(&rect);
g_pCurView=this;
// rspt=point-CPoint(rect.left,rect.top)+CPoint(0,0);
//rspt=CPoint(rect.left,rect.top);
CRichtestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if((g_nOpqTask>=ID_OSNAP_ENDPOINT&&g_nOpqTask<=ID_OSNAP_QUARDANT)
||g_nOSnapType!=0)
{
// pDoc->OSnap(pDC,TRUE);
}
if(g_nOpqTask==ID_ZOOM_WINDOW)
ZoomWindow(pDC,TRUE);
switch(g_nCurTask)
{case ID_DRAW_LINE:
if(0)
{
};
case ID_DRAW_CIRCLE:
{
CPen* pp=new CPen;
pp->CreatePen(0,1,RGB(255,0,0));
CPen* old=pDC->SelectObject(pp);
pDC->MoveTo(point.x,rect.bottom);
pDC->LineTo(point.x,rect.top);
pDC->MoveTo(rect.left,point.y);
pDC->LineTo(rect.right,point.y);
pDC->SelectObject(old);
delete pp;
pDoc->graph.change(zDelta);
unsigned long bkcolor= pDC->GetBkColor();
CPen* pNewPen=new CPen;
pNewPen->CreatePen(0,5,bkcolor);
CPen* oldpen=pDC->SelectObject(pNewPen);
CRect clientrect;
GetClientRect(&clientrect);
pDC->Rectangle(clientrect);
OnDraw(pDC);
break;
}
case ID_DRAW_ARC:
if(0)
{
};
default:
break;
}
return TRUE;//CScrollView::OnMouseWheel(nFlags, zDelta, pt);
}
void CCadView::OnRButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CRichtestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CDC* pDC=GetDC();
CPen* pp=new CPen;
CRect rect;
GetClientRect(&rect);
pp->CreatePen(0,1,RGB(0,0,0));
CPen* old=pDC->SelectObject(pp);
pDC->MoveTo(point.x,rect.bottom);
pDC->LineTo(point.x,rect.top);
pDC->MoveTo(rect.left,point.y);
pDC->LineTo(rect.right,point.y);
pDC->SelectObject(old);
delete pp;
bmove=FALSE;
pDoc->graph.rbuttonup(this,nFlags,point);
// return TRUE;//OnRButtonUp(nFlags, point);
}
BOOL CCadView::draw_graph(int graphtype, CPoint point)
{CRichtestDoc* pDoc = GetDocument();
CPen* pNewPen=new CPen;
pNewPen->CreatePen(0,5,RGB(50,50,255));
CDC* pDC=GetDC();
CRect rect;
GetClientRect(rect);
CPoint view_center=CPoint(rect.Width()/2,rect.Height()/2);
pDC->PatBlt(rect.left,rect.top,rect.Width(),rect.Height(),RGB(255,255,255));//清除旧
node* pn;
pn=pDoc->graph.head;
unsigned long bkcolor= pDC->GetBkColor();
pNewPen=new CPen;
pNewPen->CreatePen(0,5,bkcolor);
CPen* oldpen=pDC->SelectObject(pNewPen);
CRect clientrect;
GetClientRect(&clientrect);
pDC->Rectangle(&clientrect);
while(pn!=NULL)
{
pn->draw(this,pDC);
pn=pn->pnn;
}
return TRUE;
}
void CCadView::frcdraw()
{
CDC* pDC=GetDC();
CRect rect;
this->GetClientRect(rect);
pDC->Rectangle(&rect);
OnDraw(pDC);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?