シートセットマネージャの深淵へ:GetInterfaceObjectで解き明かすプロジェクト情報の抽出術
AutoCADのオブジェクトモデルを語る際、多くのエンジニアは`ActiveDocument`や`ModelSpace`といった表層的な階層に終始する。だが、大規模プロジェクトの現場で真に求められるのは、図面単体ではなく「プロジェクト全体」の統括データだ。
今回解説するのは、VBAの標準的なオブジェクトブラウザには決して姿を現さない、しかし強力なCOMインターフェースである`AcSmSheetSetMgr`を呼び出し、シートセットマネージャ(SSM)のデータを抽出する手法だ。これは、単なる自動化を超えた、システム統合の第一歩である。
—
1. なぜ「GetInterfaceObject」なのか?
通常、AutoCADのVBA環境は`AcadApplication`を頂点とする階層構造で定義されている。しかし、シートセット管理(.dstファイル)の機能は、AutoCADのコアプロセスとは別個のCOMサーバーとして実装されている。
これを呼び出すために必要なのが `GetInterfaceObject` だ。このメソッドは、AutoCADのオブジェクトモデルが公開していない外部インターフェースを、 ProgID を指定してインスタンス化する「裏口」とも呼べる手法である。
プログレスIDの正体
‘ 必要なProgID
Const PROGID_SSM As String = “SheetSetManager.SheetSetManager.1”
このIDを指定することで、AutoCADの内部メモリ空間を汚染することなく、シートセットマネージャのCOMコンポーネントを直接操ることが可能となる。
—
2. 実装の極意:メモリ管理とCOMのライフサイクル
VBAのガーベジコレクションは極めて脆弱だ。特にCOMオブジェクトを扱う際、明示的な解放を怠れば、AutoCADの終了時にゾンビプロセスが残り、致命的なメモリリークを引き起こす。
以下のコードは、単に動くものではなく、「終了後の後始末まで完璧に設計された」実務コードである。
Public Sub ExportSheetSetData(dstFilePath As String)
Dim oSSM As Object
Dim oDatabase As Object
‘ 1. インターフェースの取得
On Error Resume Next
Set oSSM = ThisDrawing.Application.GetInterfaceObject(“SheetSetManager.SheetSetManager.1”)
If Err.Number <> 0 Then
MsgBox “SSMインターフェースが取得できません。AutoCADが適切にインストールされているか確認してください。”
Exit Sub
End If
On Error GoTo 0
‘ 2. データベースのオープン
‘ 注意: OpenDatabaseは排他制御を伴うため、ReadOnlyモードを強く推奨
Set oDatabase = oSSM.OpenDatabase(dstFilePath, True)
‘ 3. ここで再帰関数を用いてシート情報を取得する(詳細は後述)
TraverseSheetSet oDatabase.GetSheetSet
‘ 4. 厳格なメモリ解放 (重要)
‘ COMオブジェクトへの参照を全てNothingに設定し、GCに明示的に通知する
Set oDatabase = Nothing
Set oSSM = Nothing
Debug.Print “処理完了: メモリ解放済み”
End Sub
—
3. 深層解析:シートセットの再帰的走査
シートセットはツリー構造だ。ルートの下に複数のサブセット(フォルダ)があり、その中にシートが存在する。これを処理するには、再帰アルゴリズムが不可欠である。
Private Sub TraverseSheetSet(oElem As Object)
Dim oChild As Object
‘ 自身のタイプを判定して処理
If TypeOf oElem Is IAcSmSheet Then
‘ シートの場合の処理:シート番号とタイトルを抽出
Debug.Print “Sheet: ” & oElem.GetNumber & ” – ” & oElem.GetTitle
ElseIf TypeOf oElem Is IAcSmSubset Then
‘ サブセットの場合、再帰的に探索
For Each oChild In oElem
TraverseSheetSet oChild
Next
End If
End Sub
—
4. チーフアーキテクトからの助言:現場で生き残るための知見
1. Late Bindingの活用:
`AcSmComponents`ライブラリを参照設定に追加する手もあるが、バージョン間の互換性問題(AutoCAD 2022と2024でライブラリが異なる等)を回避するため、あえて`Object`型を用いた「Late Binding」を推奨する。これにより、配布先で「参照不可」エラーに悩まされるリスクをゼロにできる。
2. Windows APIによる制御:
大規模なシートセットを扱う際、SSMのダイアログが背面に隠れてプロセスが停止することがある。`FindWindow` APIを使用してSSMのウィンドウハンドルを監視し、必要に応じて`SetForegroundWindow`で前面に引き出す処理を組み込めば、システム管理者が運用する際の信頼性は格段に向上する。
3. 例外ハンドリングの徹底:
ネットワーク越しに`.dst`ファイルを開く際は、排他ロックが頻発する。`On Error Resume Next`を多用するのではなく、ファイル属性を事前に確認し、読み取り専用で開くロジックを強制すべきだ。
結び:エンジニアの誇り
シートセットマネージャのハックは、AutoCAD自動化の中でも「禁断の果実」に近い。しかし、これをマスターすれば、数百枚の図面管理台帳をわずか数秒で作成し、整合性を自動チェックするシステムを構築できる。
VBAはレガシーではない。使い手の知性次第で、それは現代の複雑なBIM/CIMフローにおいて、なおも最強の武器となり得るのだ。コードの美しさと、メモリへの敬意を忘れないこと。それが、真のアーキテクトの道である。
