C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

押し出しを押し出さずに掘り下げる1

自分がFusion360APIを取り組み始めた際、どの様に進めていったのか
よく覚えていないのですが・・・調べてみると、3個目でイベント使って
いるとは。結構尖ってました。


最近になり気が付いたのですが、"Fusion360APIで操作の記録が出来ない"
と言う現実から考え、最初に取り組むべきはサンプルコードの改造が一番
取り掛かりやすいと感じています。

念の為、今回はこの様の環境で試しています。
Fusion360 Ver2.0.9849
・Win10
・ms-python.python v2021.2.633441544
尚、python的な説明は行いません。(僕も細かな事がわかっていませんので)


まず、こちらの "素のコード" の方法で、新規のスプリクトを作成します。
Fusion360のスクリプト/アドインの登録 - C#ATIA

"編集" ボタンを押すとVSCodeが起動すると何やらコードが記載されています。
折角なので、実行してみましょう。VSCodeからデバッグとして実行する方法が
Web関係の実行方法とちょっと異なる事を最近知りました。

f:id:kandennti:20210311145452p:plain
手順としては、
アクティビティーバーの "A" をクリック。サイドバーが切り替わります。
続いてサイドバーの一番上の "Python:Attach" の左にある三角 "B" をクリック。
これだけで実行されてしまうと思います。
念の為、 コードを修正し再度実行したい場合は、"C" 部分をクリックすると
再度実行になります。(未保存で実行しても、実行直前に強制保存されます。)

もっと細かな操作は、こちらをご覧になるとよろしいかと思います。
Fusion 360 Help

実行結果としては 'Hello script' とダイアログが表示されます。
・・・表示されるだけです。まぁ画像も要らないでしょう。


"もうちょっとFusion360APIらしいものを" と思うので、ドキュメントのこちらを
お借りしましょう。
Fusion 360 Help

押し出しのサンプルです。何はともあれ、実行してみましょう。
f:id:kandennti:20210311145815p:plain
タイムラインを見ると

スケッチ -> コンポーネント新作 -> 押し出し

を実行した事がわかります。
又、よく見てみると新たなドキュメントも作成されています。
f:id:kandennti:20210311145902p:plain
つまりそれらの処理が書かれているってことですね! それらを見てみましょう。

まず、サンプルが読みにくいため、コメントの日本語化と追記し、型ヒントを
利用した状態に修正して見ました。処理内容は変更していません。

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:
・・・

この状態で、実行すると
f:id:kandennti:20210311150515p:plain
スケッチだけになってしまいました。コメント化した部分のみで
コンポーネント新作 -> 押し出し” を実行している事が分かります。

コメント化したaddSimpleメソッドは、こちらです。
Fusion 360 Help
"profile" と "distance" と "operation" の3つのパラメータを受け取り、
ExtrudeFeatureオブジェクトを返してきます。

それぞれGUIでの表示はこんな感じです。
f:id:kandennti:20210311150843p:plain
まぁ日本語にすれば察しはつきます。

"profile" はGUI同様、スケッチの要素で囲まれている領域ですね。

意外なのは "distance" がdouble(pythonではfloat)型では無いところです。
これは距離では、式が利用出来たり、単位を付けられたりする為だと思われます。

"operation" は、FeatureOperations列挙型です。
Fusion 360 Help
使われていた "NewComponentFeatureOperation" は、新しいボディを作りつつ、
新たなコンポーネントに入れる事の様です。・・・GUIではありませんね。
f:id:kandennti:20210311150829p:plain
コンポーネントを作成している犯人はわかりました。


折角なので、ここでコンポーネントを作成しないでボディだけ新作してみましょう。
コメント化した部分は元に戻し、"operation" の部分のみを書き換えます。

・・・
        # 押し出しを作成
        extrudes :adsk.fusion.ExtendFeatures = rootComp.features.extrudeFeatures
        ext :adsk.fusion.ExtendFeature = extrudes.addSimple(
            prof,
            distance,
            adsk.fusion.FeatureOperations.NewBodyFeatureOperation) #ここ修正
    except:
・・・

念の為、Fusion360の編集からVSCodeを起動すると、"."を書いた時点でインテリセンスで
メソッド・プロパティ類が候補として表示されます。
f:id:kandennti:20210311151018p:plain
型ヒントを使用すると楽ですね。

これを実行すると
f:id:kandennti:20210311151045p:plain
形状は変わりませんが、コンポーネントは作成されずボディが出来ました。