C#ATIA

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

全ての原点を表示/非表示する2

こちらの続きです。
全ての原点を表示/非表示する(失敗) - C#ATIA

リンク付きコンポーネントにも対応したいので、機能を探しまくり。

テキストコマンドで選択する方法がもう一つあったことを思い出し、
単体でテストしたところ上手く行きました。
onkのフォーマットを調べた事が無かったのですがこんな感じです。

ObjectPaths.Onk 
ONK::CmpInst=Assy%20v9/Cmp=Assy%20v9/CmpInsts/CmpInst=SubAssy_NonPosition%20v3%3A1/Cmp=SubAssy_NonPosition%20v3/CmpInsts/CmpInst=A%20v1%3A1/Cmp=A%20v1/OriginWorkGeometry

良く調べると、URLエンコード絡みだと分かり解読出来ました。

この様なテストコードで試すと、リンク付きコンポーネントも含め
全ての原点フォルダの表示/非表示について切り替えが可能に
なりました。

# Fusion360API Python script

import traceback
import adsk.fusion
import adsk.core
import urllib

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

        # axis select ok
        dict = {}
        for occ in root.allOccurrences:
            comp: adsk.fusion.Component = occ.component
            dict[occ.name] = comp.name

        root_onk = f'ONK::CmpInst={urllib.parse.quote(root.name)}/Cmp={urllib.parse.quote(root.name)}'
        for o in root.allOccurrences:
            o: adsk.fusion.Occurrence
            fullpath = o.fullPathName
            app.log(fullpath)
            onks = [root_onk]
            paths = fullpath.split('+')
            for path in paths:
                onks.append(f'/CmpInsts/CmpInst={urllib.parse.quote(path)}/Cmp={urllib.parse.quote(dict[path])}')
            onks.append('/OriginWorkGeometry')
            onk = ''.join(onks)
            app.log(onk)
            app.executeTextCommand(u'Commands.Select {}'.format(onk))
        app.executeTextCommand(u'Commands.Start VisibilityToggleCmd')

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

出来るのは良いのですが、あくまで表示/非表示を切り替えるだけで
現状が表示・非表示どちらかなのかを判断する方法が見つからず
悩んでます。

テキストコマンドの

VO.List

表示されている原点フォルダの情報っぽいものは出力される所
までは見付けたのですが・・・。先が長い。