【入門編】【実務中級】図面内の全オブジェクトの、指定したカスタムプロパティ(Extension Dictionary/Xrecord)を検索・抽出する – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは!AutoCAD VBAの世界へようこそ。
マクロの記録ボタンを押すだけの自動化から一歩進み、自分だけのCADシステムを構築したいと思っているあなたへ。

今回は、実務で差がつく「図面内に埋め込まれたカスタムメタデータ(拡張辞書 / 拡張レコード)の検索と抽出」をテーマに、AutoCAD VBAの本質を解説します。

「図面の中に、自分勝手なデータを隠し持たせたい」「パーツごとの管理番号やカスタム属性をVBAでごっそり回収したい」——そんな現場の切実な要望に応えるための技術です。ここをクリアすれば、あなたのAutoCAD VBAのスキルは間違いなく中級者の領域に到達します。

優しく、そして深く。しっかりと解説していきますので、コーヒーでも飲みながらリラックスしてついてきてくださいね。

1. 拡張辞書(Extension Dictionary)と拡張レコード(Xrecord)の正体

AutoCADの図面(`AcadDocument`)や、線分・円などの図形(`AcadEntity`)には、標準で用意されているプロパティ(画層、色、座標など)以外に、「ユーザーが勝手にデータを保存できる隠しポケット」を持たせることができます。

それが Extension Dictionary(拡張辞書)Xrecord(拡張レコード) です。

  • Extension Dictionary(拡張辞書): オブジェクトが持つ「引き出し」のようなものです。この中に複数の「ファイル」をしまうことができます。
  • Xrecord(拡張レコード): 引き出しの中にしまう「ファイル」の実体です。ここにテキストや数値などのデータを配列として格納できます。

これらは、外部のデータベースやExcelに頼らず、「図面ファイル単体でカスタム情報を完全に保持できる」という強力なメリットを持っています。図面管理システムや、BIM/CIM的なメタデータ連携の基盤として、実務では非常によく使われるテクニックです。

2. 【全体像】検索のアルゴリズム

図面全体(モデル空間)から特定のカスタムプロパティを持ったオブジェクトを探し出す手順は、以下の通りです。

1. モデル空間の全オブジェクトをスキャンする (`AcadModelSpace` のループ)
2. 各オブジェクトが「拡張辞書(Extension Dictionary)」を持っているか確認する (`HasExtensionDictionary` プロパティ)
3. 持っていれば、その辞書の中に目的の「キー(名称)」を持つXrecordが存在するか探す
4. 見つかったら、その中身(データ)を取り出してイミディエイトウィンドウ等に出力する

言葉にするとシンプルですが、ここにはAutoCAD特有の「オブジェクトのライフサイクル」や「エラーハンドリング」の罠が潜んでいます。次の章で、実際のコードを見ていきましょう。

3. 実装コード:図面全体から拡張レコードを検索・抽出する

以下のコードは、開発環境(VBAエディタ)の標準モジュールにそのまま貼り付けて、すぐに実行できる実用的なコードです。

Option Explicit

‘ —————————————————————–
‘ プロシージャ名: SearchCustomProperties
‘ 概要: モデル空間内の全オブジェクトを走査し、指定したキーを持つ
‘ 拡張辞書(Extension Dictionary)/拡張レコード(Xrecord)を検索・抽出する
‘ —————————————————————–
Public Sub SearchCustomProperties()
‘ 検索したいカスタムプロパティのキー名(お好きな文字列に変更してください)
Const TARGET_KEY As String = “MY_COMPANY_DATA”

Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing

Dim mSpace As AcadModelSpace
Set mSpace = acadDoc.ModelSpace

Dim ent As AcadEntity
Dim targetCount As Long
targetCount = 0

Debug.Print “=== 拡張レコードの検索を開始します (検索キー: ” & TARGET_KEY & “) ===”

‘ 1. モデル空間の全オブジェクトをループ
For Each ent In mSpace

