📄 movecopy.cpp
字号:
// 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 + -