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オートメーションエンジニアと名乗れるのだ。
さあ、次は君がこのコードをベースに、自社のフォーマットに合わせた「最強の管理台帳生成ツール」を完成させてくれ。期待している。
