時間が経ちましたが、こちらの続きです。
要素の依存関係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" は、これらのフィーチャで作成されている情報は
取得できます。あとは、各フィーチャがスケッチから作成されている場合は
スケッチ名を、結合の場合はボディ名をぶら下げるぐらいかな・・・。