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

📄 movecopy.cpp

📁 一个2D电磁场FEM计算的VC++源程序
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// femmeDoc.cpp : implementation of the CFemmeDoc class (continued...)
//

#include "stdafx.h"
#include "femme.h"
#include "femmeDoc.h"
#include "femmeView.h"
#include "probdlg.h"
#include "PtProp.h"
#include "OpBlkDlg.h"
#include "OpNodeDlg.h"
#include "OpSegDlg.h"
#include "OpArcSegDlg.h"
#include "ArcDlg.h"
#include "DXFImport.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

extern BOOL bNoClose;

//-----------------------------------------------------------------

BOOL CFemmeDoc::ReadDXF(CString fname, double DefTol)
{
	FILE *fp;
	int j,k;

	if( (fp=fopen(fname,"rt"))==NULL ) return FALSE;
	NoDraw=TRUE;

	// clear out any old drawing that we might have;
//	nodelist.RemoveAll(); 
//	linelist.RemoveAll();
//	arclist.RemoveAll(); 
//	blocklist.RemoveAll();
//	undonodelist.RemoveAll();
//	undolinelist.RemoveAll();
//	undoarclist.RemoveAll();
//	undoblocklist.RemoveAll();
//	nodeproplist.RemoveAll();
//	lineproplist.RemoveAll();
//	blockproplist.RemoveAll();
//	circproplist.RemoveAll();
//	meshnode.RemoveAll();
//	meshline.RemoveAll(); 
//	greymeshline.RemoveAll();
	
	char s[256];
	char v[256];
	BOOL PolylineFlag=FALSE;
	CNode n[4];
	CSegment segm;
	CArcSegment asegm;
	CComplex c,p,q;
	double R,a0,a1;
	int xx;

	while (fgets(s,256,fp)!=NULL)
	{
		if (strncmp(s,"POINT",5)==0)
		{
			xx=0;
			do{
				if (fgets(s,256,fp)==NULL) break;
				k=atoi(s);
				if (k==0) break;
				fgets(v,256,fp);
				if (k==10) { n[0].x=atof(v); xx=xx | 1; }
				if (k==20) { n[0].y=atof(v); xx=xx | 2; }
			} while(1>0);
			if (xx==3) nodelist.Add(n[0]);
		}

		if (strncmp(s,"LWPOLYLINE",10)==0)
		{
			int segs=0;
			int PolyLineClosed=FALSE;
			int firstpoint=-1;
			int n0,n1;
			double angle=0;
			xx=0;
			do{
				if (fgets(s,256,fp)==NULL) break;
				k=atoi(s);
				if (k==0) break;
				fgets(v,256,fp);
				if (k==10) { n[0].x=atof(v); xx=xx | 1; }
				if (k==20) { n[0].y=atof(v); xx=xx | 2; }
				if (k==42) {
					angle=720.*atan(atof(v))/PI;
					if(angle<-360.) angle=-360.;
					if(angle>360.) angle=360.;
				}			
				if (k==70) PolyLineClosed=TRUE;
				if (xx==3){
					j=nodelist.GetSize();
					nodelist.Add(n[0]);
					xx=0;
					if(segs==0) firstpoint=j;
					else{
						if(angle==0)
						{
							segm.n0=j; 
							segm.n1=j-1;
							linelist.Add(segm);
						}
						else{
							if(angle>0) { n0=j-1; n1=j; }
							else{ n0=j; n1=j-1; angle=fabs(angle); }
							if(angle>180.)
							{
								CComplex p0,p1,p2;
								angle/=2.;
								p0=nodelist[n0].x + I*nodelist[n0].y;
								p1=nodelist[n1].x + I*nodelist[n1].y;
								p2=(p0+p1)/2. - I*(1.-cos(angle*PI/180.))*(p1-p0)/
									(2.*sin(angle*PI/180.));
								n[0].x=Re(p2);
								n[0].y=Im(p2);
								nodelist.InsertAt(j,n[0]);
								asegm.ArcLength=angle;
								asegm.MaxSideLength=5.;
								if (n0<n1){
									asegm.n0=n0;
									asegm.n1=j;
								}
								else{
									asegm.n0=j;
									asegm.n1=n1;
								}
								arclist.Add(asegm);
								if(n1==j){
									n1++;
									n0=j;
								}
								else{
									n0++;
									n1=j;
								}
							}	
							asegm.n0=n0;
							asegm.n1=n1;
							asegm.ArcLength=angle;
							asegm.MaxSideLength=5.;
							arclist.Add(asegm);
							angle=0;
						}
					}
					segs++;
				}
			} while(1>0);
			if ((PolyLineClosed==TRUE) && (firstpoint>=0) && (segs>0))
			{
				// take care of closing the contour, if required.
				j=nodelist.GetSize()-1;
				if(angle==0)
				{
					segm.n0=j; 
					segm.n1=firstpoint;
					linelist.Add(segm);
				}
				else{
					if(angle>0) { n0=j; n1=firstpoint; }
					else{ n0=firstpoint; n1=j; angle=fabs(angle); }
					if(angle>180.)
					{
						CComplex p0,p1,p2;
						angle/=2.;
						p0=nodelist[n0].x + I*nodelist[n0].y;
						p1=nodelist[n1].x + I*nodelist[n1].y;
						p2=(p0+p1)/2. - I*(1.-cos(angle*PI/180.))*(p1-p0)/
							(2.*sin(angle*PI/180.));
						n[0].x=Re(p2);
						n[0].y=Im(p2);
						nodelist.Add(n[0]);
						j++;
						asegm.ArcLength=angle;
						asegm.MaxSideLength=5.;
						if (n0>n1){
							asegm.n0=n0;
							asegm.n1=j;
						}
						else{
							asegm.n0=j;
							asegm.n1=n1;
						}
						arclist.Add(asegm);

						if(n1==j-1) n1=j;
						else n0=j;

					}	
					asegm.n0=n0;
					asegm.n1=n1;
					asegm.ArcLength=angle;
					asegm.MaxSideLength=5.;
					arclist.Add(asegm);
					angle=0;
				}
			}
		}


		if (strncmp(s,"POLYLINE",8)==0)
		{
			PolylineFlag=-1;
		}

		if (strncmp(s,"SEQEND",6)==0)
		{
			PolylineFlag=FALSE;
		}		
		
		if (strncmp(s,"VERTEX",6)==0)
		{
			xx=0;
			do{
				if (fgets(s,256,fp)==NULL) break;
				k=atoi(s);
				if (k==0) break;
				fgets(v,256,fp);
				if (k==10) { n[0].x=atof(v); xx=xx | 1; }
				if (k==20) { n[0].y=atof(v); xx=xx | 2; }
			} while(1>0);

			if(xx==3)
			{
				nodelist.Add(n[0]);
				if (PolylineFlag==TRUE){
					j=nodelist.GetSize();
					segm.n0=j-2; segm.n1=j-1;
					linelist.Add(segm);
				}
				if (PolylineFlag==-1) PolylineFlag=TRUE;
			}
		}

		if (strncmp(s,"LINE",4)==0)
		{
			xx=0;
			do{
				if (fgets(s,256,fp)==NULL) break;
				k=atoi(s);
				if (k==0) break;
				fgets(v,256,fp);
				if (k==10) { n[0].x=atof(v); xx=xx | 1; }
				if (k==20) { n[0].y=atof(v); xx=xx | 2; }
				if (k==11) { n[1].x=atof(v); xx=xx | 4; }
				if (k==21) { n[1].y=atof(v); xx=xx | 8; }
			} while(1>0);
			
			if (xx==15)
			{
				j=nodelist.GetSize();
				nodelist.Add(n[0]);
				nodelist.Add(n[1]);
				segm.n0=j; segm.n1=j+1;
				linelist.Add(segm);
			}
		}
		
		// catch ARCALIGNEDTEXT, which derails the ARC code...
		if (strncmp(s,"ARCA",4)==0) s[0]=NULL;
		
		if (strncmp(s,"ARC",3)==0)
		{
			xx=0;
			do{
				if (fgets(s,256,fp)==NULL) break;
				k=atoi(s);
				if (k==0) break;
				fgets(v,256,fp);
				if (k==10) { c.re=atof(v); xx=xx | 1; }
				if (k==20) { c.im=atof(v); xx=xx | 2; }
				if (k==40) { R=atof(v);    xx=xx | 4; }
				if (k==50) { a0=atof(v);   xx=xx | 8; }
				if (k==51) { a1=atof(v);   xx=xx | 16; }
			} while(1>0);

			if(xx==31)
			{
				if (a1<a0) a1+=360.;

				if ((a1-a0)<=180.){
					p=R*exp(I*PI*a0/180.) + c;
					q=R*exp(I*PI*a1/180.) + c;
					n[0].x=p.re; n[1].x=q.re;
					n[0].y=p.im; n[1].y=q.im;
					j=nodelist.GetSize();
					nodelist.Add(n[0]);				
					nodelist.Add(n[1]);	
					asegm.n0=j; asegm.n1=j+1;
					asegm.MaxSideLength=5.;
					asegm.ArcLength=(a1-a0);
					arclist.Add(asegm); 
				}
				else{
					p=R*exp(I*PI*a0/180.) + c;
					q=R*exp(I*PI*(a1+a0)/360.) + c;
					n[0].x=p.re; n[1].x=q.re;
					n[0].y=p.im; n[1].y=q.im;
					j=nodelist.GetSize();
					nodelist.Add(n[0]);				
					nodelist.Add(n[1]);				
					asegm.n0=j; asegm.n1=j+1;
					asegm.MaxSideLength=5.;
					asegm.ArcLength=(a1-a0)/2.;
					arclist.Add(asegm);

					p=q;
					q=R*exp(I*PI*a1/180.) + c;
					n[0].x=p.re; n[1].x=q.re;
					n[0].y=p.im; n[1].y=q.im;
					j=nodelist.GetSize();
					nodelist.Add(n[0]);				
					nodelist.Add(n[1]);				
					asegm.n0=j; asegm.n1=j+1;
					asegm.MaxSideLength=5.;
					asegm.ArcLength=(a1-a0)/2.;
					arclist.Add(asegm); 
				}			
			}
		}

		if (strncmp(s,"CIRCLE",6)==0)
		{
			xx=0;
			do{
				if (fgets(s,256,fp)==NULL) break;
				k=atoi(s);
				if (k==0) break;
				fgets(v,256,fp);
				if (k==10) { c.re=atof(v); xx=xx | 1; }
				if (k==20) { c.im=atof(v); xx=xx | 2; }
				if (k==40) { R=atof(v);    xx=xx | 4; }
			} while(1>0);

			if(xx==7)
			{
				n[0].x=c.re+R; n[1].x=c.re-R;
				n[0].y=c.im; n[1].y=c.im;
				j=nodelist.GetSize();
				nodelist.Add(n[0]);
				nodelist.Add(n[1]);
				asegm.n0=j; asegm.n1=j+1;
				asegm.MaxSideLength=5.;
				asegm.ArcLength=180.;
				arclist.Add(asegm);
				asegm.n1=j; asegm.n0=j+1;
				arclist.Add(asegm);
			}
		}
			
	}

	fclose(fp);

	// could be that nothing actually got read.  We want to
	// catch this case and tell the user about it.
	if(nodelist.GetSize()==0) return FALSE;

	// suggest the proper tolerance
	CComplex p0,p1;
	CDXFImport dlg;
	int i;

	p0=nodelist[0].CC();
	p1=p0;
	for(i=1;i<nodelist.GetSize();i++)
	{
		if(nodelist[i].x<p0.re) p0.re=nodelist[i].x;
		if(nodelist[i].x>p1.re) p1.re=nodelist[i].x;
		if(nodelist[i].y<p0.im) p0.im=nodelist[i].y;
		if(nodelist[i].y>p1.im) p1.im=nodelist[i].y;
	}

	R=abs(p1-p0)*1.e-04;
	dlg.m_dxftol=floor(R/pow(10.,floor(log10(R))))*pow(10.,floor(log10(R)));

	if(DefTol<0)
	{
		dlg.DoModal();
		FancyEnforcePSLG(dlg.m_dxftol);
	}
	else
	{
		if (DefTol==0) DefTol=dlg.m_dxftol;
		FancyEnforcePSLG(DefTol);
	}

	NoDraw=FALSE;

	return TRUE;
}

