AutoCAD VBAの深淵へ:図面の中に「自分だけのデータベース」を構築する極意
こんにちは。AutoCADの自動化という荒波を乗りこなそうとしている皆さん、ようこそ。
「マクロの記録」で生成されたコードの羅列に満足できなくなったら、いよいよエンジニアとしての扉が開いた証拠です。今回は、AutoCADの図面ファイル(.dwg)の中に、「独自の階層構造データ」を永続的に保存するという、一歩踏み込んだ技術を伝授します。
単なる属性情報(XData)ではありません。図面そのものを、まるでリレーショナルデータベースのように扱える「名前付きオブジェクト辞書(Named Object Dictionaries)」の世界へご案内しましょう。
—
なぜ「名前付きオブジェクト辞書」なのか?
AutoCADの図面には、線や円といった図形(Entity)以外に、見えないデータ領域が存在します。
XData(拡張データ)は手軽ですが、構造化や検索には向きません。そこで登場するのが`Dictionaries`(辞書)です。
これは「名前」と「オブジェクト(データ)」をペアにして格納できる、AutoCAD内部の強力なストレージです。これを使えば、図面内に「機器リスト」「工程情報」「プロジェクト固有のパラメータ」といった階層構造を持つデータを、図面の一部として埋め込むことができます。
—
辞書構築のアーキテクチャ
図面内の`Dictionaries`は、`AcadDocument.Database`の中に鎮座しています。
イメージとしては、Windowsのフォルダ構成に近いです。
1. Root Dictionary: 図面の最上位にある辞書(ここが入り口)。
2. Custom Dictionary: 私たちが作成する独自の辞書。
3. XRecord: 実際にデータを書き込むコンテナ。
この3層構造さえ理解すれば、AutoCADは単なる製図ソフトから「設計情報管理システム」へと進化します。
—
実践:自分だけの辞書を作成・書き込みする
以下のコードは、図面内に「MyProjectData」という辞書を作成し、そこに「機器番号」と「設置日」を保存するサンプルです。
Sub CreateCustomDictionary()
Dim dictObj As AcadDictionary
Dim xRec As AcadXRecord
Dim dictName As String
Dim data(0 To 1) As Variant
Dim dataType(0 To 1) As Integer
dictName = “MyProjectData”
‘ 1. 名前付きオブジェクト辞書を取得または作成
On Error Resume Next
Set dictObj = ThisDrawing.Database.Dictionaries.Add(dictName)
If dictObj Is Nothing Then
Set dictObj = ThisDrawing.Database.Dictionaries.Item(dictName)
End If
On Error GoTo 0
‘ 2. データを格納するXRecordを作成(または既存のものを取得)
Set xRec = dictObj.AddXRecord(“Equipment_001”)
‘ 3. データを設定(DXFコード1は文字列、1070は整数などのルールがある)
dataType(0) = 1: data(0) = “Pump-A-101” ‘ 機器名
dataType(1) = 1070: data(1) = 20231027 ‘ 設置日(整数)
‘ 4. XRecordにデータを書き込み
xRec.SetXRecordData dataType, data
MsgBox “図面内にデータを埋め込みました!”, vbInformation
End Sub
コードの解説と「落とし穴」
- `On Error Resume Next`の重要性: 辞書は一度作れば図面に残ります。二回目以降の実行でエラーにならないよう、「なければ作り、あれば取得する」という泥臭い制御が必須です。
- DXFコードの理解: `dataType`で指定する数値(1や1070)はDXFの仕様に基づいています。ここがAutoCADプログラミングにおける最初の「難所」です。最初は`1`(文字列)から使い始めるのがコツです。
—
開発現場で陥りやすいエラーと対策
初心者がやりがちなミスを先回りしてお教えします。
1. 「辞書が残って消せない!」:
辞書は図面の一部なので、図面を保存すれば残ります。不要になった場合は `dictObj.Delete` で消去できますが、依存関係に注意してください。
2. 型変換の不一致:
`data`配列の型は`Variant`ですが、中身のデータ型と`dataType`で指定したDXFコードが合っていないと、AutoCADは無慈悲にクラッシュします。必ずペアを検証する習慣をつけましょう。
3. パフォーマンス:
何万件も書き込む場合、`Dictionaries`は重くなります。数千件を超える場合は、別のデータベース(SQLiteやJSONファイル)への外部連携を検討するのも、プロの判断です。
—
さあ、次のステージへ
この手法を習得すれば、「図面を開いた瞬間に、その図面の設計担当者や承認プロセスが自動的に読み込まれる」といった、現場の苦労を劇的に減らすシステムを構築できます。
「マクロ」を「ツール」へ、「コード」を「資産」へ。
皆さんが書くその1行が、数年後の誰かの仕事を助けるはずです。
今回のコードをベースに、ぜひ自分の業務に必要なデータ構造を設計してみてください。何か壁にぶつかったら、またここへ戻ってきてくださいね。応援しています。
