Fusion360 APIを使ってアセンブリのツリーリストをCSVで出力してみた

Share on:

Fusion360でコンポーネントのツリーリストをCSVファイルとして保存するプログラムをPythonで作成してみました。

再帰で子部品の属性を取得する

まず属性の取得は下記のようなプログラムにしました。componentにmaterialがなければmaterialを空の文字列として、materialがあればcomponent.material.nameをmaterialとするプログラムにしています。

1if component.material is None:
2    tree_bom.append({'rank':str(rank), 'part number':component.name, 'material':''})
3else:
4    tree_bom.append({'rank':str(rank), 'part number':component.name, 'material':component.material.name})

上記のようにコンポーネントの属性を取得して、コンポーネントの子部品について探索する処理はrecursionという関数を再帰的に呼び出して子部品の属性を探索する処理にしました。

 1def recursion(component, rank):
 2    if component.material is None:
 3        tree_bom.append({'rank':str(rank), 'part number':component.name, 'material':''})
 4    else:
 5        tree_bom.append({'rank':str(rank), 'part number':component.name, 'material':component.material.name})
 6    components = [ occurrence.component for occurrence in component.occurrences ]
 7    for component in components:
 8        recursion(component, rank + 1)
 9tree_bom = []
10recursion(root_component, 0)

辞書のリストをCSVで保存

csvモジュールを使用して辞書のリストtree_bomをcsvとして保存しました。

1with open(filename, 'w', newline='') as f:
2    writer = csv.DictWriter( f, tree_bom[0].keys() )
3    writer.writeheader()
4    writer.writerows(tree_bom)

ソースコード

 1#Author-
 2#Description-
 3import adsk.core, adsk.fusion, traceback
 4import csv
 5
 6def save_tree_bom(root_component, filename):
 7    def recursion(component, rank):
 8        if component.material is None:
 9            tree_bom.append({'rank':str(rank), 'part number':component.name, 'material':''})
10        else:
11            tree_bom.append({'rank':str(rank), 'part number':component.name, 'material':component.material.name})
12        components = [ occurrence.component for occurrence in component.occurrences ]
13        for component in components:
14            recursion(component, rank + 1)
15    tree_bom = []
16    recursion(root_component, 0)
17    
18    with open(filename, 'w', newline='') as f:
19        writer = csv.DictWriter( f, tree_bom[0].keys() )
20        writer.writeheader()
21        writer.writerows(tree_bom)
22
23def run(context):
24    ui = None
25    try:
26        app = adsk.core.Application.get()
27        ui  = app.userInterface
28
29        design = app.activeProduct
30        if not design:
31            ui.messageBox('No active design', 'Save tree bom')
32            return
33
34        save_tree_bom(design.rootComponent, 'D:/list.csv')
35
36        ui.messageBox('Finished!!')
37
38    except:
39        if ui:
40            ui.messageBox( 'Failed:\n{}'.format( traceback.format_exc() ) )

関連記事