AutoCAD VBAの「深淵」を操る:SummaryInfoによる図面プロパティの完全制御
AutoCADの図面管理において、ファイルプロパティ(タイトル、作成者、カスタムプロパティなど)を「手動」で入力していないか?もしそうなら、今すぐその習慣を捨てるべきだ。
図面情報は、BIM/CIMやPDM(製品データ管理)連携の礎だ。プロパティが不正確な図面は、検索不能なゴミデータと同じである。今回は、`AcadDocument.SummaryInfo`オブジェクトを駆使し、図面情報を標準化・自動化するための「現場で生き残るための実装」を伝授する。
—
1. なぜ「SummaryInfo」の設計が重要なのか
多くの開発者が陥る罠は、プロパティを単なる「文字列の器」と捉えていることだ。しかし、`SummaryInfo`はAutoCADのデータベース(DWG)のメタデータを司る重要なインターフェースである。
特に重要なのは「カスタムプロパティ」の扱いだ。標準プロパティ(タイトル、サブジェクト等)とは異なり、カスタムプロパティはキーと値のペアで動的に追加・削除される。ここを雑に扱うと、後続のシステム(Excel集計やデータベース同期)で例外が多発する。
プロフェッショナルの設計思想:
- イミュータブル(不変)な設計を意識せよ: 実行時にプロパティを「追加」するのか「更新」するのかを明確に分けること。
- 遅延バインディングを避けよ: `AcadSummaryInfo`オブジェクトを明示的に宣言し、メモリリークの温床となるオブジェクト参照の放置を避ける。
—
2. プロダクションコード:堅牢なプロパティ操作クラス
このコードは、単なるサンプルではない。現場で「壊れない」ことを前提とした設計だ。エラーハンドリングとオブジェクトの解放を徹底している。
Option Explicit
‘ SummaryInfoの操作をカプセル化したプロシージャ
‘ 戻り値で成功/失敗を制御し、呼び出し元でログ管理を行う設計
Public Sub SetDrawingMetadata(ByVal title As String, ByVal author As String)
Dim doc As AcadDocument
Dim sInfo As AcadSummaryInfo
On Error GoTo ErrorHandler
Set doc = ThisDrawing
Set sInfo = doc.SummaryInfo
‘ 標準プロパティの設定
sInfo.Title = title
sInfo.Author = author
‘ カスタムプロパティの安全な更新
‘ 存在しなければ追加、存在すれば上書きするロジック
UpdateCustomProperty sInfo, “ProjectID”, “PJ-2023-001”
UpdateCustomProperty sInfo, “DrawingStatus”, “Approved”
Debug.Print “メタデータの更新が完了しました。”
Exit Sub
ErrorHandler:
MsgBox “プロパティ設定エラー: ” & Err.Description, vbCritical
End Sub
‘ カスタムプロパティを安全に扱うためのプライベートメソッド
Private Sub UpdateCustomProperty(sInfo As AcadSummaryInfo, key As String, val As String)
Dim i As Integer
Dim keyFound As Boolean
keyFound = False
‘ 既存のキーを探索
For i = 0 To sInfo.NumCustomInfo – 1
Dim k As String, v As String
sInfo.GetCustomByIndex i, k, v
If k = key Then
sInfo.SetCustomByIndex i, key, val
keyFound = True
Exit For
End If
Next i
‘ 存在しない場合は新規追加
If Not keyFound Then
sInfo.AddCustomInfo key, val
End If
End Sub
—
3. 実務で「失敗しない」ための3つの鉄則
① GetCustomByIndexのインデックス境界を意識せよ
`NumCustomInfo`で取得した数値をループの終了条件に使う際、インデックスは「0からN-1」であることを忘れるな。これをオフバイワンエラー(1ずれるミス)で落とす開発者は、大規模な図面管理システムでは信用されない。
② 外部DB連携時のデータクレンジング
AutoCADから抽出したプロパティをSQL ServerやAccessに流し込む場合、プロパティ値に「改行」や「特殊文字」が含まれているとデータベース側でクエリが破壊される。
- 鉄則: 読み取った値に対して `Replace(val, vbCrLf, ” “)` などのサニタイズを必ず噛ませること。
③ オブジェクトライフサイクルの管理
VBAはガベージコレクションが強力ではない。`AcadSummaryInfo`を広域変数に持ち続けるのは自殺行為だ。必要なメソッド内で参照し、スコープが外れたら適切に解放されるよう、ローカル変数での運用を徹底してほしい。
—
結論:標準化は「自動化」から始まる
図面のプロパティが統一されていない組織は、情報の検索に年間数百時間を浪費している。今回提示したコードをベースに、自社の図面管理ルールを自動適用するツールを構築してほしい。
プログラミングは単なるコード書きではない。「情報の流れを制御すること」こそが、真の自動化エンジニアの仕事だ。
次回の記事では、このメタデータを活用して「図面枠の自動書き出しと一括更新」を同期させる高度な手法について解説する。準備はいいか?コードは裏切らない。ただ、書き手次第だ。
