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

📄 movecopy.cpp

📁 一个2D电磁场FEM计算的VC++源程序
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	CArray< CBlockLabel, CBlockLabel&> newblocklist;
	int i;
	CComplex p0,p1;
	double d;

	newnodelist.RemoveAll();
	newlinelist.RemoveAll();
	newarclist.RemoveAll();
	newblocklist.RemoveAll();

	for(i=0;i<nodelist.GetSize();i++) newnodelist.Add(nodelist[i]);
	for(i=0;i<linelist.GetSize();i++) newlinelist.Add(linelist[i]);
	for(i=0;i<arclist.GetSize();i++) newarclist.Add(arclist[i]);
	for(i=0;i<blocklist.GetSize();i++) newblocklist.Add(blocklist[i]);

	nodelist.RemoveAll();
	linelist.RemoveAll();
	arclist.RemoveAll();
	blocklist.RemoveAll();
	
	// find out what tolerance is so that there are not nodes right on
	// top of each other;
	if(tol==0){
		if (newnodelist.GetSize()<2) d=1.e-08;
		else{
			p0=newnodelist[0].CC();
			p1=p0;
			for(i=1;i<newnodelist.GetSize();i++)
			{
				if(newnodelist[i].x<p0.re) p0.re=newnodelist[i].x;
				if(newnodelist[i].x>p1.re) p1.re=newnodelist[i].x;
				if(newnodelist[i].y<p0.im) p0.im=newnodelist[i].y;
				if(newnodelist[i].y>p1.im) p1.im=newnodelist[i].y;
			}
			d=abs(p1-p0)*1.e-06;
		}
	}
	else d=tol;
;
	// put in all of the nodes;
	for(i=0;i<newnodelist.GetSize();i++) AddNode(newnodelist[i],d);
	
	// put in all of the lines;
	for(i=0;i<newlinelist.GetSize();i++)
	{
		p0.Set(newnodelist[newlinelist[i].n0].x,newnodelist[newlinelist[i].n0].y);
		p1.Set(newnodelist[newlinelist[i].n1].x,newnodelist[newlinelist[i].n1].y);
		AddSegment(p0,p1,newlinelist[i],d);
	}

	// put in all of the arcs;
	for(i=0;i<newarclist.GetSize();i++)
	{
		p0.Set(newnodelist[newarclist[i].n0].x,newnodelist[newarclist[i].n0].y);
		p1.Set(newnodelist[newarclist[i].n1].x,newnodelist[newarclist[i].n1].y);
		AddArcSegment(p0,p1,newarclist[i],d);
	}

	// put in all of the block labels;
	for(i=0;i<newblocklist.GetSize();i++) AddBlockLabel(newblocklist[i],d);

	UnselectAll();
	return;
}


BOOL CFemmeDoc::AddNode(CNode &node, double d)
{
	int i,k;
	CSegment segm;
	CArcSegment asegm;
	CComplex c,a0,a1,a2;
	double x,y;
	double R;

	x=node.x; y=node.y;

	// test to see if ``too close'' to existing node...
	for (i=0;i<nodelist.GetSize();i++)
		if(nodelist[i].GetDistance(x,y)<d) return FALSE;

	// can't put a node on top of a block label; do same sort of test.
	for (i=0;i<blocklist.GetSize();i++)
		if(blocklist[i].GetDistance(x,y)<d) return FALSE;

	// if all is OK, add point in to the node list...
	nodelist.Add(node);

	// test to see if node is on an existing line; if so, 
	// break into two lines;
	k=linelist.GetSize();
	for(i=0;i<k;i++)
	{
		if (fabs(ShortestDistance(x,y,i))<d)
		{
			segm=linelist[i];
			linelist[i].n1=nodelist.GetSize()-1;
			segm.n0=nodelist.GetSize()-1;
			linelist.Add(segm);
		}
	}

	// test to see if node is on an existing arc; if so, 
	// break into two arcs;
	k=arclist.GetSize();
	for(i=0;i<k;i++)
	{
		if (ShortestDistanceFromArc(CComplex(x,y),arclist[i])<d)
		{
			a0.Set(nodelist[arclist[i].n0].x,nodelist[arclist[i].n0].y);
			a1.Set(nodelist[arclist[i].n1].x,nodelist[arclist[i].n1].y);
			a2.Set(x,y);
			GetCircle(arclist[i],c,R);
			asegm=arclist[i];
			arclist[i].n1=nodelist.GetSize()-1;
			arclist[i].ArcLength=arg((a2-c)/(a0-c))*180./PI;
			asegm.n0=nodelist.GetSize()-1;
			asegm.ArcLength=arg((a1-c)/(a2-c))*180./PI;
			arclist.Add(asegm);
		}
	}
	return TRUE;
}

