NX Journal アセンブリのリストをcsvで保存

NX Journalでアセンブリのツリーのリストとパーツリストをcsvで出力するプログラムを作成しました。



componentクラスの GetChildrenIsSuppressed を使い子部品を取得して、pythonの標準ライブラリのcsvでCSVファイルとして保存しています。取得したい属性はattrに入れて、辞書のキーがコンポーネントから取得する属性で、値がCSVの保存時に使用する名前となります。CSVファイルはDドライブ直下にparts_list.csvとtree_list.csvで保存されます。

出力されるパーツリストは重複無しで部品を計数したリストです。ツリーリスト、パーツリスト共に抑制されたコンポーネントはスキップするようにしています。

import csv
import NXOpen

attr = {
    "part_number":"部品番号",
    "part_name":"部品名前",
}

def main():
    theSession  = NXOpen.Session.GetSession()
    workPart = theSession.Parts.Work
    theComponent = workPart.ComponentAssembly.RootComponent
    rank1 = 0
    parts_list = {}

    # アセンブリトップを追加
    tree_list = [ [rank1, theComponent] ]

    # 子部品の属性を再帰で取得
    recursion( theComponent, rank1 + 1, tree_list, parts_list )

    # ツリーリストをcsv出力
    csv_tree_list = [ [attr[key] for key in attr.keys()] ]
    for tmp in tree_list:
        component = [tmp[0]]
        for key in attr.keys():
            try:
                component.append( tmp[1].GetStringAttribute(key) )
            except:
                component.append("")
        csv_tree_list.append(component)
    saveCSV("D:\\tree_list.csv", csv_tree_list)
 
    # パーツリストをcsv出力
    csv_parts_list = [ [key, parts_list1[key]] for key in parts_list1 ]
    saveCSV("D:\\parts_list.csv", csv_parts_list)

def saveCSV(filename, lists):
    with open(filename, "w", encoding="cp932") as f:
        writer = csv.writer(f, lineterminator="\n")
        writer.writerows(lists)

def recursion( component1, rank2, tree_list2, parts_list2 ):
    for child1 in component1.getChildren():
 
        # 抑制されていればスキップ
        if child1.IsSuppressed:
            continue
 
        # ツリーリストに追加
        tree_list2.append( [rank2, child1] )
 
        # パーツリストに追加
        part_no = component2.GetStringAttribute(attr["部品番号"])
        if part_no in parts_list2.keys:
            parts_list2[part_no] = parts_list2[part_no] + 1
        else:
            parts_list2[part_no] = 1
 
        # 再帰実行
        recursion( child1, rank2 + 1, tree_list2, parts_list2 )

if __name__ == '__main__':
    main()

コメント

タイトルとURLをコピーしました