【テクニカル・上級編】【上級プロフェッショナル】図面内のオブジェクトに、連番(シーケンス番号)を自動付与し、カスタムプロパティとして管理する – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAの深淵:カスタムプロパティによる「永続的」オブジェクト管理の極意

AutoCADの図面管理において、図形とデータを分離させる設計は、もはや時代遅れの負債である。図面内の設備機器や配管に対し、外部データベースに頼らず「図面内に自己完結する永続的なID」を保持させること。これこそが、小規模〜中規模のBIM/CIMワークフローにおける、最も堅牢な防波堤となる。

今回は、AutoCAD VBAを用い、オブジェクトに「XData(拡張データ)」ではなく、より将来性の高い「カスタムプロパティ(図面情報)」と「XRecord(拡張レコード)」を組み合わせた、プロフェッショナルな連番付与メカニズムを伝授する。

なぜ「XData」ではなく「XRecord」なのか

レガシーなAutoCAD開発において、XData(拡張データ)は手軽だが、16KBという厳しい容量制限と、構造の柔軟性の欠如が足枷となる。
真のアーキテクトであれば、`Dictionary`オブジェクトによるXRecord管理を選択すべきだ。これは図面データベースの「名前付きオブジェクト辞書(Named Object Dictionary: NOD)」に直接紐付けられ、AutoCADのUNDO/REDOスタックとも完全に同期する。

実装の極致:連番付与とカスタムプロパティ管理

以下のコードは、選択したオブジェクトに対して一意のIDを付与し、NODに情報を書き込むための堅牢な実装だ。

Option Explicit

‘ 伝説的なエンジニアは、グローバル変数を汚染しない。
‘ 必要なオブジェクトは最小スコープで管理し、確実に解放する。

Public Sub AssignSequenceID()
Dim selSet As AcadSelectionSet
Dim ent As AcadEntity
Dim seqNumber As Long

‘ 1. SelectionSetの初期化(既に存在する場合はクリア)
On Error Resume Next
Set selSet = ThisDrawing.SelectionSets.Add(“SS_SEQ”)
If Err.Number <> 0 Then
Set selSet = ThisDrawing.SelectionSets.Item(“SS_SEQ”)
selSet.Clear
End If
On Error GoTo 0

‘ 2. オブジェクト選択(ユーザー操作の最適化)
selSet.SelectOnScreen

‘ 3. シーケンス番号の起点(本来は外部の最終管理値から取得すべき)
seqNumber = GetLastSequenceNumberFromDictionary()

Dim i As Integer
For i = 0 To selSet.Count – 1
Set ent = selSet.Item(i)
seqNumber = seqNumber + 1

‘ カスタムプロパティ(XRecord)への書き込み
WriteXRecordToEntity ent, “SEQ_ID”, CStr(seqNumber)
Next i

‘ 4. メモリの明示的解放(VBAのガーベジコレクションを信用するな)
selSet.Delete
Set selSet = Nothing
End Sub

‘ 核心技術:オブジェクトへのXRecord埋め込み
Private Sub WriteXRecordToEntity(ent As AcadEntity, key As String, val As String)
Dim xrec As AcadXRecord
Dim dataGroup As Variant
Dim dataType As Variant

‘ XRecord用のデータ型定義(DXFコード 1は文字列)
dataType = Array(1)
dataGroup = Array(val)

‘ 拡張辞書が存在しない場合は作成
If Not ent.HasExtensionDictionary Then ent.CreateExtensionDictionary

‘ 既存のXRecordがあれば更新、なければ作成
On Error Resume Next
Set xrec = ent.ExtensionDictionary.Item(key)
If Err.Number <> 0 Then
Set xrec = ent.ExtensionDictionary.AddXRecord(key)
End If
On Error GoTo 0

xrec.SetXRecordData dataType, dataGroup
End Sub

シニアエンジニアが意識すべき「3つの技術的懸念」

1. メモリ管理とオブジェクト解放

VBAはCOMラッパーである以上、`Set obj = Nothing`を怠ると、AutoCADのセッションが終了するまでメモリリークが蓄積される。特にループ処理内での`AcadEntity`の参照は、必ず最後に解放せよ。大規模図面でこれを怠ることは、プロのエンジニアとして恥じるべき行為である。

2. Windows APIによる「外部連携」の壁

図面内のIDと、社内のERPや外部DBを紐付ける際、VBAから直接DBを叩くのは推奨されない。
「VBAはあくまでAutoCADのラッパー」と割り切ること。VBA側で連番を生成し、それをCSVまたはJSONとしてエクスポートし、外部のPythonやC#製のバッチサービスがそれを処理する「非同期連携アーキテクチャ」こそが、現在求められるスケーラブルな解だ。

3. レガシー環境の保守性

AutoCADのバージョン更新によって、オブジェクトモデルの挙動が微妙に変化することは稀ではない。

  • Late Binding(遅延バインディング)の活用: 特定のバージョンに依存しないよう、`Object`型での宣言を検討せよ。
  • エラーハンドリングの徹底: `On Error Resume Next`を多用するアマチュアとは決別し、必ず`Err.Number`を判定し、ログを吐き出すルーチンを組み込め。

結論:自動化の先にある「データ駆動型設計」

オブジェクトに連番を付与することは、単なる事務作業ではない。それは図面を「単なる線の集まり(ドローイング)」から「クエリ可能なデータベース(モデル)」へと昇華させる第一歩だ。

この記事を読んだ諸君には、単にコードをコピーするだけでなく、このデータが将来的にどう活用されるか、その「ライフサイクル」までを設計図に描いてほしい。技術を掌握する者は、ツールに使われるのではなく、ツールを支配する側であるべきだ。

諸君のAutoCAD環境に、真の自動化の灯火が灯ることを期待する。

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