C#ATIA

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

要素の依存関係8

こちらの続きです。
要素の依存関係7 - C#ATIA

ほぼ変わっていないのですが、プロファイルを持っているものは
そのスケッチを表示させるようにしました。

よく考えたら辞書で管理している為、確認の出力はjsonにすれば
簡単でした。

# Fusion360API Python script

import traceback
import adsk.fusion
import adsk.core
import json

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 = {}
        try:
            for body in selFeat.bodies:
                dict[body.entityToken] = {
                    'name': body.name,
                    'features': []
                }
        except:
            pass

        if len(dict.keys()) < 1:
            timeline.markerPosition = backupMarker
            return

        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]
                timeObj.rollTo(True) # <-これ重要
                for key in dict.keys():
                    if key in tokens:
                        dict[key]['features'].append(getReference(feat))

            except:
                pass

        timeline.markerPosition = backupMarker

        print(json.dumps(dict, indent=4))
        app.log(f'{json.dumps(dict, indent=4)}')

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


def getReference(feat: adsk.fusion.Feature):
    refs = getProfileReferences(feat)
    
    return {
        'name': feat.name,
        'refs': [ref.name for ref in refs]
    }

def getProfileReferences(self):

    def getParentEntity(prof):
        if hasattr(prof, 'parentSketch'):
            return prof.parentSketch
        elif hasattr(prof, 'body'):
            return prof.body
        else:
            return

    try:
        prof = self.profile
        if hasattr(prof, '__iter__'):
            profs = [getParentEntity(p) for p in self.profile]
            profsDict = {}
            [profsDict.setdefault(p.entityToken, p) for p in profs]
            return list(profsDict.values())
        else:
            return [getParentEntity(prof)]
    except:
        return []


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

結果はこちら

 {
    "/v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZwvUFb/9Lr/M/2fqCZ/KrZ70ngCqMFIzNFJITk9IsjNISdZOMLC10TdIMU3UtEy2TdE0s0xKTDc2NjJNSksBqgWYwoAGwfQYKYOtA1hsbGgEA8u9PbYgAAAA=": {
        "name": "Body1",
        "features": [
            {
                "name": "Extrude1",
                "refs": [
                    "Sketch1"
                ]
            },
            {
                "name": "Extrude3",
                "refs": [
                    "Sketch3"
                ]
            },
            {
                "name": "Fillet1",
                "refs": []
            },
            {
                "name": "Hole1",
                "refs": []
            },
            {
                "name": "Sweep1",
                "refs": [
                    "Sketch4"
                ]
            },
            {
                "name": "Extrude4",
                "refs": []
            },
            {
                "name": "Draft2",
                "refs": []
            },
            {
                "name": "Extrude5",
                "refs": [
                    "Sketch7"
                ]
            },
            {
                "name": "Extrude6",
                "refs": [
                    "Sketch8"
                ]
            },
            {
                "name": "Extrude7",
                "refs": [
                    "Sketch8"
                ]
            },
            {
                "name": "Extrude8",
                "refs": [
                    "Sketch9"
                ]
            },
            {
                "name": "Mirror1",
                "refs": []
            },
            {
                "name": "Fillet2",
                "refs": []
            },
            {
                "name": "Fillet3",
                "refs": []
            },
            {
                "name": "Chamfer1",
                "refs": []
            },
            {
                "name": "Web1",
                "refs": []
            },
            {
                "name": "Mirror2",
                "refs": []
            }
        ]
    }
}