⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 femmeview.cpp

📁 一个2D电磁场FEM计算的VC++源程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	if (nChar==VK_TAB)
	{
		if ((EditAction==0) || (EditAction==2)) EnterPoint();
		if (EditAction==4)
		{
			CGroupNumber dlg;
			dlg.m_groupnumber=0;
			if(dlg.DoModal()==IDOK)
			{
				int i,j;
				j=dlg.m_groupnumber;
				// now, the group associated with the nearest entity is in j;
				// toggle the select of all objects in this group;
				for(i=0;i<pDoc->nodelist.GetSize();i++)
					if (pDoc->nodelist[i].InGroup==j) pDoc->nodelist[i].ToggleSelect();
				for(i=0;i<pDoc->linelist.GetSize();i++)
					if (pDoc->linelist[i].InGroup==j) pDoc->linelist[i].ToggleSelect();
				for(i=0;i<pDoc->arclist.GetSize();i++)
					if (pDoc->arclist[i].InGroup==j) pDoc->arclist[i].ToggleSelect();
				for(i=0;i<pDoc->blocklist.GetSize();i++)
					if (pDoc->blocklist[i].InGroup==j) pDoc->blocklist[i].ToggleSelect();
				DrawPSLG();
			}
		}
	}

	if (nChar==VK_DELETE) OnEditCut();

	if (nChar==VK_SPACE) OnOpenSelected();

	if (nChar==VK_ESCAPE){
		pDoc->UnselectAll();
		FirstPoint=-1;
		ZoomWndFlag=0;
		SelectWndFlag=0;
		CreateRadiusFlag=0;

		CMainFrame *MFrm;
		MFrm=(CMainFrame *)GetTopLevelFrame();
		CMenu* MMnu=MFrm->GetMenu();
		CToolBar *pToolBar=&MFrm->m_toolBar;    
		CToolBarCtrl *tc=&pToolBar->GetToolBarCtrl();
		tc->PressButton(ID_SELECTWND,FALSE);

		DrawPSLG();
	}

	if (nChar==VK_F3)
	{
		int i;
		for (i=0;i<pDoc->blocklist.GetSize();i++)
			pDoc->blocklist[i].MaxArea/=4.;
		InvalidateRect(NULL);
	}

	if (nChar==VK_F4)
	{
		int i;
		for (i=0;i<pDoc->blocklist.GetSize();i++)
			pDoc->blocklist[i].MaxArea*=4.;
		InvalidateRect(NULL);
	}

	// Call to base class...
	CView::OnKeyDown(nChar, nRepCnt, nFlags);
}

void CFemmeView::EnterPoint()
{
	// TODO: Add your command handler code here
	CEnterPt pDlg;
	double x,y,t,d;
	int i;
	CFemmeDoc* pDoc = GetDocument();
	BOOL flag;

	// Send present parameter values to the dialog
	// pDlg.m_rji=TheDoc->vi[0];

	if(pDoc->Coords==FALSE){
		pDlg.m_coord1 = mx;
		pDlg.m_coord2 = my;
		if(pDoc->ProblemType==0){
			pDlg.m_label1 = "x-coord";
			pDlg.m_label2 = "y-coord";
		}
		else{
			pDlg.m_label1 = "r-coord";
			pDlg.m_label2 = "z-coord";
		}
	}
	else{
		pDlg.m_coord1=sqrt(mx*mx+my*my);
		pDlg.m_coord2=atan2(my,mx)*180/PI;
		pDlg.m_label1="radius";
		pDlg.m_label2="degrees";
	}
	
	// Display dialog and collect data
	if(pDlg.DoModal()==IDOK)
	{
		if(pDoc->Coords==FALSE){
			x=pDlg.m_coord1;
			y=pDlg.m_coord2;
		}
		else{
			t=pDlg.m_coord2*PI/180;
			x=pDlg.m_coord1*cos(t);
			y=pDlg.m_coord1*sin(t);
		}
		pDoc->UpdateUndo();

		if (pDoc->nodelist.GetSize()<2) d=1.e-08;
		else{
			CComplex p0,p1,p2;
			p0=pDoc->nodelist[0].CC();
			p1=p0;
			for(i=1;i<pDoc->nodelist.GetSize();i++)
			{
				p2=pDoc->nodelist[i].CC();
				if(p2.re<p0.re) p0.re=p2.re;
				if(p2.re>p1.re) p1.re=p2.re;
				if(p2.im<p0.im) p0.im=p2.im;
				if(p2.im>p1.im) p1.im=p2.im;
			}
			d=abs(p1-p0)*1.e-06;
		}

		if (EditAction==0){
			pDoc->UpdateUndo();
			flag=pDoc->AddNode(x,y,d);
		}
		if (EditAction==2){
			pDoc->UpdateUndo();
			flag=pDoc->AddBlockLabel(x,y,d);
		}

		if(flag==TRUE){
			MeshUpToDate=FALSE;
			if(MeshFlag==TRUE) OnShowMesh();
			else DrawPSLG();
		}
	}
}

