C#ATIA

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

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

こちらの続きであり、
ボディの体積をダンプする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です。
(結果のダンプ関数も修正する必要があります)


あぁ時間が無い・・・。