のように点の座標を入力します。(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 ライブラリ コマンドリファレンス|