C#ATIA

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

基準フューチャーのボディを差し替える

ナカナカ本題が進みません。

いつもAPIではお世話になっている基準フューチャーに
updateBodyメソッドがあるんです。
Fusion 360 Help
使ったこと無いんです。 が、必要になりそうなので試しています。


まず、この様なデータを用意しました。
f:id:kandennti:20210713144154p:plain
・基準フューチャーを作成し、円柱のボディを作成し、
 基準フューチャーから抜ける。
・ブロックを作る。
・2個のボディをブーリアン和。
・お互いのボディの境界付近が絡むようなフィレット(ルールド)。
色ぐらい付けるべきですかね?

タイムラインではこんな感じです。
f:id:kandennti:20210713144531p:plain
一番最初が基準フューチャーです。
要は、基準フューチャーで作成されたボディが関連するタイムラインが
欲しく、updateBodyメソッドの効果を知りたかったんです。

念のため、GUIの操作で
f:id:kandennti:20210713145018p:plain
基準フューチャーに戻り、新たなボディ(ボディ19)を作成。
古いボディ(ボディ18)を削除し、基準フューチャーから
抜けると・・・ブーリアンとフィレットが赤くなりエラーです。
そりゃ参照すべきボディが消えてしまったので、迷子になるのは
当然です。


実験の為に、こんな感じで作りました。

# Fusion360API Python script
import adsk.core, adsk.fusion, traceback

def run(context):
    ui = adsk.core.UserInterface.cast(None)
    try:
        app :adsk.fusion.Application = adsk.core.Application.get()
        ui = app.userInterface
        des :adsk.fusion.Design = app.activeProduct
        # root :adsk.fusion.Component = des.rootComponent

        # 差し替え用円柱
        tmpMgr :adsk.fusion.TemporaryBRepManager = adsk.fusion.TemporaryBRepManager.get()
        PNT3D = adsk.core.Point3D
        radius = 10
        brep :adsk.fusion.BRepBody = tmpMgr.createCylinderOrCone(
            PNT3D.create(0,0,0),
            radius,
            PNT3D.create(0,0,2),
            radius)

        # BaseFeature取得
        tl :adsk.fusion.Timeline = des.timeline
        tlObj :adsk.fusion.TimelineObject = tl.item(0)
        # tlObj.rollTo(True) # タイムラインのロールは必要無し
        baseFeat :adsk.fusion.BaseFeature = adsk.fusion.BaseFeature.cast(tlObj.entity)
        # sourceBody :adsk.fusion.BRepBody = baseFeat.bodies[0] # 編集に入ってからじゃないとNG

        # BaseFeature編集
        baseFeat.startEdit()

        sourceBody :adsk.fusion.BRepBody = baseFeat.bodies[0]
        # newBody = root.bRepBodies.add(brep, baseFeat) #入れちゃダメ
        baseFeat.updateBody(sourceBody, brep) # 差し替え!

        # BaseFeature編集終了
        baseFeat.finishEdit()

        # tl.moveToEnd() # ロールを戻す必要無し

    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

コメントにしている行が多数あるのは、それだけ失敗したからです。

実行すると
f:id:kandennti:20210713145705p:plain
見栄えの問題から色を付けましたが、関係ないです。
驚くことに、エラーになりません。updateBodyの名称は嘘じゃないです。

これ、こちらのBoxerで使用されているんです。
FusionBoxer/OffsetBoundingBoxCommand.py at master · tapnair/FusionBoxer · GitHub
最初見た時 "こんな事出来るんだぁ" と思いましたよ。
ドキュメントの日付を見ると、CustomFeaturesと同じタイミングで
実装されたっぽいですね。