【したいこと】 2つのプログラムを組み合わせる。
【取り組んできたこと】 2つのプログラムを作りました。
{ FILE *fp; char *str,buf[1000]; char subbuf[100],*s1; char buf2[100],*s2; if ((fp = fopen("test.txt", "r")) == NULL) { printf("ファイルが開けません\n"); return EXIT_SUCCESS } while (fgets(buf, 1000, fp) != NULL) { str=buf while(*str!='\0'){ if(*str!='\0' && (*str=='G' || *str=='X' || *str=='Y' || *str=='I' || *str=='J')){ s2=buf2; while(*str!='\0' && (*str=='G' || *str=='X' || *str=='Y' || *str=='I' || *str=='J')) *s2++=*str++; *s2='\0'; } if(isdigit(*str) || *str=='-' || *str=='.'){ s1=subbuf; while(*str!='\0' && (isdigit(*str) || *str=='-' || *str=='.')) *s1++=*str++; *s1='\0'; printf("[%s] [%lf]\n",buf2,atof(subbuf); } else str++; } } fclose(fp); return 0; }
似たスレがありましたがそのスレをぱくって英大文字を取り出す機能を付け加えました。
このプログラムにより英大文字と数字を仕分けでき、中でもG、X、Y、I、Jのみにしました。(必要なのはこれだけな為)
例実行すると
[G][1]
[X][12]
[Y][31]
[13.2]
[J][-12]
な感じになります。
2つ目のプログラムが図形描写のプログラムで
{ CEdit *p,*q,*r,*s,*t; CDC *v; CString a,b,c,d,z; p=(CEdit *)GetDlgItem(IDC_EDIT1); q=(CEdit *)GetDlgItem(IDC_EDIT2); r=(CEdit *)GetDlgItem(IDC_EDIT3); s=(CEdit *)GetDlgItem(IDC_EDIT4); t=(CEdit *)GetDlgItem(IDC_EDIT5); p->GetWindowText(a); q->GetWindowText(b); r->GetWindowText(c); s->GetWindowText(d); t->GetWindowText(z); int Z=atoi(z); double A=atof(a); double B=atof(b); double C=atof(c); double D=atof(d); switch(Z){ case 92: v=GetDC(); v->MoveTo((int)(A),(int)(B)); bx=A; by=B; ReleaseDC(v); break; case 01: v=GetDC(); v->MoveTo((int)(bx),(int)(by)); v->LineTo((int)(A),(int)(B)); bx=A; by=B; ReleaseDC(v); break; case 02 v=GetDC(); double r2; r2=sqrt(C*C+D*D); v->Arc((int)(bx+C-r2),(int)(by+D-r2),(int)(bx+C+r2),(int)(by+D+r2),(int)(A),(int)(B),(int)(bx),(int)(by)) bx=A; by=B; ReleaseDC(v); break; case 03 v=GetDC(); double r1; r1=sqrt(C*C+D*D); v->Arc((int)(bx+C-r1),(int)(by+D-r1),(int)(bx+C+r1),(int)(by+D+r1),(int)(bx),(int)(by),(int)(A),(int)(B)) bx=A; by=B; ReleaseDC(v); break; } }
このプログラムはCADで使うんですが、
G92:現在位置変更
G01:直線を引く
G02:時計回りに円弧を書く
G03:反時計回りに円弧を書く
例えば
G01 X100 Y100とすると原点or前の座標から(100,100)まで直線を引く
G02 X100 Y100 I50 J50とすると原点or前の座標から(100,100)で前の座標から(50,50)行った所を中心とする円弧
という風になっています。ややこしいので深く書きませんがこのように図形を書きます。
この書き方をLineToやArc関数で表したものです。
この2つはMFCとコンソールでちょっとタイプが違いますが・・
作りたいプログラムは
G01X100Y100
G02X200Y200I50J50
M90
D90
のような文が書かれているファイルから一行ずつ読み込み上の例ですと上2文を取り出して
図形を書いていくというプログラムです。