// compile as: // cc -lm -o dxf2mvg dxf2mvg.c #include #include #include #include FILE*fi,*fo; #define DEFAULT_DPI 1000 int DPI=DEFAULT_DPI; #define DEFAULT_STROKEWID 2 #define DEFAULT_OUTFILE "dxf.g" //#define DEFAULT_LINECOL "black" //#define DEFAULT_BGCOL "white" //#define DEFAULT_FONTSIZE 10 //#define DEFAULT_FONTCOLOR "black" #define COLLEN 32 #define DEFAULT_PRECISION 3 #define DEFAULT_MINDIST 0.01 //#define DEFAULT_FONTOFFS 3 //int fontsize=DEFAULT_FONTSIZE; //int fontoffsx=DEFAULT_FONTOFFS; //nt fontoffsy=DEFAULT_FONTOFFS; //ar fontcolor[COLLEN+2]=DEFAULT_FONTCOLOR; //int showcoords=0; //int pixelcoords=0; //int coordcenterref=0; //char textxysep[COLLEN+2]="\n"; //char textpartssep[COLLEN+2]="\n"; //char sizexysep[COLLEN+2]="\n"; int canvasaddx=0; int canvasaddy=0; int canvasaddl=0; int canvasaddt=0; int coordprec=DEFAULT_PRECISION; int decimals=2; int decmult=100; char cmt[16]=";"; #define OUTG 0 #define OUTSCAD 1 int outformat=OUTG; char scadpref[256]="line"; #define CMDLEN 256 char g_pendown[CMDLEN+2]=""; char g_penup[CMDLEN+2]=""; char g_start[CMDLEN+2]=""; char g_end[CMDLEN+2]=""; double crosscoordmaxx=0,crosscoordmaxy=0; double multix=0.0; double multiy=0.0; double addx=0.0; double addy=0.0; double preaddx=0.0; double preaddy=0.0; double sizex=0; double sizey=0; //char bgcol[COLLEN+2]=DEFAULT_BGCOL; //char linecol[COLLEN+2]=DEFAULT_LINECOL; //char crosscol[COLLEN+2]=DEFAULT_LINECOL; //char movecol1[COLLEN+2]="yellow"; //char movecol2[COLLEN+2]="orange"; //char movecol3[COLLEN+2]="green"; //int strokewid=DEFAULT_STROKEWID; int showmoves=0; int showentities=0; int fliphorz=0; int flipvert=0; int x_fliphorz=0; int x_flipvert=0; int tozero=0; int x_tozero=0; int tocenter=0; int showcrosscoord=0; // show coordinates of cross mark centers int showlinecoord=1; // show coordinates of individual line endpoints - default 1, disabling in options int showcrosssize=0; // show dimensions of cross-center polylines int showonlycrosssize=0;// show dimensions, suppress coordinates int showcrossdimhalf=0; // show half-size of dimensions, radius instead of diameter int nomvg=0; // suppress MVG output, for other things int outputcoordvars=0; // output coordinates of crosses as bash variables int outputcoordcompact=0; char movecol[COLLEN+2]; long linenum=0; char*outfile=DEFAULT_OUTFILE; double mindist=DEFAULT_MINDIST; char str_prff[16]; int pixelsx,pixelsy; int showdxf=0; int showdxfraw=0; int showline=0; int showcmt=1; int showg=1; int showautocal=0; int showtrace=0; int showtracecenter=0; int showtraceg=0; int showparams=1; int gtoupper=1; double minx,maxx,miny,maxy; double ominx,omaxx,ominy,omaxy; long lines=0; double getdouble() { char s[512]; fgets(s,510,fi); return atof(s); } double str2x(char*s) { double d; d=atof(s); // if(x_tozero)d=d-minx; // d=(d+preaddx)*multix; // if(x_fliphorz)d=maxx-d; // d=d+addx; return d; } double str2y(char*s) { double d; d=atof(s); // if(x_tozero)d=d-miny; // d=(d+preaddy)*multiy; // if(x_flipvert)d=maxy-d; // d=d+addy; return d; } double trans_x(double x){ if(tozero||tocenter)x=x-minx; if(tocenter)x=x-(maxx-minx)/2; x=x+preaddx; x*=multix; x+=addx; x*=decmult;x=round(x);x/=decmult; return x; } double trans_y(double y){ if(tozero||tocenter)y=y-miny; if(tocenter)y=y-(maxy-miny)/2; y=y+preaddy; y*=multiy; y+=addy; y*=decmult;y=round(y);y/=decmult; return y; } int mm2pix(double d) { return round(d/25.4*DPI); } #define MAXXY 999999999 void scanfile() { char s1[512],s2[512],*sp; int i,t; double d; minx=MAXXY;maxx=-MAXXY; miny=MAXXY;maxy=-MAXXY; rewind(fi); while(!feof(fi)){ fgets(s1,510,fi);sp=strchr(s1,0x0d);if(sp)sp[0]=0; fgets(s2,510,fi);sp=strchr(s2,0x0d);if(sp)sp[0]=0; if(ferror(fi)){fprintf(stderr,"[Error %i at read]",ferror(fi));return;} i=atoi(s1); //printf("%i:%s\n",i,s2); if((i==10)||(i==11)){d=str2x(s2);if(dmaxx)maxx=d;} if((i==20)||(i==21)){d=str2y(s2);if(dmaxy)maxy=d;} if(!strncmp(s2,"LINE",4))lines++; if(i==999){ double d; if(!strncmp(s2,"CROSSCOORDMAXX:",15))crosscoordmaxx=atof(s2+15); if(!strncmp(s2,"CROSSCOORDMAXY:",15))crosscoordmaxy=atof(s2+15); } } //overrride of maximum dimensions by crosses if(crosscoordmaxx>maxx)maxx=crosscoordmaxx; if(crosscoordmaxy>maxy)maxy=crosscoordmaxy; pixelsx=mm2pix(maxx); pixelsy=mm2pix(maxy); if(tozero){pixelsx-=mm2pix(minx);pixelsy-=mm2pix(miny);} } void setprff(int n){ if(n<0)n=0;if(n>5)n=5; decmult=pow(10,n); //printf("multiplier:%i\n",decmult); if(outformat==OUTSCAD)sprintf(str_prff,"%%6.%if%%s",n); else sprintf(str_prff,"%%.%if%%s",n); } void prff(double d,char*s){ printf(str_prff,d,s); } double lastx=-MAXXY,lasty=-MAXXY,lastz=-MAXXY; int penup=1; void printpendown(){ if(!penup)return; penup=0; if(showg)if(showcmt)printf("%s #PENDOWN\n",cmt); if(showg)if(g_pendown[0])printf("%s\n",g_pendown); } void printpenup(){ if(penup)return; penup=1; if(showg)if(showcmt)printf("%s #PENUP\n",cmt); if(showg)if(g_penup[0])printf("%s\n",g_penup); } void transgcode(char*s) { while(s[0]){ if((s[0]==',')||(s[0]==';'))s[0]='\n'; if(gtoupper)if((s[0]>='a')&&(s[0]<='z'))s[0]-='a'-'A'; s++; } } void printominmax(){ if(outformat==OUTSCAD){ printf("%s_minx=",scadpref);prff(ominx,"");printf(";\n"); printf("%s_maxx=",scadpref);prff(omaxx,"");printf(";\n"); printf("%s_miny=",scadpref);prff(ominy,"");printf(";\n"); printf("%s_maxy=",scadpref);prff(omaxy,"");printf(";\n"); } } int scad_isline=0; int scad_drawline=0; int scad_points=0; int scad_lineno=0; int scad_linepoint=0; int scad_linepointmax=4; int scad_loffs=0; double scad_lastx=-99999999,scad_lasty=-99999999; void printscadbegin(){ char s[256]; if(scad_isline)return; scad_lineno++; // printf("// begin\n"); sprintf(s,"%s%i",scadpref,scad_lineno); scad_loffs=strlen(s)+3; printf("%s=[ ",s); if(scad_lineno<10){printf(" ");scad_loffs++;} scad_isline=1; scad_points=0; scad_linepoint=0; } void printscadend(){ if(!scad_isline)return; printf(" ];\n"); scad_isline=0; scad_points=0; } void printscadpoint_raw(double x,double y){ scad_linepoint++; if(!scad_isline)printscadbegin(); if(scad_points)printf(", "); if(scad_linepoint>=scad_linepointmax){ int t; printf("\n");for(t=0;tomaxx)omaxx=x; if(yomaxy)omaxy=y; } void scad_close(){ printscadend(); printf("\n"); printf("%s_all=[",scadpref); int t; for(t=0;tmindist)return 0; // if(abs(y-lasty)>mindist)return 0; double dist=sqrt((x-lastx)*(x-lastx)+(y-lasty)*(y-lasty)); if(distomaxx)omaxx=x; if(yomaxy)omaxy=y; } // convert at earliest viable moment void printmoveline(double x1,double y1,double x2,double y2) { x1=trans_x(x1); y1=trans_y(y1); x2=trans_x(x2); y2=trans_y(y2); if((x2!=lastx)||(y2!=lasty)) if(showg)if(showline)if(showcmt)printf("%s moveline %f %f %f %f\n",cmt,x1,y1,x2,y2); printgmove(0,x2,y2); linenum++; } void printline(double x1,double y1,double x2,double y2) { x1=trans_x(x1); y1=trans_y(y1); x2=trans_x(x2); y2=trans_y(y2); //printf("[%f:%f:%f:%f]\n",x1,y1,x2,y2); if(showg)if(showline)if(showcmt)printf("%s line %f %f %f %f\n",cmt,x1,y1,x2,y2); printgmove(0,x1,y1); printgmove(1,x2,y2); linenum++; } void printdimensionsinfo(){ if(showcmt){ printf("%s# dimraw ",cmt);prff(maxx-minx," x ");prff(maxy-miny,"\n"); printf("%s# boxraw ",cmt);prff(minx," ");prff(miny," ");prff(maxx," ");prff(maxy,"\n"); printf("%s# scale ",cmt);prff(multix,"");if(multix!=multiy){printf(" ");prff(multiy,"");}printf("\n"); printf("%s# dim ",cmt);prff(trans_x(maxx)-trans_x(minx)," x ");prff(trans_y(maxy)-trans_y(miny),"\n"); printf("%s# box ",cmt);prff(trans_x(minx)," ");prff(trans_y(miny)," ");prff(trans_x(maxx)," ");prff(trans_y(maxy),"\n"); // printf("; #rwidth ");prff(maxx-minx,"\n"); // printf("; #rheight ");prff(maxy-miny,"\n"); // printf("#viewbox %li %li %li %li\n",mm2pix(minx),mm2pix(miny),mm2pix(maxx),mm2pix(maxy)); // printf("##xysize %lix%li\n",pixelsx+canvasaddx+canvasaddl,pixelsy+canvasaddy+canvasaddt); // if(outfile && outfile[0])printf("; ##outfile %s\n",outfile); // else printf("; ##outfile %s\n",DEFAULT_OUTFILE); if(showg)printf("\n"); } } void printparams(){ if(showcmt)printf("%s# params ",cmt); if(multix!=multiy){printf("-sx ");prff(multix," -sy ");prff(multiy," -dx ");} else{if(multix!=1.0){printf("-s ");prff(multix," -dx ");}else printf(" -dx ");} prff(trans_x(minx)-minx," -dy ");prff(trans_y(minx)-miny,"\n"); } void printautocalframe(){ if(showcmt)printf("\n%s# AUTOCALIBRATION LEVELING\n",cmt); printf("G29 L");prff(trans_x(minx)," F");prff(trans_y(miny)," R");prff(trans_x(maxx)," B");prff(trans_y(maxy),"\n"); if(showcmt)printf("\n"); } void showgocenter(){ printf("G0 X");prff((trans_x(minx)+trans_x(maxx))/2," Y");prff((trans_y(miny)+trans_y(maxy))/2,"\n"); } void showtracebox(){ if(showcmt){printf("\n%s# OUTLINE BOX TRACE",cmt);if(showtracecenter)printf(" FROM CENTER");printf("\n");} if(showtracecenter)showgocenter(); printf("G0 X"); prff(trans_x(minx)," Y");prff(trans_y(maxy),"\n"); printf("G%i X",showtraceg);prff(trans_x(maxx)," Y");prff(trans_y(maxy),"\n"); printf("G%i X",showtraceg);prff(trans_x(maxx)," Y");prff(trans_y(miny),"\n"); printf("G%i X",showtraceg);prff(trans_x(minx)," Y");prff(trans_y(miny),"\n"); printf("G%i X",showtraceg);prff(trans_x(minx)," Y");prff(trans_y(maxy),"\n"); if(showtracecenter)showgocenter(); } void processfile() { char s1[512],s2[512],*sp; int i,t; double x1=0,y1=0,x2=0,y2=0,xo=0,yo=0; int isline=0,ispoly=0,isvertex=0; int polyseg=0; int iscross=0; x_fliphorz=fliphorz; x_flipvert=flipvert; x_tozero=tozero; if(sizex){multix=sizex/(maxx-minx);} if(sizey){multiy=sizey/(maxy-miny);} if(!multix)multix=multiy;else if(!multiy)multiy=multix; if(!multix)multix=1.0; if(!multiy)multiy=1.0; if(showparams)printparams(); printdimensionsinfo(); if(showautocal)printautocalframe(); if(showtrace)showtracebox(); if(showg)if(g_start[0]){ if(showcmt)printf("\n%s #START SEQUENCE\n",cmt); printf("%s\n",g_start); } if(showg)if(showcmt)printf("%s #START DATA\n",cmt); /* 0 - unit name 8 - layer name 10,20,11,21 - xy coordinates; 1x=X 2x=Y, 3x=Z 100 - subclass marker 66 - "entities follow" flag (obsolete, ignore) LINE,LWPOLYLINE: common POLYLINE: in autotrace output; sequence of VERTEX until SEQEND VERTEX: in autotrace output */ ominx=MAXXY; ominy=MAXXY; omaxx=-MAXXY; omaxy=-MAXXY; rewind(fi); while(!feof(fi)){ fgets(s1,510,fi);sp=strchr(s1,0x0d);if(sp)sp[0]=0;sp=strchr(s1,0x0a);if(sp)sp[0]=0; if(showcmt)if(showdxfraw)printf("; %s\n",s1); fgets(s2,510,fi);sp=strchr(s2,0x0d);if(sp)sp[0]=0;sp=strchr(s2,0x0a);if(sp)sp[0]=0; if(showcmt)if(showdxfraw)printf("; %s\n",s2); if(ferror(fi)){fprintf(stderr,"[Error %i at read]",ferror(fi));return;} if(showcmt)if(showdxf)printf("; %10s %s\n",s1,s2); i=atoi(s1); if(i==0){if(showentities)printf("; #%s\n",s2); if(!strcmp(s2,"LINE")){isline=1;ispoly=0;} else if(!strcmp(s2,"LWPOLYLINE")){ispoly=1;isline=0;polyseg=0;isvertex=0;} else if(!strcmp(s2,"POLYLINE")){ispoly=1;isline=0;polyseg=0;isvertex=0;} // in autotrace output else if(!strcmp(s2,"VERTEX")){isvertex=1;continue;} // in autotrace output else {isline=0;ispoly=0;isvertex=0;} } //printf("XX:%i:%i:%i\n",isline,ispoly,polyseg); if(!isline)if(!ispoly)continue; if(isline){ if(i==10)x1=str2x(s2);else if(i==11)x2=str2x(s2);else if(i==20)y1=str2y(s2);else if(i==21)y2=str2y(s2); if(i==21){printmoveline(xo,yo,x1,y1); printline(x1,y1,x2,y2); xo=x2;yo=y2;} } else if(ispoly){ if(i==10)x1=str2x(s2);else if(i==20)y1=str2y(s2); if(i==20){if(polyseg==0)printmoveline(xo,yo,x1,y1); else printline(xo,yo,x1,y1); xo=x1;yo=y1; polyseg++; } } } if(showg)if(showcmt)if(showmoves)printf("%s stroke '%s' line %li,%li %li,%li\n",cmt,"zzz",mm2pix(xo),mm2pix(yo),0,0); printpenup(); if(showg)if(g_end[0]){ if(showcmt)printf("\n%s #END SEQUENCE\n",cmt); printf("%s\n",g_end); } if(outformat==OUTSCAD){scad_close();} if(showg)if(showcmt)printf("%s #END FILE\n",cmt); } void help() { char s[32]; printf("dxf2g - converts an OpenSCAD DXF file to a 2.5D gcode file\n" " (does not support entities other than LINE and LWPOLYLINE)\n"); printf("\nUsage: dxf2g [options] \n"); printf(" Modes:\n"); printf( " -coordvars do not generate graphics, instead output coords of cross marks and object dimensions\n" " in bash variable syntax (MUST be first argument)\n" " -coordvarsc same, in compact form (MUST be first argument)\n" " Dimensions and orientation:\n" " -s scaling factor\n" " -sx scaling factor horizontal\n" " -sy scaling factor vertical\n" " -dx shift horizontal\n" " -dy shift vertical\n" " -sizex scale to width in x\n" " -sizey scale to height in y\n" " -fh flip horizontal\n" " -fv flip vertical\n" " -z if offset, align to zero before shifting\n" " -c center before shifting\n" " -opts show options for further calls\n" " Output and appearance:\n" // " -o output file name (default \"%s\")\n" " -mind minimum distance between successive points\n" " -dp show numbers with n decimals (default=2)\n" " -cdxf show DXF code in comments, more legible\n" " -cdxfraw show DXF code in comments, as-is\n" " -cline show line movements in comments\n" " -cnocmt don't show unnecessary comments\n" " -ng don't show gcode, just the analysis\n" // " -lm show movement lines\n" // " -vc show DXF entities in MVG comments\n" // " -margx add n pixels to the right side\n" // " -margy add n pixels to the bottom side\n" // " -margt add n pixels to the top side\n" // " -margl add n pixels to the left side\n" " G-code macros:\n" " -cfg read config from a file\n" " -pd pen-down gcode (colon- or semicolon-delimited)\n" " -pu pen-up gcode\n" " -gs start gcode\n" " -ge end gcode\n" " -autocal output only G29 autocalibration frame\n" " -withautocal add G29 autocalibration frame to the gcode front\n" " -trace output only G0 move around the dimensions, start/stop at minx,maxy corner\n" " -tracec output only G0 move around the dimensions, start/stop at center\n" " -traceg1 output G1 move around the dimensions\n" " OpenSCAD output:\n" " -scad instead of G-code output arrays of coordinates for polylines\n" " -scadname use s as variable name (to facilitate including more files)\n" // " Annotations and coordinates:\n" // " -cm show coordinates in millimeters, with %i decimal places\n" // " -cmprec show coordinates in millimeters, with n decimal places\n" // " -cc show coordinates relative to object center (default: object left top)\n" // " -cr show coordinates of cross marks\n" // " -cro show only coordinates of cross marks, not of lines\n" // " -crdim show coords and polyline width/height at cross mark\n" // " -crdimo show only dimensions of cross marked object, no coords\n" // " -crdimh show half of the dimensions value (radius vs diameter)\n" " Other:\n" " -h, -help, --help\n" " this help\n" ,DEFAULT_OUTFILE,DEFAULT_PRECISION); exit(0); } char*fni; int readcfgfile(int cfgdepth,char*fn); int parsecommand(int cfgdepth,int t,char*argv[]){ if(!strcmp(argv[t],"-h"))help(); // if(!strcmp(argv[t],"-hp"))help(1); if(!strcmp(argv[t],"-help"))help(); if(!strcmp(argv[t],"--help"))help(); // read configs if(!strcmp(argv[t],"-cfg")){t++;readcfgfile(cfgdepth,argv[t]);return t;} // sizing if(!strcmp(argv[t],"-s" )){t++;multix=atof(argv[t]);return t;} if(!strcmp(argv[t],"-sx")){t++;multix=atof(argv[t]);return t;} if(!strcmp(argv[t],"-sy")){t++;multiy=atof(argv[t]);return t;} if(!strcmp(argv[t],"-sizex")){t++;sizex=atof(argv[t]);return t;} if(!strcmp(argv[t],"-sizey")){t++;sizey=atof(argv[t]);return t;} if(!strcmp(argv[t],"-dx")){t++;addx=atof(argv[t]);return t;} if(!strcmp(argv[t],"-dy")){t++;addy=atof(argv[t]);return t;} if(!strcmp(argv[t],"-fh")){fliphorz=1;return t;} if(!strcmp(argv[t],"-fv")){flipvert=1;return t;} if(!strcmp(argv[t],"-z" )){tozero=1;return t;} if(!strcmp(argv[t],"-c" )){tocenter=1;return t;} if(!strcmp(argv[t],"-dp" )){t++;decimals=(atoi(argv[t]));return t;} if(!strcmp(argv[t],"-mind")){t++;mindist=atof(argv[t]);return t;} //outputs: if(!strcmp(argv[t],"-o" )){t++;outfile=argv[t];return t;} // if(!strcmp(argv[t],"-d" )){t++;DPI=atoi(argv[t]);return t;} // if(!strcmp(argv[t],"-lw")){t++;strokewid=atoi(argv[t]);return t;} // if(!strcmp(argv[t],"-lcol")){t++;strncpy(linecol,argv[t],COLLEN);return t;} // if(!strcmp(argv[t],"-crcol")){t++;strncpy(crosscol,argv[t],COLLEN);return t;} // if(!strcmp(argv[t],"-bgcol")){t++;strncpy(bgcol,argv[t],COLLEN);return t;} // if(!strcmp(argv[t],"-lm")){showmoves=1;return t;} // if(!strcmp(argv[t],"-vc")){showentities=1;return t;} // if(!strcmp(argv[t],"-margx")){t++;canvasaddx=atoi(argv[t]);return t;} // if(!strcmp(argv[t],"-margy")){t++;canvasaddy=atoi(argv[t]);return t;} // if(!strcmp(argv[t],"-margt")){t++;canvasaddt=atoi(argv[t]);return t;} // if(!strcmp(argv[t],"-margl")){t++;canvasaddl=atoi(argv[t]);return t;} // // if(!strcmp(argv[t],"-cp" )){showcoords=1;pixelcoords=1;return t;} // if(!strcmp(argv[t],"-cm" )){showcoords=1;return t;} // if(!strcmp(argv[t],"-cmprec")){t++;showcoords=1;coordprec=atoi(argv[t]);return t;} // if(!strcmp(argv[t],"-cc" )){coordcenterref=1;return t;} // if(!strcmp(argv[t],"-cr" )){showcrosscoord=1;return t;} // if(!strcmp(argv[t],"-cro" )){showcrosscoord=1;showlinecoord=0;return t;} // if(!strcmp(argv[t],"-crdim")){showcrosssize=1;showcoords=1;return t;} // if(!strcmp(argv[t],"-crdimo")){showcrosssize=1;showcoords=1;showonlycrosssize=1;return t;} // if(!strcmp(argv[t],"-crdimh")){showcrosssize=1;showcoords=1;showcrossdimhalf=1;return t;} // if(!strcmp(argv[t],"-cfs")){t++;fontsize=atoi(argv[t]);return t;} // if(!strcmp(argv[t],"-cfcol")){t++;strncpy(fontcolor,argv[t],COLLEN);return t;} // if(!strcmp(argv[t],"-csep")){t++;strncpy(textxysep,argv[t],COLLEN);return t;} // if(!strcmp(argv[t],"-coordvars")){showcoords=1;nomvg=1;outputcoordvars=1;showcrosscoord=1;return t;} // if(!strcmp(argv[t],"-coordvarsc")){showcoords=1;nomvg=1;outputcoordvars=1;showcrosscoord=1;outputcoordcompact=1;return t;} if(!strcmp(argv[t],"-nocomment")){return t;} if(!strcmp(argv[t],"-autocal")){showautocal=1;showg=0;return t;} if(!strcmp(argv[t],"-withautocal")){showautocal=1;return t;} if(!strcmp(argv[t],"-trace")){showtrace=1;showg=0;return t;} if(!strcmp(argv[t],"-tracec")){showtrace=1;showtracecenter=1;showg=0;return t;} if(!strcmp(argv[t],"-traceg1")){showtraceg=1;showg=0;showtrace=1;return t;} if(!strcmp(argv[t],"-pd")){t++;strncpy(g_pendown,argv[t],CMDLEN);return t;} if(!strcmp(argv[t],"-pu")){t++;strncpy(g_penup ,argv[t],CMDLEN);return t;} if(!strcmp(argv[t],"-gs")){t++;strncpy(g_start, argv[t],CMDLEN);return t;} if(!strcmp(argv[t],"-ge")){t++;strncpy(g_end, argv[t],CMDLEN);return t;} if(!strcmp(argv[t],"-cdxf")){showdxf=1;return t;} if(!strcmp(argv[t],"-cdxfraw")){showdxfraw=1;return t;} if(!strcmp(argv[t],"-cline")){showline=1;return t;} if(!strcmp(argv[t],"-cnocmt")){showcmt=0;return t;} if(!strcmp(argv[t],"-graw")){gtoupper=0;return t;} if(!strcmp(argv[t],"-ng")){showg=0;return t;} if(!strcmp(argv[t],"-opts")){showcmt=0;showtrace=0;showg=0;return t;} if(!strcmp(argv[t],"-scad")){outformat=OUTSCAD;strcpy(cmt,"// ");return t;} if(!strcmp(argv[t],"-scadname")){t++;strncpy(scadpref,argv[t],31);return t;} if(!strncmp(argv[t],"-",1)){fprintf(stderr,"Unknown option: %s\n",argv[t]);exit(1);} if(cfgdepth==0)fni=argv[t]; else{fprintf(stderr,"Filename not to be specified in cfg file. Config options must start with dash. ('%s' '%s')\n",argv[t],argv[t+1]);exit(1);} return t; } #define MAXCFGDEPTH 3 int readcfgfile(int cfgdepth,char*fn){ FILE*f; char s[256],*sp,*sp0; char empty[]=""; char*sarr[2]; if(cfgdepth>MAXCFGDEPTH){fprintf(stderr,"Higher level of recursion than %i. Skipping file '%s'.\n",MAXCFGDEPTH,fn);return 0;} f=fopen(fn,"r"); if(!f){ fprintf(stderr,"Cannot open config file '%s'. Aborting.\n"); exit(2); } while(!feof(f)){ fgets(s,255,f); sp0=s;while((sp0[0]==' ')||(sp0[0]=='\t'))sp0++; if(!sp0[0])continue; if((sp[0]==';')||(sp[0]=='#')||(sp[0]=='/'))continue; // comments sp=strchr(sp0,'\n');if(sp)sp[0]=0; sp=strchr(sp0,'\r');if(sp)sp[0]=0; sp=sp0;while((sp[0])&&(sp[0]!=' ')&&(sp[0]!='\t'))sp++; if(sp){sp[0]=0;sp++;while((sp[0]==' ')||(sp[0]=='\t'))sp++;}else sp=empty; sarr[0]=sp0;sarr[1]=sp; parsecommand(cfgdepth+1,0,sarr); printf("Filestr: %s\n",s); } fclose(f); exit(0); return 0; } int main(int argc,char*argv[]) { //fi=stdin; int t; outfile=""; if(argc<2)help(); //strcpy(movecol,movecol1); for(t=1;t