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

スポンサーリンク

AutoCAD VBAの深淵:AcSmSheetSetMgrによる「シートセット」完全制御の極意

AutoCADのオートメーションにおいて、`ActiveDocument.ModelSpace`を弄り回すだけで満足してはいないか?
大規模プロジェクトにおいて、真に管理すべきは図面内の線分ではなく、「シートセットマネージャ(SSM)」というメタデータ構造そのものだ。

今回は、VBAのオブジェクトブラウザには決して姿を現さない「禁断のAPI」である`AcSmSheetSetMgr`を呼び出し、シートセット情報を一括抽出して管理台帳を自動生成する、実務レベルのソリューションを伝授する。

1. なぜ「GetInterfaceObject」なのか

通常、AutoCADのVBA環境では`AcSmComponents`ライブラリは直接参照できない。多くの初心者はここで躓き、外部プログラムや手動操作に逃げる。

だが、プロのエンジニアは`AcadApplication.GetInterfaceObject`を使用する。これはCOMの遅延バインディングの極致であり、AutoCAD本体のプロセスを跨いで、シートセットマネージャのCOMインターフェースを直接メモリにロードする手法だ。

この手法のメリットは以下の3点に集約される。

  • 非依存性: プロジェクト設定で「参照設定」を増やす必要がない(配布が極めて容易)。
  • 高速性: AutoCADの図面を開かずにメタデータのみを抽出できる(バッチ処理に最適)。
  • 堅牢性: データ構造を直接叩くため、UI上の操作エラーの影響を受けない。

2. 【プロダクションコード】シートセット情報抽出エンジン

以下のコードは、指定した`.dst`ファイルからシート名とレイアウト名を抽出し、イミディエイトウィンドウに出力する基本モジュールだ。

Option Explicit

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

On Error GoTo ErrorHandler

‘ 1. AcSmSheetSetMgrのインスタンスを取得(これが鍵となる)
Set smMgr = ThisDrawing.Application.GetInterfaceObject(“AcSmComponents.AcSmSheetSetMgr”)

‘ 2. 指定したDSTファイルをデータベースとしてオープン
Set db = smMgr.OpenDatabase(dstFilePath)
Set ss = db.GetSheetSet

‘ 3. 再帰的にシートを巡回
Debug.Print “— シートセット情報抽出開始 —”
TraverseElements ss

‘ 4. クリーンアップ
smMgr.CloseDatabase db

Exit Sub

ErrorHandler:
MsgBox “エラー発生: ” & Err.Description, vbCritical
End Sub

‘ 要素を再帰的に巡回するプロシージャ
Private Sub TraverseElements(parent As Object)
Dim iter As Object
Dim item As Object

Set iter = parent.GetEnumerator

Do While iter.Next(item)
‘ シートセットまたはシートかを確認
If TypeName(item) = “IAcSmSheet” Then
Debug.Print “シート名: ” & item.GetTitle & ” / レイアウト: ” & item.GetLayout.GetLayoutName
ElseIf TypeName(item) = “IAcSmSheetSet” Or TypeName(item) = “IAcSmSubset” Then
‘ サブセット内の要素を再帰的に取得
TraverseElements item
End If
Loop
End Sub

3. 実務で「死なない」ための設計指針

このコードをそのまま業務に組み込む際、以下の3点を必ず守れ。守らぬ者は必ず数ヶ月後に「謎のクラッシュ」に泣くことになる。

① インターフェースの解放とメモリ管理

`GetInterfaceObject`で取得したCOMオブジェクトは、VBAのメモリ管理の「外側」にいる場合がある。必ず`Set smMgr = Nothing`を実行すること。ループ処理の中で安易にインスタンスを生成し続けると、メモリリークを招きAutoCADが不安定になる。

② DSTファイルの排他制御

シートセットファイル(`.dst`)は、誰かが開いていると書き込みロックがかかる。読み取りのみであれば問題ないが、自動台帳作成ツールとして「メタデータの書き換え」まで行う場合は、必ず`FileSystemObject`等でファイルのロック状態を確認するガード句を入れるべきだ。

③ データベース連携の注意点

抽出したデータをExcelに書き出す際、`DoEvents`を適切に挟まないと、大規模なシートセット(数百枚規模)を処理する際にAutoCADの応答が停止したとOSが誤認し、フリーズと判定される。UIを更新するなら、適度な間隔で処理を逃がせ。

結論:エンジニアの誇りとして

「面倒な手作業を自動化する」ことだけが目標なら、誰でも書けるコードで十分だ。しかし、君たちが目指すべきは、「誰が使っても壊れず、将来の仕様変更にも耐えうる堅牢なアーキテクチャ」の構築であるはずだ。

今回紹介した`AcSmSheetSetMgr`へのアクセスは、AutoCAD開発における一つの登竜門だ。これを掌握すれば、図面管理の自動化レベルは一段階上の次元へ到達する。

コードをコピペして満足するな。この背後にある「COMのインターフェース構造」を想像し、なぜこのメソッドが必要なのか、その意図を理解した者だけが、真のAutoCADオートメーションエンジニアと名乗れるのだ。

さあ、次は君がこのコードをベースに、自社のフォーマットに合わせた「最強の管理台帳生成ツール」を完成させてくれ。期待している。

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