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

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

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

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

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

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

def recursion(component, rank):
    if component.material is None:
        tree_bom.append({'rank':str(rank), 'part number':component.name, 'material':''})
    else:
        tree_bom.append({'rank':str(rank), 'part number':component.name, 'material':component.material.name})
    components = [ occurrence.component for occurrence in component.occurrences ]
    for component in components:
        recursion(component, rank + 1)
tree_bom = []
recursion(root_component, 0)

辞書のリストをCSVで保存

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

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

ソースコード

#Author-
#Description-
import adsk.core, adsk.fusion, traceback
import csv

def save_tree_bom(root_component, filename):
    def recursion(component, rank):
        if component.material is None:
            tree_bom.append({'rank':str(rank), 'part number':component.name, 'material':''})
        else:
            tree_bom.append({'rank':str(rank), 'part number':component.name, 'material':component.material.name})
        components = [ occurrence.component for occurrence in component.occurrences ]
        for component in components:
            recursion(component, rank + 1)
    tree_bom = []
    recursion(root_component, 0)
    
    with open(filename, 'w', newline='') as f:
        writer = csv.DictWriter( f, tree_bom[0].keys() )
        writer.writeheader()
        writer.writerows(tree_bom)

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

        design = app.activeProduct
        if not design:
            ui.messageBox('No active design', 'Save tree bom')
            return

        save_tree_bom(design.rootComponent, 'D:/list.csv')

        ui.messageBox('Finished!!')

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

記事の共有

関連記事

コメント

comments powered by Disqus