プログラムからの3Dモデル生成
3D sketchを作ることができれば、SweepでBody化できる。 3D sketchはDXF形式で保存することができて、これはプログラムから生成できる。
code:python:
import ezdxf
obj = ezdxf.readfile("/media/winhome/Desktop/foo.dxf")
list(obj.entities)
→Lineオブジェクトがいくつか入っているのが見えた
code:python:
import ezdxf
from math import sin, cos, pi
dwg = ezdxf.new('AC1015') # splines requires the DXF R2000 format or later
points = []
for i in range(100):
z = cos(pi / 99 * i)
s = sin(pi / 99 * i)
x = cos(40 * pi / 100 * i) * s
y = sin(40 * pi / 100 * i) * s
points.append((x * 100, y * 100, z * 100))
msp = dwg.modelspace()
msp.add_spline(points)
dwg.saveas("/media/winhome/Desktop/spline.dxf")
https://gyazo.com/d5eed038f77b3fd1bd3da28e7b67e382
パスが出来たらPipeコマンドで立体化は容易。
うーん、パスを作って読み込むところまではできたのだけど、それをBodyにするところで「自己交差がある」というエラーになる。最初は隣り合うラインが交差しているのかと思ったが、1本だけ選んでも一番外側以外はエラーになる。
少し形を変えたらpipeで立体化できるようになったけど、複数パスをまとめて選択して実行しても1本しか作成されない。1本ずつ選んでpipeで立体化して、を繰り返していかないといけないし、1本やるたびに何秒も待たされる。
まとめ
・1本のパスならDXFを出力するプログラムを書いてFusion360のPipeで立体化が楽ちん ・しかしパスが複数本になると手作業と待ち時間が多くて大変
・やっぱSTLまでダイレクトに出力するべきか?
・スプラインに対してPipe処理をしたものをブーリアン演算するのがものすごく重い
・2本目以降のPipe処理をやろうとしたときに、デフォルトの挙動が「既存オブジェクトとのブーリアン演算」
・プレビュー表示のためにデフォルト挙動は即座に実行してしまう
・Bodyを非表示にしておくと、デフォルトの挙動は「新規Body作成」になるので比較的重くない
・非表示のオブジェクトを生成した旨の警告が出るが無視してよい
・それで30本それぞれをオブジェクト化してから全部まとめてブーリアン演算で結合→ものすごく時間がかかる(1時間オーダー)
・STLへの出力にも10分くらいかかる
・XYZWareへのインポートにも1分くらいかかる
Fusion360はPythonやJSで自動化ができる。
・サンプルスクリプトをSpyder(Pythonの統合開発環境)でデバッグ実行できる
・裏がpdbなので任意の位置で対話的にコードを実行できる
・スクリプト全体を実行してもろもろの関数を定義した後、run(context)がスクリプトの外から呼ばれるので、冒頭にブレークポイントを仕掛けるとよさそう
・サンプルのPipeがダイアログを出さずにrunの中だけで処理を行うサンプルなので分かりやすい
・SpyderのObject Inspectorが、dirみたいな元から入っているやつ以外に対してうまく動かないように見える
・対話的インタプリタでfoo.とピリオドを打つと補完のための問い合わせが裏で走って、失敗して、エラー報告ターミナルに切り替わる。元のターミナルにいちいち戻せば一応動く。
code:python:
>> app = adsk.core.Application.get()
>> product = app.activeProduct
>> design = adsk.fusion.Design.cast(product)
>> comp = design.rootComponent
>> feats = comp.features
>> feats.pipeFeatues
<adsk.fusion.PipeFeatures; proxy of <Swig Object of type 'adsk::core::Ptr< adsk::fusion::PipeFeatures > *' at 0x000000634981C330> >
「pipeFeatues」は公式がtypoしている。
そしてpipeFeatuesにはaddがない。sweepにはあるのに。
code:python:
sweepFeats = feats.sweepFeatures
sweepInput = sweepFeats.createInput(profile, path, adsk.fusion.FeatureOperations.NewBodyFeatureOperation)
sweepInput.orientation = adsk.fusion.SweepOrientationTypes.PerpendicularOrientationType
sweepFeat = sweepFeats.add(sweepInput)
メモ
3Dプリント×Python ~コードからアプローチする3Dプリンティング~
OpenSCAD - Documentation
コードで制御するCAD