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

Share on:

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

処理内容

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

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

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

1root_component = app.activeProduct.rootComponent
2all_occurrences = root_component.allOccurrences
3for occurrence in all_occurrences:
4    occurrence.isLightBulbOn = True

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

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

1def view_fit(app):
2    view_port = app.activeViewport
3    if not view_port:
4        return False
5    camera = view_port.camera
6    if not camera:
7        return False
8    camera.isFitView =  True
9    view_port.camera = camera

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

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

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

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

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

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

 1def visible_one_component(occurrence1, all_occurrences):
 2    visible_flag = True
 3    for occurrence2 in all_occurrences:
 4        if not occurrence1 == occurrence2:
 5            if len(occurrence2.childOccurrences) > 0:
 6                occurrence2.isLightBulbOn = True
 7                visible_children(occurrence1)
 8            else:
 9                occurrence2.isLightBulbOn = False
10        else:
11            if visible_flag:
12                visible_flag = False
13                occurrence2.isLightBulbOn = True

動作の様子

出力された画像

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

ソースコード

 1#Author-
 2#Description-
 3
 4import adsk.core, adsk.fusion, adsk.cam, traceback
 5
 6def unique_children_screenshots(app):
 7    root_component = app.activeProduct.rootComponent
 8    all_occurrences = root_component.allOccurrences
 9    unique_children = { occ.component.name : occ for occ in all_occurrences }
10    unique_children = [ unique_children[key] for key in unique_children ]
11
12    for occurrence in all_occurrences:
13        occurrence.isLightBulbOn = True
14    view_fit(app)
15    app.activeViewport.saveAsImageFile('D:/images/' + root_component.name + '.jpg', 600, 600)
16
17    for occurrence in unique_children:
18        visible_one_component(occurrence, all_occurrences)
19        view_fit(app)
20        component_name = occurrence.component.name
21        app.activeViewport.saveAsImageFile('D:/images/' + component_name + '.jpg', 600, 600)
22
23    for occurrence in all_occurrences:
24        occurrence.isLightBulbOn = True
25    
26    view_fit(app)
27    
28def visible_one_component(occurrence1, all_occurrences):
29    visible_flag = True
30    for occurrence2 in all_occurrences:
31        if not occurrence1 == occurrence2:
32            if len(occurrence2.childOccurrences) > 0:
33                occurrence2.isLightBulbOn = True
34                visible_children(occurrence1)
35            else:
36                occurrence2.isLightBulbOn = False
37        else:
38            if visible_flag:
39                visible_flag = False
40                occurrence2.isLightBulbOn = True
41
42def visible_children(occurrence1):
43    for occurrence2 in occurrence1.childOccurrences:
44        occurrence2.isLightBulbOn = True
45        visible_children(occurrence2)
46
47def view_fit(app):
48    view_port = app.activeViewport
49    if not view_port:
50        return False
51    camera = view_port.camera
52    if not camera:
53        return False
54    camera.isFitView =  True
55    view_port.camera = camera
56
57def run(context):
58    ui = None
59    try:
60        app = adsk.core.Application.get()
61        ui  = app.userInterface
62
63        unique_children_screenshots(app)
64
65        ui.messageBox('Finished!!!')
66
67    except:
68        if ui:
69            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

関連記事