C#ATIA

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

フィレットの元のエッジを探せ!!1

タイトルが若干過剰です。

フィレットを付けた際の元のエッジがどのフィーチャで作成されたか?
を探し出します。

取りあえず作りましたが、これは正しくない事が分かりました。
が、無くしてしまいそうなので、とりあえず書き残しておきます。

# 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
        root: adsk.fusion.Component = des.rootComponent

        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

        feat: adsk.fusion.Feature = sel.entity
        timeObj: adsk.fusion.TimelineObject = feat.timelineObject
        timeObj.rollTo(True)
        edgeSets = [es for es in sel.entity.edgeSets]

        edgeTokens =[]
        for edgeset in edgeSets:
            edgeTokens.extend([e.entityToken for e in edgeset.edges])

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

        useFeats = []
        for timeObj in timeObjs[::-1]:
            timeEnt: adsk.fusion.Feature = timeObj.entity
            if not hasattr(timeEnt, 'bodies'):
                continue

            timeObj.rollTo(False)
            tmpTokens = []
            for body in timeEnt.bodies:
                tmpTokens.extend([e.entityToken for e in body.edges])
            if any([token in edgeTokens for token in tmpTokens]):
                useFeats.append(timeEnt)

        [app.log(f.name) for  f in useFeats[::-1]]

        timeline.markerPosition = backupMarker

    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。先頭からにすべし。
・エッジを見つけたら、edgeTokensリストから除去しないと
 重複して見つけ出してしまう。あくまで最初のフィーチャを
 見つけ出す。

タイムラインの長さにもよりますが、まぁワンテンポ待ちぐらい
なので耐えられない事は無いぐらいの時間でした。
”作成” 側のコマンドは親子を見る必要が有るけど、"修正" 側の
コマンドは親だけ見つければ良いのかな?