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

📄 movecopy.cpp

📁 一个2D电磁场FEM计算的VC++源程序
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		{
			if(nodelist[i].IsSelected==TRUE){
				nodelist[i].x+=dx;
				nodelist[i].y+=dy;
			}
		}
		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;
			}
		}
		TranslateMove(dx,dy,0);
		return;
	}

	if(EditAction==2)
	{
		for(i=0;i<blocklist.GetSize();i++)
		{
			if(blocklist[i].IsSelected==TRUE){
				blocklist[i].x+=dx;
				blocklist[i].y+=dy;
			}
		}
		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;
			}
		}
		TranslateMove(dx,dy,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){
				nodelist[i].x+=dx;
				nodelist[i].y+=dy;
			}
		}

		for(i=0;i<blocklist.GetSize();i++)
		{
			if(blocklist[i].IsSelected==TRUE){
				blocklist[i].x+=dx;
				blocklist[i].y+=dy;
			}
		}
		
		EnforcePSLG();
		return;
		
	}


}

void CFemmeDoc::RotateCopy(CComplex c, double dt, int ncopies, int EditAction)
{
  int i,j,k,nc;
  CComplex x,z;
  double t;

  for(nc=0;nc<ncopies;nc++){
	t=((double) (nc+1))*dt;

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

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

	if(EditAction==1)
	{
		CSegment segm;
		CNode n0,n1;
		k=linelist.GetSize();
		for(i=0;i<k;i++)
		{
			if(linelist[i].IsSelected==TRUE){
				n0=nodelist[linelist[i].n0];
				n1=nodelist[linelist[i].n1];
				
				x.Set(n0.x,n0.y);
				x=(x-c)*z+c;
				n0.x=x.re;
				n0.y=x.im;

				x.Set(n1.x,n1.y);
				x=(x-c)*z+c;
				n1.x=x.re;
				n1.y=x.im;

				j=nodelist.GetSize();
				segm=linelist[i];
				segm.n0=j; segm.n1=j+1;
				segm.IsSelected=FALSE;
				nodelist.Add(n0);
				nodelist.Add(n1);
				linelist.Add(segm);
			}
		}
	}

	if(EditAction==2)
	{
		CBlockLabel lbl;
		k=blocklist.GetSize();
		for(i=0;i<k;i++)
		{
			if(blocklist[i].IsSelected==TRUE){
				x.Set(blocklist[i].x,blocklist[i].y);
				lbl=blocklist[i];
				x=(x-c)*z+c;
				lbl.x=x.re;
				lbl.y=x.im;
				lbl.IsSelected=FALSE;
				for(j=0;j<blockproplist.GetSize();j++)
					if(blockproplist[j].BlockName==blocklist[i].BlockType)
						if(blockproplist[j].H_c!=0) lbl.MagDir+=t;

				blocklist.Add(lbl);
			}
		}
	}

	if(EditAction==3)
	{
		CArcSegment asegm;
		CNode n0,n1;
		k=arclist.GetSize();
		for(i=0;i<k;i++)
		{
			if(arclist[i].IsSelected==TRUE){
				n0=nodelist[arclist[i].n0];
				n1=nodelist[arclist[i].n1];
				
				x.Set(n0.x,n0.y);
				x=(x-c)*z+c;
				n0.x=x.re;
				n0.y=x.im;

				x.Set(n1.x,n1.y);
				x=(x-c)*z+c;
				n1.x=x.re;
				n1.y=x.im;

				j=nodelist.GetSize();
				asegm=arclist[i];
				asegm.n0=j; asegm.n1=j+1;
				asegm.IsSelected=FALSE;
				nodelist.Add(n0);
				nodelist.Add(n1);
				arclist.Add(asegm);
			}
		}
	}

	if(EditAction==4){

		// copy selected nodes;
		CNode node;
		k=nodelist.GetSize();
		for(i=0;i<k;i++)
		{
			if(nodelist[i].IsSelected==TRUE){
				x.Set(nodelist[i].x,nodelist[i].y);
				node=nodelist[i];
				x=(x-c)*z+c;
				node.x=x.re;
				node.y=x.im;
				node.IsSelected=FALSE;
				nodelist.Add(node);
			}
		}

		// copy selected segments;
		CSegment segm;
		CNode n0,n1;
		k=linelist.GetSize();
		for(i=0;i<k;i++)
		{
			if(linelist[i].IsSelected==TRUE){
				n0=nodelist[linelist[i].n0];
				n1=nodelist[linelist[i].n1];
				
				x.Set(n0.x,n0.y);
				x=(x-c)*z+c;
				n0.x=x.re;
				n0.y=x.im;
				n0.IsSelected=0;

				x.Set(n1.x,n1.y);
				x=(x-c)*z+c;
				n1.x=x.re;
				n1.y=x.im;
				n1.IsSelected=0;

				j=nodelist.GetSize();
				segm=linelist[i];
				segm.n0=j; segm.n1=j+1;
				segm.IsSelected=FALSE;
				nodelist.Add(n0);
				nodelist.Add(n1);
				linelist.Add(segm);
			}
		}

		// copy selected arc segments
		CArcSegment asegm;
		k=arclist.GetSize();
		for(i=0;i<k;i++)
		{
			if(arclist[i].IsSelected==TRUE){
				n0=nodelist[arclist[i].n0];
				n1=nodelist[arclist[i].n1];
				
				x.Set(n0.x,n0.y);
				x=(x-c)*z+c;
				n0.x=x.re;
				n0.y=x.im;
				n0.IsSelected=0;

				x.Set(n1.x,n1.y);
				x=(x-c)*z+c;
				n1.x=x.re;
				n1.y=x.im;
				n1.IsSelected=0;

				j=nodelist.GetSize();
				asegm=arclist[i];
				asegm.n0=j; asegm.n1=j+1;
				asegm.IsSelected=FALSE;
				nodelist.Add(n0);
				nodelist.Add(n1);
				arclist.Add(asegm);
			}
		}

		// copy selected block labels
		CBlockLabel lbl;
		k=blocklist.GetSize();
		for(i=0;i<k;i++)
		{
			if(blocklist[i].IsSelected==TRUE){
				x.Set(blocklist[i].x,blocklist[i].y);
				lbl=blocklist[i];
				x=(x-c)*z+c;
				lbl.x=x.re;
				lbl.y=x.im;
				lbl.IsSelected=FALSE;
				for(j=0;j<blockproplist.GetSize();j++)
					if(blockproplist[j].BlockName==blocklist[i].BlockType)
						if(blockproplist[j].H_c!=0) lbl.MagDir+=t;

				blocklist.Add(lbl);
			}
		}
	}
  }
  
  EnforcePSLG();
  return;

}

