C#ATIA

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

GUIで開かれているドキュメントを判断する

ちょっぴりこちらの続きです。
細々とした最近の成果物 - C#ATIA

"少しづつ検討しているものの、こちらの問題にぶつかっています。"
と記載していた部分が解決しました。
Solved: Re: How to determine which documents are open in the GUI - Autodesk Community

リプライ頂いた方にも趣旨が伝わっていなかったようなので・・・。

こんな感じで図面のファイルを1個だけを開きます。
f:id:kandennti:20220310164738p:plain

こちらのスクリプトを実行すると、開かれたドキュメントの名前を
出力します。

# Fusion360API Python script

import traceback
import adsk.fusion
import adsk.core

def run(context):
    ui: adsk.core.UserInterface = None
    try:
        app: adsk.core.Application = adsk.core.Application.get()
        ui = app.userInterface

        docs: adsk.core.Documents = app.documents
        app.log(f'-- Documents Count:{docs.count} --')

        for doc in docs:
            df: adsk.core.DataFile = doc.dataFile
            app.log(f'{df.name}.{df.fileExtension} -- isVisible:{doc.isVisible}')

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

テストしていたものの場合、結果はこちらです。

 -- Documents Count:6 --
 SubAssy_NonPosition.f3d -- isVisible:True
 A.f3d -- isVisible:True
 B.f3d -- isVisible:True
 SubAssy_Position.f3d -- isVisible:True
 Assy.f3d -- isVisible:True
 draw.f2d -- isVisible:True

開いているのは1個のファイルだけなのに、6個のドキュメント名が出力
されます。 5個は表示されていないのですが、裏側でドキュメントが
開かれています。
(図面のファイルは開く事に時間がかかります。原因は関連する3Dの
ファイルも開いているからだと思います。)

isVisibleプロパティを期待しましたが、全てTrue (見えている) となって
しまい。判断する事が出来ませんでした。


大切なお話を忘れていました。
そもそも、何故そこを判断したいと思ったのか?
と言うお話です。

データパネルにあるファイルを開くにはDocuments.openメソッドを使用します。
Fusion 360 Help
試したところ、既に開いているファイルを開く操作や処理がGUIでも
APIでも出来ます。しかし実際は既に開かれている為、何も変化しません。
(2個のタブが出来るわけではありません)
何も変化しないので問題なさそうなのですが、クラウドからダウンロード
してくる時間がかかります。

上記のような状態で非表示のドキュメントをGUIで開いた状態にするのは
Document.activateメソッドを利用すれば表示される事が分かりました。
Fusion 360 Help
しかも既に読み込まれた状態の為、非常に高速です。
その方が良いですよね?

その為、実際に表示されているかどうかを判断したかったんです。


結局、テキストコマンドを探しまくって、こちらを見つけました。

DocumentMgt.DumpDocTxnEntity

上記の図面のみを開いているとこんな感じの出力です。

DocumentMgt.DumpDocTxnEntity 
---------------------
Top level document: draw v2
	Number of Chains: 0
	XRef Missing: 0
	BU Computed Needed: 0

draw.f2d と A.f3d を開いた状態であれば、この様になります。

---------------------
Top level document: draw v2
	Number of Chains: 0
	XRef Missing: 0
	BU Computed Needed: 0

---------------------
Top level document: A v5
	Number of Chains: 0
	XRef Missing: 0
	BU Computed Needed: 0

”Top level document: " と改行までが見えているドキュメント名
になっています。判断出来ますね。

最終的には、あちらのフォーラムに記載したものです。
テキストコマンドの出力結果を正規表記のこの一行で、
全てのドキュメント名を抜き出してます。

topLevelNames = re.findall(r'Top level document: (.+)\r', res)

カッコいい(自己満足)