【テクニカル・上級編】図面プロパティ(カスタムプロパティ含む)の自動設定・取得!AcadDocumentのSummaryInfo – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAの深淵:SummaryInfoオブジェクトによる図面メタデータ管理の極意

AutoCADの図面管理において、`SummaryInfo`オブジェクトは、単なる「ファイル情報」の格納庫ではない。これはBIM/CIM連携や、大規模な図面管理システムにおける「インデックスの要」である。

多くのエンジニアは、このオブジェクトを単なるプロパティの列挙体として扱うが、それは浅い。真にシステムを安定させるためには、AutoCADのメモリ管理モデルと、COMインターフェースが背負うレガシーな制約を理解しなければならない。

1. SummaryInfoのアーキテクチャとライフサイクル

`AcadDocument.SummaryInfo`は、図面ファイルに埋め込まれたメタデータへの唯一無二のゲートウェイだ。しかし、このオブジェクトは`ActiveDocument`の生存期間に厳密に依存している。

大規模な自動化システムを構築する場合、「オブジェクトの明示的なキャッシュと解放」を怠れば、メモリリークは免れない。特に、複数の図面をループ処理する際、SummaryInfoへの参照を保持したまま`Document.Close`を叩くような実装は、AutoCADのCOMサーバーを不安定化させる主原因となる。

2. 実践:カスタムプロパティの安全な操作

標準的なプロパティ(Title, Author等)は直接アクセスできるが、カスタムプロパティは「キーと値」のペアで管理される。ここでは、堅牢性を担保した実用的なコード例を示す。

‘ ——————————————————————
‘ 図面のカスタムプロパティを安全に設定・更新するプロシージャ
‘ ——————————————————————
Public Sub UpdateCustomProperty(ByVal key As String, ByVal value As String)
Dim doc As AcadDocument
Dim info As AcadSummaryInfo
Dim i As Integer
Dim keyFound As Boolean

Set doc = Application.ActiveDocument
Set info = doc.SummaryInfo

keyFound = False

‘ 既存のキーを探索
For i = 0 To info.NumCustomInfo – 1
Dim currentKey As String
Dim currentValue As String
Call info.GetCustomByIndex(i, currentKey, currentValue)

If StrComp(currentKey, key, vbTextCompare) = 0 Then
Call info.SetCustomByIndex(i, value)
keyFound = True
Exit For
End If
Next i

‘ 存在しない場合は新規追加
If Not keyFound Then
Call info.AddCustomInfo(key, value)
End If

‘ メモリ最適化:明示的な解放
‘ VBAのガベージコレクションを待たず、即座にオブジェクト参照を破棄する
Set info = Nothing
Set doc = Nothing
End Sub

3. シニアエンジニアのための最適化知見

A. レガシーなCOM参照の罠

VBAの`Set`ステートメントによるオブジェクト参照は、`AcadDocument`が閉じられても解放されないケースがある。特にループ処理内での`SummaryInfo`の連続生成は避けるべきだ。可能であれば、関数内でオブジェクトをインスタンス化し、関数終了時に確実に`Nothing`を代入することで、COMサーバーのスタックをクリーンに保て。

B. Windows APIとの連携による「強制同期」

`SummaryInfo`を更新した後、AutoCADのUI上のプロパティパレットが即座に同期されない場合がある。これは描画スレッドとの競合だ。どうしても即座に反映させたい場合は、`SendMessage` APIを用いて再描画信号を送るのが最も確実だ。

‘ ユーザー定義の再描画強制(高度な手法)
Public Declare PtrSafe Function SendMessage Lib “user32” Alias “SendMessageA” _
(ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr

※実務では`doc.SendCommand “_REGEN “`を用いるのが一般的だが、バックグラウンド処理においては、これらAPIを駆使して「システムに今の状態を強制認識させる」技術が差別化を生む。

4. システム間連携の要諦:XML/JSONとのマッピング

図面管理システム(PDM/PLM)と連携する場合、`SummaryInfo`をただの文字列格納庫として使うな。命名規則を厳格化し、キー名にプレフィックス(例: `SYS_PROJECT_ID`, `SYS_REV_NO`)を付与することで、検索クエリの効率が劇的に向上する。

結論:技術は「管理」から始まる

AutoCAD VBAを極めるということは、単に図形を描くことではない。オブジェクトモデルが持つ「隠れた挙動」を掌握し、いかにしてメモリを汚さず、堅牢なデータ構造を図面内に構築できるかという「管理能力」そのものである。

あなたが次に書くコードが、数年後のメンテナンス担当者の感謝を呼ぶものであることを期待する。本質を見失うな。それが伝説への唯一の道だ。

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