void CFemmeView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	if(bLinehook!=FALSE){
		CView::OnLButtonDown(nFlags, point);
		return;
	}

	BOOL flag;
	CFemmeDoc* pDoc = GetDocument();

	if (CreateRadiusFlag==TRUE)
	{
		int k;
		double r;

		CreateRadiusFlag=FALSE;
		if ((k=pDoc->ClosestNode(mx,my))<0) return; // catch case where no nodes have been drawn yet;
		if (pDoc->CanCreateRadius(k)==FALSE)
		{
			AfxMessageBox("The specified point is not suitable for\nconversion into a radius");
			return;
		}

		CPromptBox dlg;
		dlg.mytitle = "Enter desired radius dimension:";
		if (dlg.DoModal()==IDOK)
		{
			r=dlg.ParseDouble();
			if (r>0){
				if (pDoc->CreateRadius(k,r))
				{
					InvalidateRect(NULL);
					MeshUpToDate=FALSE;
				}
				else MsgBox("Could not make a radius of the prescribed dimension");
			}
		}

		return;
	}

	if (SelectWndFlag==1)
	{
		ZoomPix.RemoveAll();
		SelectWndFlag++;
		wzx=mx;wzy=my;
		return;
	}
	if (SelectWndFlag==2) return;
	
	if (SelectCircFlag==1)
	{
		ZoomPix.RemoveAll();
		SelectCircFlag++;
		wzx=mx;wzy=my;
		return;
	}

	if (SelectCircFlag==2) return;


	if (ZoomWndFlag==1)
	{
		ZoomPix.RemoveAll();
		ZoomWndFlag++;
		wzx=mx;wzy=my;
		return;
	}
	
	if (ZoomWndFlag==2) return;

	if (EditAction==0){
		pDoc->UpdateUndo();
		flag=pDoc->AddNode(mx,my,1./mag);
		if (flag==TRUE)
		{
			MeshUpToDate=FALSE;
			if(MeshFlag==TRUE) OnShowMesh();
			else DrawPSLG(); 
		}
	}

	if (EditAction==1){
		if (FirstPoint<0){
			if(pDoc->nodelist.GetSize()==0) return;
			FirstPoint=pDoc->ClosestNode(mx,my);
			pDoc->nodelist[FirstPoint].ToggleSelect();
			DrawPSLG(); 
		}
		else{
			pDoc->nodelist[FirstPoint].ToggleSelect();
			pDoc->UpdateUndo();
			flag=pDoc->AddSegment(FirstPoint,pDoc->ClosestNode(mx,my));
			FirstPoint=-1;
			if(flag==TRUE){
				MeshUpToDate=FALSE;
				if(MeshFlag==TRUE) OnShowMesh();
				else DrawPSLG(); 
			}
			else DrawPSLG();
		}
	}

	if (EditAction==2){
		pDoc->UpdateUndo();
		flag=pDoc->AddBlockLabel(mx,my,1./mag);
		if(flag==TRUE)
		{
			MeshUpToDate=FALSE;
			if(MeshFlag==TRUE) OnShowMesh();
			else DrawPSLG();
		}
	}

	if (EditAction==3){
		if (FirstPoint<0){
			if (pDoc->nodelist.GetSize()==0) return;
			FirstPoint=pDoc->ClosestNode(mx,my);
			pDoc->nodelist[FirstPoint].ToggleSelect();
			DrawPSLG(); 
		}
		else{
			CArcSegment asegm;
			CArcDlg dlg;
			asegm.n0=FirstPoint;
			asegm.n1=pDoc->ClosestNode(mx,my);
			pDoc->nodelist[asegm.n1].ToggleSelect();
			DrawPSLG();
			
			for(int k=0;k<pDoc->lineproplist.GetSize();k++)
				dlg.namelist.Add(pDoc->lineproplist[k].BdryName);

			dlg.cursel=0;
			dlg.m_MaxSeg=MaxSeg;
			dlg.m_ArcAngle=ArcAngle;
			if (dlg.DoModal()==IDCANCEL){
				FirstPoint=-1;
				pDoc->UnselectAll();
				DrawPSLG();
				return;
			}
			MaxSeg = asegm.MaxSideLength = dlg.m_MaxSeg;
			ArcAngle = asegm.ArcLength = dlg.m_ArcAngle;
			if (dlg.cursel==0) asegm.BoundaryMarker="<None>";
			else asegm.BoundaryMarker=pDoc->lineproplist[dlg.cursel-1].BdryName;

			pDoc->UpdateUndo();
			flag=pDoc->AddArcSegment(asegm);
			flag=FALSE;
			FirstPoint=-1;
			pDoc->UnselectAll();
			if(flag==TRUE){
				MeshUpToDate=FALSE;
				if(MeshFlag==TRUE) OnShowMesh();
				else DrawPSLG(); 
			}
			else DrawPSLG();
		}
	}

	CView::OnLButtonDown(nFlags, point);
}

