こちらの続きです。
ボディの体積をダンプする2 - C#ATIA
前回は単純にルートコンポーネントのボディを取得した順番に
体積をダンプしました。
目的によりますが取得した順番で処理を行うより、ソートされた
状態で処理を行った方が効率が良い場面が、結構あります。
で、体積の小さい順にソートする処理は、Fusion360であれば
こんな感じです。(他にも有るはずです)
# Fusion360API Python script import traceback import adsk.core as core import adsk.fusion as fusion def run(context): ui: core.UserInterface = None try: app: core.Application = core.Application.get() ui = app.userInterface des: fusion.Design = app.activeProduct root: fusion.Component = des.rootComponent bodies = list(root.bRepBodies) dump_bodies_volume("- ソート前 -", bodies) # ソート bodies.sort(key=lambda x:x.volume) dump_bodies_volume("- ソート後 -", bodies) except: if ui: ui.messageBox('Failed:\n{}'.format(traceback.format_exc())) def dump_bodies_volume( title: str, bodies: list[fusion.BRepBody], ) -> None: app: core.Application = core.Application.get() app.log(title) [app.log(f"{body.name} : {body.volume}") for body in bodies]
適当なデータを元に、実行した結果はこんな感じです。
- ソート前 - ボディ1 : 523.5987755982989 ボディ2 : 11.288630390154829 ボディ3 : 11.166338980586621 ボディ4 : 64.15144164664072 - ソート後 - ボディ3 : 11.166338980586621 ボディ2 : 11.288630390154829 ボディ4 : 64.15144164664072 ボディ1 : 523.5987755982989
これを体積ではなく、表面積で処理したくなった場合は、
2行を修正するのみです。
・・・ # bodies.sort(key=lambda x:x.volume) bodies.sort(key=lambda x:x.area) ・・・ # [app.log(f"{body.name} : {body.volume}") for body in bodies] [app.log(f"{body.name} : {body.area}") for body in bodies] ・・・
簡単ですね。
これと同等の処理を清楚に、CATIA V5のマクロで実現する方法は
有るのでしょうか? と言う事が元々の本題です。
(今の所、見つかって無い)