C#ATIA

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

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

Fusion360のスプリクトを作成する際の取っ掛かりになれば、と思い少し
役立つのではないかな?と思うスプリクトを作成しました。(後ほど)


スプリクト(やアドイン)のサンプルは結構多く見付かります。代表的なものは
公式Helpのものです。
Help

全てを見た訳では無いので断言出来ませんが、ほとんどが点・線・面等を
新たに作成するようなものばかりです。これらのサンプルの様に
"新たな要素の作成" は、比較的出来ます。実はスプリクト(や他のソフトのマクロ等)
では、"既存の要素の情報を取得する" 事の方が遥かに難しいです。

例えば「押し出し」について調べたいとします。
最初の段階として "押し出しって何オブジェクトなの?" となるのですが
こちらから探し出すのは現実的とは思えないのが本音です。
https://help.autodesk.com/cloudhelp/ENU/Fusion-360-API/images/Fusion.pdf

"押し出しってExtendFeatureオブジェクトなんだな" とさえわかってしまえば、
こちらを調べてば良いことがわかります。
Help
細かな事はわからなくても(僕もわかっていないのです)きっと押し出しに
関する情報はどれかのプロパティに含まれているはずです。

この "XXって何オブジェクトなの?" を調べるだけの為のスプリクトを
作ってみました。

#FusionAPI_python SelectItemInfo
#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)
        
        #選択機能
        sels = adsk.core.Selections.cast(ui.activeSelections)
        
        #未選択を除外
        if sels.count < 1:
            ui.messageBox('要素を選択してから実行してください')
            return
        
        #ダイアログ用準備
        dl_msg = '選択要素名: {}\nオブジェクト名: {}'
        dl_title = '選択要素情報'
        dl_btn = adsk.core.MessageBoxButtonTypes.YesNoButtonType
        dl_icn = adsk.core.MessageBoxIconTypes.InformationIconType
        dl_no = adsk.core.DialogResults.DialogNo
        
        #選択されているものをループ
        for i,sel in enumerate(sels):
            
            #実際に選択した要素
            ent = sel.entity
            
            #情報取得
            msg = dl_msg.format(ent.name,ent.objectType)
            if i+1 != sels.count:
                msg += '\n残りの要素も続けますか?({}/{})'.format(i+1,sels.count)
            else:
                msg += '\nこれで終了です({}/{})'.format(i+1,sels.count)
                
            #情報表示
            print(msg)
            if ui.messageBox(msg,dl_title,dl_btn,dl_icn) == dl_no:
                break #ループから抜ける
            
    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

どうしても上手く行かない為(選択フィルタの関係上)、事前に調べたい要素を
選択した上でスプリクトを実行する必要があります。

実際に試してみます。
こんな感じのデータを用意しました。
f:id:kandennti:20190702002050p:plain
スケッチに丸を描き、押しただけです。このデータのタイムラインの2個を
選択した後、先程のスプリクトを実行します。するとこんなダイアログが表示されます。
f:id:kandennti:20190702002324p:plain
これであれば、"何のオブジェクトを調べれば良いのか?" がわかると思います。
(画像の例では ”adsk::fusion::Sketch” と表示されるので、sketchオブジェクトを
 調べれば良い事がわかります)

本当は事前選択じゃなくしたいのですが、現状の選択フィルタでは作れそうに無いですね…。