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) で扱える→ jw.rb は 外部変形を 愉快に使いこなす ツールです。すべて ruby で書かれています。座標 = [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 は 日本語を話すイメージ で書け あいまいな表現 や 意味のない表現 も できます。 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 の 外部変形プログラム
| 前へ | 表紙へ |rubyJWW ライブラリ プログラム例|rubyJWW ライブラリ コマンドリファレンス|
JW_CAD 外部変形機能は ユニークな作図法です。世界中のCADに「標準装備」されてないことが不思議なほど便利な機能です。 「線 [マウス] 点 …」で 直線を引くとき、スクリプトは「線 [座標] 点 …」とできるのが この機能の特徴です。◎点を結ぶ線を引くプログラム例高級な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(外部変形機能の例題と解説書) で 線データ は◯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)◎線データ %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)A 作図作業のイメージでプログラム plot triangle +3.0, 4.0, 5.0 で 辺長 3, 4, 5 の 三角形をプロットする プログラムを考えます。
◯画面の中央を始点として 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: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 は エディタで図面を引くための補助ツールです。
→ 例題が実行できないときは、バッチファイルを浅いフォルダに移動してください。![]()
◎書き込みデータ 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 @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]]座標を文字列(String)で与えることができるようになりました。
'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]]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 @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 @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 @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 @let nojww %0 & pause & exit REM #jww REM #h1 REM #g1 REM #e p $select_datajwc_temp.txt で # 以降の指示・選択データ が $select_data[] に 1行づつ String で セットされます:線色 2 から 線色 8 に 変更する @let %0 REM #jw REM #h1 REM #g1 REM #e hd change "lc2", "lc8" reset[ 選択データ、図形 を 編集する 関数 ] 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 #〜 には十分に注意してください。属性が失われることがあります。
:【 線を引く 】 @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 ]→ line :c とすることもできます。 [ 応用実験(2) ] 複線を引くプログラムです。 [ 241fukusen_1-2.ln.bat ]:【 三角形を描く 】 @let %0 REM #jww REM #1- 1点を指示してください REM #2- 2点を指示してください REM #3 3点を指示してください REM #e line hp 1..3, 1
[ 応用実験(3) ] 点から線へ向けて垂線を引くプログラムです。 [ 207suisen.bat ]:【 複線 】 @let %0 REM #jww REM #1- 始点を指示してください REM #2 終点を指示してください REM #3 複写する点を指示してください REM #e line fukusens (hp 1, 2), 3
[ 参考 ] → JW_CAD のコマンドで 点から線へ垂線を引く手順は @「/」コマンドで 始点を指示する A 垂線を降ろす線を右ドラッグして「鉛直・円周点」を選ぶ 以上です。 [ 線属性 ] 線色 lc ・ 線種 lt は 半角の空白をひとついれて 下記のように指定します。:【 点と線の垂線 】 @let %0 REM #jww REM #1 ○点を指示 REM #2ln ●線を指示 REM #e line suisens 1, 2.ln
lc 3 lt 2[ SXF対応拡張の線属性 ] SXFの線属性を利用して 線色は予備線色 17 〜 256 で任意色を設定しておけば lc 117 〜 lc 356 で利用できます。 線種も同様に 予備線種 17 〜 32 を設定しておけば lt 47 〜 lt 62 で利用で きます。 → レイヤ ly や 線幅 lw は | rubyJWW ライブラリ コマンドリファレンス | を参照してください。![]()
![]()
:【 線の長さ 】 @let %0 REM #jww REM #1ln 線を指示 REM #e comment 1.ln.r![]()
:【 線の交点 】 @let %0 REM #jww REM #1ln 線(1)を指示 REM #2ln 線(2)を指示 REM #e comment point inters 1.ln, 2.ln![]()
:【 線の交角 】 @let %0 REM #jww REM #1ln 線(1)を指示 REM #2ln 線(2)を指示 REM #e comment interdeg 1.ln, 2.ln![]()
:【 2点の中心 】 @let %0 REM #jww REM #1- ○点(1)を指示 《中心線(点−点)》 REM #2 ●点(2)を指示 REM #e line centers 1, 2![]()
:【 2線の中心 】 @let %0 REM #jww REM #1ln ○線(1)を指示 《中心線(線−線)》 REM #2ln ●線(2)を指示 REM #e line centers 1.ln, 2.ln![]()
:【 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![]()
[ 点の移動 ]円 や 文字 あるいは 図形 も 扱えます。![]()
:【 線の回転複写 】 @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
| 前へ | 表紙へ |rubyJWW ライブラリ プログラム例|rubyJWW ライブラリ コマンドリファレンス|