こちらの続きです。
Fusion360スプリクト作成の取っ掛かり2 - C#ATIA
前回までは、何かの処理を行うためのオブジェクトの探し方を行いました。
(多々不足していますが・・・)
実際にスプリクトを作成する際、毎回事前選択するのは現実的ではありません。
今回は、比較的お手軽なユーザーによる要素の選択方法を行ってみましょう。
Fusion360のスプリクトに挑戦し始めた頃、この機能を探し回ったのですが
サンプルが見つからず、ナカナカ見つけ出すことが出来ませんでした。
結論を書くと、UserInterface オブジェクトの selectEntity メソッドを
利用することになります。
Help
説明書きされていますが、単体の要素の選択のみが提供されています。
こちらを見ればわかるのですが、2つのパラメータが必要です。
Help
prompt - マウスカーソルを止めているとツールチップとして表示される文字
filter - 選択要素を制限する為のフィルター
フィルターに関しては、こちらにリストがあります。
Help
実は不具合があり、一部のフィルターが機能していません。(恐らく直っていません)
Re: Select SketchConstraints using api - Autodesk Community
これらを考慮した上で、ソリッドのボディを選択するコードを作成しました。
#FusionAPI_python サンプル #Author-kantoku #Description-要素の選択 import adsk.core, adsk.fusion, traceback def run(context): ui = adsk.core.Application.cast(None) try: #fusion360の取得 app = adsk.core.Application.get() ui = adsk.core.UserInterface.cast(app.userInterface) #選択 msg = 'ソリッドのボディを選択してください/ESC-キャンセル' item = Sel(msg ,'SolidBodies') if item is None: return #中止 #キャスト 必ず行う必要は無いです solid = adsk.fusion.BRepBody.cast(item) #情報の取得 infos = [] infos.append('ボディ名 : {}'.format(solid.name)) infos.append('所属コンポーネント名 : {}'.format(solid.parentComponent.name)) infos.append('面数 : {}'.format(solid.faces.count)) infos.append('辺数 : {}'.format(solid.edges.count)) infos.append('頂点数 : {}'.format(solid.vertices.count)) #表示 ui.messageBox('\n'.join(infos)) except: if ui: ui.messageBox('Failed:\n{}'.format(traceback.format_exc())) #選択 def Sel(msg, selFilter): app = adsk.core.Application.get() ui = app.userInterface try: #選択時 return ui.selectEntity(msg, selFilter).entity except: #ESCキー時 return None
selectEntityが機能している(選択待ち)際、ESCキーを押すと処理が中止されますが
エラーとなっています為、例外処理で対応しています。(その為Sel関数にしています)
試しにこんなデータを作ってみました。
丸 - ソリッド
四角 - サーフェス
三角 - メッシュ
です。先程のスプリクトを実行し選択しようとすると
こんな状態になります。
ん~画像ではわかりにくいのですが、マウスカーソルがソリッド上にある時のみ
ハイライトした状態となり、選択可能だとユーザーはわかりますし、
それ以外の場合は、選択も出来ない状態となります。
では、この状態でソリッドとサーフェスの両方を選択可としたい場合
どうすれば良いのでしょうか? 実は長い間出来ないものと思っていましたが
この様にすれば可能です。
・・・ #選択 msg = 'BRepなボディを選択してください/ESC-キャンセル' item = Sel(msg ,'SolidBodies,SurfaceBodies') if item is None: return #中止 ・・・
フィルターとなる部分に ",(カンマ)" 区切りの1つの文字列で指定する事で
複数のタイプのフィルターが可能です。
これ、Helpに記載されてないんですよね。
これで少し作成するスプリクトの幅が広がりますよね?