随分と時間が経過しちゃいましたが、こちらの続きです。
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
本当はもう一個問題を指摘しようと思っていたのですが、フィレットの場合は
上手く処理されてしまい、問題が再現出来なかったので、今回は薄い内容で
おしまいです。消化不良。