ファイルからの図形描写

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
初心者

ファイルからの図形描写

#1

投稿記事 by 初心者 » 16年前

今まで質問させていただいた総まとめのような問題ですが・・
【したいこと】 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文を取り出して
図形を書いていくというプログラムです。

バグ

Re:ファイルからの図形描写

#2

投稿記事 by バグ » 16年前

2つの関数が正しく動く事を前提として書くと…

1:文字列を読み込む

2:1回の描画に必要なコマンドをCEditに書き込む

3:描画用の関数を呼ぶ

これで、いいんじゃないでしょうか?

初心者

Re:ファイルからの図形描写

#3

投稿記事 by 初心者 » 16年前

聞きたいこと明確に書いてませんでした。この2つ組み合わせると
OnZukei はvoid型として宣言されていますが、値を返しました。
OnZukei の宣言を確認してくださいとエラーでます。

私が使っているのはVC++6.0ですが調べてみると
VC++6.0ではreturnを許さないとかどうとか書いてありました。
改善方法はないのでしょうか?
void CMainFlame::OnZukei()
{
FILE *fp;
   char *str,buf[1000];
  char subbuf[100],*s1;
    char buf2[100],*s2;
  char buf3[100],*s3;
    char buf4[100],*s4;
     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++;
                   if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
                   s2=buf2;
                   if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
                    while(*str!='\0'&&(isdigit(*str) || *str=='-' || *str=='.'))
                   *s2++=*str++;
                    *s2='\0';
               }
        if(*str!='\0' && *str=='X'){
                  *str++;
                   if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
                   s3=buf3;
                   if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
                    while(*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))                   *s3++=*str++;
                    *s3='\0';
               }
              if(*str!='\0' && *str=='Y'){
                  *str++;
                   if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
                   s4=buf4;
                   if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
               while(*str!='\0' &&(isdigit(*str) |*str=='||*str=='.'))                              *s4++=*str++;
                    *s4='\0';
}
               CDC *v;
               v=GetDC();
               if(atof(buf2)==92){
                MoveTo(atof(buf3),atof(buf4));
                ReleaseDC(v);
             }   
                else if(atof(buf)==01){
                  MoveTo(0,0);
                 LineTo(atof(buf3),atof(buf4));
                 ReleaseDC(v);
              }
                            else
                     str++;
                }
         }
      fclose(fp);
      return 0;
  }
要はreturnがあるのがいけないのだとはおもいますが消しても動かないしどうすればいいのかさっぱり

Mist

Re:ファイルからの図形描写

#4

投稿記事 by Mist » 16年前

return;

とすれば戻り値なしのreturnになりますよ。

御津凪

Re:ファイルからの図形描写

#5

投稿記事 by 御津凪 » 16年前

void CMainFlame::OnZukei()
 ↑
上記のこれが戻り値の型ですが、この関数は void 型なので、 return に値を指定することができません。
戻り値を必要とするのであればここの型を変え(クラスで宣言しているところも同様に)、
そうでないのなら、 Mist さんの通り、値を指定しないで書いてください。

コードを見ると、開けなかった時と関数の終了時に return で値を返している(処理結果を返している)ので、
戻り値の型を変更するほうが良いですね。

# よく見ると、いくつかセミコロンが無いところがありますね。

初心者

Re:ファイルからの図形描写

#6

投稿記事 by 初心者 » 16年前

そういうことでしたか。エラーは出ないんですが動きませんね・・
ちょっとがんばってみます。ありがとうございました

初心者

Re:ファイルからの図形描写

#7

投稿記事 by 初心者 » 16年前

どこが悪いのはわかりません・・
ご指摘してもらえませんか

ま~く

Re:ファイルからの図形描写

#8

投稿記事 by ま~く » 16年前

動かないとは、描画されないということですか?
それとも値が読めないのですか?

初心者

Re:ファイルからの図形描写

#9

投稿記事 by 初心者 » 16年前

試しにちゃんとGとXとYの値がbuf2,buf3,buf4に行ってるのかをチェックしたら大丈夫でしたので
描画されない方です。

Mist

Re:ファイルからの図形描写

#10

投稿記事 by Mist » 16年前

> else if(atof(buf)==01){

else if (atoi(buf2) == 1) {

じゃないかな?
bufには読み込んだ行がそのまま入っているからatoiは0だと思うよ。
あと、01と書くと8進数の1になるので今回は間違いではないけども修正したほうがいいです。

ま~く

Re:ファイルからの図形描写

#11

投稿記事 by ま~く » 16年前

では描画について。
void CMainFlame::OnZukei()
ということから、アプリケーションの種類は SDIまたはMDIで作ったと思います。
このCMainFlameは外側の枠をあらわすウィンドウなのでそこに描いても描画できないと思います。
CViewから派生してできたxxxViewで描画処理を行う必要があると思います。
ちなみに、貼り付けてあるソースコードではその描画部分がコンパイルできそうにないので
本物?のコードを見せていただいたほうが直接どうすればよいか言えるかもしれません。
MainFrameで行っている処理をViewで行えばできると思うので試してみてください。

バグ

Re:ファイルからの図形描写

#12

投稿記事 by バグ » 16年前

あら?
たしかMFC使用のダイアログベースアプリだったような気がしたんですが…?
作り直したんでしょうか?(^_^;)

初心者

Re:ファイルからの図形描写

#13

投稿記事 by 初心者 » 16年前

ま~くさんのおっしゃってる通り、SDIでは描写できなかったので
ダイアログベースですると何か変な黒い塊が描写されましたので少しいじくってみます。
ありがとうございました

初心者

Re:ファイルからの図形描写

#14

投稿記事 by 初心者 » 16年前

始めはダイアログでしてたんですがSDIのが原点関係で楽かなと思いSDIに移し、
今またダイアログに戻しました

バグ

Re:ファイルからの図形描写

#15

投稿記事 by バグ » 16年前

なるほど、そういうことでしたか、納得です(^-^)

閉鎖

“C言語何でも質問掲示板” へ戻る