mruby-siren と Fusion360 の連帯の可能性
Autodesk社のFusion360と言うCADをご存知でしょうか? こちらのCADは非常に多くのフォーマットのCADデータを インポートすることが可能なのですが、サーフェス・ソリッドのみ で点・線が欠落してしまいます。 https://forums.autodesk.com/t5/fusion-360-ri-ben-yu/igesrain-kabu-detanoinpoto/m-p/6606029#M3144 https://forums.autodesk.com/t5/fusion-360-ri-ben-yu/stp-xing-shi-dengnofairuwo-dumi-rumi-shuki-chushiwo-xingtta-shini-dian-xiannadono-yao-suga-xiaoeteiru/m-p/7218766#M6156
Fusion360もAPIは、かなり公開されており、 http://help.autodesk.com/view/fusion360/ENU/?guid=GUID-dc7ae251-e060-4d87-b6b8-e7f78abc0777 これらの問題を "Sirenを利用すれば解決出来るのでは?" と思ったのですが、素人レベルで可能なものか・・・と感じております。
Siren自身の魅力は、バイナリ版であれば導入が非常に簡単なため、 多くのユーザーにも受け入れやすいものと感じているのですが、 mRuby↔Python間でデータのやり取りが可能なものか?どうか? もよくわからない状態なのが正直なところです…。
Fusion360 を触ったことがないですが、スケッチの概念があったり、Curve3D クラスがあるところを見ると Fusion360 自体はしっかりした構造を持っていて、パーサ側の機能がないようですね。
siren で IGES ファイルを読み込み、Fusion360 向けの Python スクリプトを出力する mruby スクリプトを書いてみました。
#!siren
# coding: utf-8
iges = "sample.iges"
py = "sample.py"
# 評価用の IGES ファイルを生成
def make_sample_iges(path)
points = [[0, 0, 0], [1, 0, 0], [1, 1, 0], [2, 1, 0], [2, 2, 0]]
wire = Siren.polyline points
Siren.save_iges wire, path
end
# IGES ファイルがなければ生成
unless File.exist? iges
make_sample_iges iges
end
# IGES ファイルの読み込み
model = Siren.load_iges iges
# 書き出すスクリプトファイルを開く
file = File.open(py, "w")
file.puts "import adsk.core"
# 例えば、モデル中の直線要素を処理する
model.edges.select{|e| e.curve.is_a? Siren::Line }.each_with_index do |e, i|
if e.infinite?
# 無限直線の場合
c = e.curve
file.write "res#{i} = InfiniteLine3D.create("
file.write "Point3D.create(#{e.pos.x}, #{e.pos.y}, #{e.pos.z}), "
file.puts "Vector3D.create(#{c.dir.x}, #{c.dir.y}, #{c.dir.z}))"
else
# 有限直線(線分)の場合
file.write "res#{i} = Line3D.create("
file.write "Point3D.create(#{e.sp.x}, #{e.sp.y}, #{e.sp.z}), "
file.puts "Point3D.create(#{e.tp.x}, #{e.tp.y}, #{e.tp.z}))"
end
end
# スクリプトファイルを閉じる
file.close
例は直線だけですが、同じ要領で円弧や NURBS 曲線も対応できそうです。
実行すると
S0000001
,,31HOpen CASCADE IGES processor 7.1,13HFilename.iges, G0000001
16HOpen CASCADE 7.1,31HOpen CASCADE IGES processor 7.1,32,308,15,308,15,G0000002
,1.,2,2HMM,1,0.01,15H20170807.123552,1E-007,2.,7Hyamadai,,11,0, G0000003
15H20170807.123552,; G0000004
102 1 0 0 0 0 0 000000000D0000001
102 0 0 1 0 0D0000002
110 2 0 0 0 0 0 000010000D0000003
110 0 0 1 0 0D0000004
110 3 0 0 0 0 0 000010000D0000005
110 0 0 1 0 0D0000006
110 4 0 0 0 0 0 000010000D0000007
110 0 0 1 0 0D0000008
110 5 0 0 0 0 0 000010000D0000009
110 0 0 1 0 0D0000010
102,4,3,5,7,9; 0000001P0000001
110,0.E+000,0.E+000,0.E+000,1.,0.E+000,0.E+000; 0000003P0000002
110,1.,0.E+000,0.E+000,1.,1.,0.E+000; 0000005P0000003
110,1.,1.,0.E+000,2.,1.,0.E+000; 0000007P0000004
110,2.,1.,0.E+000,2.,2.,0.E+000; 0000009P0000005
S 1G 4D 10P 5 T0000001
のような評価用 IGES ファイル sample.iges が生成され、それを読み込み
import adsk.core
res0 = Line3D.create(Point3D.create(0, 0, 0), Point3D.create(1, 0, 0))
res1 = Line3D.create(Point3D.create(1, 0, 0), Point3D.create(1, 1, 0))
res2 = Line3D.create(Point3D.create(1, 1, 0), Point3D.create(2, 1, 0))
res3 = Line3D.create(Point3D.create(2, 1, 0), Point3D.create(2, 2, 0))
といった Python スクリプト sample.py を出力します。 Fusion360 を動かせる環境が手元にないため、チェックはしていませんが、考え方はこれでいいはずだと思います。
ただ、 Fusion360 側をしっかり調べればもっとスマートな方法も見つかるかもしれません。
早速ありがとうございます。(速いです・・・)
全く理解できていませんが、時間が出来次第勉強させていただきます。
エクスポートする為の Fusion360 → Siren は、Sirenスプリクトを書き出し → 実行で出来そうだな と感触は持っていたのですが、インポートの Siren → Fusion360 は、どうすれば良いのだろう? と思っておりました。 試してはいませんが、モジュールとして書き出したPythonスプリクトをインポート すれば、実行できそうな気がしてきました。 色々とアドバイスありがとうございます。
みすぼらしいものですが、公開まで漕ぎ着けました。 https://forums.autodesk.com/t5/fusion-360-ri-ben-yu/3dcad-zhong-jianfairuno3dna-dian-qu-xianwoinpotosurusupurikuto/td-p/7370346