void CFemmeDoc::TranslateCopy(double incx, double incy, int ncopies, int EditAction)
{
  int i,j,k,nc;
  double dx,dy;
  for(nc=0;nc<ncopies;nc++){
	dx=((double)(nc+1))*incx;
	dy=((double)(nc+1))*incy;

	if(EditAction==0)
	{
		CNode node;
		k=nodelist.GetSize();
		for(i=0;i<k;i++)
		{
			if(nodelist[i].IsSelected==TRUE){
				node=nodelist[i];
				node.x+=dx;
				node.y+=dy;
				node.IsSelected=FALSE;
				nodelist.Add(node);
			}
		}
	}

	if(EditAction==1)
	{
		CSegment segm;
		CNode n0,n1;
		k=linelist.GetSize();
		for(i=0;i<k;i++)
		{
			if(linelist[i].IsSelected==TRUE){
				n0=nodelist[linelist[i].n0];
				n1=nodelist[linelist[i].n1];
				
				n0.x+=dx;
				n0.y+=dy;

				n1.x+=dx;
				n1.y+=dy;

				j=nodelist.GetSize();
				segm=linelist[i];
				segm.n0=j; segm.n1=j+1;
				segm.IsSelected=FALSE;
				nodelist.Add(n0);
				nodelist.Add(n1);
				linelist.Add(segm);
			}
		}
	}

	if(EditAction==2)
	{
		CBlockLabel lbl;
		k=blocklist.GetSize();
		for(i=0;i<k;i++)
		{
			if(blocklist[i].IsSelected==TRUE){
				lbl=blocklist[i];
				lbl.x+=dx;
				lbl.y+=dy;
				lbl.IsSelected=FALSE;
				blocklist.Add(lbl);
			}
		}
	}

	if(EditAction==3)
	{
		CArcSegment asegm;
		CNode n0,n1;
		k=arclist.GetSize();
		for(i=0;i<k;i++)
		{
			if(arclist[i].IsSelected==TRUE){
				n0=nodelist[arclist[i].n0];
				n1=nodelist[arclist[i].n1];
							
				n0.x+=dx;
				n0.y+=dy;
				n0.IsSelected=FALSE;
				
				n1.x+=dx;
				n1.y+=dy;
				n1.IsSelected=FALSE;

				j=nodelist.GetSize();
				asegm=arclist[i];
				asegm.n0=j; asegm.n1=j+1;
				asegm.IsSelected=FALSE;
				nodelist.Add(n0);
				nodelist.Add(n1);
				arclist.Add(asegm);
			}
		}
		
	}

    if(EditAction==4)
	{
		CNode node;
		k=nodelist.GetSize();
		for(i=0;i<k;i++)
		{
			if(nodelist[i].IsSelected==TRUE){
				node=nodelist[i];
				node.x+=dx;
				node.y+=dy;
				node.IsSelected=FALSE;
				nodelist.Add(node);
			}
		}
	
		CSegment segm;
		CNode n0,n1;
		k=linelist.GetSize();
		for(i=0;i<k;i++)
		{
			if(linelist[i].IsSelected==TRUE){
				n0=nodelist[linelist[i].n0];
				n1=nodelist[linelist[i].n1];
				
				n0.x+=dx;
				n0.y+=dy;
				n0.IsSelected=FALSE;

				n1.x+=dx;
				n1.y+=dy;
				n1.IsSelected=FALSE;

				j=nodelist.GetSize();
				segm=linelist[i];
				segm.n0=j; segm.n1=j+1;
				segm.IsSelected=FALSE;
				nodelist.Add(n0);
				nodelist.Add(n1);
				linelist.Add(segm);
			}
		}
	
		CBlockLabel lbl;
		k=blocklist.GetSize();
		for(i=0;i<k;i++)
		{
			if(blocklist[i].IsSelected==TRUE){
				lbl=blocklist[i];
				lbl.x+=dx;
				lbl.y+=dy;
				lbl.IsSelected=FALSE;
				blocklist.Add(lbl);
			}
		}
	
		CArcSegment asegm;
		k=arclist.GetSize();
		for(i=0;i<k;i++)
		{
			if(arclist[i].IsSelected==TRUE){
				n0=nodelist[arclist[i].n0];
				n1=nodelist[arclist[i].n1];
							
				n0.x+=dx;
				n0.y+=dy;
				n0.IsSelected=FALSE;
			
				n1.x+=dx;
				n1.y+=dy;
				n1.IsSelected=FALSE;

				j=nodelist.GetSize();
				asegm=arclist[i];
				asegm.n0=j; asegm.n1=j+1;
				asegm.IsSelected=FALSE;
				nodelist.Add(n0);
				nodelist.Add(n1);
				arclist.Add(asegm);
			}
		}
		
	}

  }
  EnforcePSLG();
  return;
}

void CFemmeDoc::EnforcePSLG()
{
	EnforcePSLG(0);
}

void CFemmeDoc::EnforcePSLG(double tol)
{
	/*  need to enforce:
		1) no duplicate point;
		2) no intersections between line segments, lines and arcs, or arcs;
		3) no duplicate block labels;
		4) no overlapping lines or arcs.

		can do this by cleaning out the various lists, and rebuilding them
		using the ``add'' functions that ensure that things come out right.
	*/

	CArray< CNode, CNode&>             newnodelist;
	CArray< CSegment, CSegment&>       newlinelist;
	CArray< CArcSegment, CArcSegment&> newarclist;

⌨️ 快捷键说明

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