AutoCADの深淵へ:Named Object Dictionaryで図面に「知性」を埋め込む
AutoCADの図面データにおいて、XData(拡張データ)に依存しているエンジニアは多い。しかし、一度でも複雑な階層データやプロジェクト管理情報をXDataで構築しようとして、バイト制限や検索コストの壁に突き当たり、絶望したことはないだろうか。
「図面は単なる幾何情報の集合体ではない。プロジェクトの源泉データであるべきだ」
本稿では、AutoCADの隠された真のデータ保持機構である「名前付きオブジェクト辞書(Named Object Dictionary:NOD)」を制御し、図面内部に堅牢な構造化データベースを構築する極意を伝授する。
—
1. なぜXDataではなく「辞書(Dictionary)」なのか
AutoCADには、図面全体で共有されるデータコンテナである`Named Object Dictionary`が存在する。ここを使いこなすと、以下の恩恵が受けられる。
- 階層構造の実現: 辞書の中に辞書を入れ子にできる。XDataのようなフラットなデータ構造の限界を突破できる。
- オブジェクトの独立性: 図形に紐付ける必要がない。図面ファイルそのものにメタデータを付与できる。
- 高速なアクセシビリティ: キー名による直接アクセスが可能なため、大規模なデータセットでも検索コストが極めて低い。
—
2. 堅牢な辞書設計:実装の鉄則
辞書を扱う上で最も避けるべきは、「存在チェックを怠った読み込み」と「名前の衝突」だ。プロダクションコードでは、以下の設計パターンを徹底してほしい。
1. 名前空間の専有: 辞書名には必ず自社ツール固有のプレフィックス(例:`MYCO_PROJ_DATA`)を付与する。
2. 遅延初期化: 「辞書がなければ作る」というガード節を必ず設ける。
3. オブジェクトの永続化: `XRecord`を使用する。辞書はコンテナであり、実際のデータは`XRecord`に格納するのがAutoCADの作法だ。
—
3. 実践:図面内データ管理のプロダクションコード
以下のコードは、図面内に「機器リスト」を階層化して保存し、読み出すためのコアロジックだ。
Option Explicit
‘ 辞書名とXRecord名の定数管理
Private Const DICT_ROOT As String = “MYCO_PROJECT_DATA”
Private Const XREC_EQUIP_LIST As String = “EQUIPMENT_SPEC”
‘ @brief 図面内に辞書とXRecordを作成・取得する
Public Function GetOrCreateProjectXRecord() As AcadXRecord
Dim dictRoot As AcadDictionary
Dim xRec As AcadXRecord
‘ 1. ルート辞書を取得または作成
Set dictRoot = ThisDrawing.Dictionaries.Add(DICT_ROOT)
‘ 2. XRecordを取得または作成
On Error Resume Next
Set xRec = dictRoot.GetObject(XREC_EQUIP_LIST)
If xRec Is Nothing Then
Set xRec = dictRoot.AddXRecord(XREC_EQUIP_LIST)
End If
On Error GoTo 0
Set GetOrCreateProjectXRecord = xRec
End Function
‘ @brief 構造化データをXRecordに書き込むサンプル
Public Sub SaveEquipmentData(dataArray As Variant)
Dim xRec As AcadXRecord
Set xRec = GetOrCreateProjectXRecord()
‘ XRecordはDXFコードでデータを保持する
‘ 1:文字列, 10:点, 40:実数 など
‘ 実務ではJSON文字列化して格納するのが最もメンテナンス性が高い
Dim types(0) As Integer: types(0) = 1
Dim data(0) As Variant: data(0) = Join(dataArray, “|”)
xRec.SetXRecordData types, data
End Sub
【プロの洞察】なぜJSON文字列化を推奨するのか
VBAのコード例で`Join`関数を使い、データをパイプ区切りで格納している点に注目してほしい。
XRecordのDXFコード(1, 10, 40等)を厳密に管理しようとすると、将来的なスキーマ変更(項目の追加・削除)で必ずコードが破綻する。「XRecordの中身はシリアライズされた文字列(JSON等)として保持し、VBA側でパースする」。これが、保守性を極限まで高めるための「賢いサボり方」だ。
—
4. 運用上の致命的な注意点
- パージ(PURGE)の罠: 辞書は「図面内のオブジェクト」として認識されるため、適切に参照を維持しないと、パージコマンドで消される可能性がある。データの実体がどこからも参照されていない状態は避けること。
- パフォーマンス: 大量のデータを辞書に詰め込むと、図面の保存時間がわずかに増大する。MB単位の巨大なバイナリを埋め込むべきではない。あくまで「メタデータ」や「設定情報」の格納に留めるのがAutoCADのアーキテクチャに対する敬意である。
- 他ツールとの競合: 同じ図面を他のCADツールや自社外のツールで開く可能性がある場合、辞書のキー名が競合しないか、必ず`Dictionaries`コレクション全体を確認するロジックをプロトタイプ段階で実装しておくべきだ。
—
最後に:エンジニアとしての矜持
AutoCAD VBAはレガシーと言われることもある。だが、APIの奥底にある`Named Object Dictionary`を操ることは、図面に「命」を吹き込むことと同義だ。
単に線を引くツールではなく、「データと図面が完全に同期したインテリジェントな成果物」を作る。それこそが、我々エンジニアが目指すべき高みではないだろうか。
このコードを叩き台に、君のプロジェクトに最適化されたデータ管理基盤を構築してほしい。健闘を祈る。
