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

 はじめに
 jw.rb は JW_CAD 外部変形用ライブラリ で 作図の基本動作のコマンド集です。
 AUTOCAD の AUTOLISP のような機能を JW_CAD に提供しようという試みです。
 画面のレイアウトを換えるようなことはできませんが 作図を支援する関数は豊富に揃えたつもりです。
 では、古くて新しい外部変形のツール を 理屈抜きで ご覧ください。
  [ jw.rb の 特徴 ]
  @外部変形機能のコマンド は すべて図形として扱える
  A入力ファイル jwc_temp.txt の 自動読み取り機能 がある
  B指示点・座標、線、円、文字データは hp、ln、ci、ch で 評価できる
  C標準出力を jwc_temp.txt にする関数 jww がある
  Dバッチコマンド REM #〜 文 を 読み取って評価する関数 run がある
  E作図コマンド point、line、circle、text … は 自動読み取り機能とリンク している
  F座標、線、円、点、文字データは 配列(Array) あるいは 文字列(String) で扱える
  座標 = [1,2] = "1 2" あるいは [[1,2],[3,4]] = ["1 2","3 4"] = "1 2\n3 4\n"
  線 = [1,2,3,4] = "1 2 3 4"
  円 = [1,2,3] = "ci 1 2 3"
  点 = [1,2,0,0,0] = "pt 1 2" あるいは "pt 1 2 0 0 0"
  文字 = ["ch",1,2,0,0,"str"] = "ch 1 2 0 0 \"str"
 → jw.rb は 外部変形を 愉快に使いこなす ツールです。すべて ruby で書かれています。
 [ jw.rb の 川柳 ] ruby は 日本語を話すイメージ で書け あいまいな表現 や 意味のない表現 も できます。
 p [3,4].r →「ピタゴラスの定理の外部変形」。5.0。
 p 3*("D25".a :cm2) →「3-D25の断面積」。オプションで。
 p "H400x200".rot(30.rad).jiku.deg  →「30゚ 傾いたH鋼の主軸の角度は 30゚」。動作確認。
 line 1.ci.div 5 →「指示円弧1の弧長を5等分した点を結んで線を引く」。円なら line (1.ci.div 5), :c 。
 circle 1.ln, :d →「指示線1を直径とする円を描く」。circle x1, y1, x2, y2, :d とも。
 p "ci 0 0 10 0 180 1 0".area.gy  → 「半円の図心の位置を得る」。円弧は弓形で。
 plot rc sqrt("ci 0 0 50".area.a) → 「円と同じ面積の正方形を描く」。円の平方根。
 plot $select_data.move →「選択した図形を指示点に貼り付ける」。戻る で ぱっと消える。
 → 本稿に紹介するプログラムは ruby-1.8.7、ruby-1.9.3 で動作を確認しています。
 [ 参考資料 ] jw.rb が全般にわたって参考とした資料です。
 @AUTOCAD GX-5 コマンドリファレンス / オートデスク社
 AABC's of AutoLISP / George Omura著 吉木一彦訳
 BRuby プログラミング入門 / 原信一郎著
 Cプログラミング Ruby / デビッド・トーマス+アンドリュー・ハント著 田和勝訳
 DJw_cad 4 徹底解説 リファレンス編 / Jiro Shimizu + Yoshifumi Tanaka著
 E建設技術者の数学 / 鎌谷秀男・芦田謙二共著
 FLite & Seen Lite の 外部変形プログラム

 それでは、外部変形の古くて新しい種の蒔き方と育て方を紹介します。
 → jw.rb V.1.07.31 で 動作を確認しています。

