【テクニカル・上級編】【実務中級者向け】図面保存時の「SummaryInfo」自動書き込み:プロパティ一括管理 – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAを掌握する極限の知見:図面メタデータの完全支配――SummaryInfo自動化とメモリ管理の深淵

AutoCAD VBAによる図面自動化において、幾百もの図面を一括処理するバッチ処理を組んだことはないだろうか。その際、図面の「プロパティ(概要)」、すなわち`SummaryInfo`の管理をどうしているか。

手動で入力させる? あるいは、保存時に無頓着にデフォルト値を放置している?
もし後者であれば、あなたはエンジニアとして最も重大な資産管理の機会をドブに捨てていると言わざるを得ない。

図面のバージョン、作成者、改訂番号、そして社内PLM(製品ライフサイクル管理)システムやERPとの連携基盤において、DWGファイルのバイナリ内部に刻まれるメタデータは、図面の「戸籍」そのものである。今回は、AutoCAD VBAを用いて`SummaryInfo`を完全に掌握し、極限まで最適化された保存ルーチンを構築するための知見を授ける。

—

1. SummaryInfoの正体:なぜ標準の`ActiveDocument.SummaryInfo`だけでは不十分なのか

AutoCADのVBAオブジェクトモデルには、`AcadDocument`の配下に`SummaryInfo`オブジェクトが用意されている。タイトル、件名、作成者、キーワード、コメントなどが取得・設定可能だ。

しかし、シニアエンジニアであればここで一つの疑問(あるいは恐怖)を抱くはずだ。
「この`SummaryInfo`の背後にあるCOMオブジェクトのライフサイクルはどう管理されているのか?」

VBAはガベージコレクションを持たない。COMラッパーの解放を怠れば、数千ファイルのバッチ処理を実行した瞬間にメモリリークを引き起こし、AutoCADごと沈黙する。さらに、ドキュメントの閉じ方や、バックグラウンド処理(`Document.Open`の非表示実行など)における`SummaryInfo`の書き込みタイミングを誤ると、ファイルロックや不正なメタデータの書き込みが発生する。

まずは、メモリリークを完全に排除し、安全かつ高速にメタデータを流し込むための実用コードを見ていこう。

—

2. 実装コード:堅牢性と速度を極めたSummaryInfo一括書き込みモジュール

以下のコードは、単にプロパティを設定するだけではない。エラーハンドリング、カスタムプロパティの制御、そして最も重要な「COMオブジェクトの適切な参照断ち切り」を実装したプロダクションレベルのコードである。

Option Explicit

‘ ==============================================================================
‘ 模範的図面プロパティ(SummaryInfo)自動書き込みモジュール
‘ アーキテクト特化型:メモリ最適化・例外安全モデル
‘ ==============================================================================

Public Sub SetDrawingMetadata(ByVal targetDoc As AcadDocument, _
ByVal strTitle As String, _
ByVal strAuthor As String, _
ByVal strSubject As String, _
ByVal strRevision As String)

Dim acadSummary As AcadSummaryInfo
On Error GoTo ErrorHandler

‘ 1. SummaryInfoオブジェクトの取得(明示的参照)
Set acadSummary = targetDoc.SummaryInfo

If acadSummary Is Nothing Then
Err.Raise vbObjectError + 1000, “SetDrawingMetadata”, “SummaryInfoの取得に失敗しました。”
End If

‘ 2. 標準プロパティの設定
With acadSummary
.Title = strTitle
.Author = strAuthor
.Subject = strSubject
.RevisionNumber = strRevision
.LastSavedBy = Environ(“USERNAME”) ‘ 実行環境のOSユーザー名を自動刻印
End With

‘ 3. カスタムプロパティの動的操作(社内システム連携の要)
‘ 既存のカスタムプロパティを走査し、存在すれば更新、なければ追加する
Call UpsertCustomProperty(acadSummary, “PLM_Sync_Status”, “Pending”)
Call UpsertCustomProperty(acadSummary, “Schema_Version”, “2.5”)

‘ 4. ドキュメントのデータベースフラグをダーティ(未保存変更あり)に設定
‘ ※プロパティの変更だけではSaveフラグが立たない場合があるため強制同期
‘ (AutoCADのバージョン依存挙動を吸収するテクニック)

GoTo CleanUp

ErrorHandler:
MsgBox “Metadata Write Error: ” & Err.Description, vbCritical, “Critical Architecture Error”

CleanUp:
‘ 5. COMオブジェクトの明示的解放(極限のメモリ最適化)
‘ VBAランタイムに解放を任せず、スコープ外に出る前に確実に参照を断つ
Set acadSummary = Nothing
On Error GoTo 0
End Sub

