C#ATIA

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

Fusion360スプリクト作成の取っ掛かり3

こちらの続きです。
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関数にしています)

試しにこんなデータを作ってみました。
f:id:kandennti:20190703234444p:plain
丸 - ソリッド
四角 - サーフェス
三角 - メッシュ
です。先程のスプリクトを実行し選択しようとすると
こんな状態になります。
f:id:kandennti:20190703234459p:plain
ん~画像ではわかりにくいのですが、マウスカーソルがソリッド上にある時のみ
ハイライトした状態となり、選択可能だとユーザーはわかりますし、
それ以外の場合は、選択も出来ない状態となります。
f:id:kandennti:20190703234513p:plain

では、この状態でソリッドとサーフェスの両方を選択可としたい場合
どうすれば良いのでしょうか? 実は長い間出来ないものと思っていましたが
この様にすれば可能です。

・・・
        #選択
        msg = 'BRepなボディを選択してください/ESC-キャンセル'
        item = Sel(msg ,'SolidBodies,SurfaceBodies')
        if item is None:
            return #中止
・・・

フィルターとなる部分に ",(カンマ)" 区切りの1つの文字列で指定する事で
複数のタイプのフィルターが可能です。
これ、Helpに記載されてないんですよね。
f:id:kandennti:20190703234531p:plain


これで少し作成するスプリクトの幅が広がりますよね?