【テクニカル・上級編】【実務中級】AcadDocument.Database内の「名前付きオブジェクト辞書」からカスタム設定を読み出す – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAの深淵:Named Objects Dictionary(NOD)を掌握する

諸君、AutoCADのAPIを「単なるコマンドの自動化ツール」程度に考えていないか?

もし君が、図面の中に「外部ファイルに依存しない設定値」を埋め込み、社内の設計標準を強制・管理しようと目論んでいるなら、`XRecord`を用いた「名前付きオブジェクト辞書(Named Objects Dictionary:以下NOD)」の攻略は避けては通れない関門だ。

これは、AutoCADのデータベース(`AcadDatabase`)の心臓部に直接データを刻み込む、まさに「神の領域」へのアクセスに近い。今回は、VBAというレガシーな枠組みの中で、この極めて強力なストレージをいかにして安全かつ高速に制御するか、その極意を伝授する。

1. なぜNODなのか:XDataの限界を超えて

一般的に開発者が使う「XData」は、図形(Entity)に付随する。だが、図形が削除されればデータも消える。これでは設計標準やシステム管理用のメタデータとしては脆弱すぎる。

NODは、`AcadDocument.Database`の直下に存在する「辞書(Dictionary)」だ。図形とは独立して存在し、図面が存在する限り永続する。ここに設定値をシリアライズして格納することで、図面を開くだけで自動的に自社の管理ロジックを読み込ませる「自律型図面」が構築可能となる。

2. 【実装の極意】NODへのアクセスとメモリ管理

VBAはガベージコレクションが脆弱だ。特にAutoCADのCOMオブジェクトを扱う際、明示的な解放を怠れば、メモリリークは必然。ループ処理の中でオブジェクトを生成・破棄する際は、必ず `Nothing` を代入し、参照カウンタを制御せよ。

以下は、NOD内に「MY_SYSTEM_CONFIG」という辞書を作成し、設定値を読み書きするプロトタイプだ。

‘ 伝説的な堅牢性を持つNOD管理クラスの断片
Public Sub SaveConfigToNOD(key As String, value As String)
Dim db As AcadDatabase
Dim dicts As AcadDictionaries
Dim myDict As AcadDictionary
Dim xRec As AcadXRecord
Dim data(0) As Variant
Dim types(0) As Integer

Set db = ThisDrawing.Database
Set dicts = db.Dictionaries

‘ 1. 名前付きオブジェクト辞書(Named Objects Dictionary)を取得
‘ これがデータベースのルート辞書だ
Set myDict = db.Dictionaries.Item(“NamedObjectsDictionary”)

‘ 2. 独自の辞書オブジェクトがあるか確認、なければ生成
On Error Resume Next
Dim customDict As AcadDictionary
Set customDict = myDict.Item(“MY_SYSTEM_CONFIG”)
If Err.Number <> 0 Then
Set customDict = myDict.Add(“MY_SYSTEM_CONFIG”)
End If
On Error GoTo 0

‘ 3. XRecordの生成または取得
On Error Resume Next
Set xRec = customDict.Item(key)
If Err.Number <> 0 Then
Set xRec = customDict.AddXRecord(key)
End If
On Error GoTo 0

‘ 4. データの書き込み(DXFコード 1 は文字列型)
data(0) = value
types(0) = 1
xRec.SetXRecordData types, data

‘ 5. 明示的なメモリ解放(最重要)
Set xRec = Nothing
Set customDict = Nothing
Set myDict = Nothing
Set dicts = Nothing
Set db = Nothing
End Sub

3. 実務で直面する「罠」と最適化の知見

① Windows APIとの連携

もし、このNOD内のデータとWindowsのレジストリやネットワーク上の設定ファイルを同期させる必要があるなら、`Win32 API` の `GetPrivateProfileString` 等を呼び出すことになるだろう。その際、VBAの `Declare` 宣言は必ず `PtrSafe` を付加せよ。64bit AutoCAD環境でのクラッシュを避けるための最低限の作法だ。

② データベースの更新タイミング

NODへの書き込みは「即時」反映されるが、`Database.SaveAs` のタイミングでデータベース全体が検証される。大量のデータをNODに突っ込むと、保存時間が指数関数的に増大する。設定値は極力バイナリや文字列でコンパクトにまとめ、JSONライクな構造で格納することを推奨する。

③ レガシー環境の保守

AutoCAD VBAは今後、.NET API(ObjectARX)への移行が求められる過渡期にある。NODの構造は、VBAからでも.NETからでも同じ「辞書構造」としてアクセス可能だ。VBAで構築したこの仕組みは、将来的にC#やVB.NETへ移行する際、コードロジックをそのまま移植できるという資産価値がある。

4. 最後に:アーキテクトからの助言

技術の進歩は速いが、CADのデータベース構造という「根幹」は、過去30年ほとんど変わっていない。このNODという仕組みを使いこなせるかどうかで、君が単なる「マクロ屋」で終わるか、CADの運用基盤を設計する「エンジニア」になれるかの分水嶺が決まる。

コードをコピペして動かして終わりにするな。なぜそのオブジェクトが必要なのか、なぜメモリを解放しなければならないのか。その「構造の深層」を理解したとき、君は初めてAutoCADのオートメーションを掌中に収めたと言えるだろう。

健闘を祈る。何かあればまた深淵を覗きに来るといい。

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