こちらの続きです。
要素の依存関係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": [] } ] } }