C#ATIA

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

任意のコンポーネントに関連するオカレンスを取得

Fusion360APIで深いコンポーネントのデータを扱ったことが
無かったため、理解するためにゴニョゴニョしてます。

例えばこんな感じの状態です。
f:id:kandennti:20191028172729p:plain
青矢印のスケッチが影響を受けているのは
コンポーネント1:1
コンポーネント2:1
コンポーネント3:1
の3個です。これらのオカレンスを取得したいと思っているのですが、
サクッと行う方法が見つからないんです。

こちらのComponentオブジェクトのメソッド
「allOccurrencesByComponent」や「occurrencesByComponent」で
取得出来るのかな と思っていたのですが、出来ないんです。
Fusion 360 Help
allOccurrencesByComponentメソッドであれば、指定した
コンポーネントに直接関係するオカレンスは取得出来る感じです。
(occurrencesByComponentは謎のまま)

現在、目的を果せそうな唯一の方法はOccurrenceオブジェクトの
「fullPathName」で返ってくる文字列です。
Fusion 360 Help
コンポーネント1:1」のオカレンスで試すとこんな感じです。
f:id:kandennti:20191028172718p:plain

簡単な方法が有るのではないのかな? とは思いつつ見つからないので
fullPathNameメソッドを利用してこんな感じのものを作ってみました。

#fusion360API_python
import adsk.core, adsk.fusion, traceback

def run(context):
    ui = None
    try:
        app = adsk.core.Application.get()
        ui  = app.userInterface
        des = adsk.fusion.Design.cast(app.activeProduct)

        tgtComp = des.allComponents.itemByName('コンポーネント1')

        occs = GetParentOccurrenceList(tgtComp)

        if occs is None:
            ui.messageBox('Nothing Occurrence')
        else:
            occs_name = [occ.name for occ in occs]
            ui.messageBox('\n'.join(occs_name))

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

def GetParentOccurrenceList(comp):
    comp = adsk.fusion.Component.cast(comp)
    des = adsk.fusion.Design.cast(comp.parentDesign)
    root =des.rootComponent

    if root == comp:
        return None

    occs = root.allOccurrencesByComponent(comp)
    if len(occs) < 1:
        return None

    occ = occs[0]
    occ_names = occ.fullPathName.split('+')
    occs = [root.allOccurrences.itemByName(name) 
                for name in occ_names]

    return occs

実行するとこんな感じです。
f:id:kandennti:20191028172707p:plain
一応目的は果たしています・・・もっと簡単な方法あるような気がする。
質問しようかなぁ。