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()