void CFemmeDoc::RotateMove(CComplex c, double t, int EditAction)
{
	int i,j;
	CComplex x,z;

	z=exp(I*t*PI/180);

	if(EditAction==0)
	{
		for(i=0;i<nodelist.GetSize();i++)
		{
			if(nodelist[i].IsSelected==TRUE){
				x.Set(nodelist[i].x,nodelist[i].y);
				x=(x-c)*z+c;
				nodelist[i].x=x.re;
				nodelist[i].y=x.im;
			}
		}
		EnforcePSLG();
		return;
	}

	if(EditAction==1)
	{
		for(i=0;i<linelist.GetSize();i++)
		{
			if(linelist[i].IsSelected==TRUE){
				nodelist[linelist[i].n0].IsSelected=TRUE;
				nodelist[linelist[i].n1].IsSelected=TRUE;
			}
		}
		RotateMove(c,t,0);
		return;
	}

	if(EditAction==2)
	{
		for(i=0;i<blocklist.GetSize();i++)
		{
			if(blocklist[i].IsSelected==TRUE){
				x.Set(blocklist[i].x,blocklist[i].y);
				x=(x-c)*z+c;
				blocklist[i].x=x.re;
				blocklist[i].y=x.im;

				for(j=0;j<blockproplist.GetSize();j++)
					if(blockproplist[j].BlockName==blocklist[i].BlockType)
						if(blockproplist[j].H_c!=0) blocklist[i].MagDir+=t;
			}
		}
		EnforcePSLG();
		return;
	}

	if(EditAction==3)
	{
		for(i=0;i<arclist.GetSize();i++)
		{
			if(arclist[i].IsSelected==TRUE){
				nodelist[arclist[i].n0].IsSelected=TRUE;
				nodelist[arclist[i].n1].IsSelected=TRUE;
			}
		}
		RotateMove(c,t,0);
		return;
	}

	if(EditAction==4)
	{

		for(i=0;i<linelist.GetSize();i++)
		{
			if(linelist[i].IsSelected==TRUE){
				nodelist[linelist[i].n0].IsSelected=TRUE;
				nodelist[linelist[i].n1].IsSelected=TRUE;
			}
		}

		for(i=0;i<arclist.GetSize();i++)
		{
			if(arclist[i].IsSelected==TRUE){
				nodelist[arclist[i].n0].IsSelected=TRUE;
				nodelist[arclist[i].n1].IsSelected=TRUE;
			}
		}

		for(i=0;i<nodelist.GetSize();i++)
		{
			if(nodelist[i].IsSelected==TRUE){
				x.Set(nodelist[i].x,nodelist[i].y);
				x=(x-c)*z+c;
				nodelist[i].x=x.re;
				nodelist[i].y=x.im;
			}
		}
	
		for(i=0;i<blocklist.GetSize();i++)
		{
			if(blocklist[i].IsSelected==TRUE){
				x.Set(blocklist[i].x,blocklist[i].y);
				x=(x-c)*z+c;
				blocklist[i].x=x.re;
				blocklist[i].y=x.im;

				for(j=0;j<blockproplist.GetSize();j++)
					if(blockproplist[j].BlockName==blocklist[i].BlockType)
						if(blockproplist[j].H_c!=0) blocklist[i].MagDir+=t;
			}
		}

		EnforcePSLG();
		return;
	}
}

void CFemmeDoc::TranslateMove(double dx, double dy, int EditAction)
{
	int i;

	if(EditAction==0)
	{
		for(i=0;i<nodelist.GetSize();i++)

⌨️ 快捷键说明

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