外部変形ruby煙の出ない玉手箱 プログラム例(改訂6版) - 番外地

  本稿は JW_CAD 外部変形のプログラムを作成されている方の読み物として掲載しています。

| 前へ | 表紙へ |いろはにruby外部変形|rubyJWW ライブラリ コマンドリファレンス|

  • ♪ Lite & Seen Lite は みんなの道具。
     煙の出ない玉手箱( jw.rb )は JW_CAD 外部変形の ruby によるコマンド集です。
     ( jw.rb is a command set by ruby's GAIBUHENKEI for JW_CAD. )

     外部変形のプログラムで、面倒なのは、データの読み取りと作図コマンドを
     いちからつくらなければならないことです。これが、プログラムを作る壁と
     なってしまいます。そこで jw.rb は 面倒なことはしなくてすむように工夫
     しました。プログラムとはいっても、マウス操作を書き留める程度ですが、
     それなりには使えると思います。

     クラス、オブジェクトというだけで「やめたっ」となる方も多いかと思いま
     す。クラスやオブジェクトを知らなくてもプログラムは組めます。不便を感
     じることもないと思います。世間的には通用しない考え方のようですが。
     クラスやオブジェクトを知らなくても プログラムは組めますので ことばに
     翻弄されないように、気持ちをしっかり持つことも大切です。

     それでは ・・・ ごゆっくりとご覧ください。

     線の交点 に 点を打つ なら このようになります。
    :線の交点 に 点を打つ
    @echo off
    REM #jww
    REM #1%dln 線を指示してください
    REM #2#
    REM #e
    
    %~dp0let %0
    
    point inters
    
     → %~dp0let %0 についての詳細は 「はじめに」の項 を 参照ください。
     → ここで
       point は 点を打つ関数、inters は 交点を返す関数 です。
       let で point inters を実行します。%0 は このファイルを指します。
    [ jw.rb ] の記述は マウス操作を書き留めただけのせいか 単調です。
    
    point inters 1.ln, 2.ln
     格調高く autolisp風 に アレンジするなら
    alias command send #として
    (command "point", (command "inters", 1.ln, 2.ln))
     エレガンスに Vector Script風 に 書くなら
    alias RUN eval #として
    prog =<<-Procedure
    begin
      point inters 1.ln, 2.ln
    end
    Procedure
    RUN(prog)
     となります。
    [ ruby ] では プログラムしておけば 同じ関数名で
     関数(引数, … ) のほか
     引数.関数( … ) や
     [引数, … ].関数 のように いろいろな使い方ができます。
     上記の例なら
     point(inters(1.ln, 2.ln)) のほか
     1.ln.inters(2.ln).point   や
     inters(1.ln, 2.ln).point  でも構いません。
     ところが、この自由さが jw.rb を 非常にわかりにくいものにしています。そこで
    [ jw.rb ] では
     関数(引数, … ) を 推奨することにしました。
     上記の例なら
     point(inters(1.ln, 2.ln)) とし、省略できる引数を省略すると
     point(inters()) さらに、はずせる括弧をはずして書けば
     point inters となります。
    
     通常(外部変形を使わない作業)の手順との比較
    [通常]
      (交差点があるとき)
      「点」→「線1と線2の交点の近傍を右クリック」
      (交差点がないとき)
      「点」→「交点」→「線1を指示」→「線2を指示」
           あるいは
      「点」→「線1を9時方向に右ドラッグ(線上点・交点)」→「線2を指示」
    [外変]
      (ファイル選択)
      「外変」→「プログラム(ファイル選択)」→「線1を指示」→「線2を指示」
      (AUTOモードのカスタマイズクロックメニューに外部変形用バッチファイルを設定したとき)
      「AUTO」→「画面をドラッグ(設定した方向)」→「線1を指示」→「線2を指示」
    


     ◎ruby は 下記のサイトから 入手できます。
      ◇http://ftp.ruby-lang.org/pub/ruby/binaries/

     ◎ruby の インストールの方法は 下記に詳しい説明があります。
      ◇http://www.ruby-lang.org/ja/install.cgi?cmd=view;name=top

     ◎煙の出ない玉手箱( jw.rb ) の インストールの方法は 下記に説明があります。
      ◇jw.rb を インストールする

      動作しないときは外部変形に詳しい方にご相談ください。


    [ irb を利用すれば コマンドプロンプト画面で 線の交点や角度が確認できます ]
    → 計算できないときに強制終了することがあります。
    >irb -rjw → jw.rb をロードして irb を起動する
    irb(main):001:0> inters([-1,-1,1,1],[0,-1,0,1]) → 線の交点
    => [0, 0]
    irb(main):002:0> [-1,-1,1,1].angle.deg → 線の角度( ゚ )
    => 45.0
    irb(main):003:0> [-1,-1,1,1].clength → 線の長さ
    => 2.82842712474619
    irb(main):004:0> [0,0,1].clength → 円の周長
    => 6.28318530717959
    irb(main):005:0> [0,0,1,0,0,0.5,0].clength → 楕円の周長
    => 4.84422411027384
    irb(main):006:0> inters([0,0,1,0,0,0.5,0],[0,0,1,0,0,0.5,90]) → 楕円の交点
    => [[-0.447213595, 0.447213595], [0.447213595, 0.447213595], 
        [-0.447213595, -0.447213595], [0.447213595, -0.447213595]]
    
    → 作図コマンドの動作確認にも便利です。
    irb(main):001:0> line 1,2,3,4
    1 2 3 4 → 図形の出力
    => [1, 2, 3, 4] → 返り値
    irb(main):002:0> line [1,2], [3,4]
    1 2 3 4
    => [[1, 2], [3, 4]]
    irb(main):003:0> line [1,2,3,4], [5,6,7,8]
    h#引数 :5 は無効です
    1.0 2.0 3.0 4.0
    5 6 7 8
    => [1, 2, 3, 4]
    irb(main):004:0> line [[1,2,3,4], [5,6,7,8]]
    1 2 3 4
    5 6 7 8
    => [[1, 2, 3, 4], [5, 6, 7, 8]]
    irb(main):005:0> circle 1,2,3
    ci 1 2 3
    => 1
    irb(main):006:0> circle [1,2], [3,4]
    ci 1.0 2.0 2.82842712474619
    => [1, 2]
    

    [ 参考 ] 入力で Windows のショートカット キー は有効です。
      Ctrl + C コピーする。
      Ctrl + X 切り取る。
      Ctrl + V 貼り付ける。
      Ctrl + Z 元に戻す。



     ◎スクリプトの例題はここからダウンロードできます。
      → 外部変形ruby煙の出ない玉手箱 / rubyscript.zip
      → 構造用パッケージ Seen Lite RC/S/KUI/PEN (jw.rb版) あります。


     [ JW_CAD 外部変形 のメニュー ]
     ◎プログラムはすべて自己完結しています。必要な項目のみ
      確認されることをお勧めします。

  • はじめに
    001line.bat
    002circle.bat
    003point.bat
    004text.bat
    005rect.bat
    006lnlength.bat
    007lnslope.bat
    008ptdist.bat
    009cirpoi.bat
    010poicir.bat
    011ray.bat
    012xline.bat
    013_2sen.bat
    014pointmark.bat
    015rect_sl.bat
    016circle_so.bat
    017jreverse.bat
    018time.bat
    019circross.bat
    020fukusen.bat
    021inters.bat
    022interdeg.bat
    023hd.bat
    024arc_l.bat
    025lemunis.bat
    026lnmark.bat
    027arcmark.bat
    028lncross.bat
    029step.bat
    030jish.bat
    032keisen.bat
    051gethk.bat
    052geths.bat
    071calc.bat
    072jww.bat
    あとがき
    【 jww, run 】
    【 線を引く 】
    【 円を描く 】
    【 点を打つ 】
    【 こんにちは 】
    【 矩形を描く 】
    【 線長(作図画面のスケール)を計測表示する 】
    【 線角を計測表示する 】
    【 点間隔(表示画面のスケール)を計測表示する 】
    【 円を点に変換する 】
    【 点を円に変換する 】
    【 放射線 ray 】
    【 構築線 xline 】
    【 2重線 2sen 】
    【 点マーカを打つ 】
    【 矩形を描く( sl ) 】
    【 円環を描く( so ) 】
    【 文字を逆書きする 】
    【 時刻を書き込む 】
    【 円に+を記入する 】
    【 複線を引く(直線) 】
    【 交点(直線) 】
    【 交角(直線) 鋭角/左回りが正 】
    【 画面表示のデータを全部消去する 】
    【 楕円弧の長さ(表示画面のスケール)を計測表示する 】
    【 レムニスケートを描く 】
    【 線の端点をマークする 】
    【 楕円弧の端点をマークする 】
    【 直交線を引く 】
    【 階段を割り付ける 】
    【 一筆書きでH形鋼断面を描く 】
    【 罫線を引く 】
    【 軸角を取得する 】
    【 スケールを取得する 】
    【 電卓を開く 】
    【 図面を開く 】



    はじめに 【 jww, run 】
    ◎jw.rb には 標準出力を jwc_temp.txt とするコマンド jww があります。
    jww
    text "はじめまして"
    
     で はじめまして が
    jww
    echo "0 0 1000 0"
    
     で 1m の 線 が jwc_temp.txt に 書き出されます。

    ◎REM 文 に書いたプログラムを評価(実行)するコマンド run があります。
     標準出力を jwc_temp.txt として
    REM #: 〜 または REM #jww; 〜
    
      〜 の部分を評価(実行)し、数値 $p は
    REM #[cf] ***** /_$[1-9a-z]" $p = 
    
     で 入力でき、文字列 $p は
    REM #[cf] ***** /_$[A-Z]" $p = 
    
     で 入力できます。
      → 数値 $p の入力では 全角文字 は 半角文字 に変換されます。
      → $p を指定しないとき $[1-9] は $_1 〜 $_9、 $[a-zA-Z] は $a 〜 $Z にセットされます。

    ◯バッチファイルから ruby や jw.rb を 隠すことができます。
     つぎのような run.bat を パスの通ったフォルダに置いておけば
    @echo off & cls
    set RUBYLIB=\jww\Lite\pro\ruby\lib
    ruby -Ks -rjw -e "run '%1'" %* -
    
     → run.bat の RUBYLIB は jw.rb のあるフォルダの位置を示します。
     → jw.rb が site_ruby か vendor_ruby フォルダにあるとき RUBYLIB は 不要です。
    :こんにちは
    @echo off
    REM #jww
    REM #1%d 位置を指示して下さい
    REM #99#
    REM #f 文字 = /_$A"
    REM #: text ($A || "こんにちは")
    REM #e
    run %0 %*
    
     のように書けます。
     本稿では、run.bat を バッチファイルと同じフォルダにおくものとして
    %~dp0run %0 %*
    
     と書いています。なお、バッチファイルに戻す必要があるなら
    call %~dp0run %0 %*
    
     としてください。コマンドライン引数がなければ 末尾の %* は不要です。
     run.bat を 使わないで 普通に書くなら
    :こんにちは
    @echo off
    REM #jww
    REM #1%d 位置を指示して下さい
    REM #99#
    REM #f 文字 = /_$A"
    REM #e
    set RUBYLIB=\jww\Lite\pro\ruby\lib
    ruby -x %~f0 %*
    goto:eof
    #!ruby -Ks -rjw
    run
    text ($A || "こんにちは")
    __END__
    
     となります。緑色の部分は 決まり文句 です。つぎの項の let.bat は この部分の動作を整理したものです。
     → jw.rb が site_ruby か vendor_ruby フォルダにあるとき RUBYLIB は 不要です。

    ◎シンプルにプログラムを評価(実行)する let.bat が 実用的です。
     run.bat は REM #: 〜 に プログラムを書きますが、let.bat は べた書きするだけです。
    :こんにちは
    @echo off
    REM #jww
    REM #1%d 位置を指示して下さい
    REM #99#
    REM #f 文字 = /_$A"
    REM #e
    %~dp0let %0 %*
    text ($A || "こんにちは")
    
     あるいは
    :線の両端に点を打つ
    @echo off
    REM #jw
    REM #1ln 線を指示してください
    REM #e
    %~dp0let %0
    point 1.ln.pt
    
     となります。本稿では この書き方を採用しました。

    |メニューへ戻る|先頭へ戻る|



    001line.bat 【 線を引く 】
     ◯2点を結ぶ線を引く
      
     ◯入力のイメージ
        REM #1-
        REM #2
        
     指示点データが、hp番号、座標x, y の順に書き出されます。
      hp1- x1 y1
      hp2  x2 y2
    
     ◯出力のイメージ
      線データは、始点座標x1, y1、終点座標x2, y2 の順に書き込みます。
       line x1, y1, x2, y2
       line [x1, y1], [x2, y2]
    
      x1 y1 x2 y2
    
      連続線データは、座標のセットで与えます。
       line [[x1, y1], [x2, y2], [x3, y3], … ]
    
      x1 y1 x2 y2
      x2 y2 x3 y3
       … 
    
      基点[x1, y1] から 放射状に線を引くこともできます。
       line [x1, y1], [[x2, y2], [x3, y3], … ]
    
      x1 y1 x2 y2
      x1 y1 x3 y3
       … 
    
      複数の基点から 放射状に線を引くならこうなります。
       line [[x1, y1], [x2, y2]], [[x3, y3], [x4, y4], … ]
    
      x1 y1 x3 y3
      x1 y1 x4 y4
       … 
      x2 y2 x3 y3
      x2 y2 x4 y4
       … 
    
      指示点データや指示線データは番号が使えます。
    
      指示点 1 と 2 を結ぶ線
      line 1, 2
    
      x1 y1 x2 y2
    
      指示点 1 と 2 と 3 が頂点となる三角形
      line hp 1..3, 1
    
      x1 y1 x2 y2
      x2 y2 x3 y3
      x3 y3 x1 y1
    
      指示点 1 が頂点、指示線 2 が1辺となる三角形
      line 1, 2.ln.pt
    
      x1 y1 x2 y2
      x1 y1 x3 y3
    
      指示線 1 の端点と指示線 2 の端点をすべて結ぶ
      line 1.ln.pt, 2.ln.pt
    
      x1 y1 x3 y3
      x1 y1 x4 y4
      x2 y2 x3 y3
      x2 y2 x4 y4
    
    :線を引く
    @echo off
    REM #jww
    REM #e
    
    %~dp0let %0
    
    x1 = 0; y1 = 0
    x2 = 1000; y2 = 1000
    line(x1, y1, x2, y2)
    
     あるいは
    :データで線を引く
    @echo off
    REM #jww
    REM #e
    
    %~dp0let %0
    
    line "0 0 1000 1000"
    
     となります。
    [ jw.rb ] は [x1, y1, x2, y2].r や 1.ln.r で 線長を返します。
     線データを変数(オブジェクト)とする便利な関数(メソッド)を揃えています。
     線データは 文字列 や 配列のほか 指示線データなら 1.ln のように番号が使えます。
     線データ = "0 0 1000 1000"
     線データ = [0,0,1000,1000]
     線データ . x1     #始点X座標 → 0.0
     線データ . y1     #始点Y座標 → 0.0
     線データ . x2     #終点X座標 → 1000.0
     線データ . y2     #終点Y座標 → 1000.0
     線データ . r      #線長 → 1414.2135623731
     線データ . len    #線長 → 1414.2135623731
     線データ . d      #線角 → 0.785398163397448
     線データ . deg    #線角 → 45.0
     線データ . p1     #始点 → [0.0, 0.0]
     線データ . p2     #終点 → [1000.0, 1000.0]
     線データ . pt     #[始点, 終点] → [[0.0, 0.0], [1000.0, 1000.0]]
     線データ . c      #中点 → [500.0, 500.0]
     線データ . w      #スパン → [x2 - x1, y2 - y1]
    
     点をマウスで指示するなら
    :マウスで指示して線を引く
    @echo off
    REM #jww
    REM #1-%d 始点を指示してください
    REM #2%d  終点を指示してください
    REM #e
    %~dp0let %0
    line(1, 2)
    
     相対距離 x, y を 指定して線を引くなら
    :相対距離 x, y を 指定して線を引く
    @echo off
    REM #jww
    REM #1%d 点を指示してください
    REM #99#
    REM #e
    %~dp0let %0
    line(stroke(hp(), x = 300, y = 400))
    
     長さ l と 角度 d を 指定して線を引くなら
    :長さ l と 角度 d を 指定して線を引く
    @echo off
    REM #jww
    REM #1%d 点を指示してください
    REM #99#
    REM #e
    %~dp0let %0
    line(pstroke(hp(), l = 500, d = rad(30)))
    
     となります。hp() で すべての指示点を返します。
     → hp() は $hp[1..-1] と 同じです。
    繰り返しになりますが
     相対距離   は stroke()
     長さ と 角度 は pstroke()
    を使うことで 直感的に 線が引けるように工夫しています。
    → stroke() や pstroke() は 線データを返す関数です。
    
    [ jw_cad ] は
     寸法 と 傾きを入力して 線データを配置できるようになっています。この動作を line( 〜 )
    でわかりやすく処理することは 実は大きな課題でした。
     思いついたアイデアは
     @ line( { 寸法 => r, 傾き => d, … } ) で python 風に ハッシュで扱う
     A line( pstroke(寸法, 傾き) ) のように 線データを返す関数 を利用する
    でした。
     @はプログラムを追加する必要があるのでやめました。Aはそのまま使えるので便利なことに
    気づきました。気づけば大したこともないのですが、大きな発見でした。
    
     もうひとつ データで引くなら
    :線データで線を引く
    @echo off
    REM #jww
    REM #e
    %~dp0let %0
    print DATA.read
    __END__
    0 0 1000 1000
    
     となります。
     長さ $r を入力し、角度 45°で 基点を中点(:c)として配置するなら
    :線を引く(2)
    @echo off
    REM #jww
    REM #1%d 点を指示してください
    REM #99#
    REM #c 長さを入力してください /_$r"
    REM #e
    %~dp0let %0 %*
    line ($r || 1000).to_f, :c45
    
     のようにします。:c** の角度** 部分は 正の整数のみ扱えます。
     線を引いて、その端点に矢印(ソリッド図形)を描くなら
    :線を引く(3)
    @echo off
    REM #jww
    REM #1-%d 始点を指示してください
    REM #2%d  終点を指示してください
    REM #e
    %~dp0let %0
    line arrow
    
     のようにします。
     コマンドラインで 点の座標を入力して引くなら
     → テストプログラムです。
    :線を引く(4)
    @echo off
    REM #jww
    REM #c どこから /_$1" $pt1 =
    REM #c ど こ へ /_$2" $pt2 =
    REM #c&&
    REM #e
    %~dp0let %0 %*
    line $pt1, $pt2
    
     として
    どこから
    -2000,1000
    ど こ へ
    3000,4000
    コマンド入力−>
    $1" $pt1 =-2000,1000" $2" $pt2 =3000,4000"
     のように点の座標を入力します。(Ver.1.03.93 より)
     帯状に線を引くなら
     → テストプログラムです。
    :線を引く(5)
    @echo off
    REM #jww
    REM #1/%d 始点を指示してください
    REM #2%d  終点を指示してください
    REM #e
    %~dp0let %0
    line (lnmove ln, (-1000..1000).step(200).to_a)
    
     通り芯なら( 木造平面例.jww X方向 )
    line (lnmove ln, [0, [900] * 8, 900 * 2].ruisin)
    
     のようにします。

     指示線の属性を取得するなら
    :指示線の属性を取得する
    @echo off
    REM #jww
    REM #1ln 線を指示してください
    REM #e
    
    @call %~dp0let %0
    @type jwc_temp.txt
    @pause
    @exit
    
    p 1.ln.lg # → レイヤグループ
    p 1.ln.ly # → レイヤ
    p 1.ln.lc # → 線色
    p 1.ln.lt # → 線種
    p 1.ln :lg, :ly, :lc, :lt # → [lg, ly, lc, lt]
    p $lnx[1] # → [lg, ly, lc, lt, lw]
    
     のようにします。

    |メニューへ戻る|先頭へ戻る|



    002circle.bat 【 円を描く 】
      ◯円の中心と円周上の点で円を描く
      
     ◯入力のイメージ
        REM #1-
        REM #2
        
     指示点データが、hp番号、座標x,y の順に書き出されます。
      hp1- x1 y1
      hp2  x2 y2
    
     ◯出力のイメージ
       circle x, y, r
       circle [x1, y1], [x2, y2]
    
     円データは、中心座標x,y、半径r の順に書き込みます。
      ci x y r
    
      指示点データや指示円データは番号が使えます。
    
      指示点 1 が中心、指示点 2 が円周上の点となる円
      circle hp 1, 2
    
      x1 y1 r
    
      指示点 1 と 2 と 3 が円周上の点となる円
      circle hp 1..3
    
      x y r
    
      レイヤ a に 指示円 1 を描く
        ly "a"
      circle 1.ci
    
        lya
      x1 y1 r1
    
      指示線 2 を直径とする円を描く
      circle 2.ln, :d
    
      x2 y2 r2
    
    :円を描く
    @echo off
    REM #jww
    REM #e
    %~dp0let %0
    x = 0; y = 0
    r = 1000
    circle(x, y, r)
    
     データで描くなら
    :円データで円を描く
    @echo off
    REM #jww
    REM #e
    %~dp0let %0
    print DATA.read
    __END__
    ci 0 0 1000
    
     となります。
    [ jw.rb ] は [x, y, r].r や 1.ci.r で 半径を返します。
     円データを変数(オブジェクト)とする便利な関数(メソッド)を揃えています。
     円データは 文字列 や 配列のほか 指示円データなら 1.ci のように番号が使えます。
     円データ = "0 0 1000 45 225 1 0"
     円データ = [0,0,1000,45,225,1,0]
     円データ . x      #X座標 → 0.0
     円データ . y      #Y座標 → 0.0
     円データ . r      #半径 → 1000.0
     円データ . p1     #始角 → 45.0
     円データ . p2     #終点 → 225.0
     円データ . w      #扁平比 → 1.0
     円データ . d      #傾角 → 0.0
     円データ . pt     #中心点 → [0.0, 0.0]
     円データ . pt(0)  #中心点 → [0.0, 0.0]
     円データ . pt(-1) #始点 → [707.106781186548, 707.106781186547]
     円データ . pt(1)  #終点 → [-707.106781186548, -707.106781186547]
     円データ . pt(2)  #端点 → [[707.106781186548, 707.106781186547],
                                 [-707.106781186548, -707.106781186547]]
     円データ . c      #中点 → [-707.106781186547, 707.106781186548]
     円データ . len    #弧長 → 3141.59265358979
    
     マウスで指示して描くなら
    :マウスで指示して円を描く
    @echo off
    REM #jww
    REM #1-%d 円の中心を指示してください
    REM #2%d  円周上の点を指示してください
    REM #e
    %~dp0let %0
    circle 1, 2
    
     指示点1と2を直径とするとき circle 1, 2, :d とします。
     半径 500(デフォルト値)、基点 左上 で 描くなら
    :円を描く(2)
    @echo off
    REM #jww
    REM #1%d 基点を指示してください
    REM #c 半径を入力してください /_$r"
    REM #e
    %~dp0let %0 %*
    circle ($r || 500).to_f, :p7
    
     のようにします。
     座標を指定して 直径 1000、基点 中中 で 描くなら
     → テストプログラムです。基点からのオフセット値を dx, dy = -100, -200 とした。
    :円を描く(3)
    @echo off
    REM #jww
    REM #0 原点を指示してください
    REM #e
    %~dp0let %0
    c1 = [:d5, 1000, -100, -200]
    circle [0, 0], c1
    circle [5000, 5000], c1
    
     のようにします。
     扇形・弓形を描くなら
     
    
    :扇形を描く
    @echo off
    REM #jww
    REM #1%d 円弧の中心を指示してください
    REM #e
    %~dp0let %0
    r = 500; p1 = 30; p2 = 120; w = 0.5; d = 30
    line 1, arc([hp(1), r, p1, p2, w, d]).pt(2)
    
    :弓形を描く
    @echo off
    REM #jww
    REM #1%d 円弧の中心を指示してください
    REM #e
    %~dp0let %0
    r = 500; p1 = 30; p2 = 120; w = 0.5; d = 30
    line arc([hp(1), r, p1, p2, w, d]).pt(2)
    
     となります。円弧データ.pt(2) で 始点、終点の座標を返します。
     円に内接する正 5 角形を描くなら
     → テストプログラムです。
    :円を描く(4)
    @echo off
    REM #jww
    REM #1-%d 円の中心を指示してください
    REM #2%d  円周上の点を指示してください
    REM #e
    %~dp0let %0
    polygon(1, 2, 角数 = 5, mode = 0) #内接
    
     頂点に番号と点を打つなら
    (pg n = 5).each_with_index{|x, i| echo x, ((i + 1).to_n if i != n)}
    
     のようにします。
     gnuplot で 円に内接する正 12 角形を描いてみます。
     → gnuplot の 2D 出力 は 外部変形 や 座標ファイルで読み込めます。
    :円を描く Gnuplot
    @echo off
    REM #jww
    REM #1-%d 円の中心を指示してください
    REM #2%d 円周上の点を指示してください
    REM #e
    set RUBYLIB=\jww\Lite\pro\ruby\lib
    ruby -x %~f0
    goto:eof
    
    #!ruby -Ks -rjw
    n = 12
    r = dist
    d = angle
    f = open("| pgnuplot", "w")
    f.print <<Gp
      set parametric
      set samples #{n + 1}
      set term table
      set format "%.15g"
      set output "jwc_temp.txt"
      plot [t = -pi : pi] \
            #{r} * cos(t + #{d}) + #{1.x}, #{r} * sin(t + #{d}) + #{1.y}
    Gp
    f.close
    sleep 2 #2sec 処理の終了を待つ #100419
    __END__
    

     指示円の属性を取得するなら
    :指示円の属性を取得する
    @echo off
    REM #jww
    REM #1ci 円を指示してください
    REM #e
    
    @call %~dp0let %0
    @type jwc_temp.txt
    @pause
    @exit
    
    p 1.ci.lg # → レイヤグループ
    p 1.ci.ly # → レイヤ
    p 1.ci.lc # → 線色
    p 1.ci.lt # → 線種
    p 1.ci :lg, :ly, :lc, :lt # → [lg, ly, lc, lt]
    p $cix[1] # → [lg, ly, lc, lt, lw]
    
     のようにします。

    |メニューへ戻る|先頭へ戻る|



    003point.bat 【 点を打つ 】
     ◯点を打つ
      
      
     ◯入力のイメージ
        REM #1-
        REM #99#
        
     指示点データが、hp番号、座標x, y の順に書き出されます。
      hp1- x1 y1
      hp2  x2 y2
      …
    
     ◯出力のイメージ
       point [x1, y1]
       point [[x1, y1], [x2, y2], … ]
       
     点データを、点座標x1, y1、点座標x2, y2、… の順に書き込みます。
      pt x1 y1
    
    :点を打つ
    @echo off
    REM #jww
    REM #e
    %~dp0let %0
    x = 1000; y = 1000
    point(x, y)
    
     データで描くなら
    :点データで点を打つ
    @echo off
    REM #jww
    REM #e
    %~dp0let %0
    print DATA.read
    __END__
    pt 1000 1000
    
     となります。
    [ jw.rb ] は [x, y].r や 1.r で 点の原点からの距離を返します。
     点データを変数(オブジェクト)とする便利な関数(メソッド)を揃えています。
     点データは 文字列 や 配列のほか 指示点データなら 1 のように番号が使えます。
     点データ = "1000 1000"
     点データ = [1000,1000]
     点データ . x      #X座標 → 1000.0
     点データ . y      #Y座標 → 1000.0
     点データ . r      #原点からの距離 → 1414.2135623731
     点データ . len    #原点からの距離 → 1414.2135623731
     点データ . d      #原点からの角度 → 0.785398163397448
     点データ . deg    #原点からの角度 → 45.0
    
     マウスで指示するなら
    :マウスの指示位置に点を打つ
    @echo off
    REM #jww
    REM #1%d 点位置を指示して下さい
    REM #99#
    REM #e
    %~dp0let %0
    point
    
     線を引いて、その端点に点を打つなら
    :点を打つ(2)
    @echo off
    REM #jww
    REM #1%d 点位置を指示して下さい
    REM #99#
    REM #e
    %~dp0let %0
    line point
    
     のようにします。
     線を引いて、その中点に点を打つなら
     → テストプログラムです。( :c 中点, :p1 始点, :p2 終点 )
    :点を打つ(3)
    @echo off
    REM #jww
    REM #1%d 点位置を指示して下さい
    REM #99#
    REM #e
    %~dp0let %0
    line point :c
    
     のようにします。point を arrow にすると矢印になります。

     鉄筋記号なら
    :鉄筋記号 @echo off REM #jww REM #1%d 位置を指示して下さい REM #99# REM #e %~dp0let %0 bar_draw(hp(), d = 29, ang = 0, mark = 0, barsize = 1, type = 1)
     となります。

    |メニューへ戻る|先頭へ戻る|



    004text.bat 【 こんにちは 】
     ◯こんにちは
      
      
     ◯入力のイメージ
        REM #1-
        REM #99#
    
     指示点データが、hp番号、座標x, y の順に書き出されます。
      hp1- x1 y1
      hp2  x2 y2
      …
    
        REM #f 文字 =  /_$A" $s =
    
     入力した 文字列が $s に与えられます。(コマンドライン引数 %* 経由)
    
     ◯出力のイメージ
       text [x1, y1], str
       text [[x1, y1], [x2, y2], … ], str
       
     文字列データを、点座標x1, y1、点座標x2, y2、… の順に書き込みます。
      ch x1 y1 lx ly "str
    
    :こんにちは
    @echo off
    REM #jww
    REM #e
    %~dp0let %0
    x = 0; y = 0
    str = "こんにちは"
    d = 45 #d = deg(atan2(ly, ly))
    text([x, y], str, d, "ch")
    
     "ch" は 省略できます。d を 省略すると d = 0 となります。
     echo("ch", x, y, lx = 1, ly = 1, "\"こんにちは") でも 同じです。
     データで書くなら
    :文字列データで書く
    @echo off
    REM #jww
    REM #0 記入する位置を指示して下さい
    REM #e
    %~dp0let %0
    print DATA.read
    __END__
    ch 0 0 1 1 "こんにちは
    
     となります。
    [ jw.rb ] は 1.ch.str で 文字列を返します。
     文字列データを変数(オブジェクト)とする便利な関数(メソッド)を揃えています。
     文字列データは 配列のほか 指示データなら 1.ch のように番号が使えます。
     文字列データ = ["ch", 0, 0, 1, 1, "こんにちは"]
     文字列データ . x      #X座標 → 0
     文字列データ . y      #Y座標 → 0
     文字列データ . lx     #X方向余弦 → 1
     文字列データ . ly     #Y方向余弦 → 1
     文字列データ . r      #文字列長 → 1.4142135623731
     文字列データ . len    #文字列長 → 1.4142135623731
     文字列データ . d      #傾角 → 0.785398163397448
     文字列データ . deg    #傾角 → 45.0
     文字列データ . str    #文字列 → "こんにちは"
    ◎指示データで 1.ch のように番号を使うなら
     1.ch . line      #下線を引く
     1.ch . circle    #◯で囲む
     all.ch . rect    #□で囲む ( all は (1..-1) を定義したものです。)
    
     マウスの指示位置に書くなら
    :マウスでこんにちは
    @echo off
    REM #jww
    REM #1%d 記入する位置を指示して下さい
    REM #99#
    REM #f 文字 = /_$A"
    REM #e
    %~dp0let %0 %*
    text ($A || "こんにちは")
    
      文字の記入は、基点の座標値[x, y] と 文字列 で
      text [x, y], "こんにちは" のようにすれば 処理できるようにしています。
      基点の座標値は、誰が考えてもあきらかなときには
      text "こんにちは" のように 省略できます。
      座標値は text 1, "こんにちは" のように 指示点番号を使うこともできます。
      文字の傾きは、傾角°で与えます。
       text "こんにちは", hk なら 傾角°は 軸角°となります。
      さらに 文字データの種別は
       text "こんにちは", hk, :c2 なら 傾角°は 軸角°となります。

     → 指示した数値を加えて結果を書き入れてみます。
    :指示した数値の足し算をする
    @echo off
    REM #jww
    REM #1%dch 数値 a を指示してください
    REM #2%dch 数値 b を指示してください
    REM #3%d   計算結果の記入位置を指示して下さい
    REM #e
    %~dp0let %0
    a = 1.str.zen_han.gsub(/,/, "").to_f
    b = 2.str.zen_han.gsub(/,/, "").to_f
    text 3, ("a + b = %.3f" % (a + b)).to_s
    
     → 単位が付いた文字は扱えません。

     指示文字の属性を取得するなら
    :指示文字の属性を取得する
    @echo off
    REM #jww
    REM #1ch 文字を指示してください
    REM #e
    
    @call %~dp0let %0
    @type jwc_temp.txt
    @pause
    @exit
    
    p 1.ch.lg # → レイヤグループ
    p 1.ch.ly # → レイヤ
    p 1.ch.lc # → 線色
    p 1.ch.lt # → 線種
    p 1.ch.cn # → 文字種[0-10]
    p 1.ch :lg, :ly, :lc, :lt, :cn # → [lg, ly, lc, lt, cn]
    p $chx[1] # → [lg, ly, lc, lt, "", cn, hcw, hch, hcd, hcc]
    
     のようにします。

    |メニューへ戻る|先頭へ戻る|



    005rect.bat 【 矩形を描く 】
      ◯始点と対頂点で矩形を描く
      
     ◯入力のイメージ
        REM #1-
        REM #2
        
     指示点データが、hp番号、座標x,y の順に書き出されます。
      hp1- x1 y1
      hp2  x2 y2
    
     ◯出力のイメージ
       rect x1, y1, x2, y2
       rect [x1, y1], [x2, y2]
    
     @始点と対頂点以外の2点の座標は
      p3 = [x3, y3]
      p4 = [x4, y4]
     内部計算します。
    
     A矩形データは、線データで書き込みます。( line ln rc )
      x1 y1 x3 y3
      x3 y3 x2 y2
      x2 y2 x4 y4
      x4 y4 x1 y1
     →頂点の座標データでも構いません。( rect | line rc )
      x1 y1
      x3 y3
      x2 y2
      x4 y4
      x1 y1
    
    :矩形を描く
    @echo off
    REM #jww
    REM #e
    %~dp0let %0
    x1 = 0; y1 = 0 #始点
    x2 = 1000; y2 = 1000 #終点
    rect(x1, y1, x2, y2)
    
     データで描くなら
    :データで矩形を描く
    @echo off
    REM #jww
    REM #e
    %~dp0let %0
    echo %(
    0 0 1000 0
    1000 0 1000 1000
    1000 1000 0 1000
    0 1000 0 0
    )
    
     あるいは
    :データで矩形を描く
    @echo off
    REM #jww
    REM #e
    %~dp0let %0
    print DATA.read
    __END__
    0 0 1000 0
    1000 0 1000 1000
    1000 1000 0 1000
    0 1000 0 0
    
     となります。
     マウスで指示するなら
    :マウスで指示して矩形を描く
    @echo off
    REM #jww
    REM #1-%d 矩形の始点を指示してください
    REM #2%d  対頂点を指示してください
    REM #e
    %~dp0let %0
    rect 1, 2
    
     → 正方形なら
    polygon 4
    
     となります。line pg 4 でも構いません。

     横寸法 500、縦寸法 1000、基点 左上 で 描くなら
    :矩形を描く(2)
    @echo off
    REM #jww
    REM #1%d 基点を指示してください
    REM #e
    %~dp0let %0
    rect [:左上, 500, 1000]
    
     のようにします。:左上 は :p7 でも構いません。
     → rect stroke(1, 500,-1000) とすることもできます。

     座標を指定して 横寸法 500、縦寸法 1000、基点 中中 で 30°回転させて 描くなら
     → 基点からのオフセット値を dx, dy = -100, -200 とする。
    :矩形を描く(3)
    @echo off
    REM #jww
    REM #0 原点を指示してください
    REM #e
    %~dp0let %0
    *c1 = [:p5, 500, 1000, -100, -200], 30
    rect [0, 0], *c1
    rect [5000, 5000], *c1
    
     のようにします。

     横寸法 500、縦寸法 1000、外枠 50、横桟の数 2、縦桟の数 2、基点 中下 で 描くなら
     → テストプログラムです。指示点があるときのみ動作します。
    :矩形を描く(4)
    @echo off
    REM #jww
    REM #1%d 基点を指示してください
    REM #3#
    REM #e
    %~dp0let %0
    rect [:p2, 500, 1000, 50, 2, 2]
    
     のようにします。

     始点から終点までの中間に等距離で描くなら
     → テストプログラムです。複数の座標を指定することができます。
    :矩形を描く(5)
    @echo off
    REM #jww
    REM #1-%d 始点を指示してください
    REM #2%d  終点を指示してください
    REM #e
    %~dp0let %0
    a, b, r, d = 1820, 120, ln.r, ln.d.deg
    rect (ln.c *(a..r).step(a).map{|x| x / r}), [:p5, b], d
    
     のようにします。
     1間(a = 1,820)おきに4寸角(b)の柱を始点から終点まで(距離 r, 傾き d)配置するプログラムです。

     [矩形データを取得する例題] 矩形に斜線を書く
     → 線(ln)・円(ci)・点(pt)・文字(ch)のように、矩形を表すコマンドはありません。
       矩形データは、線データや曲線データを jwc_temp.txt から直接読み取る必要があります。
    :矩形に斜線を書く
    @echo off
    REM #jww
    REM #h1
    REM #hc 矩形を範囲選択してください
    REM #g1
    REM #e
    
    %~dp0let %0
    
    if $lnn <= 1 && $pln == 0
      puts "heデータが見当たりません"
      exit
    end
    ln = $lnn > 0 ? ln(0..-1) : [0] #線データ
    if $pln > 0 #曲線データ
      pln = pl(1..-1)
      pln = pln[0] while pln.size == 1
      if $pln > 1
        for x in pln do for y in x do ln << y end end
      else
        for x in pln do ln << x end
      end
    end
    
    lnn = ln.size - 1
    r = 1
    r2 = 0
    pt_rect = [] #閉鎖形の頂点座標のセット
    gosa = 1e-4 * scale
    
    while r < lnn #閉鎖形を取得して、頂点座標 pt を pt_rect にセットする
      for k in r...lnn
        pt = ln[k].pt
        mk = [0] * (lnn + 1)
        mk[k] = m = 1
        jk = []
        jk << k
        for i in (k + 1)..lnn
          break if !mk[1..-1].include?(0)
          for j in (k + 1)..lnn
            next if mk[j] > 0
            if dist(pt[m], ln[j].pt.near(pt[m])) <= gosa
              pt[m += 1] = ln[j].pt.near(pt[m - 1], -1)
              mk[j] = m
              jk << j
              break
            end
          end
        end
        pt[m] = pt[0] if dist(pt[m], pt[0]) <= gosa
        break if m > 1
      end
    
      pt_rect << pt if pt.size > 3
    
      for i in jk.sort
        break if i != r
        r += 1
      end
      r += 1 if r == r2 || (pt.size == 2 && r2 == 0)
      r2 = r
    end
    
    if pt_rect.size > 0
      for i in 0...pt_rect.size
        if pt_rect[i].size == 5 #4辺
          l1 = pt_rect[i].values_at(0, 2).flatten
          l2 = pt_rect[i].values_at(1, 3).flatten
          pc = inters l1, l2
          pm1 = ln_hpsens l1, pc
          pm2 = ln_hpsens l2, pc
          pr1 = ln_hpdist l1, pc
          pr2 = ln_hpdist l2, pc
          if pm1 == -1 && pm2 == -1 && pr1.abs + pr2.abs < gosa # を除く
             line l1 if ln.include?(l1) == false
            line l2 if ln.include?(l2) == false
          end
        end
      end
    end
    
     矩形を塗りつぶすなら 青字部分を次のようにします。
            slplot pt_rect[i].values_at(0..-2)
    
     三角形なら 赤字部分を次のようにします。
        if pt_rect[i].size == 4 #3辺
          〜
        end
    

    |メニューへ戻る|先頭へ戻る|



    006lnlength.bat 【 線長(作図画面のスケール)を計測表示する 】
    :線長(作図画面のスケール)を計測表示する
    @echo off
    REM #jww
    REM #1ln 基準線を指示してください
    REM #e
    %~dp0let %0
    puts "h#L = %.06f " % lnlength
    

    |メニューへ戻る|先頭へ戻る|



    007lnslope.bat 【 線角を計測表示する 】
      jw.rb は 線データを 下図のように補正しているため
      [線角] コマンドと同じ値を返します。
             補正の必要がないときは jw.rb の設定を変更してください。
    
    
    :線角を計測表示する
    @echo off
    REM #jww
    REM #1ln 基準線を指示してください
    REM #e
    %~dp0let %0
    puts "h#∠ = %.03f ゚ " % lnslope.deg
    

    |メニューへ戻る|先頭へ戻る|



    008ptdist.bat 【 点間隔(表示画面のスケール)を計測表示する 】
    :点間隔(表示画面のスケール)を計測する
    @echo off
    REM #jww
    REM #1-%d 始点を指示してください
    REM #2%d  終点を指示してください
    REM #e
    %~dp0let %0
    puts "h#Dist = %.06f " % dist
    
    dist は 指示点、線、円 の相互の間隔を求める関数です。
      楕円の扱い方は JW_CAD [間隔] コマンド とは異なります。法線となる経路の間隔を返します。
    → 点1 と 点2 を結ぶ線の角度゚は angle.deg で返せます。

    |メニューへ戻る|先頭へ戻る|



    009cirpoi.bat 【 円を点に変換する 】
    :円を点に変換する
    @echo off
    REM #jww
    REM #h1
    REM #g1
    REM #hc 円を選択してください
    REM #e
    
    ruby -x %~f0 jwc_temp.txt
    goto:eof
    
    #!ruby -an -i.bak
    case $_
      when /^ci/
        if $F.size == 4
          puts "pt %s %s" % $F[1..2]
        else
          print
        end
      else
        if $_ =~ /^hq/ then
          puts "hd"
        else print end
    end
    __END__
    
    上記のプログラムは jw.rb を利用していません。
    → jw.rb は jwc_temp.txt を 一度、全部読み込んでしまいます。
     そのため、jwc_temp.txt を 読みながらデータを書き換える処理はできません。
     しかしながら、それなりの処理はできます。
    [ jw.rb を 利用したやりかた ]
    :円を点に変換する
    @echo off
    REM #jww
    REM #h1
    REM #g1
    REM #e
    set RUBYLIB=\jww\Lite\pro\ruby\lib
    ruby -x %~f0
    goto:eof
    #!ruby -Ks -rjw
    class String
      def except(reg)
        self.each_line do |line| #ruby-1.9.0 → each 不可
          if /^h/ !~ line
            print line if reg !~ line
          end
        end
      end
    end
    
    #jwc_temp.txt を jwc_temp に読み込む
    f = open("jwc_temp.txt","r")
      jwc_temp = f.read
    f.close
    
    jww
    hd
    jwc_temp.except(/^ci/) #ci データを除いて jwc_temp.txt を復帰する
    $ci.each_index do |i|
      point $ci[circle ci_set i][0, 2] if i > 0
    end
    reset
    __END__
    

    |メニューへ戻る|先頭へ戻る|



    010poicir.bat 【 点を円に変換する 】
    :点を円に変換する
    @echo off
    REM #jww
    REM #h1
    REM #g1
    REM #hc 点と点マーカを選択してください
    REM #bz
    REM #e
    
    ruby -x %~f0 jwc_temp.txt
    goto:eof
    
    #!ruby -an -i.bak
    case $_
      when /^pt/
        puts "ci %s %s %s" % [$F[1], $F[2], 5]
        print
      when /^pn/
        print "lc" + $_[2..-1]
        print
      else
        if $_ =~ /^hq/ then 
          puts "hd\nbz"
        else print end
    end
    __END__
    

    |メニューへ戻る|先頭へ戻る|



    011ray.bat 【 放射線 ray 】
    012xline.bat 【 構築線 xline 】
    → 関数 xline は サイズを指定すれば、十字線としても利用できます。
    :構築線 xline
    @echo off
    REM #jww
    REM #zs
    REM #e
    %~dp0let %0
    xline #:s100 ここを生かすと線の長さが 100mm(図寸) となる
    
     → 円の指示点に接線を引いてみます
    :円の指示点に接線を引く
    @echo off
    REM #jww
    REM #1ci 円・円弧を指示してください
    REM #2   点位置を指示してください
    REM #e
    %~dp0let %0
    ang = angle 1.ci, (pt = 1.ci.snap 2)
    lr = 1.ci.r #接線の長さを半径とする(接点からの長さ)
    xline pt, ang, lr, 2
    
     → angle 円データ,指示点 で 円の接線の角度が返ります。
     → 接線の角度は ang = angle 1.ci, 2 で 返ります。
       angle 1.ci, 2 は angle 1.ci.pt, 2 と 同じです。
     → xline pt, ang, lr, 1 で 法線が引けます。

    |メニューへ戻る|先頭へ戻る|



    013_2sen.bat 【 2重線 2sen 】
      ◯始点と終点で2重線と留線を描く
      
     ◯入力のイメージ
        REM #1-
        REM #2
        
     指示点データが、hp番号、座標x,y の順に書き出されます。
      hp1- x1 y1
      hp2  x2 y2
    
     REM #k 幅| 200(L) | 400(R) | 100 | 125 | 150 | 175 | 250 | 300 | 350 | /_$i=
    
     選択した 幅の番号$i が、コマンドライン引数に与えられます。
    
     ◯出力のイメージ
       dline [x1, y1], [x2, y2], w, :t50
       dline [x1, y1], [x2, y2], 100, 100 - w, :t50
       dline [[x1, y1], [x2, y2], … ], w, :t50
    
    :2重線 2sen
    @echo off
    REM #jww
    REM #1-%d 始点を指示してください
    REM #2%d  終点を指示してください
    REM #k 幅| 200(L) | 400(R) | 100 | 125 | 150 | 175 | 250 | 300 | 350 | /_$i=
    REM #e
    %~dp0let %0 $1"%*"
    dline %w(200 200 400 100 125 150 175 250 300 350)[$i].to_f, :t50
    
     :t** で 留線の出が 指定できます。**部分は 正の整数のみ扱えます。:rt** で 外側に留線が引けます。
     :g1000 で 鉄骨大梁とジョイント位置が記入できます。

    鉄筋を2重線で引いてみます。
    → 短い線は処理できません。アールに対して十分に長い場合のみ利用できます。
    → アールは鋼材の厚みや堅さによって、調整してください。
    :鉄筋を2重線で引く
    @echo off
    REM #jww
    REM #1-%d 点位置を指示してください
    REM #99#
    REM #k 鉄筋| D25(L) | D32(R) | D22 | D25 | D29 | D32 | D35 | D38 | D41 | /_$i=
    REM #e
    %~dp0let %0 $1"%*"
    dbar = %w(25 25 32 22 25 29 32 35 38 41)[$i].to_f #鉄筋径
    b1 = dbar / 2
    b2 = -b1
    dbai = 6 #アール内法径倍率 調整する必要があります
    d = dbar * dbai #アール内法径
    dline b1, b2, d
    

    |メニューへ戻る|先頭へ戻る|



    014pointmark.bat【 点マーカを打つ 】
     ◯点マーカを打つ
      
     ◯入力のイメージ
        REM #1-
        REM #99#
    
     指示点データが、hp番号、座標x, y の順に書き出されます。
      hp1- x1 y1
      hp2  x2 y2
      …
    
        REM #c マーカコード番号, 倍率 /_$1" $code, $bai =
    
     入力したマーカコード番号, 倍率が、コマンドライン引数に与えられます。
    
     ◯出力のイメージ
       pmark [x1, y1], bai, d, code
       pmark [[x1, y1], [x2, y2], … ], bai, d, code
       
     点マーカデータを、点座標x1, y1、点座標x2, y2、… の順に書き込みます。
      pt x1 y1 bai d code
    
    :点マーカを打つ 
    @echo off
    REM #jww
    REM #1%d 点位置を指示してください
    REM #99#
    REM #c マーカコード番号, 倍率 /_$1" $code, $size =
    REM #e
    %~dp0let %0 $1"$code=8" $2"$size=1" %*
    pn sxflc :red
    pmark $size, $hk, $code
    

     線を引いて、その端点に点マーカを打つなら
    :点マーカを打つ(2)
    @echo off
    REM #jww
    REM #1-%d 始点を指示してください
    REM #2%d  終点を指示してください
    REM #e
    %~dp0let %0
    line
    pmark ln, :s5
    
     のようにします。

    |メニューへ戻る|先頭へ戻る|



    015rect_sl.bat 【 矩形を描く( sl ) 】
     ◯ソリッド図形を描く
     線形ソリッド図形
    
     三角形ソリッド図形
     
     四角形ソリッド図形
      
     ◯入力のイメージ
        REM #1-
        REM #2
        …
    
     指示点データが、hp番号、座標x,y の順に書き出されます。
      hp1- x1 y1
      hp2  x2 y2
        …
    
     ◯出力のイメージ
       rect [[x1, y1], [x2, y2]], :sl
      slplot [x1, y1, x2, y2, … ]
      slplot [[x1, y1], [x2, y2], … ]
    
    :ソリッド図形で矩形を描く
    @echo off
    REM #jww
    REM #1-%d 矩形の始点を指示してください
    REM #2%d  対頂点を指示してください
    REM #e
    %~dp0let %0
    lc10 0, 255, 0
    rect :sl
    
    → line rc, :sl や polygon 4, :sl でも 描けます。( polygon 4, :sl は 動作が異なります )

     線、三角、四角、蝶形ソリッド図形 なら
    :ソリッド図形で矩形を描く(2)
    @echo off
    REM #jww
    REM #1-%d 点位置を指示してください
    REM #4#
    REM #e
    %~dp0let %0
    lc10 :lime
    slplot
    
     のようにします。( :lime :red :green :blue )

    ◣◢リボンを描くなら
     → テストプログラムです。
    :ソリッド図形で矩形を描く(3)
    @echo off
    REM #jww
    REM #1-%d 矩形の始点を指示してください
    REM #2%d  対頂点を指示してください
    REM #e
    %~dp0let %0
    lc10 :orange
    slplot [[p5 = rc[0..1].c, rc[1..2]], [p5, rc[3..4]]]
    
     のようにします。▶◀なら
    slplot rc.values_at(0, 3, 1, 2)
    
     のようにします。

    |メニューへ戻る|先頭へ戻る|



    016circle_so.bat 【 円環を描く( so, sg ) 】
     ◯円ソリッド図形を描く
      
     ◯入力のイメージ
        REM #1-
        REM #2-
        REM #3
    
     指示点データが、hp番号、座標x,y の順に書き出されます。
      hp1- x1 y1
      hp2- x2 y2
      hp3  x3 y3
    
     ◯出力のイメージ
      oval [[x1, y1], [x2, y2]], :sl
      solid :sg, [[x1, y1], [x2, y2], [x3, y3]], w, cflg
       w : 扁平率 → sg, so で 3点指示のとき負値とすると3点目で円環幅を決定する
       cflg : 円フラグ → :sg, :so のとき cflg は 内円半径 = r * cflg
    
    
    :ソリッド図形で円環( so, sg )を描く
    @echo off
    REM #jww
    REM #1-%d 円の中心点
    REM #2-%d 外側の円周上の点で円環弧の始点
    REM #3%d  内側の円周上の点で円環弧の終点
    REM #e
    %~dp0let %0
    lc10 :blue
    solid :sg, -0.8
    
     → oval :sl で 楕円のソリッド図形が描けます。

    |メニューへ戻る|先頭へ戻る|



    017jreverse.bat 【 文字を逆書きする 】
    特殊文字には対応していません。
    
    
    :文字を逆書きする
    @echo off
    REM #jww
    REM #1ch 文字を指示してください
    REM #e
    %~dp0let %0
    hd
    text 1.chx.pt, (ch_set 1).str.split("").reverse.join
    reset
    

    |メニューへ戻る|先頭へ戻る|



    018time.bat 【 時刻を書き込む 】
    :時刻を書き込む
    @echo off
    REM #jww
    REM #0 時刻を書き込む基点を指示してください
    REM #e
    %~dp0let %0
    week = %w(日 月 火 水 木 金 土)
    str = Time.now.strftime("日本時間 %Y/%m/%d %H:%M:%S (") +
          week[Time.now.strftime("%w").to_i] + ")"
    text str
    

    |メニューへ戻る|先頭へ戻る|



    019circross.bat 【 円に+を記入する 】
    :円に+を記入する
    @echo off
    REM #jww
    REM #h1
    REM #g1
    REM #hc 円を選択してください
    REM #e
    %~dp0let %0
    l = 2.5.scale
    (ci 1..-1).each do |ci|
    	xline ci.pt, ci.d.rad, l #中心点
    	if ci.w != 1
    		xline ci.f, ci.d.rad, l #焦点
    	end
    end
    

    |メニューへ戻る|先頭へ戻る|



    020fukusen.bat 【 複線を引く(直線) 】
    :複線を引く
    @echo off
    REM #jww
    REM #1ln 線を指示してください
    REM #2   複写する点を指示してください
    REM #e
    %~dp0let %0
    line fukusens
    
     → fukusens は 円弧、文字列、曲線にも対応しています。包絡処理はできません。

     数値を指定して両側に引くなら
    :複線を引く(2)
    @echo off
    REM #jww
    REM #1ln 線を指示してください
    REM #e
    %~dp0let %0
    d = (angle 1.ln) + PI / 2
    line (fukusens 1.ln, (polarto 1.ln.c, 100, d))
    line (fukusens 1.ln, (polarto 1.ln.c,-100, d))
    
     あるいは
    line (lnmove 1.ln, 100), (lnmove 1.ln,-100)
    
     のようにします。

    曲線なら
    :複線を引く(3)
    @echo off
    REM #jww
    REM #h1
    REM #g1
    REM #hc【 曲線 】 曲線を選択して下さい
    REM #e
    %~dp0let %0
    d = (angle (pl 1)[0]) + PI / 2
    line (fukusens 1.pl, (polarto (pl 1)[0].c, 100, d))
    line (fukusens 1.pl, (polarto (pl 1)[0].c,-100, d))
    
     のようにします。

    |メニューへ戻る|先頭へ戻る|



    021inters.bat 【 交点(直線) 】
    本稿の最初に紹介した例題です。
    ここでは、maxima を 利用して直線の式から交点を求めます。
    → maxima は 数式処理システムのフリーウェアです。
    @2直線の式を
       y = m1 * x + b1  ・・・ (1)
       y = m2 * x + b2  ・・・ (2)
    とします。
     m1, m2 は それぞれの直線の勾配です。
     b1, b2 は y 軸 と それぞれの直線の交点の y 座標の値(y 切片)です。
    
    A直線 (1) と (2) の 交点 [xc, yc] は
      ひとつの直線 [x1, y1, x2, y2]
        y = y1 + m1 * (x - x1), m1 = (y2 - y1) / (x2 - x1)
        y | x=0 → b1 = y1 - m1 * x1
    と
      もうひとつの直線 [x3, y3, x4, y4]
        y = y3 + m2 * (x - x3), m2 = (y4 - y3) / (x4 - x3)
        y | x=0 → b2 = y3 - m2 * x3
    で 勾配 m1, m2 と y 切片 b1, b2 が 決まれば
        xc = (     b2 -      b1) / (m1 - m2)  ・・・ (3)
        yc = (m1 * b2 - m2 * b1) / (m1 - m2)  ・・・ (4)
    で 求められます。
    
    Bmaxima は (1),(2)式 を解いて 交点を 求めることができます。
     → 直接、方程式を解くため (3),(4)式 は 不要です。
    
    ◯このとき
    ・2直線の勾配の差 m1-m2 がゼロとなるときは 重なっているか 平行です。処理できません。
    ・m1-m2 は 実際には 誤差があるため 小さな値となるときをゼロとみなす処理が必要です。
    
    :交点(直線)
    @echo off
    REM #jww
    REM #1%dln 線を指示してください
    REM #2#
    REM #e
    set RUBYLIB=\jww\Lite\pro\ruby\lib
    ruby -x %~f0
    goto:eof
    
    #!ruby -Ks -rjw
    m1 = 1.ln.m
    b1 = 1.ln.y - m1 * 1.ln.x
    m2 = 2.ln.m
    b2 = 2.ln.y - m2 * 2.ln.x
    if (m1 - m2).abs > 1e-10 then
      f = open "| maxima --very-quiet > jwc_temp.txt", "w"
        f.print <<-Jw
          d : solve([y = m1 * x + b1, y = m2 * x + b2], [x, y])$
          pt : ev(d, m1 = #{m1}, b1 = #{b1}, m2 = #{m2}, b2 = #{b2})$
          [xc, yc] : ev([x, y], pt)$
          printf(true, "pt ~,15g ~,15g\n", xc, yc)$
          quit()$
        Jw
      f.close
      sleep 2 #2sec 処理の終了を待つ
    else
      jww; puts "h# 計算できません "
    end
    
    → 1.ln.m で 線1の勾配を返します。

    |メニューへ戻る|先頭へ戻る|



    022interdeg.bat 【 交角(直線) 鋭角/左回りが正 】
    → 線1と線2の交点 pc と それぞれの指示点側の線の端点 p1, p2 より 鋭角∠(pc → p1),(pc → p2) を返す。
    :交角(直線)
    @echo off
    REM #jww
    REM #1%dln 線を指示してください
    REM #2#
    REM #e
    %~dp0let %0
    puts "h#∠ %s゚ " % interdeg
    

    |メニューへ戻る|先頭へ戻る|



    023hd.bat 【 画面表示のデータを全部消去する 】
    :画面表示のデータを全部消去する
    @echo off
    REM #jww
    REM #h4 データ選択をしない、読取可能データ書き出し
    REM #g1
    REM #e
    %~dp0let %0
    hd
    

    |メニューへ戻る|先頭へ戻る|



    024arc_l.bat 【 楕円弧の長さ(表示画面のスケール)を計測表示する 】
    :楕円弧の長さ(表示画面のスケール)を計測表示する
    @echo off
    REM #jww
    REM #1ci 長さを計測する円・円弧を指示してください
    REM #e
    %~dp0let %0
    puts "h#Lr = %.06f " % cilength
    
     → 1.ci.clength でも構いません。
    [ 参考資料 ]
        xr, yr = polar(rx, rad(p1), w)
     
     関数 cislope で
       av = cislope([0, 0, rx, p1, p2, w, d = 0], [xr, yr], :per) → 法線角
       ah = cislope([0, 0, rx, p1, p2, w, d = 0], [xr, yr], :tan) → 接線角
      得ることもできます。
    

    |メニューへ戻る|先頭へ戻る|



    025lemunis.bat 【 レムニスケートを描く 】
     → 2点 1, 2 を 結ぶ線の 角度 と 距離 は (hp 1, 2).ln :d, :r で 返します。
       V.1.04.09 から利用できます。
    :レムニスケート
    @echo off
    REM #jww
    REM #1-%d 始点を指示してください
    REM #2%d  終点を指示してください
    REM #e
    %~dp0let %0
    f = proc {|r, p| r * cos(p) * sqrt(1.0 - 0.5 * sin(p) ** 2)}
    g = proc {|r, p| r * cos(p) * sin(p) / sqrt(2.0)}
    n = 100 #分割数
    d, r = (hp 1, 2).ln :d, :r
    p = 2 * PI / n
    for i in 0..n do
      echo move(1, f.call(r, p * i), g.call(r, p * i), d)
    end
    
    
    
    :放物線
    @echo off
    REM #jww
    REM #1-%d 中心軸の始点を指示してください
    REM #2%d 中心軸の終点を指示してください
    REM #3%d 中心軸からの高さを指示してください
    REM #e
    %~dp0let %0
    a = ptdist(1, 2) #幅
    b = ln_hpdist((hp 1, 2), 3) #高さ
    d = ptslope(1, 2) #中心軸の傾き
    for t in (-1..1).step(0.1)
      x = a * t
      y = b * t * t
      echo(move(1, (a - x) / 2, b - y, d))
    end
    
     懸垂線は for 〜 end を以下のように書き換えてください。
    for t in (-1..1).step(0.1)
      x = a * t
      y = b * cosh(t / 0.5672963)
      echo(move(1, (a - x) / 2, b + (b - y) / 2, d))
    end
    
     座屈後の棒の変形は楕円積分を利用して解くことができます。
    
    
    REM #jww エラスチカ
    REM #1-%d 変形前の棒の始点を指示してください
    REM #2%d 変形前の棒の終点を指示してください
    REM #e
    
    %~dp0let %0
    
    def E(p,g=nil)
      return g ? ee(p,g) : ee(PI/2,p)
    end
    def F(p,g); return ee(p,g,1) end
    def K(g); return ee(PI/2,g,1) end
    
    g = gear(-60) #g = [k, m, e, h] ガウス積分のセット
    l = ptdist(1, 2) #棒の長さ
    d = ptslope(1, 2) #棒の傾き
    
    for al in (0..165).step(15) do
      g[0] = k = sin(al.rad / 2)
      a = l / (2 * K(g))
      for t in (-90..90).step(10) do
        p = t.rad
        s = a * (K(g) - F(p,g))
        x = 2 * a * (E(g) - E(p,g)) - s
        y = 2 * a * k * cos(p)
        echo(moveto(1, x, y, d))
      end
      puts
    end
    

    |メニューへ戻る|先頭へ戻る|



    026lnmark.bat 【 線の端点をマークする 】
    → ソリッド図形で端点に矢印を描きます。
    :線の端点に矢印を記入する
    @echo off
    REM #jww
    REM #1ln 線を指示してください
    REM #e
    %~dp0let %0
    d = ((pt, = 1.ln :near, :snap)).deg
    arrow pt, d
    
    027arcmark.bat 【 楕円弧の端点をマークする 】
      size は 矢印の外側斜面の長さです。
      
    
    :楕円弧の端点に矢印を記入する
    @echo off
    REM #jww
    REM #1ci 円・円弧を指示してください
    REM #e
    %~dp0let %0
    size = 5 #矢印の長さ( 図寸 )
    xang = 45 #矢印の交角( ゚ )
    xan2 = 120 #矢尻の交角( ゚ )
    pt, a = cipoint(1, pm = ci_hpends(1))
    w = 1.ci.w
    d = 1.ci.d
    d = d + dconv(rad(a), w).deg - 90 * pm
    arrow pt, d, size, xang, xan2
    

    |メニューへ戻る|先頭へ戻る|



    028lncross.bat 【 直交線を引く 】
     → 線1の 両端、始点、終点、中点 は 1.ln :pt, :p1, :p2, :c で 返します。
       V.1.01.40 から利用できます。
     指示線と同じ長さの直交線を、始点、終点、中点のうち 指示点に近い点を中心にして引きます。
      
      @線1の始点[x1, y1]、終点[x2, y2]、中点[x3, y3]を
          [1.ln.p1, 1.ln.p2, 1.ln.c]
        あるいは
          1.ln :p1, :p2, :c
        として
          [[x1, y1], [x2, y2], [x3, y3]]
        のセットで返し、そのうち、点1に近い点を
          pt = [[x1, y1], [x2, y2], [x3, y3]].near 1
        で計算します。
      A線1の中心を @で求めた点 pt に合わせ、PI / 2 回転させます。
    
    :直交線を引く
    @echo off
    REM #jww
    REM #1ln 線を指示してください
    REM #e
    %~dp0let %0
    pt = (1.ln :pt, :c).near 1
    l = 1.ln.r / 2
    d = 1.ln.v
    xline pt, d, l, pm = 1
    
     → 直交線の長さを指定するときは、こうします。
    l = 10.scale
    

    |メニューへ戻る|先頭へ戻る|



    029step.bat 【 階段を割り付ける 】
      
    
    :階段を割り付ける
    @echo off
    REM #jww
    REM #1-%d 始点を指示してください
    REM #2%d  終点を指示してください
    REM #c 段数 = 
    REM #e
    @call %~dp0set "n" "%*" %~dpn0.txt
    %~dp0let %0
    n = 12 if (n = ENV["n"].to_i) < 1
    w, h = ln.w $hk
    a, b = h / n, (n > 1 ? w / (n - c = 1) : w)
    K 1, 1
    n.times { echo 90 + $hk, a, "\n", $hk, b }
    

    |メニューへ戻る|先頭へ戻る|



    030jish.bat 【 一筆書きでH形鋼断面を描く 】
    → H形鋼の対称性 と 円弧を含む連続線データを利用しています。
    → ruby は 配列の連結が [1, 2] + [3, 4] → [1, 2, 3, 4] のように できるので便利です。
      
    
    :一筆書きでH形鋼断面を描く
    @echo off
    REM #jww
    REM #0 基点を指示してください
    REM #c 寸法  H-AxBxCxDxR(mm) =
    REM #e
    
    @call %~dp0set "s" "%*" %~dpn0.txt
    %~dp0let %0
    
    def jish(h, b, t, t2, r = 0, d = $hk, p0 = 7)
      pt = [
          [t / 2    , h / 2 - t2 - r],
          [t / 2 + r, h / 2 - t2],
          [b / 2    , h / 2 - t2],
          [b / 2    , h / 2]
      ]
      pt += mirror(pt.reverse, :x)
      pt += mirror(pt.reverse, :y) + [pt[0]]
      pt = rot(moveto(pt, offset(b, h, p0)), d.rad)
      pt.each_index do |i|
        echo pt[i]
        larc(pt[i..i+1], 90) if i.to_s =~ /^[068]$|^14$/ && r > 0
      end
    end
    
    s = ENV["s"] || "H-400x200x8x13x13"
    s = s.zen_han.upcase.gsub(/^H-?/i, "").gsub(/・/, "/")
    
    jish *s.chomp.split(/[\/ X\,]/).to_f
    

    |メニューへ戻る|先頭へ戻る|



    032keisen.bat 【 罫線を引く 】
    :罫線を引く
    @echo off
    REM #jww
    REM #0 罫線を引く基点を指示してください
    REM #zs
    REM #e
    
    %~dp0let %0
    
    bz
    lc 9
    lt 9
    w, h = hzs
    yp, div = 5, 2
    n = ((h - 50) / yp).to_i
    x = w / div - 50
    for i in 0...n
      y = -yp * i
      [0, y, x, y].line
    end
    

    |メニューへ戻る|先頭へ戻る|



    051gethk.bat 【 軸角を取得する 】
    :軸角を取得する
    @echo off
    REM #jww
    REM #e
    %~dp0let %0
    puts "h#hk=%s゚ " % hk
    

    |メニューへ戻る|先頭へ戻る|



    052geths.bat 【 スケールを取得する 】
    :スケールを取得する
    @echo off
    REM #jww
    REM #e
    %~dp0let %0
    puts "h#S=1/%s " % hs
    

    |メニューへ戻る|先頭へ戻る|



    071calc.bat 【 電卓を開く 】
      ◎ start calc の場合は
      電卓を開くと同時に print "hd" が実行され、外部変形は終了します。
      ◎ start /wait calc としたときは
      電卓を閉じた後に print "hd" が実行されます。
    :電卓を開く
    @echo off
    REM #jww
    REM #e
    %~dp0let %0
    Thread.start{`start calc`}
    hd
    
      → この処理は MS-DOS の コマンドで処理できます
    :電卓を開く
    @echo off
    REM #jww
    REM #e
    start calc
    echo hd > jwc_temp.txt
    
      WSH の SendKeys コマンドで (1 + 2) * 3 を 計算するなら
    :(1 + 2) * 3 を 計算する
    @echo off
    REM #jww
    REM #0 答えを記入する位置を指示してください
    REM #e
    %~dp0let %0
    WshShell = WIN32OLE.new("WScript.Shell")
    WshShell.AppActivate("電卓") || WshShell.Run("calc")
    sleep 0.5
    WshShell.SendKeys "1{+}2~*3~"
    sleep 0.5
    WshShell.SendKeys "^c"
    sleep 0.1
    Clipboard.GetText.Paste
    
     となります。

    |メニューへ戻る|先頭へ戻る|



    072jww.bat 【 図面を開く 】
    :図面を開く
    @echo off
    REM #jww
    REM #e
    %~dp0let %0
    Thread.start{`start 木造平面例.jww`}
    hd
    
      → この処理は MS-DOS の コマンドで処理できます
    :図面を開く
    @echo off
    REM #jww
    REM #e
    start 木造平面例.jww
    del jwc_temp.txt
    
      WSH を 利用するなら
    :図面を開く
    @echo off
    REM #jww
    REM #e
    ruby -x %~f0
    goto:eof
    
    #!ruby -Ks -rwin32ole
    WshShell = WIN32OLE.new("WScript.Shell")
    WshShell.Exec("/jww/jw_win.exe 木造平面例.jww")
    __END__
    
     となります。

    |メニューへ戻る|先頭へ戻る|



    あとがき

     本稿で利用している ruby というプログラム言語はフリーウェアですが 複素
    数からマトリクス演算まで扱えます。maxima や gnuplot を利用すれば 方程式
    を解いたり、グラフを描いたりもできます。maxima や gnuplot も フリーウェ
    アです。インターネットに接続しているパソコンさえあれば 世界中の人が誰で
    も自由に利用できます。便利な時代になったものです。

     開けてもびっくりしなかったでしょう。外部変形を これ以上簡単にしてどう
    なるものでもないのかもしれません。それでも より少ない労力でプログラムで
    きれば より多くの方々が JW_CAD を利用できるようになると信じています。

     ruby から jscript で あいさつです。
    #& set path=D:\Program Files\ruby-1.9\bin; & ruby -Ks %0 & goto:eof
    `\
      start mshta \
      \"\
      javascript:\
        new ActiveXObject(\"WScript.Shell\").Popup(\"ようこそ!\");\
        close()\
      \"\
    `
    
     → .Popup(\"#{RUBY_VERSION}\") で ruby の ヴァージョンを確認できます。

     alias で オリジナルのコマンドが作れます。
    REM #jw alias
    REM #1-
    REM #2
    REM #e
    
    %~dp0let %0
    
    alias H line
    alias E circle
    alias L point
    alias P hp
    
    H E L P 1, 2
    


     健康第一!! またお会いいたしましょう。

    | 前へ | 表紙へ |いろはにruby外部変形|rubyJWW ライブラリ コマンドリファレンス|