【実務・中級編】【上級プロフェッショナル】AutoCAD VBAで図面内の全オブジェクトのID(Entity Name)を取得し、データベースと連携する – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAで「図面」を「データベース」へ:Entity Nameを操るプロフェッショナルの流儀

AutoCADの図面データを外部データベースと連携させる。これはBIM/CIM時代において、CAD担当者が避けては通れない「自動化の聖杯」です。

しかし、多くのエンジニアがここで躓く。「Entity Name(ObjectID)」という概念を軽視し、不安定なコードを量産してしまうからです。本稿では、図面内のオブジェクトを確実に捕捉し、外部データベースと堅牢に同期させるための極意を伝授します。

1. 勘違い厳禁:HandleとObjectIDの決定的な違い

AutoCADには、オブジェクトを一意に識別するキーが2つ存在します。

  • Handle (文字列): 図面ファイルが変わっても(コピー等しても)維持される「不動のID」。外部DB連携の主キーにはこちらを使うべきです。
  • ObjectID (Long/LongPtr): AutoCADのセッション中のみ有効な「メモリ上のメモリアドレス」。再起動や図面の開き直しで即座に変わります。

プロの教訓: データベースと紐付けるなら、必ず `Handle` をキーにしてください。`ObjectID` は実行中のプログラム内での一時的な参照用です。

2. 堅牢な設計:全オブジェクト走査のアーキテクチャ

単に `For Each` で回すだけでは不十分です。モデル空間、ペーパー空間、ブロック定義の中にあるオブジェクトまで網羅しなければ、「抜けている情報」が生じます。

以下は、`ModelSpace` を走査し、外部DB(今回は擬似的にADODBで解説)へ送るための骨子となるプロダクションコードです。

‘ 参照設定: Microsoft ActiveX Data Objects x.x Library を追加すること
Option Explicit

Public Sub ExportEntitiesToDatabase()
Dim objEnt As AcadEntity
Dim strHandle As String
Dim strLayer As String

‘ エラーハンドリングは必須。図面破損や予期せぬオブジェクトに対処する
On Error GoTo ErrHandler

‘ データベース接続(実務では接続文字列を定数化する)
Dim conn As Object
Set conn = CreateObject(“ADODB.Connection”)
conn.Open “Provider=SQLOLEDB;Data Source=YOUR_SERVER;Initial Catalog=YOUR_DB;Integrated Security=SSPI;”

‘ モデル空間を走査
For Each objEnt In ThisDrawing.ModelSpace
‘ オブジェクトのHandleを取得(これがDBとの架け橋)
strHandle = objEnt.Handle
strLayer = objEnt.Layer

‘ SQL生成(プリペアドステートメントを推奨)
Dim sql As String
sql = “INSERT INTO CAD_Objects (Handle, LayerName, ObjectType) VALUES (‘” & _
strHandle & “‘, ‘” & strLayer & “‘, ‘” & objEnt.ObjectName & “‘)”

conn.Execute sql
Next objEnt

conn.Close
MsgBox “データベース同期完了”, vbInformation
Exit Sub

ErrHandler:
MsgBox “エラー発生: ” & Err.Description, vbCritical
End Sub

3. なぜ「遅い」のか?パフォーマンス最適化の鉄則

数万のオブジェクトを抱える図面で上記コードを動かすと、確実にフリーズします。以下の最適化は、大規模プロジェクトにおける生存戦略です。

1. SelectionSetsの活用: `ModelSpace` を直接ループするのではなく、フィルタリングした `SelectionSet` を使用する。必要なレイヤーやエンティティタイプのみを抽出することで、メモリ負荷を劇的に下げられます。
2. トランザクション管理: 1件ずつ `conn.Execute` してはいけません。DB側が悲鳴を上げます。トランザクションを開始し、バッチ処理でまとめてコミットしてください。
3. Late Bindingの排除: `CreateObject` は開発用です。本番環境では「参照設定」を行い、Early Bindingで型定義を明確にすることで、実行速度とデバッグの精度が向上します。

4. プロジェクトを成功させるための「設計思想」

現場で長年運用されるツールを作りたいなら、以下の3点を徹底してください。

  • 「書き戻し」を考慮せよ: DB側で修正した属性情報を、CAD側にどう反映させるか? `Entity.SetXData`(拡張データ)を活用し、CAD側にDBのキーを埋め込む手法が最も安定します。
  • エラーログを可視化せよ: 処理に失敗したオブジェクトの `Handle` をテキストログに吐き出す仕組みを必ず組み込んでください。「どの図形がDBに入らなかったのか」を特定できないシステムは、現場ではゴミ同然です。
  • 非同期処理は避ける: VBAはシングルスレッドです。無理な非同期処理はクラッシュの元。処理中は `Application.StatusBar` を更新し、進捗をユーザーに可視化するだけで、UXは劇的に改善します。

最後に:エンジニアとしての矜持

AutoCADのAPIを叩くということは、図面の深淵を覗くことに等しい。オブジェクトのライフサイクルを理解し、メモリとデータベースという異なる世界の整合性を保つこと。これこそが、業務自動化エンジニアに求められる最も高度なスキルです。

コピペして動いた、で終わらせないでください。なぜそのコードが動くのか、メモリ内で何が起きているのか。その理解の深さが、あなたの作成するツールの信頼性を決定づけます。

さあ、コードを書き、図面という名のデータベースを解放してください。健闘を祈ります。

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