こちらの続きであり、
ボディの体積をダンプする5 - C#ATIA
こちらの続きです。
pycatiaを味わう2 - C#ATIA
折角pycatiaの開発環境が出来たので、VBA相当の処理を試してみます。
# pycatia test import os import sys sys.path.insert(0, os.path.abspath("..\\pycatia")) from pycatia import catia def main() -> None: caa = catia() # PartDoc取得 partDoc = caa.active_document # Part取得 part = partDoc.part # SPA WorkBench取得 VBAと違いすぎてわからん・・・ spa = partDoc.spa_workbench() # 全てのBodyを取得 後々の扱いを考えリストとして bodies = list(part.bodies) # Bodyに対して拡張プロパティ的にmeasurableを追加する for body in bodies: if body.shapes.count < 0: body.measurable = None continue ref = part.create_reference_from_object( body.shapes.item(body.shapes.count) ) body.measurable = spa.get_measurable(ref) # 確認 dump_bodies_volume("- ソート前 -", bodies) # ソート sortedBodies = sorted(bodies, key=lambda x:x.measurable.volume) # 確認 dump_bodies_volume("- ソート後 -", sortedBodies) def dump_bodies_volume( title: str, bodies: list, ) -> None: print(title) [print(f"{body.name} : {body.measurable.volume}") for body in bodies] main()
この様なデータを用意しました。
実行結果はこちらです。
- ソート前 - パーツ ボディー : 6.283185307179583e-05 ボディー.2 : 0.00010053096491487339 ボディー.3 : 6.283185307179587e-06 ボディー.4 : 1.2566370614359172e-05 - ソート後 - ボディー.3 : 6.283185307179587e-06 ボディー.4 : 1.2566370614359172e-05 パーツ ボディー : 6.283185307179583e-05 ボディー.2 : 0.00010053096491487339
あぁ指数表記が・・・、多分合ってます。
”Bodyに対して拡張プロパティ的にmeasurableを追加する”で
行っている処理が非常に無駄な気もするのですが、CATIAの場合は
Body自体が体積を持っていない為、避けることが出来ない処理です。
しかし、上記処理を行ったおかげで、
# ソート sortedBodies = sorted(bodies, key=lambda x:x.measurable.volume)
の一行で、体積の小さい順にソート処理されたリストの取得が出来ます。
仮に、これを表面積にしたいのであれば、
# ソート sortedBodies = sorted(bodies, key=lambda x:x.measurable.area)
と書き換えるだけでOKです。
(結果のダンプ関数も修正する必要があります)
あぁ時間が無い・・・。