JWW専用掲示板
(現在 過去ログ152 を表示中)

HOME HELP 新規作成 新着記事 トピック表示 発言ランク ファイル一覧 検索 過去ログ

[ 最新記事及び返信フォームをトピックトップへ ]

■33117 / inTopicNo.1)  NO TITLE
  
□投稿者/ HIDE 5回-(2006/10/26(Thu) 00:20:49)

    記事内容:[|] 

    下記のような外部変形を作成していますが、数式を計算してくれません。
    いろいろ試したのですが、値を数値として扱ってないような感じです。
    どなたか知恵をを貸してください。
     実行する前に、一本の線と4点の標高値を線上付近に書いておく必要がありま
    す。
    標高Z値とZ値の水平距離から、4点交点計算をして,点を書き出そうというもので
    す。
    4GH交点.awk内にある
         #線、文字書き出しによる取得値のチェック
    で、いろいろ試したのですが、値を数値として扱ってないような感じなので、X,Y
    値が
    0を吐き出して、画面中央へ、点を書き出してしまいます。
    どなたか知恵をを貸してください。

    ーーーーーーーーーーーー4GH交点.awkーーーーーーーーーーーーーーーーーーー
    ーーー
    # 【4GH交点】断面指示線上の標高文字4点から交点を書き出す

    #断面方向指示線のXY座標取得

    (/^hhp5ln/){
    getline
    LX1=substr($1,1)*1;
    LY1=substr($2,1)*1;
    LX2=substr($3,1)*1;
    LY2=substr($4,1)*1
    }

    #A面標高値のXYZ座標取得
    (/^hhp1ch/){
    getline
    AX1=substr($2,1); AY1=$3; AZ1=substr($6,2)*1}
    (/^hhp2ch/){
    getline
    AX2=$2; AY2=$3; AZ2=substr($6,2)*1}

    #B面標高値のXYZ座標取得
    (/^hhp3ch/){
    getline
    BX1=$2; BY1=$3; BZ1=substr($6,2)*1}
    (/^hhp4ch/){
    getline
    BX2=$2; BY2=$3; BZ2=substr($6,2)*1}

    BIGIN{
    #X-Y面による標高値の垂線補正計算

    M3=(LY2-LY1)*(LX2-LX1); #交点計算

    LAX1=(AY1-LY1+M3*LX1+1/M3*AX1)/(M3+1/M3) ; LAY1=LY1+M3*(LAX1-LX1);
    LAX2=(AY2-LY1+M3*LX1+1/M3*AY2)/(M3+1/M3) ; LAY2=LY1+M3*(LAX2-LX1);
    LBX1=(BY1-LY1+M3*LX1+1/M3*BY1)/(M3+1/M3) ; LBY1=LY1+M3*(LBX1-LX1);
    LBX2=(BY2-LY1+M3*LX1+1/M3*BY1)/(M3+1/M3) ; LBY2=LY1+M3*(LBX2-LX1);

    #方向線平面座標計算
    LA1=sqrt(((LAX1-LX1)^2+(LAY1-LY1)^2)) #指示線方向累加距離
    LA2=sqrt(((LAX2-LX1)^2+(LAY2-LY1)^2))
    LB1=sqrt(((LBX1-LX1)^2+(LBY1-LY1)^2))
    LB2=sqrt(((LBX2-LX1)^2+(LBY2-LY1)^2))

    #XYZの算出
    M1=(ZA2-ZA1)/(LA2-LA1); #交点計算
    M2=(ZB2-ZB1)/(LB2-LB1);
    LL=(ZB1-ZA1+M1*LA1-M2*LB1)/(M1-M2)

    Z=ZA1+M1*(LL-LA1)

    A=atan2(LY2-LY1,LX2-LX1)

    X=LX1+LL*COS(A)

    Y=LY1+LL*SIN(A)
    }
    #XYZの転送

    END { {printf"pt %e %e\n",X,Y}

    #線、文字書き出しによる取得値のチェック
    { printf("ch %e %e %e %e \"L=%1.3f\n",LX1,LY1,0,1,lx1)
    printf("ch %e %e %e %e \"FH=%1.3f\n",LX2,LY2,1,0,m3)
    }
    { print "lc1"
    print "lt1"
    printf "%e %e %e %e\n",AX1,AY1,AX2,AY2;
    print "lc2"
    printf "%e %e %e %e\n",AX2,AY2,BX1,BY1;
    print "lc1"
    print "lt2"
    printf "%e %e %e %e\n",BX1,BY1,BX2,BY2;
    print "lc4"
    printf "%e %e %e %e\n",BX2,BY2,AX1,AY1;
    }


    {
    printf "%e %e %e %e\n", LX1,LY1,LX2,LY1;
    printf "%e %e %e %e\n", LX2,LY1,LX2,LY2;
    printf "%e %e %e %e\n", LX2,LY2,LX1,LY2;
    printf "%e %e %e %e\n", LX1,LY2,LX1,LY1;
    }
    }

    ーーーーーーーーーーーーー4GH交点.BATーーーーーーーーーーーーーーーーーー

    @REM 【4標高交点】断面指示線上の標高文字4点から交点を書き出す
    @echo off
    goto er%1

    REM #jw
    REM #cd
    REM #hcあらかじめ標高文字間の結線が必要です
    REM #hm【4標高交点】|1L)4字指示|2R)工事中|3)工事中|4)工事中|

    REM #:1
    REM #h0
    REM #hc【線交点標高】
    REM #g1
    REM #1ch 標高文字 A面(1)を指示してください(レイヤ不問)
    REM #2ch 標高文字 A面(2)を指示してください(レイヤ不問)
    REM #3ch 標高文字 B面(1)を指示してください(レイヤ不問)
    REM #4ch 標高文字 B面(2)を指示してください(レイヤ不問)
    REM #5ln 断面線を指示してください
    REM #e

    REM #:2
    REM #h1
    REM #hc【線交点標高】標高文字と結線を選択してください(始点マウス右)
    REM #g1
    REM #1ln 断面線を指示してください
    REM #e

    REM #:3
    REM #h0
    REM #e
    REM #:4
    REM #h0
    REM #e

    :er1
    :er2
    jgawk -f 4GH交点.awk jwc_temp.txt > temp.txt
    del jwc_temp.txt
    ren temp.txt jwc_temp.txt
    pause
    goto END
    :er3
    call qzset /e qzlib
    goto END
    :er4
    call qzset /e qztool.awk
    goto END

    :END
    cls
    call qzset /d qztmp?.tmp


