Fusion360 APIを使ってアセンブリに含まれるすべての子部品のスクリーンショットを保存する

パーツリストを作成する場合などにCADの絵が欲しくなるので、アセンブリの全子部品を画像化するスクリプトを作成しました。

処理内容

処理内容は下記の図の通りです。

ルートコンポーネントの子部品をすべて表示状態にする

ApplicationからrootComponentを取得して、rootComponent.allOccurrencesのオカレンスのisLightBulbOnをすべてTrueにすることでルートコンポーネントの子部品をすべて表示状態にできます。

root_component = app.activeProduct.rootComponent
all_occurrences = root_component.allOccurrences
for occurrence in all_occurrences:
    occurrence.isLightBulbOn = True

表示をビューにフィットする

adsk.core.Application.get()で取得したApplicationオブジェクトからactiveViewportを取得して、ViewPortからcameraを取得、isFitViewをTrueに設定したcameraをViewPortにセットすることで、表示がビューにフィットした状態になります。この処理はホームビューに移動コマンドを実行したときと同じ挙動になります。

def view_fit(app):
    view_port = app.activeViewport
    if not view_port:
        return False
    camera = view_port.camera
    if not camera:
        return False
    camera.isFitView =  True
    view_port.camera = camera

ビューポートを画像として保存

Application.activeViewport.saveAsImageFile()で表示している画面を画像ファイルとして保存できます。

app.activeViewport.saveAsImageFile('D:/images/' + root_component.name + '.jpg', 600, 600)

コンポーネントを1つだけ表示状態にする

表示状態の設定はオカレンスオブジェクトに対してoccurrence.isLightBulbOn = Falseとすることで非表示状態にできます。

処理対象のオカレンスであり、まだ表示設定にしていない場合はオカレンスを表示状態にします。処理対象のオカレンスではない場合で、子部品がある場合は表示状態に、子部品がない場合は非表示状態にします。

def visible_one_component(occurrence1, all_occurrences):
    visible_flag = True
    for occurrence2 in all_occurrences:
        if not occurrence1 == occurrence2:
            if len(occurrence2.childOccurrences) > 0:
                occurrence2.isLightBulbOn = True
                visible_children(occurrence1)
            else:
                occurrence2.isLightBulbOn = False
        else:
            if visible_flag:
                visible_flag = False
                occurrence2.isLightBulbOn = True

動作の様子

出力された画像

指定したフォルダ(今回はD:\images)に以下のように画像が保存されます。

ソースコード

#Author-
#Description-

import adsk.core, adsk.fusion, adsk.cam, traceback

def unique_children_screenshots(app):
    root_component = app.activeProduct.rootComponent
    all_occurrences = root_component.allOccurrences
    unique_children = { occ.component.name : occ for occ in all_occurrences }
    unique_children = [ unique_children[key] for key in unique_children ]

    for occurrence in all_occurrences:
        occurrence.isLightBulbOn = True
    view_fit(app)
    app.activeViewport.saveAsImageFile('D:/images/' + root_component.name + '.jpg', 600, 600)

    for occurrence in unique_children:
        visible_one_component(occurrence, all_occurrences)
        view_fit(app)
        component_name = occurrence.component.name
        app.activeViewport.saveAsImageFile('D:/images/' + component_name + '.jpg', 600, 600)

    for occurrence in all_occurrences:
        occurrence.isLightBulbOn = True
    
    view_fit(app)
    
def visible_one_component(occurrence1, all_occurrences):
    visible_flag = True
    for occurrence2 in all_occurrences:
        if not occurrence1 == occurrence2:
            if len(occurrence2.childOccurrences) > 0:
                occurrence2.isLightBulbOn = True
                visible_children(occurrence1)
            else:
                occurrence2.isLightBulbOn = False
        else:
            if visible_flag:
                visible_flag = False
                occurrence2.isLightBulbOn = True

def visible_children(occurrence1):
    for occurrence2 in occurrence1.childOccurrences:
        occurrence2.isLightBulbOn = True
        visible_children(occurrence2)

def view_fit(app):
    view_port = app.activeViewport
    if not view_port:
        return False
    camera = view_port.camera
    if not camera:
        return False
    camera.isFitView =  True
    view_port.camera = camera

def run(context):
    ui = None
    try:
        app = adsk.core.Application.get()
        ui  = app.userInterface

        unique_children_screenshots(app)

        ui.messageBox('Finished!!!')

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

記事の共有

関連記事

コメント

comments powered by Disqus