【テクニカル・上級編】【上級】AcadDocument.Database.Dictionariesから「カスタム辞書」を構築:図面内に独自の階層構造データを保持する – AutoCAD VBA解析バイブル

スポンサーリンク

図面に「魂」を宿す:名前付きオブジェクト辞書(NOD)によるデータ構造化の極意

AutoCADの図面ファイル(DWG)は、単なる図形の集積ではない。それは、設計の文脈とメタデータを保持する「データベース」であるべきだ。

多くの初学者は、データを保持する際にXData(拡張データ)や単純なブロック属性に頼る。だが、複雑なプロジェクト管理や機器リストのような「構造化されたデータ」を扱う際、それらはすぐに破綻する。XDataは構造の柔軟性に欠け、属性値は図形に依存しすぎる。

真のシニアエンジニアが到達すべき領域、それが「名前付きオブジェクト辞書(Named Object Dictionary: NOD)」の活用だ。

—

1. なぜ「名前付きオブジェクト辞書」なのか

NODは、DWGファイル内の「ルート辞書」である。ここにカスタム辞書を構築することは、図面内に独自の名前空間を持つデータベースを埋め込むことに等しい。

  • 永続性: 図面を保存すれば、データはそのまま残る。
  • 階層構造: 辞書の中に辞書を入れ子にできる(JSONに近い柔軟性)。
  • 非図形依存: 図形が存在しなくても、データベースとして独立して存在できる。

これは、外部DBとの同期が難しい現場のレガシー環境において、図面自体を信頼できる唯一のソース(Single Source of Truth)にするための唯一の解法である。

—

2. 実装の設計思想:オブジェクトのライフサイクル管理

VBAでNODを扱う際、最も注意すべきは「メモリの汚染」と「ポインタの消失」だ。特にCOMオブジェクトの参照は、明示的に解放しなければ、AutoCADのプロセス終了までメモリ上に残り続ける。

以下のコードは、カスタム辞書内にデータを格納する実戦的なパターンである。

‘ 伝説的なアーキテクトによる、NODへのデータ格納実装
Public Sub WriteProjectDataToDictionary(keyName As String, dataValue As String)
Dim db As AcadDatabase
Dim nod As AcadDictionaries
Dim myDict As AcadDictionary
Dim xrec As AcadXRecord
Dim DataType(0) As Integer
Dim Data(0) As Variant

Set db = ThisDrawing.Database
Set nod = db.Dictionaries

‘ 1. カスタム辞書の取得、なければ作成
On Error Resume Next
Set myDict = nod.Item(“MY_PROJECT_DATA”)
If Err.Number <> 0 Then
Set myDict = nod.Add(“MY_PROJECT_DATA”)
End If
On Error GoTo 0

‘ 2. XRecordの作成 (これがデータのコンテナとなる)
Set xrec = myDict.AddXRecord(keyName)

‘ 3. データの構造化 (今回は文字列のみだが、DXFコードで拡張可能)
DataType(0) = 1: Data(0) = dataValue
xrec.SetXRecordData DataType, Data

‘ 4. 徹底的なオブジェクト解放
‘ VBAのガベージコレクションを信用せず、明示的にNothingを代入
Set xrec = Nothing
Set myDict = Nothing
Set nod = Nothing
Set db = Nothing
End Sub

—

3. パフォーマンスと堅牢性のための極限の知見

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

大規模なシステム連携を行う際、図面保存のタイミングを制御したい場合がある。`AcApDocManager`を通じて、Windows APIの`PostMessage`を使用し、図面保存直後に外部データベースへデータを掃き出す仕組みを構築すれば、ヒューマンエラーを排除した自動化が実現できる。

辞書の肥大化に対する防御

NODに大量のXRecordを詰め込むと、図面の保存速度が低下する。

  • 正規化の徹底: 巨大なデータは、可能な限り外部XMLやJSONで管理し、図面内のNODにはその「参照キー」のみを保持させる。
  • 例外処理: `Err.Clear`を怠るな。AutoCADのCOMインターフェースは、一度エラーを吐くと後続の参照がすべて失敗する可能性がある。

—

4. シニアアーキテクトからの提言

君たちが構築するシステムが「使い捨てのスクリプト」ではなく「企業の資産」であるならば、以下の規律を守れ。

1. 名前空間の衝突を回避せよ: 辞書名には必ず自社のプレフィックス(例: `ACME_PROJ_DATA_`)を付与すること。
2. 型定義を厳格に: XRecordに書き込むデータは、DXFコードに基づいて構造化し、後から解析可能な状態を維持すること。
3. レガシーへの敬意: 新しい技術(.NET API等)に逃げる前に、VBAでもここまでできることを証明せよ。AutoCADのコアAPIを知れば、VBAは強力な武器になる。

データは、図面に刻まれて初めて「情報」となる。
諸君のコードが、図面の中に確固たる秩序をもたらすことを期待している。

—
本稿は、AutoCADの内部メモリマップを熟知するエンジニアに向けて書かれた。もし図面が破損した場合は、`Audit`コマンドの挙動をまず確認せよ。それがNODを正しく扱うための第一歩である。

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