引用返信/返信 [メール受信/OFF] 削除キー/
■33119 / inTopicNo.2)  awkスクリプト
□投稿者/ 三五六 1回-(2006/10/26(Thu) 09:19:19)

    記事内容:[|] 

    No33117に返信(HIDEさんの記事)
    こんにちは。

    > 下記のような外部変形を作成していますが、数式を計算してくれません。
    > いろいろ試したのですが、値を数値として扱ってないような感じです。
    > どなたか知恵をを貸してください。
    >  実行する前に、一本の線と4点の標高値を線上付近に書いておく必要がありま
    > す。
    > 標高Z値とZ値の水平距離から、4点交点計算をして,点を書き出そうというもので
    > す。
    > 4GH交点.awk内にある
    >      #線、文字書き出しによる取得値のチェック
    > で、いろいろ試したのですが、値を数値として扱ってないような感じなので、X,Y
    > 値が
    > 0を吐き出して、画面中央へ、点を書き出してしまいます。
    > どなたか知恵をを貸してください。
    >

    中身を精査していませんが、違和感を覚えるawkスクリプトなので、確認させてくだ
    さい。

    スクリプトの途中にBEGINルールが割り込んで居ます。
    BEGINルールを先頭に書かなくても良いのですが、どこに書いても必ず最初に一回だけ
    評価(実行)されます。(複数のBEGINルールがある場合は、書いてある順番に一回だけ
    評価されます。)
    最初と言うのは、対象ファイル(jwc_temp.txt)を読む前です。
    同様に、ENDルールは、最後(対象ファイルを読み終わってから)に実行され、ENDルール
    の実行が終わるとスクリプトの走行は終わりです。

    ちょっと見たところ、上記を前提としてプログラムされていないように見えるのですが
    見込み違いでしたらすみません。

    尚、BEGINとENDルールはどちらも省略することが可能です。

    三五六

引用返信/返信 [メール受信/OFF] 削除キー/
■33120 / inTopicNo.3)  Re[1]: NO TITLE
□投稿者/ 元丼屋店長 5回-(2006/10/26(Thu) 14:40:45)

    記事内容:[|] 

    三五六も回答されている通り、awk の処理の流れは:

      BEGIN ブロック
        ↓
      ファイル読込(/パターン/{} ブロック)
        ↓
      END ブロック

    になりますので、このスクリプトでは BEGIN ブロックを処理する際に、まだ
    ファイルが読み込まれておらず、必要な変数がセットされていないように
    見受けられます。
    BEGIN ブロックの処理を END ブロック側に持っていく必要があると思います。

    また、最後の方の読込チェックですが、名前なしの {} ブロックは、入力一行
    に対して毎回実行されてしまいます。意味のない文字データが同じ位置に重なっ
    て多数出力されてしまうと思います。
    このあたりも関数化しておいて、END ブロックから呼び出すのが正解ではない
    でしょうか。

    一応、デバッグ時の文字データの出力は、ある程度は有効かもしれませんが、
    出力順序を確認するのが面倒ですので:

    # L=1923.111

    のようにコメント出力しておいて、JWC_TEMP.TXT をエディタで直接のぞく方が
    分かりやすいかもしれません。
引用返信/返信 [メール受信/OFF] 削除キー/
■33143 / inTopicNo.4)  Re[2]: NO TITLE
□投稿者/ HIDE 6回-(2006/10/27(Fri) 22:02:09)

    記事内容:[|] 

    No33120に返信(元丼屋店長さんの記事)
    三五六さん、元丼屋店長さん、ご指導ありがとうございます。
    上記ヒントを基に、BIGIN,ENDの処理の流れを考え直し
    いろいろ試行錯誤してみたのですが、言われるとおり
           {アクションブロック}
    に数式を入れるとうまく計算するようになり、完成しました。
    (と、いっても数式に間違いがたくさんありました。)
    ありがとうございました。

引用返信/返信 [メール受信/OFF] 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/

HOME HELP 新規作成 新着記事 トピック表示 発言ランク ファイル一覧 検索 過去ログ

- Child Tree -