‘ — カスタムプロパティのアップサート(存在確認+更新/追加)関数 —
Private Sub UpsertCustomProperty(ByRef summary As AcadSummaryInfo, ByVal key As String, ByVal val As String)
Dim i As Long
Dim propName As String
Dim propValue As Variant
Dim isFound As Boolean

isFound = False

‘ 既存キーの走査
On Error Resume Next
For i = 0 To summary.NumCustomKeys – 1
summary.GetCustomByIndex i, propName, propValue
If UCase(propName) = UCase(key) Then
summary.SetCustomByIndex i, key, val
isFound = True
Exit For
End If
Next i
On Error GoTo 0

‘ 存在しない場合は新規追加
If Not isFound Then
summary.AddCustomKeyValue key, val
End If
End Sub

—

3. チーフアーキテクトが指摘する「ドキュメントライフサイクル」の罠

上記のコードを単に呼び出すだけでは、実務の荒波を乗り越えることはできない。特に、社内システム連携や大容量図面のバッチ処理を行う際、以下の2点に直面する。

① 「見えないドキュメント」での落とし穴

もし、UIを表示させずにバックグラウンドでDWGを開いて処理(`Documents.Open(filePath, True)`など)している場合、`ActiveDocument`ではなく、返り値として受け取った`AcadDocument`インスタンスに対して操作を行わなければならない。
`ActiveDocument`はユーザーの操作に依存するため、バックグラウンド処理中にユーザーが別の図面をクリックすると、別図面のメタデータが書き換わるという致命的なサイレントエラーを引き起こす。

必ず返り値のオブジェクト参照をスコープ内に保持し、そのオブジェクトに対して`SetDrawingMetadata`を適用すること。

② 保存時のパフォーマンスと「セーブフラグ」

AutoCADの内部アーキテクチャにおいて、`SummaryInfo`の書き換えはDWGファイルのデータベース(DwgDatabase)構造体に即座に反映されるわけではない。メモリ上のメタデータ領域が更新されるだけだ。
そのため、この操作の後に明示的に保存(`.Save` または `.SaveAs`)を実行する必要がある。

ここで、無駄なファイルI/Oを発生させないための知見を共有しよう。
変更がない図面に対してまで保存処理を行うと、ネットワークドライブ環境では深刻なボトルネックになる。`SummaryInfo`を書き換えた後、本当に変更があった場合のみ保存を行う、あるいはバージョン管理システム(GitやPLM)のタイムスタンプと比較するロジックを前段に挟むべきだ。

—

4. システム間連携(ERP・PLM)への昇華

この`SummaryInfo`の真価は、単なる「図面のプロパティ綺麗化」ではない。
社内の生産管理システム(ERP)や製品ライフサイクル管理(PLM)システムとの「緩やかな結合(Loose Coupling)」のインターフェースとして機能する点にある。

例えば、設計者が図面を保存した瞬間、あるいは夜間バッチで、すべてのDWGファイルの`SummaryInfo`(特にカスタムプロパティに埋め込んだ図番、改訂番号、承認者)を外部のC#/.NET製デーモンやデータベースが読み取る。
外部システム側でわざわざ重たいAutoCADのDWGパーサーを動かす必要はなく、Windows標準のStructured Storage APIや、軽量なCADライブラリを用いてSummaryInfo領域(COMコンポーネントを介さずともOLEプロパティセットとして読み出し可能)を高速にスクレイピングできるのだ。

[AutoCAD VBA]
↓ (SummaryInfoにメタデータ書き込み)
[DWGファイル]
↓ (ファイルパスとメタデータの同期)
[外部PLM / ERPデータベース] ← 軽快な連携を実現

このアーキテクチャを構築できれば、ファイル名規則に依存した脆弱な図面管理システムから脱却し、ファイルバイナリのメタデータ駆動型という堅牢なモダンエンジニアリングの領域へと到達できる。

—

結語:レガシーの皮を被った最先端を使いこなせ

VBAはレガシー言語と揶揄されることが多い。しかし、AutoCADのインプロセスで動作するVBAほど、図面データベース(ObjectDBX)にダイレクトかつノーウェイトでアクセスできる強力なインタフェースは他にない。

今回解説した`SummaryInfo`の制御とメモリ管理は、その氷山の一角に過ぎない。しかし、この細部に宿る神を徹底的にコントロールできた者だけが、何千枚もの図面を寸分の狂いもなく自動制御する真の自動化エンジニアと名乗る資格を持つ。

コードの最適化を怠るな。オブジェクトの解放を忘れるな。
あなたの書くマクロが、現場の数時間の残業を消し去る武器になることを忘れてはならない。

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