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

スポンサーリンク

AutoCADの深淵を制御せよ:Named Objects Dictionaryによる「図面内メタデータ管理」の極意

AutoCAD VBAを「単なる作図自動化ツール」だと思っているなら、それは大きな勘違いだ。真の自動化エンジニアは、図面を単なる「線の集合体」ではなく、「構造化されたリレーショナル・データベース」として捉える。

今日解説するのは、AutoCADの隠し扉とも言える「名前付きオブジェクト辞書(Named Objects Dictionary: NOD)」の攻略法だ。外部ファイルに依存せず、図面ファイルそのものにカスタム設定や管理情報を直接埋め込む。この手法をマスターすれば、ファイルが移動しても設定値が消失しない、極めて堅牢な業務ツールが構築できる。

なぜ「外部ファイル」ではなく「NOD」を選ぶのか?

多くの現場では、設定値を外部のINIファイルやExcelに逃がしている。だが、それは「データ不整合の温床」だ。

  • ファイル分離のリスク: ツール本体とデータファイルが切り離され、バージョン管理が破綻する。
  • 配布の煩雑さ: ツール更新のたびにパス設定や環境変数を修正する必要がある。

NOD(Named Objects Dictionary)を活用すれば、「図面ファイルが、それ自身の管理情報を持っている」という自己完結型のアーキテクチャを実現できる。これは、大規模プロジェクトにおけるデータの一貫性を保つための「大人のエンジニアリング」だ。

実装の勘所:XRecordという「器」を使う

NODにデータを保存するには、`AcadXRecord`というオブジェクトを利用する。これは任意のデータ型をペアとして保持できる、AutoCAD内蔵の軽量なコンテナだ。

プロダクションコード:NODへの書き込みと読み込み

以下のコードは、図面固有の「管理ID」や「ツール設定」をNODに保存・取得するためのテンプレートである。

Option Explicit

‘ 定数定義:辞書名とレコード名は一意に保つこと
Private Const DICT_NAME As String = “MY_COMPANY_SETTINGS”
Private Const RECRD_NAME As String = “ProjectMetaData”

”’

”’ 図面内にカスタム設定を保存する
”’

Public Sub SaveCustomData(ByVal settingValue As String)
Dim nod As AcadDictionary
Dim xrec As AcadXRecord
Dim dataTypes As Variant, dataValues As Variant

‘ ルート辞書(NamedObjectsDictionary)を取得
Set nod = ThisDrawing.Database.NamedObjectsDictionary

‘ 辞書が存在しない場合は作成
Dim targetDict As AcadDictionary
On Error Resume Next
Set targetDict = nod.AddObject(DICT_NAME, “AcDbDictionary”)
On Error GoTo 0
If targetDict Is Nothing Then Set targetDict = nod.Item(DICT_NAME)

‘ XRecordの作成・取得
On Error Resume Next
Set xrec = targetDict.AddObject(RECRD_NAME, “AcDbXrecord”)
On Error GoTo 0
If xrec Is Nothing Then Set xrec = targetDict.Item(RECRD_NAME)

‘ 保存データの設定(DXFコード1は文字列を意味する)
dataTypes = Array(1)
dataValues = Array(settingValue)

xrec.SetXRecordData dataTypes, dataValues
MsgBox “設定をNODに保存しました。”, vbInformation
End Sub

”’

”’ 図面内からカスタム設定を読み出す
”’

Public Function LoadCustomData() As String
Dim nod As AcadDictionary: Set nod = ThisDrawing.Database.NamedObjectsDictionary
Dim targetDict As AcadDictionary
Dim xrec As AcadXRecord
Dim dataTypes As Variant, dataValues As Variant

On Error GoTo ErrorHandler
Set targetDict = nod.Item(DICT_NAME)
Set xrec = targetDict.Item(RECRD_NAME)

xrec.GetXRecordData dataTypes, dataValues
LoadCustomData = dataValues(0)
Exit Function

ErrorHandler:
LoadCustomData = “未設定”
End Function

堅牢な設計のための3つの鉄則

1. エラーハンドリングの徹底:
`nod.Item(DICT_NAME)`のように名前でアクセスする際、オブジェクトが存在しないと即座にランタイムエラーが発生する。必ず `On Error Resume Next` を活用し、存在確認をロジックに組み込むこと。
2. DXFグループコードの理解:
`SetXRecordData`で使用する配列は、DXFのグループコードに準拠している。文字列なら `1`、整数なら `70`、実数なら `40` だ。適当な数値を入れれば確実にクラッシュする。AutoCADの仕様書を常に手元に置くこと。
3. 肥大化の抑制:
NODは万能だが、図面データベースの心臓部だ。数万件ものログを保存するような場所ではない。あくまで「図面の設定値」や「メタデータ」を保持する用途に限定し、パフォーマンス低下を招かない設計を心掛けよ。

エンジニアとしての視点

今回紹介したNODへのアクセスは、AutoCADの内部構造(ObjectARXの思想)に深く踏み込む行為だ。この手法を習得すれば、図面を単なる作図ソフトで開くのではなく、「プログラム可能なデータベース」として扱う視点が生まれるはずだ。

業務効率化の究極は、「人間が気を使わなくてもデータが勝手に管理されている状態」を作ることにある。ぜひ、次のプロジェクトの設計図に、この「隠しデータ」の仕組みを組み込んでみてほしい。

君が書くコードが、誰かの残業をゼロにする。その誇りを忘れるな。

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