C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

ボディの体積をダンプする3

こちらの続きです。
ボディの体積をダンプする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のマクロで実現する方法は
有るのでしょうか? と言う事が元々の本題です。
(今の所、見つかって無い)