C#ATIA

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

表示されているボディ情報を集計する1

こちらの取り組みです。
解決済み: 部品の集計方法について - Autodesk Community

ボディを集計すべきなのか?コンポーネントを修正すべきなのか?
迷っていますが、とりあえずボディを集計する事にします。

テストデータは、以前頂いたデータをちょっと修正しました。

ルートコンポーネントの ”main_assy v3" 内にボディが一つで、
"Base-A_assy v1:1" "Base-B_assy v2:1" "Base-B_assy v2:2" の
3個の子コンポーネントが有ります。
コンポーネントそれぞれの中にはボディは無く、
コンポーネントを複数持っている状態で、それぞれには
ボディが1個入っています。
そして、"Base-B_assy v2:1" "Base-B_assy v2:2" は、
同一のドキュメントです。
・・・言葉の説明では伝わりにくいです。

取りあえず、こんなスクリプトを作りました。

# Fusion360API Python script

import traceback
import adsk.fusion
import adsk.core
from collections import Counter

def run(context):
    ui = adsk.core.UserInterface.cast(None)
    try:
        app: adsk.core.Application = adsk.core.Application.get()
        ui = app.userInterface
        des: adsk.fusion.Design = app.activeProduct
        root: adsk.fusion.Component = des.rootComponent

        # 表示されているボディの取得
        showBodies: adsk.core.ObjectCollection = root.findBRepUsingPoint(
            adsk.core.Point3D.create(0,0,0),
            adsk.fusion.BRepEntityTypes.BRepBodyEntityType,
            1000000000000,
            True
        )

        # ボディから "ボディ名 : コンポネント名" として情報取得
        infos = []
        for b in showBodies:
            try:
                compName = b.assemblyContext.component.name
            except:
                compName = root.name

            infos.append(f'{compName} : {b.name}')

        # 集計
        res = Counter(infos)

        # 結果表示
        app.log('--------------------------------')
        app.log('コンポーネント名 : ボディ名 --- 個数')
        app.log('--------------------------------')
        for key in res.keys():
            app.log(f'{key} --- {res[key]}')

    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

これを実行すると、こんな感じの結果になります。

 --------------------------------
 コンポーネント名 : ボディ名 --- 個数
 --------------------------------
 main_assy v3 : ボディ1 --- 1
 ベース-D1 v1 : ボディ1 --- 1
 ベース-F v1 : ボディ1 --- 1
 ベース-E v1 : ボディ1 --- 1
 ベース-I1 v1 : ボディ1 --- 2
 ベース-G1 v1 : ボディ1 --- 2
 ベース-H1 v1 : ボディ1 --- 2
 ベース-C1 v2 : ボディ1 --- 2

"Base-B_assy v2:2" を非表示にして実行した結果はこちら

 --------------------------------
 コンポーネント名 : ボディ名 --- 個数
 --------------------------------
 main_assy v3 : ボディ1 --- 1
 ベース-D1 v1 : ボディ1 --- 1
 ベース-F v1 : ボディ1 --- 1
 ベース-E v1 : ボディ1 --- 1
 ベース-I1 v1 : ボディ1 --- 1
 ベース-G1 v1 : ボディ1 --- 1
 ベース-H1 v1 : ボディ1 --- 1
 ベース-C1 v2 : ボディ1 --- 1

取りあえず僕がイメージしている結果は得られています。

色々疑問。
・表示しているボディの集計で良いのかな?非表示もかな?
・そもそもボディでは無く、コンポーネントの集計かな?
CSV等のファイルに出力した方が良いのかな?