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