AutoCAD VBAの闇を制す:Proxy Objects(プロキシ図形)の検知とデータ保全の極意
AutoCADの図面を開いた際、誰もが一度は目にする「プロキシ情報」のダイアログ。多くのエンジニアはこれを「またか」と無視し、Enterキーでやり過ごしていることだろう。しかし、業務自動化を志すエンジニアにとって、それは「時限爆弾」に他ならない。
アドオン(ObjectARXアプリケーション)が存在しない環境で図面を編集・保存すれば、その背後に隠れていた高度なデータは完全に消失する。本稿では、VBAを用いてドキュメントの健全性をプログラム的に監査し、データ欠損という「現場の破滅」を未然に防ぐための極限のアーキテクチャを伝授する。
—
1. なぜ「Proxy Objects」を放置してはいけないのか
AutoCADの図面データは、純粋な線や円だけで構成されているわけではない。Civil 3DやPlant 3D、あるいはサードパーティ製のアドオンが作成した「カスタムオブジェクト」は、それらを実行するARXプログラムがロードされていない環境では、単なるダミーの「プロキシ図形(`AcDbProxyEntity`)」として扱われる。
この状態でVBAプログラムを走らせ、プロキシ図形を含む画層を削除したり、あるいは座標変換を行ったりすれば、予期せぬクラッシュや、重要な属性情報の消失を招く。「自動化ツールが図面を壊した」という悲劇は、ここから生まれる。
2. プロキシ検知の設計思想:`SummaryInfo` と `Database` の監査
AutoCADのオブジェクトモデルにおいて、プロキシの存在を確認する方法は主に二つある。
1. `SummaryInfo` オブジェクトを叩く: 図面を開いた瞬間にプロキシが含まれているかを簡易的に判定する。
2. `Database` を走査(イテレーション)する: 全図形をループし、`ObjectName` が “AcDbProxyEntity” であるものを抽出する。
大規模な図面では後者は重い。まずは高速な `SummaryInfo` でフィルタリングし、必要に応じて詳細な検証を行う階層構造がベストプラクティスだ。
—
3. 【プロダクションコード】プロキシ監査ユーティリティ
以下は、ドキュメントを開いた瞬間にプロキシの有無を判定し、存在する場合はログを吐き出して警告する、実戦投入レベルのモジュールである。
Option Explicit
‘ @brief プロキシ図形の有無を判定し、データ欠損リスクを警告する
‘ @author AutoDesk Automation Architect
Public Sub AuditProxyObjects()
Dim doc As AcadDocument
Dim iCount As Long
Dim ent As AcadEntity
Set doc = ThisDrawing
‘ 1. SummaryInfoによる高速チェック
‘ AutoCADは保存時にプロキシの有無をフラグとして持っている
If doc.SummaryInfo.NumCustomInfo > 0 Then
‘ 必要に応じてカスタムプロパティを走査
End If
‘ 2. モデル空間内のプロキシ図形を直接スキャン
iCount = 0
For Each ent In doc.ModelSpace
‘ オブジェクト名がAcDbProxyEntityかどうかを確認
If ent.ObjectName = “AcDbProxyEntity” Then
iCount = iCount + 1
End If
Next ent
‘ 3. 監査結果の通知
If iCount > 0 Then
MsgBox “【警告】この図面には ” & iCount & ” 個のプロキシ図形が含まれています。” & vbCrLf & _
“アドオンがロードされていないため、編集によりデータが消失する危険性があります。” & vbCrLf & _
“ツール実行を中断します。”, vbCritical, “ドキュメント監査システム”
‘ ここで処理を中断する(Exit Sub)
Exit Sub
End If
MsgBox “監査完了:プロキシ図形は検出されませんでした。安全に処理を開始します。”, vbInformation
End Sub
実装のポイント
- イテレーションの重さ: `ModelSpace` 全体を回すのは重い処理だ。もし図面が巨大なら、`BlockTable` を再帰的に調べるのではなく、必要な画層や範囲に絞って監査する設計を推奨する。
- エラーハンドリング: 読み取り専用ファイルや、パーミッション制限がある場合を考慮し、必ず `On Error GoTo` を実装すること。
—
4. 現場で生き残るための「運用上の注意」
このプログラムを導入するだけでは不十分だ。以下の運用ルールをチーム全体に徹底させろ。
- 自動化の開始点に組み込む: どんな自動化ツールでも、最初の1ステップ目は「ドキュメントの健全性チェック」であるべきだ。ここを省くのは、シートベルトをせずに高速道路を走るようなものだ。
- ログの保存: メッセージボックスを出すだけでなく、ログファイル(CSV等)に図面名とプロキシの数を記録しておくこと。後から「なぜこの図面だけ計算が狂ったのか」を検証する際の強力な証拠になる。
- さらなる深淵へ: より高度な開発が必要な場合は、VBAではなく `ObjectARX` または `.NET API` の `Database.ProxyStore` を調査せよ。VBAの限界を超えた先には、プロキシ図形の中身(どのARXが必要か)を特定する道が開けている。
結びに代えて
「動くツール」を作るのはプログラミング初心者でもできる。しかし、「壊れないツール」を作り、組織のデータを守り抜くのは、設計思想を持ったエンジニアにしかできない。
プロキシ図形という、目に見えない脅威に対して常に警戒心を怠らないこと。それが、君がCAD自動化の第一線で生き残り、信頼されるアーキテクトであるための条件だ。
さあ、コードを書き換えろ。君のツールが真の「プロフェッショナル・グレード」に到達する時が来た。