BOOL CFemmeDoc::AddSegment(CComplex p0, CComplex p1, CSegment &segm, double tol)
{
	int i,j,k,n0,n1;
	double xi,yi,t;
	CComplex p[2];
	CArray< CComplex, CComplex&> newnodes;

	newnodes.RemoveAll();

	n0=ClosestNode(p0.re,p0.im);
	n1=ClosestNode(p1.re,p1.im);

	// don't add if line is degenerate
	if (n0==n1) return FALSE;
	
	// don't add if the line is already in the list;
	for(i=0;i<linelist.GetSize();i++){
		if ((linelist[i].n0==n0) && (linelist[i].n1==n1)) return FALSE;
		if ((linelist[i].n0==n1) && (linelist[i].n1==n0)) return FALSE;
	}

	segm.IsSelected=FALSE; segm.n0=n0; segm.n1=n1; 
	
	// check to see if there are intersections with segments
	for(i=0;i<linelist.GetSize();i++)
		if(GetIntersection(n0,n1,i,&xi,&yi)==TRUE)  newnodes.Add(CComplex(xi,yi));

	// check to see if there are intersections with arcs
	for(i=0;i<arclist.GetSize();i++){
		j=GetLineArcIntersection(segm,arclist[i],p);
		if (j>0) for(k=0;k<j;k++) newnodes.Add(p[k]);
	}

	// add nodes at intersections
	if(tol==0)
	{
		if (nodelist.GetSize()<2) t=1.e-08;
		else{
			CComplex p0,p1;
			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;
			}
			t=abs(p1-p0)*1.e-06;
		}
	}
	else t=tol;

	for(i=0;i<newnodes.GetSize();i++) 
		AddNode(newnodes[i].re,newnodes[i].im,t);
	
	// Add proposed line segment
	linelist.Add(segm);

	// check to see if proposed line passes through other points;
    // if so, delete line and create lines that link intermediate points;
    // does this by recursive use of AddSegment;
	double d,dmin;
    UnselectAll();
    if (tol==0) dmin=abs(nodelist[n1].CC()-nodelist[n0].CC())*1.e-05;
	else dmin=tol;

    k=linelist.GetSize()-1;
    for(i=0;i<nodelist.GetSize();i++)
    {
        if( (i!=n0) && (i!=n1) )
        {
            d=ShortestDistance(nodelist[i].x,nodelist[i].y,k);
			// catch a special case...
			if (abs(nodelist[i].CC()-nodelist[n0].CC())<dmin) d=2.*dmin;
			if (abs(nodelist[i].CC()-nodelist[n1].CC())<dmin) d=2.*dmin;
	        if (d<dmin){
                linelist[k].ToggleSelect();
                DeleteSelectedSegments();
                AddSegment(n0,i,&segm,dmin);
                AddSegment(i,n1,&segm,dmin);
                i=nodelist.GetSize();
            }

        }
    }

	return TRUE;
}



