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