cadview.cpp
来自「故障诊断工作涉及的领域相当广泛」· C++ 代码 · 共 1,156 行 · 第 1/2 页
CPP
1,156 行
// CadView.cpp : implementation of the CCadView class
//
#include "stdafx.h"
#include "Cad.h"
//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by richtest.rc
//
#define LBUTTONDOWN 1
#define RBUTTONDOWN 2
#define SNAPDIPAN 2
#define SNAPIN 4
#define SNAPOUT 8
#define SNAPCONIN 16
#define SNAPCONOUT 32
//#include "CadDoc.h"
#include "CadView.h"
#include "StatusDlg.h"
#include "MyStatusBar.h"
#include "node.h"
#include <math.h>
#include "bpinfodlg.h"
#include "moudledlg.h"
#include "richtest.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern class CRichtestApp theApp;
dpt rspt=dpt(0,0);
dpt offset=dpt(0,0);
BOOL bmove=FALSE;
double g_scale=1;
double g_c_scale=1;
int g_c_flag=0;
unsigned char step=0;
CView* pcadview=NULL;
extern CSize operator*(CSize size,double scale);
extern unsigned int stepg;
node* g_pn=NULL;
int whichin;
void retan_cen_mov(CRect& rect,CPoint point)
{
rect.left+=point.x;
rect.right+=point.x;
rect.top+=point.y;
rect.bottom+=point.y;
}
/////////////////////////////////////////////////////////////////////////////
// CCadView
class bp_net;
IMPLEMENT_DYNCREATE(CCadView, CView)
BEGIN_MESSAGE_MAP(CCadView, CView)
//{{AFX_MSG_MAP(CCadView)
ON_WM_SETCURSOR()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_LBUTTONDBLCLK()
// ON_WM_LBUTTONCLK()
//ON_COMMAND(ID_REDRAW, OnRedraw)
ON_COMMAND(ID_SETDLG, OnSetDlg)
ON_WM_KEYDOWN()
ON_WM_RBUTTONDOWN()
ON_WM_MOUSEWHEEL()
ON_WM_RBUTTONUP()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
ON_COMMAND_RANGE(ID_DRAW_LINE,ID_DRAW_TEXT,OnDrawCommand)
ON_COMMAND_RANGE(ID_MODIFY_ERASE,ID_MODIFY_SCALE,OnModifyCommand)
//ON_COMMAND_RANGE(ID_OSNAP_ENDPOINT,ID_OSNAP_QUARDANT,OnOSnapCommand)
ON_COMMAND_RANGE(ID_ZOOM_WINDOW,ID_ZOOM_ALL,OnZoomCommand)
ON_COMMAND_RANGE(ID_EDIT_COPY,ID_EDIT_PASTE,OnNotFinishCommand)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCadView construction/destruction
CCadView::CCadView()
{ pptlst=NULL;
pflag=0;
bway=FALSE;
bwaystart=0;
m_prePoint.x=m_prePoint.y=-1;
//设置世界坐标与屏幕坐标的关系
m_dOrgX=m_dOrgY=0.0;
m_dWorldToScreen=m_dScreenToWorld=1.0;
bnest=FALSE;
bgraph=FALSE;
bmousewheel=FALSE;
ppcmd=theApp.getcmd();//获得对应级别模块存储指针
cnt=theApp.getcmdcnt();//获得对应级别模块数量
firstext=TRUE;
}
CCadView::~CCadView()
{
//ptlst.clear;
}
/////////////////////////////////////////////////////////////////////////////
// CCadView drawing
void CCadView::OnDraw(CDC* pDC)
{ pcadview=this;
CRect rect;
this->GetClientRect(&rect);
width=rect.right-rect.left;
height=rect.bottom-rect.top;
CRichtestDoc* pDoc = GetDocument();
pDoc->graph.pmv=pDoc->getview();
pDoc->graph.pv=this;
ASSERT_VALID(pDoc);
CPen* pNewPen=new CPen;
pNewPen->CreatePen(0,10,RGB(180,180,180));
CPen* old=pDC->SelectObject(pNewPen);
pDC->MoveTo(rspt.x,rspt.y);
pDC->LineTo(rspt.x+50,rspt.y);
pDC->MoveTo(rspt.x,rspt.y);
pDC->LineTo(rspt.x,rspt.y+50);
pDC->SelectObject(old);
delete pNewPen;
// TODO: add draw code for native data here
//获取当前客户区的大小
if(!pDoc->bpnet.bempty)
{ bp_net* pbnet=&pDoc->bpnet;
draw_bp_net(pbnet,CPoint(-1,-1));
}
else if(!pDoc->graph.empty)
{
pDoc->graph.draw(this,pDC,1);
g_nCurTask=ID_DRAW_CIRCLE;
}
DrawSys(pDC);
int cc=0;
}
/////////////////////////////////////////////////////////////////////////////
// CCadView printing
BOOL CCadView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CCadView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CCadView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CCadView diagnostics
#ifdef _DEBUG
void CCadView::AssertValid() const
{
CView::AssertValid();
}
void CCadView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CRichtestDoc* CCadView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CRichtestDoc)));
return (CRichtestDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CCadView message handlers
BOOL CCadView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
SetCursor(AfxGetApp()->LoadCursor(IDC_CROSS));
return TRUE;
}
CPoint oldoffset=CPoint(0,0);
void CCadView::OnMouseMove(UINT nFlags, CPoint point)
{static BOOL flag=FALSE;
static BOOL firstmove=TRUE;
static CPoint prept;
CPoint cpt;
g_nFlags=nFlags;
CPoint pt=point;
if(firstmove)
{
prept=point;
firstmove=FALSE;
}
ScreenToWorld(g_dCurX,g_dCurY,point);
g_pCurView=this;
CRichtestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect rect;
GetClientRect(rect);
CDC* pDC=GetDC();
if(bmousewheel)
{CPen* pp=new CPen;
pp->CreatePen(0,1,RGB(0,0,0));
CPen* old=pDC->SelectObject(pp);
pDC->MoveTo(m_prePoint.x,rect.bottom);
pDC->LineTo(m_prePoint.x,rect.top);
pDC->MoveTo(rect.left,m_prePoint.y);
pDC->LineTo(rect.right,m_prePoint.y);
pDC->SelectObject(old);
bmousewheel=FALSE;
}
DrawCursor(pDC,point);
//记录当前点,以作为下次进入MouseMove的前一个点
m_prePoint=point;
if((g_nOpqTask>=ID_OSNAP_ENDPOINT&&g_nOpqTask<=ID_OSNAP_QUARDANT)
||g_nOSnapType!=0)
{
// pDoc->OSnap(pDC,FALSE);
}
if(g_nOpqTask>=ID_ZOOM_WINDOW&&g_nOpqTask<=ID_ZOOM_ALL)
ZoomWindow(pDC,FALSE);
if(g_nCurTask>=ID_DRAW_LINE&&g_nCurTask<=ID_DRAW_TEXT)
;// pDoc->create(0,0,0);
if((g_nCurTask>=ID_EDIT_COPY&&g_nCurTask<=ID_EDIT_PASTE)
||(g_nCurTask>=ID_MODIFY_ERASE&&g_nCurTask<=ID_MODIFY_SCALE))
{
// pDoc->ModifyMove(pDC);
}
switch(g_nCurTask)
{case ID_DRAW_LINE:
if(1)
{
};
break;
case ID_DRAW_CIRCLE:
{
pDoc->graph.mousemove(this,nFlags,point);
}
break;
case ID_DRAW_ARC:
{if(step==1)
{ pDC->MoveTo(first.x,first.y);
pDC->LineTo(first.x,point.y);
pDC->LineTo(point.x,point.y);
pDC->LineTo(point.x,first.y);
pDC->LineTo(first.x,first.y);
}
}
default:
break;
}
//获得状态条的指针
if(1)
{CMyStatusBar* pStatus=(CMyStatusBar*)
AfxGetApp()->m_pMainWnd->GetDescendantWindow(ID_VIEW_STATUS_BAR);
if(pStatus)
{
char tbuf[40];
sprintf(tbuf,"(%8.3f,%8.3f)",g_dCurX,g_dCurY);
//在状态条的第二个窗格中输出当前鼠标的位置
pStatus->SetPaneText(1,tbuf);
}
}
prept=point;
g_dPreX=g_dCurX;
g_dPreY=g_dCurY;
goon:
;
}
void CCadView::OnLButtonDown(UINT nFlags, CPoint point)
{ CRichtestDoc* pDoc = GetDocument();
pDoc->graph.pmv=pDoc->getview();
pDoc->graph.pv=this;
dpt cpt;
g_nFlags=nFlags;
ScreenToWorld(g_dCurX,g_dCurY,point);
g_pCurView=this;
// rspt=CPoint(0,0);
// g_scale=1;
ASSERT_VALID(pDoc);
CDC* pDC=GetDC();
int nDrawMode=pDC->SetROP2(R2_NOT);
//覆盖先前的光标线
CRect rect;
GetClientRect(rect);
pDC->SetROP2(nDrawMode);
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(create_bp_net(1,point))
{
char info[]="是否开始优化训练";
goondlg dlg(info);//是否训练
if(dlg.DoModal()==IDOK)
pbnet->excersize();//开始训练
};
break;
}
case ID_DRAW_CIRCLE:
{pDoc->graph.lbuttondown(this,nFlags,point);
break;
}
case ID_DRAW_ARC:
{
if(1)
{
first=dpt(point);
step++;
};
break;
}
default:
break;
}
goon:
if((g_nCurTask>=ID_EDIT_COPY&&g_nCurTask<=ID_EDIT_PASTE)
||(g_nCurTask>=ID_MODIFY_ERASE&&g_nCurTask<=ID_MODIFY_SCALE))
{
//pDoc->ModifyLButton(pDC);
}
g_dOrgX=g_dCurX;
g_dOrgY=g_dCurY;
CPen* pp=new CPen;
if(g_nCurTask==ID_DRAW_ARC)
pp->CreatePen(0,1,RGB(0,0,0));
else if(g_nCurTask==ID_DRAW_CIRCLE)
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;
}
void CCadView::OnLButtonUp(UINT nFlags, CPoint point)
{
g_nFlags=nFlags;
ScreenToWorld(g_dCurX,g_dCurY,point);
g_pCurView=this;
// rspt=CPoint(0,0);
// g_scale=1;
CRichtestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CDC* pDC=GetDC();
int nDrawMode=pDC->SetROP2(R2_NOT);
//覆盖先前的光标线
CRect rect;
GetClientRect(rect);
pDC->SetROP2(nDrawMode);
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:
break;
case ID_DRAW_CIRCLE:
{
pDoc->graph.lbuttonup(this,nFlags,point);
bgraph==TRUE;
pDoc->bgraph=TRUE;
pgraph=&pDoc->graph;
}
break;
case ID_DRAW_ARC:
if(1)
{pDoc->graph.lbuttondown(this,nFlags,point);
second=dpt(point);
double s1=width/abs(second.x-first.x);
double s2=height/abs(second.y-first.y);
if(s1>s2)
s1=s2;
g_c_scale*=s1;
g_scale=s1;
//double t=1/g_c_scale;
dpt sp=(first-rspt)*s1+rspt;//*t;
double fuyi=-1.0;
offset=sp*fuyi;
pDoc->graph.see();
// rspt+=offset;
frcdraw();
step=0;
g_nCurTask=ID_DRAW_CIRCLE;
};
break;
default:
break;
}
CPen* pp=new CPen;
if(g_nCurTask==ID_DRAW_ARC)
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;
}
void CCadView::OnRButtonDown(UINT nFlags, CPoint point)
{
CRichtestDoc* pDoc = GetDocument();
bmove=TRUE;
ASSERT_VALID(pDoc);
CDC* pDC=GetDC();
if((g_nCurTask>=ID_EDIT_COPY&&g_nCurTask<=ID_EDIT_PASTE)
||(g_nCurTask>=ID_MODIFY_ERASE&&g_nCurTask<=ID_MODIFY_SCALE))
{
// pDoc->ModifyRButton(pDC);
}
}
void CCadView::DrawCursor(CDC* pDC,CPoint point)
{
//获取当前客户区的大小
CRect rect;
GetClientRect(rect);
//设置R2_NOT的绘图方式
unsigned long bkcolor= pDC->GetBkColor();
// CPen* pNewPen=new CPen;
// pNewPen->CreatePen(0,1,bkcolor);
// CPen* old=pDC->SelectObject(pNewPen);
int nDrawMode=pDC->SetROP2(R2_NOT);
//覆盖先前的光标线
pDC->MoveTo(rect.left,m_prePoint.y);
pDC->LineTo(rect.right,m_prePoint.y);
pDC->MoveTo(m_prePoint.x,rect.top);
pDC->LineTo(m_prePoint.x,rect.bottom);
// //pNewPen=new CPen;
// pNewPen->CreatePen(0,1,RGB(0,0,0));
// pDC->SelectObject(pNewPen);
//绘制新的光标线
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->SelectObject(old);
//设置先前的绘图方式
pDC->SetROP2(nDrawMode);
}
void CCadView::DrawSys(CDC* pDC)
{
CRect rect;
GetClientRect(rect);
//绘制先前的光标线,
//以避免在应用程序间切换时出现不应有的线
pDC->MoveTo(rect.left,m_prePoint.y);
pDC->LineTo(rect.right,m_prePoint.y);
pDC->MoveTo(m_prePoint.x,rect.top);
pDC->LineTo(m_prePoint.x,rect.bottom);
DrawGrid(pDC);
}
void CCadView::OnRedraw()
{
//获取当前客户区的大小
CRect rect;
GetClientRect(rect);
CDC* pDC=GetDC();
pDC->Rectangle(rect);
CPen* pNewPen=new CPen;
pNewPen->CreatePen(0,10,RGB(180,180,180));
CPen* old=pDC->SelectObject(pNewPen);
pDC->MoveTo(rspt.x,rspt.y);
pDC->LineTo(rspt.x+50,rspt.y);
pDC->MoveTo(rspt.x,rspt.y);
pDC->LineTo(rspt.x,rspt.y+50);
pDC->SelectObject(old);
delete pNewPen;
OnDraw(pDC);
}
void CCadView::OnSetDlg()
{
CStatusDlg dlg;
dlg.m_Page1.m_dOriginX=m_dOrgX;
dlg.m_Page1.m_dOriginY=m_dOrgY;
dlg.m_Page1.m_dStoW=m_dScreenToWorld;
dlg.m_Page1.m_dWtoS=m_dWorldToScreen;
dlg.m_Page2.m_dGrid=g_dGrid;
dlg.m_Page2.m_dSnap=g_dSnap;
dlg.m_Page2.m_nGrid=(g_bGrid==TRUE ? 0:1);
dlg.m_Page2.m_nOrtho=(g_bOrtho==TRUE ? 0:1);
dlg.m_Page2.m_nSnap=(g_bSnap==TRUE ? 0:1);
dlg.m_Page3.m_bEndpoint=(TRUE,g_nOSnapType&1,FALSE);
dlg.m_Page3.m_bMidpoint=(g_nOSnapType&2,TRUE,FALSE);
dlg.m_Page3.m_bCenter=(TRUE,g_nOSnapType&4,FALSE);
dlg.m_Page3.m_bQuardant=(TRUE,g_nOSnapType&8,FALSE);
dlg.m_Page3.m_nOSnapSize=g_nOSnapSize/2;
int ret=dlg.DoModal();
if(ret==IDOK)
{
m_dOrgX=dlg.m_Page1.m_dOriginX;
m_dOrgY=dlg.m_Page1.m_dOriginY;
m_dScreenToWorld=dlg.m_Page1.m_dStoW;
if(fabs(m_dScreenToWorld)<1e-10)
m_dScreenToWorld=1.0;
m_dWorldToScreen=1/m_dScreenToWorld;
g_dGrid=dlg.m_Page2.m_dGrid;
g_dSnap=dlg.m_Page2.m_dSnap;
g_bGrid=(dlg.m_Page2.m_nGrid==0 ? TRUE:FALSE);
g_bOrtho=(dlg.m_Page2.m_nOrtho==0 ? TRUE:FALSE);
g_bSnap=(dlg.m_Page2.m_nSnap==0 ? TRUE:FALSE);
g_nOSnapType=dlg.m_Page3.m_bEndpoint+2*dlg.m_Page3.m_bMidpoint+
4*dlg.m_Page3.m_bCenter+8*dlg.m_Page3.m_bQuardant;
g_nOSnapSize=dlg.m_Page3.m_nOSnapSize*2;
//绘制状态条的SNAP,GRID,OTHRO窗格
CMyStatusBar* pStatus=(CMyStatusBar*)
AfxGetApp()->m_pMainWnd->GetDescendantWindow(ID_VIEW_STATUS_BAR);
pStatus->Redraw();
//绘制网格
CDC* pDC=GetDC();
DrawGrid(pDC);
}
}
void CCadView::OnDrawCommand(DWORD wParam,LPARAM lParam)
{ CRichtestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
g_nCurTask=wParam;
g_nStep=0;
pgraph=&pDoc->graph;
char* prompt[]={"Enter the first point",
"Enter the center",
"Enter the center",
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?