BOOL CFemmeDoc::AddArcSegment(CComplex p0, CComplex p1, CArcSegment &asegm, double tol)
{


	int i,j,k;
	CSegment segm;
	CArcSegment newarc;
	CComplex c,p[2];
	CArray< CComplex, CComplex&> newnodes;
	double R,d,dmin,t;

	asegm.n0=ClosestNode(p0.re,p0.im);
	asegm.n1=ClosestNode(p1.re,p1.im);

	newnodes.RemoveAll();

	// don't add if line is degenerate
	if (asegm.n0==asegm.n1) return FALSE;

	// don't add if the arc is already in the list;
	for(i=0;i<arclist.GetSize();i++){
		if ((arclist[i].n0==asegm.n0) && (arclist[i].n1==asegm.n1) &&
			(fabs(arclist[i].ArcLength-asegm.ArcLength)<1.e-02)) return FALSE;
		// arcs are ``the same'' if start and end points are the same, and if
		// the arc lengths are relatively close (but a lot farther than
		// machine precision...
	}

	// add proposed arc to the linelist
	asegm.IsSelected=FALSE;
	
	// check to see if there are intersections
	for(i=0;i<linelist.GetSize();i++)
	{
		j=GetLineArcIntersection(linelist[i],asegm,p);
		if(j>0) for(k=0;k<j;k++) newnodes.Add(p[k]);
	}
	for(i=0;i<arclist.GetSize();i++)
	{
		j=GetArcArcIntersection(asegm,arclist[i],p);
		if(j>0) for(k=0;k<j;k++) newnodes.Add(p[k]);
	}

	// add nodes at intersections
	if (tol==0)
	{
		if (nodelist.GetSize()<2) t=1.e-08;
		else{
			CComplex p0,p1;
			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;
			}
			t=abs(p1-p0)*1.e-06;
		}
	}
	else t=tol;

	for(i=0;i<newnodes.GetSize();i++) 
		AddNode(newnodes[i].re,newnodes[i].im,t);

	// add proposed arc segment;
	arclist.Add(asegm);

	// check to see if proposed arc passes through other points;
    // if so, delete arc and create arcs that link intermediate points;
    // does this by recursive use of AddArcSegment;
	UnselectAll();
	GetCircle(asegm,c,R);
    if (tol==0) dmin=fabs(R*PI*asegm.ArcLength/180.)*1.e-05;
	else dmin=tol;
    k=arclist.GetSize()-1;
			
    for(i=0;i<nodelist.GetSize();i++)
    {
        if( (i!=asegm.n0) && (i!=asegm.n1) )
        {
			d=ShortestDistanceFromArc(CComplex(nodelist[i].x,nodelist[i].y),arclist[k]);

		//	if (abs(nodelist[i].CC()-nodelist[asegm.n0].CC())<2.*dmin) d=2.*dmin;
		//	if (abs(nodelist[i].CC()-nodelist[asegm.n1].CC())<2.*dmin) d=2.*dmin;
            if (d<dmin){
				CComplex a0,a1,a2;
				a0.Set(nodelist[asegm.n0].x,nodelist[asegm.n0].y);
				a1.Set(nodelist[asegm.n1].x,nodelist[asegm.n1].y);
				a2.Set(nodelist[i].x,nodelist[i].y);
                arclist[k].ToggleSelect();
                DeleteSelectedArcSegments();

				newarc=asegm;
				newarc.n1=i;
				newarc.ArcLength=arg((a2-c)/(a0-c))*180./PI;
                AddArcSegment(newarc,dmin);

				newarc=asegm;
				newarc.n0=i;
				newarc.ArcLength=arg((a1-c)/(a2-c))*180./PI;
                AddArcSegment(newarc,dmin);

                i=nodelist.GetSize();
            }
        }
    }
   
	return TRUE;
}

BOOL CFemmeDoc::AddBlockLabel(CBlockLabel &blabel, double d)
{
	int i;
	double x,y;
	BOOL AddFlag=TRUE;

	x=blabel.x; y=blabel.y;

	// test to see if ``too close'' to existing node...
	for (i=0;i<blocklist.GetSize();i++)
		if(blocklist[i].GetDistance(x,y)<d) AddFlag=FALSE;

	// can't put a block label on top of an existing node...
	for (i=0;i<nodelist.GetSize();i++)
		if(nodelist[i].GetDistance(x,y)<d) return FALSE;

	// can't put a block label on a line, either...
	for (i=0;i<linelist.GetSize();i++)
		if(ShortestDistance(x,y,i)<d) return FALSE ;

	// if all is OK, add point in to the node list...
	if(AddFlag==TRUE) blocklist.Add(blabel);
	
	return TRUE;
}

