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

スポンサーリンク

こんにちは。AutoCADの自動化という深淵な世界へようこそ。

「マクロの記録」ボタンを押すだけの日常から卒業し、図面という名のデータベースを自在に操るエンジニアへの第一歩を踏み出そうとしているあなたを、心から歓迎します。

今日は、AutoCAD VBAにおける「聖杯」とも言えるテーマを扱います。「図面内のオブジェクトをID(Handle)で特定し、外部データベースと紐付ける」。これができれば、単なる作図ソフトが、あなたの業務を支える巨大な情報資産へと変貌します。

1. なぜ「Entity Name」ではなく「Handle」なのか?

まず、プロとして最初にお伝えすべき重要な概念があります。AutoCADのオブジェクトには「Object ID(Entity Name)」「Handle(ハンドル)」という2つの識別子が存在します。

  • Entity Name: AutoCADのセッションごとに動的に割り当てられるメモリ上のポインタ。図面を閉じれば変わります。
  • Handle: 図面ファイルに永続的に書き込まれる「背番号」。ファイルを閉じても、翌日開いても変わりません。

極限の知見:
外部データベースと連携する際、Entity Nameをキーにしてはいけません。それは砂上の楼閣です。データベースの主キー(Primary Key)として使うべきは、必ず「Handle」です。 これを忘れると、翌日には全ての紐付けが崩壊します。

2. 全オブジェクトを巡回し、Handleを抽出する

では、図面内の全オブジェクトを舐めるように巡回し、そのHandleを抽出するコードを書きましょう。ここでは、ModelSpace内のすべてのエンティティを対象にします。

Sub ExportObjectHandlesToConsole()
Dim objEntity As AcadEntity
Dim strHandle As String

‘ 図面内のModelSpace(モデル空間)をオブジェクトとして取得
‘ ここが全ての入口です
For Each objEntity In ThisDrawing.ModelSpace
‘ Handleプロパティから一意のIDを取得
strHandle = objEntity.Handle

‘ デバッグ出力(イミディエイトウィンドウに表示)
Debug.Print “Type: ” & objEntity.ObjectName & ” / Handle: ” & strHandle

‘ 【重要】ここにデータベースへの登録ロジックを組み込みます
‘ Call RegisterToSQLServer(strHandle, objEntity.ObjectName)
Next objEntity

MsgBox “全オブジェクトの抽出が完了しました。”
End Sub

コードの解説

  • `For Each … In ThisDrawing.ModelSpace`: AutoCADのオブジェクトモデルにおける「コレクション」の概念です。モデル空間にある全ての図形を、メモリ効率良く一つずつ取り出します。
  • `objEntity.Handle`: これが今回一番の宝物です。文字列として返されるため、SQL Serverの`VARCHAR`型や`NVARCHAR`型に格納するのに最適です。

3. 現場で陥りやすい「落とし穴」

このプログラムを本格的な業務に投入する際、必ず以下の壁にぶつかります。先輩として先に回避策を授けておきますね。

① オブジェクトの重なりとフィルタリング

「図面内の全てのオブジェクト」といっても、ブロックの中に隠れた図形(BlockReferenceの内部)は、上記のコードでは取得できません。

  • 解決策: 再帰関数(Recursive Function)を使い、ブロック定義まで掘り下げる設計が必要です。

② データベース連携のボトルネック

1オブジェクトごとにDB接続を開いて閉じるのは、極めて非効率です。

  • 解決策: オブジェクトの情報を一旦配列やコレクションに溜め込み、トランザクション(一括登録)で書き込むのが、世界最高峰の自動化エンジニアの作法です。

4. 次のステップへの道標

今回紹介したのは、図面から「ID」を吸い上げるための最小単位のコードです。ここから先は、以下のステップで拡張していくと面白いですよ。

1. 書き込み: ADODBライブラリを使用して、SQL Serverへ接続する。
2. 読み込み: 逆にDBのIDからAutoCAD上のオブジェクトをハイライトする(`HandleToObject`メソッドを使用)。
3. 双方向同期: 図面上の変更を検知して、DBに反映するイベント駆動型の設計。

最後に:エンジニアとしての誇り

AutoCADのVBAは、一見古く見えるかもしれません。しかし、CADの心臓部である「オブジェクトモデル」を理解することは、将来的に.NETやForge (Autodesk Platform Services) へ移行する際、最強の武器になります。

「ここをクリアすれば、AutoCAD VBAの基本はバッチリ」です。まずはこのコードをVBE(Visual Basic Editor)に貼り付け、イミディエイトウィンドウに流れるHandleの洪水を見てみてください。

あなたの作図業務が、単なる「線」から「データ」へ昇華する瞬間を、心から応援しています。何か詰まったら、いつでもまた聞きに来てくださいね。

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