JwRuby(外部変形ライブラリ)を使ったサンプル
Jw_cad外部変形で利用できるライブラリ「JwRuby」を公開しています。JwRubyはjwc_temp.txtを解析・変換し、簡単にコマンドを書けるようにするライブラリで、これ一つで具体的な処理を行うわけではありません。以下にJwRubyを使った簡単なサンプルを示します。
※このライブラリは、Ruby1.8を前提としています。
1. ある点を中心に、半径の異なる円を年輪状に描く
BATファイルで指定できる基準点は、jw[key]で得ることができます。1つ目の基準点を円の中心点、2つ目を円周上の点とします。
BAT
@REM test
@echo off
REM #jww
REM #cd
REM #1
REM #2
REM #e
ruby test.rb
Ruby
#!ruby -Ks
require "jwr"
Jwr.start{|jw|
# 基準点(円の中心点と円周上の点)
cx, cy = jw[1]
vx, vy = jw[2]
# 円の半径
r = Line.new(cx, cy, vx, vy).length
1.upto(20){|i|
jw.circle(cx, cy, (r * i / 20))
}
}
2. レイヤ番号とレイヤ名のペアをcsvに保存する
BAT
@REM test
@echo off
REM #jww
REM #cd
REM #gn
REM #e
ruby test.rb
Ruby
#!ruby -Ks
require "jwr"
Jwr.start{|jw|
File.open("layer.csv", "w"){|f|
jw.layers.each{|layer|
f.write "#{layer.number.to_s(16)},#{layer.name}\n"
}
}
}
3. 六芒星を描く
シンプルで正確性の必要な図形も簡単に描くことができます。
BAT
@REM test
@echo off
REM #jww
REM #cd
REM #1
REM #2
REM #e
ruby test.rb
Ruby
#!ruby -Ks
require "jwr"
Jwr.start{|jw|
# 基準点(円の中心点と円周上の点)
cx, cy = jw[1]
vx, vy = jw[2]
# 半径
r = Line.new(cx, cy, vx, vy).length
# 各点を計算し、正三角形を2つ作る
rcos30 = r * Math.cos(30.degrees)
rsin30 = r * Math.sin(30.degrees)
p1 = [cx, cy + r]
p2 = [cx + rcos30, cy - rsin30]
p3 = [cx - rcos30, cy - rsin30]
p4 = [cx, cy - r]
p5 = [cx + rcos30, cy + rsin30]
p6 = [cx - rcos30, cy + rsin30]
tri1 = Triangle.new(p1, p2, p3)
tri2 = Triangle.new(p4, p5, p6)
# 描画
jw.draw(tri1)
jw.draw(tri2)
jw.circle(cx, cy, r)
}
4. 図面上の文字列を全て集めて保存する
スクリプトのあるフォルダに、図面上のテキストを保存します。
BAT
@REM test
@echo off
REM #jww
REM #cd
REM #h4
REM #e
ruby test.rb
Ruby
#!ruby -Ks
require "jwr"
Jwr.start{|jw|
# Textオブジェクトのみの配列を作り、Stringに変換する
texts = jw.shapes.find_all{|shape| shape.text? }
texts = texts.map{|text| text.string }
File.open("foo.txt", "w"){|f|
f.write texts.join("\n")
}
}
5. 選択範囲の図形の種類ごとに色を変える
線・円・点の色を指定して、選択された図形全ての色を変更します。
BAT
@REM test
@echo off
REM #jww
REM #cd
REM #h1
REM #e
ruby test.rb
Ruby
#!ruby -Ks
require "jwr"
Jwr.start{|jw|
# 図形を種類ごとに分ける
hash = Hash.new{|h, k| h[k] = [] }
jw.shapes.each{|shape|
case shape
when Line
hash[:line] << shape
when Circle
hash[:circle] << shape
when Point
hash[:point] << shape
end
}
jw.set_color 4
hash[:line].each{|line| jw.draw line }
jw.set_color 5
hash[:circle].each{|circle| jw.draw circle }
jw.set_point_color 6
hash[:point].each{|point| jw.draw point }
}
6. 選択範囲を1つのレイヤにまとめる
選択された図形全てをレイヤ0に移動してまとめる処理です。
BAT
@REM test
@echo off
REM #jww
REM #cd
REM #h1
REM #e
ruby test.rb
Ruby
#!ruby -Ks
require "jwr"
Jwr.start{|jw|
jw.delete_selected
jw.set_layer 0
jw.shapes.each{|shape|
jw.draw shape
}
}
7. デバッグ・確認しながら作業する
デフォルトではjwc_temp.txtを上書きしますが、Jwr.startに:outputキーワードを与えることで別名で出力することができます。それを利用し、(Jw_cadからではなく)コマンドプロンプトからRubyを実行することで、確認しながらスクリプトを作り上げていくことができます。またコマンドプロンプトから実行することで、Rubyスクリプト内で起こるエラーを確認することができます。
Ruby
#!ruby -Ks
require "jwr"
Jwr.start(:output=>"output.txt"){|jw|
# レイヤ名一覧を確認
jw.layers.each_with_index{|layer, i|
puts "#{i.to_s(16)}: #{layer.name}"
}
# 図形の種類一覧を確認
puts jw.shapes.map{|shape|shape.class}
}