BOOL CFemmeDoc::WriteDXF(CString fname)
{
	int i,j,k;
	double x0,y0,x1,y1,R,dt;
	double extmaxx,extminx,extmaxy,extminy;
	BOOL laze[256];
	int nlaze;
	char lay[256];
	CComplex c,p,s;
	FILE *fp;
	
	if ((fp=fopen(fname,"wt"))==NULL) return FALSE;

	if (nodelist.GetSize()<2){
		extmaxx=1;
		extmaxy=1;
		extminx=0;
		extminy=0;
	}
	else{
		extminx=nodelist[0].x;
		extminy=nodelist[1].y;
		extmaxx=extminx;
		extmaxy=extminy;
		for(i=1;i<nodelist.GetSize();i++)
		{
			if(nodelist[i].x<extminx) extminx=nodelist[i].x;
			if(nodelist[i].x>extmaxx) extmaxx=nodelist[i].x;
			if(nodelist[i].y<extminy) extminy=nodelist[i].y;
			if(nodelist[i].y>extmaxy) extmaxy=nodelist[i].y;
		}
		
	}
	
	for(i=0;i<arclist.GetSize();i++)
	{
		k=(int) ceil(arclist[i].ArcLength/arclist[i].MaxSideLength);
		dt=arclist[i].ArcLength*PI/(((double) k)*180.);
		GetCircle(arclist[i],c,R);
		p.Set(nodelist[arclist[i].n0].x,nodelist[arclist[i].n0].y);
		s=exp(I*dt);
		for(j=0;j<k;j++){
			p=(p-c)*s+c;
			if(p.re<extminx) extminx=p.re;
			if(p.re>extmaxx) extmaxx=p.re;
			if(p.im<extminy) extminy=p.im;
			if(p.im>extmaxy) extmaxy=p.im;
		}
	}

	p.Set(extminx,extminy); s.Set(extmaxx,extmaxy);
	R=0.025*abs(s-p);

	// check out which layers are actually called out;
	for(i=0,nlaze=0;i<256;i++) laze[i]=FALSE;
	for(i=0;i<linelist.GetSize();i++)
		if(linelist[i].InGroup!=0)
		{
			for(j=0,k=FALSE;j<nlaze;j++)
			{
				if(laze[j]==linelist[i].InGroup)
				{
					k=TRUE;
					j=nlaze;
				}
			}
			if((k==FALSE) && (nlaze<256)){
				laze[nlaze]=linelist[i].InGroup;
				nlaze++;
			}
		}

	for(i=0;i<arclist.GetSize();i++)
		if(arclist[i].InGroup!=0)
		{
			for(j=0,k=FALSE;j<nlaze;j++)
			{
				if(laze[j]==arclist[i].InGroup)
				{
					k=TRUE;
					j=nlaze;
				}
			}
			if((k==FALSE) && (nlaze<256)){
				laze[nlaze]=arclist[i].InGroup;
				nlaze++;
			}
		}

	fprintf(fp,"  0\nSECTION\n  2\nHEADER\n  9\n");
	fprintf(fp,"$INSBASE\n 10\n0.0000\n 20\n0.0000\n  9\n");
	fprintf(fp,"$EXTMIN\n 10\n%f\n 20\n%f\n  9\n",extminx-R,extminy-R);
	fprintf(fp,"$EXTMAX\n 10\n%f\n 20\n%f\n  9\n",extmaxx+R,extmaxy+R);
	fprintf(fp,"$LIMMIN\n 10\n%f\n 20\n%f\n  9\n",extminx-R,extminy-R);
	fprintf(fp,"$LIMMAX\n 10\n%f\n 20\n%f\n  9\n",extmaxx+R,extmaxy+R);
	fprintf(fp,"$TEXTSTYLE\n  7\nSTANDARD\n  9\n$CLAYER\n");
	fprintf(fp,"  8\ndefault\n  0\nENDSEC\n  0\n");
	fprintf(fp,"SECTION\n  2\nTABLES\n  0\n");
	fprintf(fp,"TABLE\n  2\nLTYPE\n 70\n4948253\n  0\n");
	fprintf(fp,"LTYPE\n  2\nCONTINUOUS\n 70\n    64\n  3\n");
	fprintf(fp,"Solid line\n 72\n    65\n 73\n     0\n 40\n0.0\n  0\nENDTAB\n  0\n");
	fprintf(fp,"TABLE\n  2\nLAYER\n 70\n     5\n  0\n");
	fprintf(fp,"LAYER\n  2\ndefault\n 70\n    64\n 62\n     7\n  6\n");
	fprintf(fp,"CONTINUOUS\n  0\n");

	for(i=0;i<nlaze;i++)
	{
		fprintf(fp,"LAYER\n  2\nlayer%i\n 70\n    64\n 62\n     7\n  6\n",laze[i]);
		fprintf(fp,"CONTINUOUS\n  0\n");
	}

	fprintf(fp,"ENDTAB\n  0\nTABLE\n  2\n");
	fprintf(fp,"STYLE\n 70\n     1\n  0\nSTYLE\n  2\nSTANDARD\n 70\n");
	fprintf(fp,"     0\n 40\n0.0\n 41\n1.0\n 50\n0.0\n 71\n     0\n");
	fprintf(fp," 42\n0.2\n  3\ntxt\n  4\n\n  0\nENDTAB\n  0\n");
	fprintf(fp,"TABLE\n  2\nVIEW\n 70\n     0\n  0\nENDTAB\n  0\n");
	fprintf(fp,"ENDSEC\n  0\nSECTION\n  2\nBLOCKS\n  0\nENDSEC\n");
	fprintf(fp,"  0\nSECTION\n  2\nENTITIES\n  0\n");

	for(i=0;i<linelist.GetSize();i++)
	{
		x0=nodelist[linelist[i].n0].x;
		y0=nodelist[linelist[i].n0].y;
		x1=nodelist[linelist[i].n1].x;
		y1=nodelist[linelist[i].n1].y;
		if (linelist[i].InGroup==0) sprintf(lay,"default");
		else sprintf(lay,"layer%i",linelist[i].InGroup);
		fprintf(fp,"LINE\n  8\n%s\n 10\n%f\n 20\n%f\n 30\n0.0\n 11\n%f\n 21\n%f\n 31\n0.0\n  0\n",
			lay,x0,y0,x1,y1);
	}

	for(i=0;i<arclist.GetSize();i++)
	{
		GetCircle(arclist[i],c,R);
		x0=arg(nodelist[arclist[i].n0].CC()-c)*180./PI;
		x1=arg(nodelist[arclist[i].n1].CC()-c)*180./PI;
		if (x0<0) x0+=360.;
		if (x1<0) x1+=360.;
		if (arclist[i].InGroup==0) sprintf(lay,"default");
		else sprintf(lay,"layer%i",arclist[i].InGroup);
		fprintf(fp,"ARC\n  8\n%s\n",lay);
		fprintf(fp," 10\n%f\n 20\n%f\n 30\n%f\n 40\n%f\n 50\n%f\n 51\n%f\n  0\n",
			c.re,c.im,0.,R,x0,x1);
	}

	fprintf(fp,"ENDSEC\n  0\nEOF\n");

	fclose(fp);

	return TRUE;
}

void CFemmeDoc::ScaleMove(double bx, double by, double sf, int EditAction)
{
	int i;

	if(EditAction==0)
	{
		for(i=0;i<nodelist.GetSize();i++)
		{
			if(nodelist[i].IsSelected==TRUE){
				nodelist[i].x=bx+sf*(nodelist[i].x-bx);
				nodelist[i].y=by+sf*(nodelist[i].y-by);
			}
		}
		EnforcePSLG();
		return;

⌨️ 快捷键说明

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