C#ATIA

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

要素の依存関係7

時間が経ちましたが、こちらの続きです。
要素の依存関係6 - C#ATIA

別の事をやっていた事が原因ですが、こちらはモチベーションが
上がらないです。原因はこちら
フィレットの元のエッジを探せ!!5 - C#ATIA
entityTokenを頼りに親子関係を取得しようと思いましたが、
モデリングする順番などで、正確な情報の取得が出来ない
と判断しました。ひょっとしたらtempIDで関係が取得出来る
可能性もあるのですが・・・面倒です。


今のところそれっぽいものを作れそうなものは、
"Body1が何のフィーチャで出来ているか?"ぐらいです。

その為のテストコードです。

# Fusion360API Python script

import traceback
import adsk.fusion
import adsk.core


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

        msg: str = 'Select'
        selFilter: str = 'Features'
        sel: adsk.core.Selection = selectEnt(msg, selFilter)
        if not sel:
            return

        timeline: adsk.fusion.Timeline = des.timeline
        backupMarker = timeline.markerPosition

        selFeat: adsk.fusion.Feature = sel.entity
        selTimeObj: adsk.fusion.TimelineObject = selFeat.timelineObject

        selTimeObj.rollTo(False)
        dict = {}
        for body in selFeat.bodies:
            dict[body.entityToken] = {
                'name': body.name,
                'features': []
            }

        timeObjs = [timeline.item(idx) for idx in range(timeline.count)]

        for timeObj in timeObjs:
            timeObj: adsk.fusion.TimelineObject
            timeObj.rollTo(False)
            feat: adsk.fusion.Feature = timeObj.entity

            try:
                tokens = [b.entityToken for b in feat.bodies]
                for key in dict.keys():
                    if key in tokens:
                        dict[key]['features'].append(feat.name)

            except:
                pass

        timeline.markerPosition = backupMarker


        # dump
        for key in dict.keys():
            name = dict[key]['name']
            feats = '\n'.join(dict[key]['features'])
            print(f'** {name} **')
            print(feats)

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


def selectEnt(
        msg: str,
        filterStr: str) -> adsk.core.Selection:

    try:
        app: adsk.core.Application = adsk.core.Application.get()
        ui: adsk.core.UserInterface = app.userInterface
        sel = ui.selectEntity(msg, filterStr)
        return sel
    except:
        return None

スクリプト実行後、フィーチャを選択(スケッチはNG)すると
選択したフィーチャのボディに関連するフィーチャ名を
出力します。

例えば、こちらのデータの一番最後のミラーで試すと

こんな感じです。

** Body1 **
Extrude1
Extrude3
Fillet1
Hole1
Sweep1
Extrude4
Draft2
Extrude5
Extrude6
Extrude7
Extrude8
Mirror1
Fillet2
Fillet3
Chamfer1
Web1
Mirror2

"Body1" は、これらのフィーチャで作成されている情報は
取得できます。あとは、各フィーチャがスケッチから作成されている場合は
スケッチ名を、結合の場合はボディ名をぶら下げるぐらいかな・・・。