C#ATIA

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

APIサンプルを我流にかみ砕く3

随分と時間が経過しちゃいましたが、こちらの続きです。
APIサンプルを我流にかみ砕く2 - C#ATIA

ベースにするコードは前回記載した物です。
最後に記載した”問題"となる部分を見てみましょう。

前回のスクリプトを実行しエッジの選択待ちの状態です。

ここで、エッジを選択せずにESCキーを押します。"処理をキャンセルしたい"を
想定した操作です。すると

メッセージの詳細は異なると思いますが、エラーとなります。

エラーは、ここの処理ですね。

        # ユーザーにエッジを選択させる
        selection: adsk.core.Selection = ui.selectEntity(
            "フィレット付けるエッジを選択してください",
            "Edges"
        )

実はこの部分はバグなのでは無いかと思っています。

ESCキーが押された際、selectEntityメソッドの戻り値が"None"でも
返してくれると助かるのですが、何故か例外を発生して止まって
しまいます。

かなり以前にフォーラムで指摘したのですが、直す気配も無い為
try~exceptでスクリプトが止まる事を回避しています。

        # ユーザーにエッジを選択させる
        # selection: adsk.core.Selection = ui.selectEntity(
        #     "フィレット付けるエッジを選択してください",
        #     "Edges"
        # )
        msg: str = 'フィレット付けるエッジを選択してください'
        selFilter: str = 'Edges'
        selection: adsk.core.Selection = selectEnt(msg, selFilter)
        if not selection:
            return
        edge: adsk.fusion.BRepEdge = selection.entity
・・・
def selectEnt(
        msg: str,
        filterStr: str) -> adsk.core.Selection:

    try:
        app: adsk.core.Application = adsk.core.Application.get()
        ui: adsk.core.UserInterface = app.userInterface
        sel = ui.selectEntity(msg, filterStr)
        return sel
    except:
        return None

名前は何でも構わないのですが、selectEnt関数を作成しました。
引数は、selectEntityメソッドと全く同じです。
例外が発生した場合はESCキーを押されたものと判断し、"None"を
返す様にしています。

戻り値に関しては、"None"を受け取った場合はスクリプトを終了させる為、
returnさせています。

この修正で
・エッジを選択 → フィレットを作成
・ESCキー → 中止
の操作になります。実際に確認してみて下さい。


最終的にはこんな感じになりました。

# Fusion360API Python script

import traceback
import adsk.fusion
import adsk.core

def run(context):
    ui: adsk.core.UserInterface = None
    try:
        # Fusion360取得
        app: adsk.core.Application = adsk.core.Application.get()

        # ユーザーインターフェース取得
        ui = app.userInterface

        # デザイン取得
        design: adsk.fusion.Design = app.activeProduct

        # アクティブなデザインのルートコンポーネントを取得
        root: adsk.fusion.Component = design.rootComponent

        # ユーザーにエッジを選択させる
        msg: str = 'フィレット付けるエッジを選択してください'
        selFilter: str = 'Edges'
        selection: adsk.core.Selection = selectEnt(msg, selFilter)
        if not selection:
            return
        edge: adsk.fusion.BRepEdge = selection.entity

        # 選択エッジをObjectCollectionに代入
        edgeCollection: adsk.core.ObjectCollection = adsk.core.ObjectCollection.create()
        edgeCollection.add(edge)

        # FilletInputオブジェクトを作成
        fillets: adsk.fusion.FilletFeatures = root.features.filletFeatures
        filletInput: adsk.fusion.FilletFeatureInput = fillets.createInput()

        # 一定Rサイズのフィレットをセット
        filletInput.addConstantRadiusEdgeSet(
            edgeCollection,
            adsk.core.ValueInput.createByString('3 mm'),
            True
        )

        # フィレット作成
        fillet: adsk.fusion.FilletFeature = fillets.add(filletInput)

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

def selectEnt(
        msg: str,
        filterStr: str) -> adsk.core.Selection:

    try:
        app: adsk.core.Application = adsk.core.Application.get()
        ui: adsk.core.UserInterface = app.userInterface
        sel = ui.selectEntity(msg, filterStr)
        return sel
    except:
        return None

本当はもう一個問題を指摘しようと思っていたのですが、フィレットの場合は
上手く処理されてしまい、問題が再現出来なかったので、今回は薄い内容で
おしまいです。消化不良。