【入門編】【実務中級】AcadApplication.GetInterfaceObjectによる「AcSmSheetSetMgr」操作:シートセットの情報を一括取得する – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAの深淵へ:シートセットマネージャ(SSM)をプログラムで完全掌握する

こんにちは。AutoCADの自動化という荒野を切り拓く皆さんに、今日は「一段上のエンジニア」になるための極意を伝授します。

多くのユーザーがVBAを始めると、`ActiveDocument`や`ModelSpace`といった、いわば「玄関先」のオブジェクトだけで満足してしまいます。しかし、大規模プロジェクトで避けて通れない「シートセットマネージャ(SSM)」のデータに触れようとすると、途端にオブジェクトブラウザから存在が消えてしまい、挫折する方が後を絶ちません。

なぜか? それは、SSMがAutoCAD本体とは別の「外部ライブラリ」として鎮座しているからです。

今日は、`GetInterfaceObject`という魔法の鍵を使い、シートセットの情報を一括取得して管理台帳を自動生成する、実務直結の技術を解説します。

1. なぜ「見えない」のか?:GetInterfaceObjectの役割

通常、VBAで使う`AcadApplication`などは「参照設定」を行うことで、プログラムがその存在をあらかじめ知ることができます。しかし、`AcSmSheetSetMgr`(シートセットマネージャの心臓部)は、AutoCADのコア部分とは切り離された、COMインターフェースとして提供されています。

これを呼び出すには、「実行時に動的に接続する」というプロセスが必要です。それが`GetInterfaceObject`です。

2. シートセット情報を取得する実装コード

まずは、以下のコードを標準モジュールに貼り付けてみてください。このコードは、現在開いている、あるいはアクセス可能なシートセットから、すべてのシート名とレイアウトパスをリストアップします。

Option Explicit

‘ シートセットマネージャを操作するためのメインプロシージャ
Sub ExportSheetSetInfo()
Dim smMgr As Object
Dim db As Object
Dim sheetSet As Object

‘ 1. インターフェースオブジェクトの生成(ここが核心!)
‘ AutoCADのCOMサーバー経由でSSMを呼び出します
Set smMgr = ThisDrawing.Application.GetInterfaceObject(“AutoCAD.AcSmSheetSetMgr.24”) ‘ バージョンは環境に合わせて調整

‘ 2. 現在のドキュメントに関連付けられたデータベースを取得
‘ シートセットファイル(.dst)のパスを取得する必要があります
‘ 今回は便宜上、アクティブなシートセットの情報を取得する前提とします
Set db = smMgr.GetDatabase(ThisDrawing.GetVariable(“DWGPREFIX”) & “YourProject.dst”)

‘ 3. シートセットオブジェクトのロックと取得
db.LockDb db
Set sheetSet = db.GetSheetSet

‘ 4. シートの再帰的走査(プロシージャへ渡す)
Debug.Print “— シートセット一覧 —”
TraverseElements sheetSet

‘ 後始末(重要!)
db.UnlockDb db
Set smMgr = Nothing
End Sub

‘ シートとサブセットを再帰的に巡回する補助プロシージャ
Private Sub TraverseElements(parent As Object)
Dim iter As Object
Dim item As Object

Set iter = parent.GetEnumerator

Do While iter.Next <> False
Set item = iter.Current

‘ アイテムがシートかどうかを判定
If TypeName(item) = “AcSmSheet” Then
Debug.Print “シート名: ” & item.GetTitle & ” | レイアウト: ” & item.GetLayout(Nothing).Name
ElseIf TypeName(item) = “AcSmSubset” Then
‘ サブセットなら中をさらに掘り下げる
TraverseElements item
End If
Loop
End Sub

3. このコードを使いこなすための「3つの壁」

初学者が必ず躓くポイントを、先輩として先に共有しておきます。

① バージョン番号の罠

`GetInterfaceObject(“AutoCAD.AcSmSheetSetMgr.24”)` の末尾にある「24」はAutoCADのバージョンに依存します(24は2021-2024版)。もしエラーが出る場合は、ここを自身の環境に合わせて書き換えるか、レジストリエディタで`AcSmSheetSetMgr`を検索してバージョンを確認してください。

② データベースのロック(LockDb / UnlockDb)

SSMのデータは、同時に他のユーザーが開いている可能性があるため、「読み取り専用」であってもロックを意識するのがプロの作法です。これを怠ると、データが読み込めなかったり、最悪の場合プロジェクトファイル(.dst)を破損させる恐れがあります。

③ 参照不可の解決

このコードは「遅延バインディング」という手法を使っています。そのため、コードを書いている最中にインテリセンス(入力補完)が効きません。
裏技: 開発中だけは「参照設定」で `AutoCAD Sheet Set Manager` にチェックを入れておくと、プロパティやメソッドの補完が効くようになり、開発効率が劇的に向上します。完成したらチェックを外してリリースしましょう。

4. まとめ:自動化の先にある世界

今回紹介した`GetInterfaceObject`を理解できれば、シートセットマネージャだけでなく、AutoCADの隠されたほぼすべての機能にアクセスする扉が開かれます。

「手動で台帳を作る」という非生産的な作業は、このコードをベースにした管理ツールに任せてしまいましょう。空いた時間で、CADの設計品質を高める工夫や、より高度なロジックの構築に注力してください。

AutoCAD VBAは、単なるマクロ記録ツールではありません。OSとCADの境界線を越えてデータを操る、強力な「エンジニアリング・ツール」です。ぜひ、今回のコードを自身のプロジェクトの礎にしてください。

もし途中で詰まったら、オブジェクトブラウザの「ライブラリ」をじっくり眺めてみてください。そこに、あなたの未知の力を待っているオブジェクトが隠れているはずです。応援しています。

タイトルとURLをコピーしました