void CFemmeView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	if(bLinehook!=FALSE){
		CView::OnLButtonUp(nFlags, point);
		return;
	}

	if (ZoomWndFlag==2){
		ZoomPix.RemoveAll();
		ZoomWndFlag=0;
		if((mx==wzx) && (my==wzy)){
			InvalidateRect(NULL);
			return;
		}
		RECT r;
		double z,m[2];
		if (mx<wzx){ z=wzx; wzx=mx; mx=z; }
		if (my<wzy){ z=wzy; wzy=my; my=z; }
		GetClientRect(&r);
		m[0]=((double) r.right)/(mx-wzx);
		m[1]=((double) r.bottom)/(my-wzy);

		ox=wzx; oy=wzy;
		if(m[0]<m[1]) mag=m[0];
		else mag=m[1];
		InvalidateRect(NULL);
	}


	if (SelectWndFlag==2){

		CMainFrame *MFrm;
		MFrm=(CMainFrame *)GetTopLevelFrame();
		CMenu* MMnu=MFrm->GetMenu();
		CToolBar *pToolBar=&MFrm->m_toolBar;    
		CToolBarCtrl *tc=&pToolBar->GetToolBarCtrl();
		tc->PressButton(ID_SELECTWND,FALSE);

		int i,k;
		double x,y,z;
		CFemmeDoc *pDoc=GetDocument();
		SelectWndFlag=0;
		if((mx==wzx) && (my==wzy)){
			InvalidateRect(NULL);
			return;
		}
		if (mx<wzx){ z=wzx; wzx=mx; mx=z; }
		if (my<wzy){ z=wzy; wzy=my; my=z; }
	
		if((EditAction==0) || (EditAction==4))
		{
			for(i=0;i<pDoc->nodelist.GetSize();i++)
			{
				x=pDoc->nodelist[i].x; y=pDoc->nodelist[i].y;
				if((x<=mx) && (x>=wzx) && (y<=my) && (y>=wzy))
					pDoc->nodelist[i].IsSelected=TRUE;
			}
		}

		if((EditAction==2) || (EditAction==4))
		{
			for(i=0;i<pDoc->blocklist.GetSize();i++)
			{
				x=pDoc->blocklist[i].x; y=pDoc->blocklist[i].y;
				if((x<=mx) && (x>=wzx) && (y<=my) && (y>=wzy))
					pDoc->blocklist[i].IsSelected=TRUE;
			}
		}

		if((EditAction==1) || (EditAction==4))
		{
			for(i=0;i<pDoc->linelist.GetSize();i++)
			{
				k=0;
				x=pDoc->nodelist[pDoc->linelist[i].n0].x;
				y=pDoc->nodelist[pDoc->linelist[i].n0].y;
				if((x<=mx) && (x>=wzx) && (y<=my) && (y>=wzy)) k++;
				x=pDoc->nodelist[pDoc->linelist[i].n1].x;
				y=pDoc->nodelist[pDoc->linelist[i].n1].y;
				if((x<=mx) && (x>=wzx) && (y<=my) && (y>=wzy)) k++;
				
				if(k==2) pDoc->linelist[i].IsSelected=TRUE;
			}
		}

		if((EditAction==3) || (EditAction==4))
		{
			for(i=0;i<pDoc->arclist.GetSize();i++)
			{
				k=0;
				x=pDoc->nodelist[pDoc->arclist[i].n0].x;
				y=pDoc->nodelist[pDoc->arclist[i].n0].y;
				if((x<=mx) && (x>=wzx) && (y<=my) && (y>=wzy)) k++;
				x=pDoc->nodelist[pDoc->arclist[i].n1].x;
				y=pDoc->nodelist[pDoc->arclist[i].n1].y;
				if((x<=mx) && (x>=wzx) && (y<=my) && (y>=wzy)) k++;
				
				if(k==2) pDoc->arclist[i].IsSelected=TRUE;
			}
		}
		InvalidateRect(NULL);
	}

	if (SelectCircFlag==2){

		CMainFrame *MFrm;
		MFrm=(CMainFrame *)GetTopLevelFrame();
		CMenu* MMnu=MFrm->GetMenu();
		CToolBar *pToolBar=&MFrm->m_toolBar;    
		CToolBarCtrl *tc=&pToolBar->GetToolBarCtrl();
		tc->PressButton(ID_FD_SELECTCIRC,FALSE);

		int i,k;
		double R;
		CComplex c,q;
		CFemmeDoc *pDoc=GetDocument();
		SelectCircFlag=0;
		if((mx==wzx) && (my==wzy)){
			InvalidateRect(NULL);
			return;
		}
	
		R=abs((mx-wzx)+I*(my-wzy));
		c=wzx+I*wzy;

		if((EditAction==0) || (EditAction==4))
		{
			for(i=0;i<pDoc->nodelist.GetSize();i++)
			{
				q=pDoc->nodelist[i].CC();
				if(abs(q-c)<=R)
					pDoc->nodelist[i].IsSelected=TRUE;
			}
		}

		if((EditAction==2) || (EditAction==4))
		{
			for(i=0;i<pDoc->blocklist.GetSize();i++)
			{
				q=pDoc->blocklist[i].x+I*pDoc->blocklist[i].y;
				if(abs(q-c)<=R)
					pDoc->blocklist[i].IsSelected=TRUE;
			}
		}

		if((EditAction==1) || (EditAction==4))
		{
			for(i=0;i<pDoc->linelist.GetSize();i++)
			{
				
				k=0;
				q=pDoc->nodelist[pDoc->linelist[i].n0].CC();
				if(abs(q-c)<=R) k++;
				q=pDoc->nodelist[pDoc->linelist[i].n1].CC();
				if(abs(q-c)<=R) k++;
				
				if(k==2) pDoc->linelist[i].IsSelected=TRUE;
			}
		}

		if((EditAction==3) || (EditAction==4))
		{
			for(i=0;i<pDoc->arclist.GetSize();i++)
			{
				k=0;
				q=pDoc->nodelist[pDoc->arclist[i].n0].CC();
				if(abs(q-c)<=R) k++;
				q=pDoc->nodelist[pDoc->arclist[i].n1].CC();
				if(abs(q-c)<=R) k++;
				
				if(k==2) pDoc->arclist[i].IsSelected=TRUE;
			}
		}
		InvalidateRect(NULL);
	}


	CView::OnLButtonUp(nFlags, point);
}

void CFemmeView::OnRButtonDown(UINT nFlags, CPoint point) 
{
	if(bLinehook!=FALSE){
		CView::OnRButtonDown(nFlags, point);
		return;
	}

	CFemmeDoc* pDoc = GetDocument();
	int i,j;

	//toggle select of nearest point
	if(EditAction==0){
		j=pDoc->ClosestNode(mx,my);
		if(j>=0) pDoc->nodelist[j].ToggleSelect();
		DrawPSLG();
	}

	//toggle select of nearest segment
	if(EditAction==1){
		j=pDoc->ClosestSegment(mx,my);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -