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