iCAD SXからツリー情報を取得してみた

2023/08/23 categories:iCAD SX| tags:iCAD SDK|iCAD SX|Python|

iCAD SXでアセンブリの子部品を再帰的に取得し、パーツ名を表示するPythonプログラムを作成してみました。

再帰的にパーツを取得

sxnet.SxInfPartTreeでパーツの子部品のリストを取得できるようなので、パーツの子部品から子部品を取得するという再帰的な処理get_partsで子部品を取得しました。階層の深さlevelとパーツ名とprintで出力します。処理内容は、単純に子部品のレベルと名前をforでprintして、再帰でまた関数を呼び出すという感じです。

def get_parts(level: int, inf_part_tree: 'sxnet.SxInfPartTree'):
    if inf_part_tree.child_list is not None:
        for child_inf_part_tree in inf_part_tree.child_list:
            child_inf_part = child_inf_part_tree.inf
            print( '{}\n{}'.format(level, child_inf_part.name) )
            get_parts(level + 1, inf_part_tree)

CAD上で表示しているモデルはSxWF.getActive()で取得できて、そのSxWFからツリー情報を取得するには、SxWF.getInfPartTree()を実行するようです。

active_wf = sxnet.SxWF.getActive()
inf_part_tree = active_wf.getInfPartTree()

以下のような感じでコンソールに表示されます。

ただし、inf_part_tree = active_wf.getInfPartTree()でアクティブなモデルの子部品を取得していますが、パーツ数が多すぎるとメモリ不足というエラーが出てしまいます。正確な数字は分かりませんが、数万点のパーツ数ではエラーが出たと思います。

0    part_a
1    part_b
2    part_c
1    part_d

Pythonコード

import clr
clr.AddReference('C:/icad sx/bin/sxnet.dll')
import sxnet

def get_parts(level: int, inf_part_tree: 'sxnet.SxInfPartTree'):
    if inf_part_tree.child_list is not None:
        for child_inf_part_tree in inf_part_tree.child_list:
            child_inf_part = child_inf_part_tree.inf
            print( '{}\n{}'.format(level, child_inf_part.name) )
            get_parts(level + 1, inf_part_tree)

def main():
    sxnet.SxSys.init(3999)
    active_wf = sxnet.SxWF.getActive()
    if active_wf is None:
        return
    inf_part_tree = active_wf.getInfPartTree()
    if inf_part_tree is None:
        return
    get_parts(0, inf_part_tree)

if __name__ == '__main__':
    main()

Share post

Related Posts

コメント