AutoCAD VBAを掌握する極限の知見:図面メタデータの完全制御とERP連携の布石
AutoCADにおける図面管理は、単なるファイル保存ではない。それは「情報の構造化」であり、将来的なERPやPLM(製品ライフサイクル管理)システムとの統合を見据えた、メタデータ管理の第一歩である。
本稿では、VBAを用いて`SummaryInfo`オブジェクトを操作し、図面保存時に自動的にメタデータを埋め込む手法を解説する。これは、単なる「便利な機能」ではない。大規模な図面データベースを構築するための、堅牢なアーキテクチャの要諦だ。
—
1. 勘所:SummaryInfo オブジェクトの本質
AutoCADの図面ファイルには、標準的なプロパティ(作成者、件名など)の他に、ユーザー定義の「カスタムプロパティ」を付与する領域が存在する。これは `Database.SummaryInfo` プロパティを通じてアクセス可能だ。
多くの初学者は、このオブジェクトを闇雲に操作し、結果としてメモリリークや図面破損を招く。我々エンジニアが意識すべきは、「オブジェクトのライフサイクル管理」と「非同期的なデータ整合性」である。
2. 実装:メタデータ自動埋め込みエンジンの構築
以下に、図面保存イベント(`SaveAs`や`Save`)をフックし、メタデータを強制的に書き込むためのコアロジックを提示する。
‘ ———————————————————————-
‘ Class Module: clsAppEvent
‘ 目的: 図面保存時の自動メタデータ更新・整合性保持
‘ ———————————————————————-
Option Explicit
Private WithEvents AppEvents As AcadApplication
Private Sub Class_Initialize()
Set AppEvents = ThisDrawing.Application
End Sub
Private Sub AppEvents_BeginSave(ByVal FileName As String)
‘ 【重要】保存直前にメタデータを注入する
‘ ここでメモリの解放とオブジェクトの再生成を確実に行う
Call InjectMetadataToDrawing(ThisDrawing.Database)
End Sub
Private Sub InjectMetadataToDrawing(ByRef db As AcadDatabase)
Dim summaryInfo As AcadSummaryInfo
Set summaryInfo = db.SummaryInfo
‘ プロジェクトコードや設計者IDをERPから取得し、カスタムプロパティへ注入
‘ 既存キーが存在する場合は更新、なければ作成という論理が必要
On Error Resume Next
summaryInfo.AddCustomInfo “ProjectCode”, “PRJ-2024-X01”
summaryInfo.AddCustomInfo “DesignerID”, “ENG-9982”
‘ 【極意】COMオブジェクトの明示的解放
‘ VBAのガベージコレクションを待つのではなく、スコープ外で即座に破棄する
Set summaryInfo = Nothing
End Sub
3. シニアエンジニアが守るべき3つの鉄則
① オブジェクトの明示的解放(Disposeの徹底)
VBAは参照カウンタ方式のメモリ管理を行う。`SummaryInfo`のようなCOMインターフェースを扱う際、明示的に `Set = Nothing` を行わないと、AutoCADのプロセス終了までメモリを占有し続ける。特に、大規模なループ処理やバッチ処理を行う際は、致命的なパフォーマンス低下を招く。
② Windows API を活用したプロセス監視
複雑なPLM連携を行う場合、VBA単体では力不足になることがある。`kernel32`の `GetProcessId` や `GetModuleHandle` を活用し、AutoCAD本体のプロセス状態を監視し、メタデータ書き込みが「成功したか否か」をログ出力する堅牢なエラーハンドリングを構築せよ。
③ レガシー環境におけるバージョン互換制御
古いDWG形式(R14〜2000系)と最新形式では、メタデータ構造が異なる場合がある。`Database.SaveAs` を使用する際は、必ず `AcSaveAsType` を指定し、社内の標準フォーマットへ強制変換するガード句を設けることが、システム管理者の矜持である。
4. ERP/PLM連携への布石
このメタデータ埋め込みは、氷山の一角に過ぎない。将来的には、以下のフローへの拡張を推奨する。
1. 抽出フェーズ: 保存されたDWGをサーバーサイド(VB.NET / C#のObjectARX/.NET API)で定期的にクロールする。
2. 検証フェーズ: `SummaryInfo`内のキー値が、ERP上のマスタと合致しているか照合する。
3. アーカイブフェーズ: 不整合がある場合は、自動的に修正するか、管理者へ例外通知(ログ)を飛ばす。
結びに代えて
AutoCAD VBAは、単なる作図支援ツールではない。それは、設計資産という巨大な情報の海を制御するための「コックピット」である。
コードをコピペして終わるな。その背後にあるメモリ管理の思想と、図面データを資産化するという概念を理解せよ。それができるエンジニアだけが、次世代の自動化システムを設計する権利を持つ。
さらなる深淵へ踏み込みたいのであれば、次は `ObjectARX` を用いたメモリ直接アクセスに挑戦することをお勧めする。健闘を祈る。
