JwRuby(外部変形ライブラリ)を使ったサンプル

 Jw_cad外部変形で利用できるライブラリ「JwRuby」を公開しています。JwRubyはjwc_temp.txtを解析・変換し、簡単にコマンドを書けるようにするライブラリで、これ一つで具体的な処理を行うわけではありません。以下にJwRubyを使った簡単なサンプルを示します。
 ※このライブラリは、Ruby1.8を前提としています。

  1. ある点を中心に、半径の異なる円を年輪状に描く
  2. レイヤ番号とレイヤ名のペアをcsvに保存する
  3. 六芒星を描く
  4. 図面上の文字列を全て集めて保存する
  5. 選択範囲の図形の種類ごとに色を変える
  6. 選択範囲を1つのレイヤにまとめる
  7. デバッグ・確認しながら作業する

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}
}