| 前へ | 表紙へ |rubyJWW ライブラリ プログラム例|rubyJWW ライブラリ コマンドリファレンス|

  • ♪ Lite & Seen Lite は みんなの道具。


    目 次



    jw.rb の 原点

     jw.rb の 原点
     JW_CAD 外部変形機能は ユニークな作図法です。世界中のCADに「標準装備」されてないことが不思議なほど便利な機能です。
     「線 [マウス] 点 …」で 直線を引くとき、スクリプトは「線 [座標] 点 …」とできるのが この機能の特徴です。
    
    ◎点を結ぶ線を引くプログラム例
    
    
    
     ◯jw.rb で 外部変形
    :線を引く
    @let %0
    REM #jww
    REM #1-%d 点を指示してください
    REM #99#
    REM #e
    line hp 1..99
    
     ◯AUTOLISP風 に アレンジ
    :線を引く
    @let %0
    REM #jww
    REM #1-%d 点を指示してください
    REM #99#
    REM #e
    alias command send
    alias getpoint hp
    command "line", (getpoint 1..99)
    
     ◯Vector Script風 に 書く
    :線を引く
    @let %0
    REM #jww
    REM #1-%d 点を指示してください
    REM #99#
    REM #e
    alias RUN eval
    prog =<<-Procedure
    begin
      line hp 1..99
    end
    Procedure
    RUN(prog)
    
     高級なCADほど、スクリプトは、わざわざ、面倒な、前置き や あとがき がなければ動かないようになっているで、一般のユーザーは、なかなか、扱えません。  よくよく考えれば、まぬけな仕様です。「線 [マウス] 点 …」で 線が引くなら、スクリプトも「線 [座標] 点 …」と書けるほうが便利です。  ただ、外部変形には おおきな問題がありました。線を引くコマンドから作る必要があったのです。それでも、作ってしまえば便利だろうと思ったわけです。  さて  外部変形の図形要素 線、円、点・座標、文字 は (x1 y1 x2 y2)、(ci x y r)、(pt x y)・(x y)、(ch x y lx ly "ようこそ!) です。線の色 lc や 種類 lt や 太さ lw は、属性として、はっきりと区別されます。  図形は 要素と属性の組み合わせ [lc1, lt2, (x1 y1 x2 y2), (ci x y r), pn3, (pt x y), cn4, (ch x y lx ly "ようこそ!)] です。外部変形が 直観的に扱えるのは この単純さです。  JWW_SMPL.BAT(外部変形機能の例題と解説書) で 線データ は
      ◎線データ
    %lg %lg %lg %lg           ( x1  y1 x2  y2 )
    
     とされ、jw.rb では
      ◯線データ
    (Array)  [x1, y1, x2, y2]
    (String) "%g %g %g %g" % [x1, y1, x2, y2]
    
     となります。円、弧・楕円データ は
      ◎円データ
    ci %lg %lg %lg                        ( x y r )
      ◎弧・楕円データ
    ci %lg %lg %lg %lg %lg %lg %lg            ( x y r 始角 終角 偏平率 軸角 )
    
     とされ、jw.rb では
      ◯円データ
    (Array)  [x, y, r]
    (String) "ci %g %g %g" % [x, y, r]
      ◯弧・楕円データ
    (Array)  [x, y, r, 始角, 終角, 偏平率, 軸角]
    (String) "ci %g %g %g %g %g %g %g" % [x, y, r, 始角, 終角, 偏平率, 軸角]
    
     となります。jw.rb では 座標 を
      ◯座標
    (Array)  [x, y]
    (String) [x, y].join(" ")
    (String) "%g %g" % [x, y]
      ◯座標のセットによる図形
    (Array)  [[x1, y1], [x2, y2], … ]
    (String) [[x1, y1], [x2, y2], … ].join(" ")
    (String) "%g %g\n"*(ary = [[x1, y1], [x2, y2], … ]).size % ary.flatten
    
     のように扱います。  つぎのように使います。 @ 図形は配列と文字列で
          線 (x1 y1 x2 y2)
    
     ◯画面の中央を始点として X軸方向に長さ 1000mm の 線   [0, 0, 1000, 0]   あるいは "0 0 1000 0" ◯線長 [0, 0, 1000, 0].len ◯線角 "0 0 1000 0".deg
    円 (ci x y r)
     ◯画面の中央を中心点として 半径 500mm の 円   [0, 0, 500]   あるいは "ci 0 0 500" ◯円周長 [0, 0, 500].len ◯面積、質量、断面2次モーメント s = "ci 0 0 500".area a = s.a :cm2 m = s.mass ix = s.ix :cm4  ◯楕円弧長 p "ci 0 0 50 30 120 0.5 0".len #→ 71.2242683391026 p ("ci 0 0 50 30 120 0.5 0".pg 360).len #→ 71.2242456036429 等角度分割 p ("ci 0 0 50 30 120 0.5 0".div 360).len #→ 71.2242421186579 等距離分割  ◯図心(半円) p "ci 0 0 10 0 180 1 0".area.gy #→ 4.24413181578388
    座標 (x y)
     ◯線を座標で表現する   ln [0, 0], [1000, 0]   あるいは ln "0 0", "1000 0" ◯円を座標で表現する ci [0, 0], [500, 0] ci [0, 0], 500.0 #半径は実数とする   あるいは ci "0 0", "500 0" ci "0 0", 500.0 ◯矩形 1000x1000 の頂点の座標 rc [-500,-500], [500, 500] → [[-500, -500], [500.0, -500.0], [500, 500], [-500.0, 500.0], [-500, -500]] 周長、断面2次モーメント s = rc [-500,-500], [500, 500] l = s.len :cm ix = s.ix :cm4 iy = s.iy :cm4  ◯面積(三角形、右回りが正) p "0 0 3 4 3 0".area.a #→ +6.0 p "0 0 3 0 3 4".area.a #→ -6.0
    図形の編集 倍率 bai(x,y)

    JIS 規格の形鋼 (断面図形) / jw.rb + jis_kata.rb + JisJkata_dic.rb(Seen Lite S) 座標と円・円弧データ(楕円・楕円弧可)で形鋼の断面図形が扱えます。 /^(R|D|X|FB|C?[LSB]?[HT]|B|BOX|□|RB|BB|P|PIPE|◯|○|\[|I|[LHF]?L|BPL|L?[CUZ]|CZ|HUT|PFC)\s*-?\s*\d/i
     ◯H形鋼の断面図形   H [400, 200]   あるいは   "H-400x200"  ◯H形鋼の断面図を描く   plot "H-400x200"  ◯H形鋼の断面性能を計算する   s = "H-400x200".area p s.a :cm2 #→ -83.3707084154333 p s.mass #→ -65.4460061061151 kg/m p s.len :cm #→ 156.168140899333 p s.ix :cm4 #→ -23456.6201041621 p s.iy :cm4 #→ -1735.70670495946
    A 作図作業のイメージでプログラム plot triangle +3.0, 4.0, 5.0 で 辺長 3, 4, 5 の 三角形をプロットする プログラムを考えます。
    :triangle
    @let %0
    REM #jw
    def triangle a, b, c
      l1 = [0, 0, a, 0] #原点からX軸方向 a の 線 を 底辺 とする
      if (pc = inters [0, 0, b.abs], [a, 0, c.abs]).flatten.size == 4
        #頂点 pc は a が 正値なら 底辺 l1 の 正領域、負値なら 負領域 にあるとする
        return ln hp l1, (mens(l1, pc[0]) > 0 ? pc[0] : pc[1]), [0, 0]
      else
        print "h#三角形にはなりません\n"
        retrn l1, [0, 0, b.abs], [a, 0, c.abs]
      end
    end
    by 100
    plot triangle +3.0, 4.0, 5.0
    
     この例のように、不確定な条件(三角形の位置)を推定して描画することを「幾何制約」というようです。 B 作図コマンドを外部変形で再現  JW_CAD は 扁平率(アスペクト比)を与えると 2点で楕円が描けます。もちろん 外部変形でも 簡単に描けます。
    :ellipse
    @let %0
    REM #jw
    REM #1-
    REM #2
    w = 0.5 #扁平率(アスペクト比)
    #楕円の主軸はXY軸、指示点1を中心点とし 指示点1と2で半径 を 決める
    plot [1.x, 1.y, hp.w(hk, w).r, 0, 360, w, hk]
    
    C plot は 汎用の作図コマンド  plot は 図形も扱える 汎用の作図コマンドです。図形要素にもそれぞれ line、circle、point、text があります。専用コマンドは 自動読み取り機能とリンク しているので
    :専用コマンドは自動読み取り機能とリンク
    @let %0
    REM #jw
    REM #1-
    REM #2
    text (line circle point), "ようこそ!"
    
     のように引数がなければ 指示点を引数として処理します。ruby は コマンド を 直列にも、並列(見た目)にも 書けることがわかります。変数を定義する必要もありません。  さてさて  作図作業をイメージすれば プログラムができると便利です。アイデア と 知識 と 経験 が 必要となるアプローチです。jw.rb は エディタで図面を引くための補助ツールです。


    |先頭へ戻る|

    jw.rb を インストールする

      jw_cad と ruby を あらかじめインストールしておいてください。
      jw_cad は http://www.jwcad.net/ の 「ダウンロード」から入手できます。
      ruby は http://www.ruby-lang.org/ja/ の 「ダウンロード」から入手できます。
      → 本稿では Windows版Rubyバイナリ mswin32版 を利用しています。
      
      jw.rb のダウンロードは ここ 「jw.rb外部変形」 からできます。
      rubyscript.zip が ダウンロードされます。自動解凍後、下図の反転部分に jw.rb があります。
    
    

      ダウンロードされた jw.rb を 下図のように ruby のフォルダへコピーしてください。
      これで jw.rb のインストールは完了です。
      → 下図は mswin32版 のフォルダ構成です。
    
    
    → 例題が実行できないときは、バッチファイルを浅いフォルダに移動してください。
    → ruby-1.8.7 や ruby-1.9 では site_ruby のほか vendor_ruby というフォルダが用意されています。
      jw.rb は site_ruby か vendor_ruby の どちらかに 置いてください。


    |先頭へ戻る|


    jwc_temp.txt を 読み取る

      jw.rb は jwc_temp.txt を 自動的に読み取ります。
      → データ一覧表

    自動 読み取り機能
     JW_CAD 外部変形機能は (jwc_temp.txt に出力される)入力データを自動的に読み取ることはできません。これが、外部変形を非常に使いずらいものにしています。
     jw.rb は jwc_temp.txt や バッチファイル を 自動的に読み取ることで、使いづらさを解消しています。
    ◎書き込みデータ jwc_temp.txt の 自動読み取り機能 があります。
     指示点を入力して座標値を表示してみます。
    
    :自動読み取り機能
    @echo off
    REM #jw
    REM #1
    set RUBYLIB=\jww\Lite\pro\ruby\lib
    ruby -Ks -rjw -e "p (hp 1)" & pause
    (出力画面)
    [-1234.56789012345, 1234.56789012345]
    続行するには何かキーを押してください . . .
    
     指示点は hp、指示線は ln、指示円は ci、指示文字は ch で返します。  → jw.rb を site_ruby か vendor_ruby フォルダに置けば RUBYLIB は 不要です。 ◎バッチファイル の 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 にセットされます。 ◎標準出力を jwc_temp.txt とするコマンド jww があります。
    jww
    text "はじめまして"
    
     で はじめまして が
    jww
    line "0 0 1000 0"
    
     で 1m の 線 が jwc_temp.txt に 書き出されます。  出力結果は jww_close すると $jww_data[] に セットされます。
    jww_close
    p $jww_data
    (出力結果)
    ["ch 0 0 1 0 \"はじめまして", "0 0 1000 0"]
    
    ◯バッチファイルから ruby や jw.rb を 隠すことができます。  本稿では let.bat を jw_win.exe のあるフォルダに置いてあると想定して書いています。  → jw.rb を site_ruby か vendor_ruby フォルダに置けば RUBYLIB は 不要です。
    @echo off
    set run=run
    if /i %1==norun (set run=#&shift /1)
    if /i %1==nojww (set nojww=%1&shift /1)
    if not exist %1 (
      echo バッチファイルが見当たりません
      echo @let %0 %* で 起動してください
      pause
      exit
    )
    set RUBYLIB=\jww\Lite\pro\ruby\lib
    ( echo %run% '%~1'
      findstr /iv "^[@:%%] ^REM" %1
    ) | ruby -Ks -rjw - %*
    
     let %0 のときに $stdout = open("jwc_temp.txt", "w") となります。  let nojww %0 で $stdout を デフォルト値(画面出力)のままにしておけます。  let norun %0 で REM #:〜 に書いたプログラムを評価しなくなります。$stdout は デフォルト値のままです。
    |先頭へ戻る|

    hp 指示点・座標
     指示点の座標値は 配列 $hp に 指示番号で 保存されます。hp は $hp を扱う関数です。
    :hp
    @let nojww %0 & pause & exit
    REM #jww
    REM #1 点を指示
    REM #e
    x1, y1 = hp 1
    p ["REM #1 ==>", x1, y1, $hp[1]]
    指示点データは 点( x y ) の座標で定義されています。
    REM #[指示番号](ln|ci|ch)? 文 で それぞれ
      基点(挿入点) は REM #[0-99]   で hp[1-99] x y (#0 は [0, 0] で 出力されない)
      指示線       は REM #[1-99]ln で hp[1-99]ln x y
      指示円・円弧 は REM #[1-99]ci で hp[1-99]ci x y
      指示文字列   は REM #[1-99]ch で hp[1-99]ch x y
    が jwc_temp.txt に 書き出されます。
    
    
    
    指示点は 番号をつけて 配列 $hp に座標値 [x, y] を保存します。線・円・文字列の指示点も 同じように 配列 $hp に保存します。指示点の座標値は $hp[指示番号] で取得します。
    [ 外部変形の座標系 ]
    外部変形には 座標系が 4種類あります。
     1)用紙中央を 原点( 0 0 ) とする
     2)用紙左下を 原点( 0 0 ) とする
     3)指示点 0 を 原点( 0 0 ) とする
     4)データを範囲選択するとき 図心?を原点( 0 0 ) とする
    
    座標は 縮尺 によって値が変わりますが、軸角の影響は受けません。
    座標の単位は mm です。
    
    $hp[1] は 表示画面の( 縮尺による )座標値です。
    
    座標値 [x, y] は $hp[1] のほか
     x, y = hp 1
    で求めることができます。すべての値 $hp[1..-1] は
     [x1, y1], [x2, y2], … = hp 1..-1
    あるいは
     [x1, y1], [x2, y2], … = hp 1..99
    で返します。
    このとき
     hp 1..-1
    は
     hp
    で構いません。
    
    $hp[0] は 原点で [0, 0] を返します。
     [0, 0] = hp 0
    
    "指示番号hp" を hp(エッチピー)指標 と呼びます。
     1.hp → "1hp"
    で返します。座標値 [x, y] は
     x, y = 1.hp.hp
    でも得られる仕組みです。指示点データは 座標値や指標のほか
    指示番号も使えるように工夫しています。
     1.hp
    は
     1
    で構いません。
    
    x 座標は
     x1 = 1.x = [x1, y1].x
    y 座標は
     y1 = 1.y = [x1, y1].y
    指示番号 1 と 2 の中点は
     hp(1, 2).c
    距離は
     hp(1, 2).r
    傾きは
     hp(1, 2).d
    のようにして求めることができます。
    → hp(-1) で 末尾のデータが得られます。
    → hp(1).y = 123 とすると $hp[1] が変更されてしまいます。
      pt = hp(1).dup; pt.y = 123 のような使い方をしてください。
    
    y, x 座標は
     y, x = 1.hp :y, :x
    のようにして求めることもできます。
    
    hp は hp 1 と 1.hp で 座標(図形) と 指標(指示番号) を 使い分けます。
    
    [ 特殊な機能 ]
    hp の 引数 で 整数 は 指示番号、実数 は 座標値 として 処理されます。
    →  hp 1, 2.0 のように 整数と実数を与えると すべて実数 と みなされます。
    
    hp 1, 2       → [[x1, y1], [x2, y2]]
    hp 2, 1       → [[x2, y2], [x1, y1]]
    hp 1, 2, 3, 4 → [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]
    hp 1..4       → [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]
    (1..4).hp     → ["1hp", "2hp", "3hp", "4hp"]
    [1, 2 … ].hp → [[x1, y1], [x2, y2] … ]
    [1].hp        → [x1, y1]
    hp 0          → [0, 0]
    hp 1.0, 2.0   → [1.0, 2.0]
    hp 1.0, 2.0, 3.0 → [[1.0, 2.0], [3.0, 1.0]]
    hp 1, 2, 3, 4.0  → [[1.0, 2.0], [3.0, 4.0]]
    hp [x1, y1], [x2, y2, x3, y3] → [[x1, y1], [x2, y2], [x3, y3]]
    hp [[[x1, y1], [x2, y2]], [[x3, y3], [x4, y4]]] → [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]
    
    '1'.hp → [x1, y1] hp 1.ln → [[x1, y1], [x2, y2]] (hp ln、hp ci、hp ch は 端点を返します)
    hp → [[x1, y1], [x2, y2], [x3, y3], [x4, y4]] のとき hp.x → [x1, x2, x3, x4] hp.y → [y1, y2, y3, y4] hp.x y2 → [[x1, y2], [x2, y2], [x3, y2], [x4, y2]]
    座標を文字列(String)で与えることができるようになりました。
    hp "1 2 3 4"  → [[1.0, 2.0], [3.0, 4.0]]
    hp "1 2\n3 4\n"  → [[1.0, 2.0], [3.0, 4.0]]
    hp "1 2 3 4 5 6" → [[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]]
    hp "1 2", "3 4", "5 6" → [[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]]
    "1 2 3 4".hp  → [[1.0, 2.0], [3.0, 4.0]]
    "1 2\n3 4\n".hp  → [[1.0, 2.0], [3.0, 4.0]]
    "1 2 3 4 5 6".hp → [[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]]
    作図コマンド point、line、circle、text … は hp と リンク しています
    point hp       == point  → hp は 省略できます
    line hp        == line
    circle hp, 5.0 == circle 5.0
    text hp, "ようこそ!" == text "ようこそ!"
    
    座標 が 下記のような文字列なら hp が 使えます
    [SVG : http://www.hcn.zaq.ne.jp/___/SVG11-2nd/shapes.html#LineElement : polyline 要素の例題 から 引用]
      points="50,375
              150,375 150,325 250,325 250,375
              350,375 350,250 450,250 450,375
              550,375 550,175 650,175 650,375
              750,375 750,100 850,100 850,375
              950,375 950,25 1050,25 1050,375
              1150,375"
      line hp points.gsub(/,/," ")
    
    |先頭へ戻る|

    ln 線データ
     線データは 配列 $ln に 番号順に 保存されます。ln は $ln を扱う関数です。
    :ln
    @let nojww %0 & pause & exit
    REM #jww
    REM #1ln 線を指示
    REM #e
    x1, y1, x2, y2 = ln 1
    p ["REM #1n ==>", x1, y1, x2, y2, $ln[1]]
    
    線データは 始点( x1 y1 ) と 終点( x2 y2 ) の座標で定義されています。
    jwc_temp.txt には
      hp[1-99]ln x y  ← 指示線のときは 指示点の座標が書き出される
      #
      属性(lg, ly, lc, lt)
      hhp[1-99]ln  ← 指示線のときは指示番号が書き出される
       x1 y1 x2 y2
    が書き出されます。座標は 縮尺 によって値が変わりますが、軸角の影響は受けません。
    
    
    
    指示線は指示番号で配列 $ln に保存し、選択データは選択順に番号を付けて格納します。 画面では( a )図のように見える線ですが ( b )図のように データは2通り考えられます。 線データは $ln[指示番号 あるいは 選択順の番号] で取得します。
    jw.rb は jwc_temp.txt を 読み込むときに ( c )図のように
    指示線データを 線の角度 が -89.999゚ 〜 90゚ となるように始点と終点を入れ替えています。
    
    → 読み込み時に 線の描き順を揃えて 角度の計算が楽になる? ようにしています。
    
    $ln[1] は 線1の作図画面の( 縮尺による )データです。
    
    データの縮尺が混在する場合、表示画面の縮尺に揃えて計算すればプログラムは混乱しません。
    線1の表示画面のデータ [x1, y1, x2, y2] は
     x1, y1, x2, y2 = ln 1
    として求めることができます。
    
    REM #bz とすると $ln[1] も ln 1 も 図面寸法 となり 縮尺の影響は受けません。
    
    "線番号ln" を ln(エルエヌ)指標 と呼びます。
     1.ln     → "1ln"
    で返します。表示画面のデータ [x1, y1, x2, y2] は
     1.ln.ln
    で得られる仕組みです。
    
    x1 座標は
     $ln[1].x1  ← 作図画面の縮尺のデータ
    y2 座標は
     ln(1).y2  ← 表示画面の縮尺のデータ
    始点 p1 は
     1.ln.p1  ← 表示画面の縮尺のデータ
    終点 p2 は
     1.ln.p2  ← 表示画面の縮尺のデータ
    線長 は
     1.ln.r  ← 表示画面の縮尺のデータ
    線角 は
     1.ln.d  ← ラジアン
    のようにして求めることができます。
    
    線の中点や端点は
     中点, 始点, 終点 = 1.ln :c, :pt
    で返せます。また、データから直接
     中点, 始点, 終点 = [x1, y1, x2, y2].ln :c, :pt
    あるいは
     中点, 始点, 終点 = "0 0 1000 1000".ln :c, :pt
    として返すこともできます。
    
    [ データの変更 ]
    つぎのようにして、データを変更すると
     ln(1).x1 = 123
    線1のデータ $ln[1] が変更されてしまいます。
     ln1 = ln(1).dup
     ln1.x1 = 123
    のような使い方をしてください。
    
    V.1.01.72 で
     $ln[1] => 1.ln.lnx あるいは 1.lnx あるいは lnx 1
    となる関係を用意しました。ただし 1.ln.lnx, 1.lnx は 線角が -89.999°〜 90°となるように始点と終点が補正されます。
    
    [ 属性 ]
    レイヤグループは
     1.ln.lg
    レイヤは
     1.ln.ly
    線色は
     1.ln.lc
    線種は
     1.ln.lt
    で返します。
    
    [ 特殊な機能 ]
    
    (1..4).ln    → ["1ln", "2ln", "3ln", "4ln"] : 範囲 を引数としたときは線データの指標を返す
    [1, 2・・・].ln → ["1ln", "2ln"・・・]
    [1].ln       → ["1ln"]
    [[x1, y1], [x2, y2]].ln → [x1, y1, x2, y2]
    [1, 2, 3, 4.0].ln → [1, 2, 3, 4.0] : 要素数が4個で実数が1つ以上あるとき
    '1'.ln       → [x1, y1, x2, y2]
    1.ln :c, :r  → 線1の中点と線長[[x, y], r]を返す
    [1..2].ln.p1 → 線1,2の始点[[x1, y1], [x2, y2]]を返す
    ln 1, 2      → [[x1, y1, x2, y2], [x3, y3, x4, y4]]
    ln hp 1, 2   → [x1, y1, x2, y2]
    ln hp 1, 2, 3→ [[x1, y1, x2, y2], [x2, y2, x3, y3], ・・・]
    ln [[x1, y1], [x2, y2]] → [x1, y1, x2, y2]
    ln [x1, y1], [x2, y2] → [x1, y1, x2, y2]
    ln [x1, y1], [x2, y2], [x3, y3] → [[x1, y1, x2, y2], [x2, y2, x3, y3]]
    ln 0         → [0, 0, 0, 0]
    hp 1.ln      → [[x1, y1], [x2, y2]]
    hp 1, 2.ln, 1→ [[x1, y1], [x2, y2], [x3, y3], [x1, y1]]
    ln x1, y1, x2, y2 → "x1 y1 x2 y2" : パラメータを実数で与えたとき
    座標、線データを文字列(String)で与えることができるようになりました。
    ln "1 2 3 4"    → [1.0, 2.0, 3.0, 4.0]
    ln "1 2\n3 4\n" → [1.0, 2.0, 3.0, 4.0]
    ln "1 2", "3 4" → [1.0, 2.0, 3.0, 4.0]
    ln "1 2 3 4 5 6"       → [[1.0, 2.0, 3.0, 4.0], [3.0, 4.0, 5.0, 6.0]]
    ln "1 2\n3 4\n5 6\n"   → [[1.0, 2.0, 3.0, 4.0], [3.0, 4.0, 5.0, 6.0]]
    ln "1 2", "3 4", "5 6" → [[1.0, 2.0, 3.0, 4.0], [3.0, 4.0, 5.0, 6.0]]
    パラメータ(引数)を実数で与えるとき puts (ln x1, y1, x2, y2) は line x1, y1, x2, y2 に 対応 するようにしています。
    |先頭へ戻る|

    ci 円データ
     円データは 配列 $ci に 番号順に 保存されます。ci は $ci を扱う関数です。
    :ci
    @let nojww %0 & pause & exit
    REM #jww
    REM #1ci 円を指示
    REM #e
    x1, y1, r = ci 1
    p ["REM #1ci ==>", x1, y1, r, $ci[1]]
    円データは 座標と半径 ( 中心座標x y 半径r ) で
    円弧データは 座標と半径などのパラメータ ( x y r 始角p1 終角p2 扁平率w 傾角d ) で定義されています。
    円・円弧データの コマンドは ci です。
    jwc_temp.txt には
      hp[1-99]ci x y  ← 指示円・円弧のときは 指示点の座標が書き出される
      #
      属性(lg, ly, lc, lt)
      hhp[1-99]ci  ← 指示円・円弧のときは指示番号が書き出される
      ci x y r     ← 円弧のときは ci x y r p1 p2 w d
    が書き出されます。座標は 縮尺 によって値が変わりますが、軸角の影響は受けません。
    円弧は ( b )図のように 始点と終点を 右回りでも左回りでも 描くことができますが 円弧データは
    左回りとして 始角と終角 を定義しています。この補正は jw_cad が jwc_temp.txt へ書き込むときに
    自動的におこなわれます。円弧データは 始点と終点の区別ができません。注意してください。
    
    
    
    指示円・円弧は指示番号で配列 $ci に保存し、選択データは選択順に番号を付けて格納します。 ( b )図の円弧データは まったく同じとなります。 → jw_cad が jwc_temp.txt へ 円弧データを書き込むとき 始角と終角の値は 0゚〜360゚ とされます。 円データは $ci[指示番号 あるいは 選択順の番号] で取得します。
    $ci[1] は 円1の作図画面の( 縮尺による )データです。
    
    データの縮尺が混在する場合、表示画面の縮尺に揃えて計算すればプログラムは混乱しません。
    円1の表示画面のデータ [x, y, r] あるいは [x, y, r, p1, p2, w, d] は
     x, y, r = ci 1
     x, y, r, p1, p2, w, d = ci 1
    として求めることができます。
    
    REM #bz とすると $ci[1] も ci 1 も 図面寸法 となり 縮尺の影響は受けません。
    
    "円番号ci" を ci(シーアイ)指標 と呼びます。
     1.ci     → "1ci"
    で返します。円データは
     1.ci.ci
    で得られる仕組みになっています。
    
    x 座標は
     $ci[1].x  ← 作図画面の縮尺のデータ
    y2 座標は
     ci(1).y2  ← 表示画面の縮尺のデータ
    中心 は
     1.ci.pt  ← 表示画面の縮尺のデータ
    半径 は
     1.ci.r  ← 表示画面の縮尺のデータ
    始角 p1 は
     1.ci.p1  ← °
    終角 p2 は
     1.ci.p2  ← °
    半径 は
     1.ci.r  ← 表示画面の縮尺のデータ
    円周・弧長 は
     1.ci.clength  ← 表示画面の縮尺のデータ
    のようにして求めることができます。
    
    中心、半径、始角、終角を
     中心, 半径, 始角, 終角 = 1.ci :pt, :r, :p1, :p2 → [[x, y], r, p1, p2]
    で返せます。また、データから直接
     中点, 半径, 始角, 終角 = [x, y, r, p1, p2, w, d].ci :pt, :r, :p1, :p2 → [[x, y], r, p1, p2]
    あるいは
     中心, 半径, 始角, 終角 = "ci 0 0 500 0 360 1 0".ci :pt, :r, :p1, :p2 → [[0, 0], 500, 0, 360]
    として返すこともできます。
    
    範囲選択したすべての円・円弧の中心点は
     ci(1..-1).pt → [[x1, y1], [x2, y2], ・・・ ]
    で得られます。
    
    [ データの変更 ]
    つぎのようにして、データを変更すると
     ci(1).r = 123
    円1のデータ $ci[1] が変更されてしまいます。
     ci1 = ci(1).dup
     ci1.r = 123
    のような使い方をしてください。
    
    [ 属性 ]
    レイヤグループは
     1.ci.lg
    レイヤは
     1.ci.ly
    線色は
     1.ci.lc
    線種は
     1.ci.lt
    で返します。
    
    [ 特殊な機能 ]
    
    (1..4).ci    → ["1ci", "2ci", "3ci", "4ci"] : 範囲 を引数としたときは円データの指標を返す
    [1, 2・・・].ci → ["1ci", "2ci"・・・]
    [1].ci       → ["1.ci"]
    [1, 2, 3.0].ci → [1, 2, 3.0] : 要素数が3個か7個で実数が1つ以上あるとき
    '1'.ci       → [x, y, r, p1, p2, w, d]
    ci 1, 2      → [[x1, y1, r1, p11, p12, w1, d1], [x2, y2, r2, p21, p22, w2, d2]]
    ci hp 1, 2   → [x, y, r]
    ci [[x1, y1], [x2, y2]] → [x1, y1, r = hypot(x2 - x1, y2 - y1)]
    ci [x1, y1], [x2, y2] → [x1, y1, r = hypot(x2 - x1, y2 - y1)]
    ci hp(1, 2), :d → [x, y, r, p1, p2, w, d] : 指示点1,2を直径とする
    ci 0         → [0, 0, 0, 0, 0, 1, 0]
    ci ln 1      → [1.ln.c.x, 1.ln.c.y, 1.ln.r / 2]
    ci [x1, y1, x2, y2] → [(x1+x2)/2, (y1+y2)/2, r = hypot((x2-x1)/2, (y2-y1)/2)]
    ci x1, y1, r → "ci x1 y1 r" : パラメータを実数で与えたとき
    ci x1, y1, x2, y2 → "ci x1 y1 r = hypot(x2 - x1, y2 - y1)" : パラメータを実数で与えたとき
    座標、円データを文字列(String)で与えることができるようになりました。
    ci "ci 1 2 3"   → [1.0, 2.0, 3.0]
    ci "1 2 3 4"    → [1.0, 2.0, 2.82842712474619]
    ci "1 2\n3 4\n" → [1.0, 2.0, 2.82842712474619]
    ci "1 2", "3 4" → [1.0, 2.0, 2.82842712474619]
    ci "1 2 3 4", "5 6 7 8" → [[[1.0, 2.0, 5.65685424949238], [1.0, 2.0, 8.48528137423857]],
                                [[3.0, 4.0, 2.82842712474619], [3.0, 4.0, 5.65685424949238]]]
    パラメータ(引数)を実数で与えるとき puts (ci x1, y1, r) puts (ci x1, y1, x2, y2) は circle x1, y1, r circle x1, y1, x2, y2 に 対応 するようにしています。
    |先頭へ戻る|

    ch 文字列データ
     文字列データは 配列 $ch に 番号順に 保存されます。ch は $ch を扱う関数です。
    :ch
    @let nojww %0 & pause & exit
    REM #jww
    REM #1ch 文字列を指示
    REM #e
    p ["REM #1ch ==>", c, x1, y1, lx, ly, str, $ch[1]]
    
    文字列データは コマンド c[hvsroptkz2] と パラメータ ( 基点座標x y 長さlx ly "文字列 ) で定義されています。
    jwc_temp.txt には
      hp[1-99]ch x y  ← 指示文字列のときは 指示点の座標が書き出される
      #
      属性(lg, ly, cn, cc)
      hhp[1-99]ch  ← 指示文字列のときは指示番号が書き出される
      c[hvsroptkz2] x y lx ly "文字列
    が書き出されます。座標は 縮尺 によって値が変わりますが、軸角の影響は受けません。
    
    
    
    指示文字列は指示番号で配列 $ch に コマンドとパラメータ を保存し、選択データは選択順に番号を付けて格納します。
    
    
    文字列の基点(基準点)は cc コマンドで変更できます。指示データの基点は REM #zc で書き込まれます。 文字列データは $ch[指示番号 あるいは 選択順の番号] で取得します。
    $ch[1] は 文字列1の作図画面の( 縮尺による )データです。
    
    データの縮尺が混在する場合、表示画面の縮尺に揃えて計算すればプログラムは混乱しません。
    文字列1の表示画面のデータ ["ch", x, y, lx, ly, str] は
     "ch", x, y, lx, ly, str = ch 1
    として求めることができます。
    
    REM #bz とすると $ch[1] も ch 1 も 図面寸法 となり 縮尺の影響は受けません。
    
    "文字番号ch" を ch(シーエッチ)指標 と呼びます。
     1.ch     → "1ch"
    で返します。文字列データは
     1.ch.ch
    で得られる仕組みになっています。
    
    x 座標は
     $ch[1].x  ← 作図画面の縮尺のデータ
    y 座標は
     ch(1).y  ← 表示画面の縮尺のデータ
    文字列は
     1.ch.str
    文字列の長さは
     1.ch.r  ← 表示画面の縮尺のデータ
    文字列の傾きは
     1.ch.d  ← ラジアン
    のようにして求めることができます。
    
    [ データの変更 ]
    つぎのようにして、データを変更すると
     ch(1).str = "123"
    文字列1のデータ $ch[1] が変更されてしまいます。
     ch1 = ch(1).dup
     ch1.str = "123"
    のような使い方をしてください。
    
    [ 属性 ]
    レイヤグループは
     1.ch.lg
    レイヤは
     1.ch.ly
    文字種は
     1.ch.cn
    で返します。
    
    [ 特殊な機能 ]
    
    (1..4).ch    → ["1ch", "2ch", "3ch", "4ch"]
    [1, 2・・・].ch → ["1ch", "2ch"・・・]
    [1].ch       → ["1ch"]
    '1'.ch       → ["ch", x, y, lx, ly, str]
    ch 1, 2      → [["ch", x1, y1, lx1, ly1, str1], ["ch", x2, y2, lx2, ly2, str2]]
    ch 1, 2, 3, 4→ [["ch", x1, y1, lx1, ly1, str1], ・・・ , ["ch", x4, y4, lx4, ly4, str4]]
    ch 1..4      → [[["ch", x1, y1, lx1, ly1, str1]], ・・・ , [["ch", x4, y4, lx4, ly4, str4]]]
    ch 0         → ["ch", 0, 0, 1, 0, ""]
    ch x, y, lx, ly, '\"str' → "ch x y lx ly \"str" : パラメータを実数で与えたとき
    [ 文字列だけが必要なとき ] ch(1..-1).str で 文字列だけの配列を返します。 1.str は ch(1).str と同じです。 [ 文字属性 ]
      
    
    [ SXF対応拡張の文字属性 ]  SXFの線属性を利用して 線色は予備線色 17 〜 256 で任意色を設定しておけば cn0 w h d c の c = 117 〜 356 で 利用できます。
    cn "0 5 5 1 117"
    cn "<#{Font.msgothic}>/"
    text 1, "ようこそ! 煙の出ない玉手箱です。"
    
      
    

    |先頭へ戻る|


    $select_data 選択データ
     選択データは 配列 $select_data に 保存されます。
    :$select_data
    @let nojww %0 & pause & exit
    REM #jww
    REM #h1
    REM #g1
    REM #e
    p $select_data
      jwc_temp.txt で # 以降の指示・選択データ が $select_data[] に 1行づつ String で セットされます
    
      [ 選択データ、図形 を 編集する 関数 ]
      erase  : 指定したデータを消去する(試作段階)
      change : 指定したデータを変更する(試作段階) → 出力あり
      [ 選択データ、図形 を 変換する 関数 ]
      ・平行移動 → 図形' = mov(図形, 数値位置x, y)
      ・回転     → 図形' = rot(図形, 回転角) : 原点まわりの回転
              → 図形' = rotate(図形, 回転中心x, y, 回転角) : 任意点まわりの回転
      ・拡大縮小 → 図形' = bai(図形, 倍率x, y)
      ・反転     → 図形' = mrr(図形, 反転条件)
      ・せん断   → 図形' = skw(図形, せん断角x, y)
      ただし、文字は座標のみです。ブロック図形は扱えません。
      ・組み合わせ
        図形' = skw(mrr(bai(rot(mov(図形, 数値位置x, y), 回転角), 倍率x, y), 反転条件), せん断角x, y)
        あるいは
        図形' = 図形.mov(数値位置x, y).rot(回転角).bai(倍率x, y).mrr(反転条件).skw(せん断角x, y)
      [ 選択データ、図形 を 出力する 関数 ]
        plot $select_data
        plot 図形'
    
     範囲選択で一度にデータを処理するとき バッチコマンドの指定 REM #〜 には十分に注意してください。属性が失われることがあります。
    :線色 2 から 線色 8 に 変更する @let %0 REM #jw REM #h1 REM #g1 REM #e hd change "lc2", "lc8" reset

    |先頭へ戻る|


    線を引く

      線を引く 出力関数 line を考えます。
      2点の座標は 1, 2 のほか hp 1, 2 とすることができます。

    [ 204line.bat ]
    
    
    :【 線を引く 】 @let %0 REM #jww REM #1- 始点を指示してください REM #2 終点を指示してください REM #e line hp 1, 2
    [ 説明 ]
    指示点1と指示点2は 1, 2 あるいは 1..2 や [1, 2] のほか
    座標値 x1, y1, x2, y2 や [x1, y1], [x2, y2] で与えることができます。
    
    hp 1, 2 は [[x1, y1], [x2, y2]] と同じです。
    また、指示点1と指示点2 は省略して line でも構いません。
    
    → hp 1, 2, 3・・・ は
        [[x1, y1], [x2, y2], [x3, y3]・・・]
    → つぎのようなものは、線データとして扱えます。
        1.ln (ln指標)
        1, 2 (hp指標, hp指標)
        hp 1..-1
        ln hp 1, [x3, y3], 2, [x4, y4], 1
        [x1, y1, x2, y2]
        [x1, y1], [x2, y2]
        [x1, y1], [[x2, y2], [x3, y3]・・・]
        [x1, y1, x2, y2, x3, y3, x4, y4・・・]
        [[x1, y1, x2, y2], [x3, y3, x4, y4]・・・]
        [[x1, y1], [x2, y2], [x3, y3], [x4, y4]・・・]
        [[[x1, y1], [x2, y2]], [[x3, y3], [x4, y4]]・・・]
    
    [ 応用実験 ] 三角形を描くプログラムです。 [ 206triangle.bat ]
    
    
    :【 三角形を描く 】 @let %0 REM #jww REM #1- 1点を指示してください REM #2- 2点を指示してください REM #3 3点を指示してください REM #e line hp 1..3, 1
    → line :c とすることもできます。 [ 応用実験(2) ] 複線を引くプログラムです。 [ 241fukusen_1-2.ln.bat ]
    
    
    :【 複線 】 @let %0 REM #jww REM #1- 始点を指示してください REM #2 終点を指示してください REM #3 複写する点を指示してください REM #e line fukusens (hp 1, 2), 3
    [ 応用実験(3) ] 点から線へ向けて垂線を引くプログラムです。 [ 207suisen.bat ]
    
    
    :【 点と線の垂線 】 @let %0 REM #jww REM #1 ○点を指示 REM #2ln ●線を指示 REM #e line suisens 1, 2.ln
    [ 参考 ] → JW_CAD のコマンドで 点から線へ垂線を引く手順は @「/」コマンドで 始点を指示する A 垂線を降ろす線を右ドラッグして「鉛直・円周点」を選ぶ 以上です。 [ 線属性 ]  線色 lc ・ 線種 lt は 半角の空白をひとついれて 下記のように指定します。
    lc 3
    lt 2
    
      
    
    [ SXF対応拡張の線属性 ]  SXFの線属性を利用して 線色は予備線色 17 〜 256 で任意色を設定しておけば lc 117 〜 lc 356 で利用できます。  線種も同様に 予備線種 17 〜 32 を設定しておけば lt 47 〜 lt 62 で利用で きます。  → レイヤ ly や 線幅 lw は | rubyJWW ライブラリ コマンドリファレンス | を参照してください。
      
    


    |先頭へ戻る|


    長さと角度

     線や円の長さと角度を返す関数 r と d の使用例です。

    [ 213lnlength.bat ], [ 215lnslope.bat ]
      
    
    :【 線の長さ 】 @let %0 REM #jww REM #1ln 線を指示 REM #e comment 1.ln.r
    • REM #1ln は 線( 1 )を指示するコマンドです。
    • jww は 標準出力を jwc_temp.txt に変更する関数です。
    • r は 線や円の長さを返す関数です。
    • comment は コメントを表示するメソッドです。 指示線の長さ は スケールを考慮した値を返します。 1.ln.r  は clength(ln 1)  あるいは lnlength 1  と 書くこともできます。 作図画面( 線を作図しているレイヤグループ )の線の長さは 1.lnx.r  あるいは clength $ln[1]  で 与えられます。
    :【 線の角度 】 @let %0 REM #jww REM #1ln 線を指示 REM #e d = 1.ln.d.deg - hk d -= 180 if d > 90 d += 180 if d <= -90 d = 90 if angle_eq?(d.abs, 90, 1e-5) comment cround( d, 10 ),'゚'
    • REM #1ln は 線(1)を指示するコマンドです。
    • deg は 角度( rad ) を ( ゚ ) に変換するメソッドです。
    • hk は 軸角( ゚ )です。
    • jww は 標準出力を jwc_temp.txt に変更する関数です。
    • cround は 数値を丸める関数です。
    • comment は コメントを表示するメソッドです。 1.ln.d.deg  は 1.ln.deg  や angle(ln 1).deg  あるいは (lnslope 1).deg  と 同じです。  → 角度は 作図画面の座標値 $ln[1] で計算しても同じです。


    |先頭へ戻る|


    交点と交角

      線の交点、線の交角を返す関数 inters と interdeg を用意しています。
      → inters は 円の交点にも 対応しています。( 円弧は円として扱われます )

    [ 217lninters.bat ]
    
    
    :【 線の交点 】 @let %0 REM #jww REM #1ln 線(1)を指示 REM #2ln 線(2)を指示 REM #e comment point inters 1.ln, 2.ln
    • REM #1ln は 線1 を 指示するコマンドです。
    • jww は 標準出力を jwc_temp.txt に変更する関数です。
    • inters は 交点を返す関数です。
    • point は 点を出力するメソッドです。
    • comment は コメントを表示するメソッドです。 inters 1.ln, 2.ln  は inters((ln 1), (ln 2))  と 同じで 表示画面の座標値で計算します。

    [ 218lninterdeg.bat ]
    
    
    :【 線の交角 】 @let %0 REM #jww REM #1ln 線(1)を指示 REM #2ln 線(2)を指示 REM #e comment interdeg 1.ln, 2.ln
    • REM #1ln は 線1 を指示するコマンドです。
    • jww は 標準出力を jwc_temp.txt に変更する関数です。
    • interdeg は 線の交角を返す関数です。
    • comment は コメントを表示するメソッドです。 interdeg 1.ln, 2.ln  は interdeg( [(ln 1), (hp 1)], [(ln 2), (hp 2)] )  と 同じで 表示画面の座標値で計算します。


    |先頭へ戻る|


    中心と端点など

      線や円の中心や近傍端点を返す関数は便利です。

    [ 219hpcenters.bat ]
    
    
    :【 2点の中心 】 @let %0 REM #jww REM #1- ○点(1)を指示 《中心線(点−点)》 REM #2 ●点(2)を指示 REM #e line centers 1, 2
    • REM #1 は 点1 を指示するコマンドです。
    • jww は 標準出力を jwc_temp.txt に変更する関数です。
    • centers は 中心線を返す関数です。
    • line は 線を出力するメソッドです。 centers 1, 2  は centers( (hp 1), (hp 2) )  と 同じで 表示画面の座標値で計算します。

    [ 221lncenters.bat ]
    
    
    :【 2線の中心 】 @let %0 REM #jww REM #1ln ○線(1)を指示 《中心線(線−線)》 REM #2ln ●線(2)を指示 REM #e line centers 1.ln, 2.ln
    • jww は 標準出力を jwc_temp.txt に変更する関数です。
    • centers は 中心線を返す関数です。
    • line は 線を出力するメソッドです。 centers 1.ln, 2.ln  で 線(1)と線(2)の交角の2等分線を返します。

    [ 220cir_3poi.bat ] 3点を通る円を描くプログラムは centers を利用すれば簡単です。
    
    
    :【 3点円 】 @let %0 REM #jww REM #1- 点(1)を指示 《3点》 REM #2- 点(2)を指示 REM #3 点(3)を指示 REM #e circle (inters (centers 1, 2), (centers 2, 3)), 1
    • jww は 標準出力を jwc_temp.txt に変更する関数です。
    • centers は 中心線を返す関数です。
    • inters は 交点を返す関数です。
    • circle は 円を出力するメソッドです。
      → circle hp 1, 2, 3 や circle でも可   → 3線に接する円    circle (inters (centers 1.ln, 2.ln), (centers 2.ln, 3.ln)), 1.ln

    線と点の関係を扱う関数はとても便利です。
    → 円と点の関係にも同様の関数が用意されています。
    
    
      ○線と点の相対位置の考え方 / 建設技術者の数学 P.64 より 点 = [x, y] 直線 = [x1, y1, x2, y2] 始点 = [x1, y1] 終点 = [x2, y2] 直線の方程式 F(x, y) = (y - y1) * (x2 - x1) - (y2 - y1) * (x - x1)    F(x, y) = 0 となる 点 [x, y] の 集合 が 直線となる    F(x, y) > 0 となる 点 [x, y] は 直線の正領域(上)にある    F(x, y) < 0 となる 点 [x, y] は 直線の負領域(下)にある
      [ 関連 ]
    • ln_hpsnap は 線の吸着点を返す関数です。
    • ln_hpdist は 線と点の最短距離を返す関数です。( 線の 下 は 負値-、上 は 正値+ )
    • ln_hpnear は 指示点近傍の線の端点を返す関数です。
    • ln_hpends は 線の端点の判別値を返す( 線の 左 -1 か 右 +1 かの判別 )関数です。
    • ln_hpsens は 線の吸着点の判別値を返す( 線の 内 -1 か 外 +1 かの判別 )関数です。
    • ln_hpmens は 線と点の相対位置の判別値を返す( 線の 下 -1 か 上 +1 かの判別 )関数です。
    • lnpoint は 線 ln の 始点 pm=-1, 終点 pm=1 の点の座標を返す関数です。
      [ インデックス(ln指標)を利用するやり方 ] 1.ln.near 1.ln.dist 2 1.ln.ends 1.ln.sens 2 1.ln.mens 2 1.ln.c → 中心点 1.ln.p1 あるいは 1.ln.pt -1 → 始点 1.ln.p2 あるいは 1.ln.pt 1 → 終点 1.ln.pt あるいは 1.ln.pt 2 → 始点 終点
    • lnextend は 線を伸縮する関数です。
    • lnbreak は 線を分割あるいは部分消去する関数です。
    • div は 分割点を返す関数です。


    |先頭へ戻る|


    点や線の移動

     点や線を移動する関数 moveto と polarto と rotate の説明です。
    [ 点の移動 ]
    
    
    • moveto は 点や線 を 相対距離で 移動する関数です。
    • polarto は 点や線 を 極座標値で 移動する関数です。
    • rotate は 点や線 を 基点で 回転移動する関数です。
     円 や 文字 あるいは 図形 も 扱えます。

    [ 244rotate_1-2.ln.bat ]
     → 複写コマンドで「回転角」と「基点変更」を設定し「連続」で作業を繰り返すことに相当します。
    
    
    :【 線の回転複写 】 @let %0 REM #jww REM #1- 始点を指示してください REM #2 終点を指示してください REM #3 複写する基点を指示してください REM #c 360゚回転複写する個数 = /_$1" REM #e n = $_1 || 6 d = 2 * PI / n for i in 0...n line rotate(hp(1, 2), 3, d * i) end


    |先頭へ戻る|


    実験プログラム

    文字を逆書きするプログラムです。

    [ 301reverse.bat ]
    
    
    :【 文字を逆書きする 】 @let %0 REM #jww REM #1ch 文字を指示してください REM #e hd 1.str = 1.str.split("").reverse.join #ruby-1.8 で 全角対応 #1.str.reverse! #ruby-1.8 半角○ 全角×、ruby-1.9 問題なし text chx ch_set 1 reset
    全角文字と半角文字が混在しても構いません。1.str は 1.ch.str と同じ。
    


    |先頭へ戻る|

    線を交点で分割するプログラムです。

    [ 312lnbreak.bat ]
      
    
    :【 線を交点で分割する 】 @let %0 REM #jww REM #1ln◇基準線(1)の指示 REM #2ln◇基準線(2)の指示 REM #e pc = inters 1.ln, 2.ln hd line (lnbreak 1, pc).lnx ln_set 1 line (lnbreak 2, pc).lnx ln_set 2 reset
    → 「線記号変形」と「外部変形」の違いがよくわかる例題です。
    [ 線記号変形で線を交点で分割する例 ]
    
    2                  交点で線切断
    110  01  -12   0     0   0
    101  10    0   0    12   0
    220  02    0  -8     0   0
    202  20    0   0     0   8
    999
    


    |先頭へ戻る|


    あとがき

     JW_CAD 外部変形 なら エディタで図面が書けます。「図面が引ける」なら「図面を書きましょう」。

     jw.rb は 直観的にプログラムする方法 を提案したつもりです。
     さらには 外部変形の作図と編集コマンドの標準仕様 のようなものを提案しているつもりです。

     jw.rb は エディタで図面を書くための 基礎研究の成果 です。JW_CAD 外部変形 には AutoLisp や PostScript あるいは SVG(VML) などにはない 軽量感とわかりやすさがあります。絵は描けませんが、図面は書けます。
     泥臭くても わかりやすいプログラムが書けます。例えば
      x1, y1, x2, y2 = ln line point hp 1, 2
    なら、指示点1と2を結ぶ線を引き、両端に点を打って、その線の座標値を返す作業になります。もうひとつ
      plot (ln rc "0 0 300 500").move hp 1, 2
    なら、指示点1と2にそれぞれ 300x500 の 矩形 を描く作業になります。


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

    | 前へ | 表紙へ |rubyJWW ライブラリ プログラム例|rubyJWW ライブラリ コマンドリファレンス|