‘ 2. オブジェクトが拡張辞書を持っているかチェック
‘ ※持っていないオブジェクトに対してHasExtensionDictionaryを無視してアクセスするとエラーになります
If ent.HasExtensionDictionary Then

Dim extDict As AcadDictionary
Set extDict = ent.GetExtensionDictionary

‘ 3. 辞書の中に目的のキーが存在するかチェック
On Error Resume Next
Dim xRec As AcadXrecord
Set xRec = extDict.Item(TARGET_KEY)
On Error GoTo 0 ‘ エラートラップを通常に戻す

‘ キーが存在した場合(xRecがNothingではない)
If Not xRec Is Nothing Then
targetCount = targetCount + 1
Debug.Print “————————————————–”
Debug.Print “発見! 対象オブジェクト Handle: ” & ent.Handle
Debug.Print “オブジェクトの種類: ” & ent.ObjectName

‘ 4. Xrecordからデータを取得する
Dim dataType As Variant
Dim dataValue As Variant

‘ GetXrecordDataメソッドでデータを配列として取り出す
Call xRec.GetXrecordData(dataType, dataValue)

‘ 格納されているデータをイミディエイトウィンドウに表示
Dim i As Long
For i = LBound(dataValue) To UBound(dataValue)
Debug.Print ” データ[” & i & “] 型ID: ” & dataType(i) & ” / 値: ” & dataValue(i)
Next i

‘ オブジェクト変数をクリーンアップ
Set xRec = Nothing
End If

Set extDict = Nothing
End If

Next ent

Debug.Print “==================================================”
Debug.Print “検索完了。合計 ” & targetCount & ” 件のオブジェクトが見つかりました。”

End Sub

4. コードの深掘りと「実務でハマりやすい罠」

このコードには、AutoCAD VBAを極める上での重要なポイントがいくつも詰まっています。エンジニアとして知っておくべきポイントを解説します。

① `HasExtensionDictionary` による安全確認

すべてのAutoCAD図形が初めから拡張辞書を持っているわけではありません。データが書き込まれていない段階では、拡張辞書は「不在」です。
いきなり `ent.GetExtensionDictionary` を呼び出すと、「そのようなオブジェクトはありません」という実行時エラー(エラー番号等)でマクロがクラッシュします。必ず `HasExtensionDictionary` で存在確認をするのが鉄則です。

② `On Error Resume Next` の正しい使い方

辞書オブジェクト(`AcadDictionary`)の `.Item(KEY)` メソッドは、指定したキーが存在しない場合にエラーを発生させます。「存在しないかもしれないキーを探す」という処理の性質上、ここでは一時的にエラーを無視する `On Error Resume Next` を使い、その直後に `Not xRec Is Nothing` で安全に判定しています。
エラー処理を掛けっぱなしにするのはバグの温床になるため、確認が終わったら速やかに `On Error GoTo 0` で解除するのがプロの作法です。

③ データの型とバリアント(Variant)

`GetXrecordData` メソッドは、AutoCADの内部データベース仕様に合わせて、データを「配列の配列(`dataType` と `dataValue`)」として返します。
VBAではこれらが `Variant` 型として扱われるため、`LBound` と `UBound` を使って安全にループを回す必要があります。ここをサボると「型が一致しません」エラーの餌食になりますので注意してください。

まとめ:ここをクリアすれば、AutoCAD VBAの基本はバッチリです!

今回は、図面内に潜むカスタムプロパティを拡張辞書と拡張レコードから探し出す実用的なテクニックを解説しました。

  • 拡張辞書(Extension Dictionary) はオブジェクトの隠し引き出し。
  • 拡張レコード(Xrecord) はその中にしまう実データ。
  • 存在確認(`HasExtensionDictionary`)とエラーハンドリングを制することが、安定したCAD自動化の鍵。

この仕組みを応用すれば、例えば「外部のExcelから読み込んだ設計情報を図形に紐付けておき、後から自動集計するシステム」などを完璧に自作できるようになります。

「マクロの記録」の向こう側にある、本当のAutoCADプログラミングの世界へようこそ。
あなたの業務自動化の旅を、これからも応援しています!

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