mruby-siren icon indicating copy to clipboard operation
mruby-siren copied to clipboard

mruby-siren と Fusion360 の連帯の可能性

Open kantoku-code opened this issue 8 years ago • 4 comments

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間でデータのやり取りが可能なものか?どうか?  もよくわからない状態なのが正直なところです…。

kantoku-code avatar Aug 07 '17 03:08 kantoku-code

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 側をしっかり調べればもっとスマートな方法も見つかるかもしれません。

dyama avatar Aug 07 '17 04:08 dyama

早速ありがとうございます。(速いです・・・)

全く理解できていませんが、時間が出来次第勉強させていただきます。

kantoku-code avatar Aug 07 '17 05:08 kantoku-code

エクスポートする為の Fusion360 → Siren は、Sirenスプリクトを書き出し → 実行で出来そうだな と感触は持っていたのですが、インポートの Siren → Fusion360 は、どうすれば良いのだろう? と思っておりました。 試してはいませんが、モジュールとして書き出したPythonスプリクトをインポート すれば、実行できそうな気がしてきました。 色々とアドバイスありがとうございます。

kantoku-code avatar Aug 08 '17 10:08 kantoku-code

みすぼらしいものですが、公開まで漕ぎ着けました。 https://forums.autodesk.com/t5/fusion-360-ri-ben-yu/3dcad-zhong-jianfairuno3dna-dian-qu-xianwoinpotosurusupurikuto/td-p/7370346

kantoku-code avatar Sep 13 '17 03:09 kantoku-code