自分がFusion360のAPIを取り組み始めた際、どの様に進めていったのか
よく覚えていないのですが・・・調べてみると、3個目でイベント使って
いるとは。結構尖ってました。
最近になり気が付いたのですが、"Fusion360APIで操作の記録が出来ない"
と言う現実から考え、最初に取り組むべきはサンプルコードの改造が一番
取り掛かりやすいと感じています。
念の為、今回はこの様の環境で試しています。
・Fusion360 Ver2.0.9849
・Win10
・ms-python.python v2021.2.633441544
尚、python的な説明は行いません。(僕も細かな事がわかっていませんので)
まず、こちらの "素のコード" の方法で、新規のスプリクトを作成します。
Fusion360のスクリプト/アドインの登録 - C#ATIA
"編集" ボタンを押すとVSCodeが起動すると何やらコードが記載されています。
折角なので、実行してみましょう。VSCodeからデバッグとして実行する方法が
Web関係の実行方法とちょっと異なる事を最近知りました。
手順としては、
アクティビティーバーの "A" をクリック。サイドバーが切り替わります。
続いてサイドバーの一番上の "Python:Attach" の左にある三角 "B" をクリック。
これだけで実行されてしまうと思います。
念の為、 コードを修正し再度実行したい場合は、"C" 部分をクリックすると
再度実行になります。(未保存で実行しても、実行直前に強制保存されます。)
もっと細かな操作は、こちらをご覧になるとよろしいかと思います。
Fusion 360 Help
実行結果としては 'Hello script' とダイアログが表示されます。
・・・表示されるだけです。まぁ画像も要らないでしょう。
"もうちょっとFusion360APIらしいものを" と思うので、ドキュメントのこちらを
お借りしましょう。
Fusion 360 Help
押し出しのサンプルです。何はともあれ、実行してみましょう。
タイムラインを見ると
スケッチ -> コンポーネント新作 -> 押し出し
を実行した事がわかります。
又、よく見てみると新たなドキュメントも作成されています。
つまりそれらの処理が書かれているってことですね! それらを見てみましょう。
まず、サンプルが読みにくいため、コメントの日本語化と追記し、型ヒントを
利用した状態に修正して見ました。処理内容は変更していません。
import adsk.core, adsk.fusion, traceback def run(context): ui :adsk.core.UserInterface = None try: # Fusion360取得 app :adsk.core.Application = adsk.core.Application.get() # ユーザーインターフェース取得 ui = app.userInterface # 新たなドキュメント作成 doc :adsk.fusion.FusionDocument = app.documents.add( adsk.core.DocumentTypes.FusionDesignDocumentType) # デザイン取得 design :adsk.fusion.Design = app.activeProduct # アクティブなデザインのルートコンポーネントを取得 rootComp :adsk.fusion.Component = design.rootComponent # xy平面に新しいスケッチを作成 sketches :adsk.fusion.Sketches = rootComp.sketches xyPlane :adsk.fusion.ConstructionPlane = rootComp.xYConstructionPlane sketch :adsk.fusion.Sketch = sketches.add(xyPlane) # 円を描く circles :adsk.fusion.SketchCircles = sketch.sketchCurves.sketchCircles circle1 :adsk.fusion.SketchCircle = circles.addByCenterRadius( adsk.core.Point3D.create(0, 0, 0), 2) # 円で定義されたプロファイルを取得 prof :adsk.fusion.Profile = sketch.profiles.item(0) # 範囲が5cm distance :adsk.core.ValueInput = adsk.core.ValueInput.createByReal(5) # 押し出しを作成 extrudes :adsk.fusion.ExtendFeatures = rootComp.features.extrudeFeatures ext :adsk.fusion.ExtendFeature = extrudes.addSimple( prof, distance, adsk.fusion.FeatureOperations.NewComponentFeatureOperation) except: if ui: ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
本来、ここまで型ヒントを使う必要は無いとは思いますが、過剰な程やっています。
(横長の状態が嫌な為、オリジナルで1行の部分も適当に改行しています)
通常であれば、処理の最初の方から順番に "※※は▽▽の機能です" の様な説明を
するものですが、性格が歪んでいる為、逆から行います。
まず、最後の方のここをコメント化します。4行になっていますが、実質1行です。
・・・ # 押し出しを作成 extrudes :adsk.fusion.ExtendFeatures = rootComp.features.extrudeFeatures # ext :adsk.fusion.ExtendFeature = extrudes.addSimple( # prof, # distance, # adsk.fusion.FeatureOperations.NewComponentFeatureOperation) except: ・・・
この状態で、実行すると
スケッチだけになってしまいました。コメント化した部分のみで
”コンポーネント新作 -> 押し出し” を実行している事が分かります。
コメント化したaddSimpleメソッドは、こちらです。
Fusion 360 Help
"profile" と "distance" と "operation" の3つのパラメータを受け取り、
ExtrudeFeatureオブジェクトを返してきます。
それぞれGUIでの表示はこんな感じです。
まぁ日本語にすれば察しはつきます。
"profile" はGUI同様、スケッチの要素で囲まれている領域ですね。
意外なのは "distance" がdouble(pythonではfloat)型では無いところです。
これは距離では、式が利用出来たり、単位を付けられたりする為だと思われます。
"operation" は、FeatureOperations列挙型です。
Fusion 360 Help
使われていた "NewComponentFeatureOperation" は、新しいボディを作りつつ、
新たなコンポーネントに入れる事の様です。・・・GUIではありませんね。
コンポーネントを作成している犯人はわかりました。
折角なので、ここでコンポーネントを作成しないでボディだけ新作してみましょう。
コメント化した部分は元に戻し、"operation" の部分のみを書き換えます。
・・・ # 押し出しを作成 extrudes :adsk.fusion.ExtendFeatures = rootComp.features.extrudeFeatures ext :adsk.fusion.ExtendFeature = extrudes.addSimple( prof, distance, adsk.fusion.FeatureOperations.NewBodyFeatureOperation) #ここ修正 except: ・・・
念の為、Fusion360の編集からVSCodeを起動すると、"."を書いた時点でインテリセンスで
メソッド・プロパティ類が候補として表示されます。
型ヒントを使用すると楽ですね。
これを実行すると
形状は変わりませんが、コンポーネントは作成されずボディが出来ました。