【テクニカル・上級編】【上級】AcadDocumentの「Proxy Objects(プロキシ図形)」検出と警告:アドオン不在によるデータ欠損を防ぐ – AutoCAD VBA解析バイブル

スポンサーリンク

【AutoCAD VBA極限技術】プロキシ図形(Proxy Objects)の検知と爆発の回避 ― データ整合性の防波堤を構築せよ

AutoCADのデータ構造における「プロキシ図形」は、いわば時限爆弾だ。
外部ARXアプリケーションによって生成されたカスタムオブジェクトが、そのアプリケーション不在の環境で開かれたとき、AutoCADはこれを「Proxy」として保持する。

この状態の図面に対し、不用意な編集や保存を行えばどうなるか。カスタムデータは永続的に欠損し、図面内には「ゴミ」が蓄積され、最悪の場合はファイルを開くたびに致命的なクラッシュを引き起こす。

本稿では、レガシーなAutoCAD VBA環境において、この潜在的なリスクを検知し、未然に防ぐための堅牢な監査メカニズムを解説する。

1. なぜプロキシ図形を「プログラム」で検知しなければならないのか

手動で`PROXYNOTICE`変数をチェックするだけでは不十分だ。
大規模な設計環境において、図面が「いつ、どの環境で」作成されたかを管理者が完全に把握することは不可能に近い。我々アーキテクトが担うべきは、「不完全な図面を編集可能状態にさせない」というゲートキーパーとしての責務である。

AutoCADのオブジェクトモデルにおいて、プロキシ図形は `AcDbProxyEntity` または `AcDbProxyObject` として存在する。これらをループで全走査するのはメモリ効率が悪く、図面規模によってはパフォーマンスが破綻する。

2. 実践:高効率プロキシ監査エンジンの実装

以下のコードは、ドキュメントのモデル空間およびペーパー空間を走査し、プロキシ図形を検知した時点で処理を中断(または警告)する、実戦仕様のルーチンである。

‘ ————————————————————————–
‘ プロキシ図形検知エンジン
‘ 戻り値: True = プロキシ図形あり(危険), False = クリーン
‘ ————————————————————————–
Public Function HasProxyObjects() As Boolean
Dim doc As AcadDocument
Dim ent As AcadEntity
Dim proxyCount As Long

Set doc = ThisDrawing
proxyCount = 0

‘ プロキシ図形はモデル空間だけでなく、全ブロック定義内にも潜む
‘ ここではパフォーマンス重視のため、モデル空間の監査を行う
On Error Resume Next
For Each ent In doc.ModelSpace
‘ AutoCADのObjectDBXで高速に型を確認
‘ “AcDbProxyEntity” はプロキシ図形のクラス名として固定されている
If TypeName(ent) = “IAcadProxyEntity” Or InStr(1, ent.ObjectName, “Proxy”) > 0 Then
proxyCount = proxyCount + 1
End If
Next ent

‘ 厳密な判定: プロキシ図形が1つでも存在すれば安全とは言えない
If proxyCount > 0 Then
MsgBox “警告: プロキシ図形が ” & proxyCount & ” 個検出されました。” & vbCrLf & _
“データ欠損のリスクがあるため、編集を中止します。”, vbCritical, “システム監査”
HasProxyObjects = True
Else
HasProxyObjects = False
End If
End Function

3. メモリ管理とパフォーマンスの極意

VBAにおける最大の敵は、`For Each` ループ内で生成される「暗黙的な参照」の放置だ。
AutoCADのオブジェクトモデルはCOMベースであり、参照が残ればメモリリークを引き起こし、AutoCADプロセスの終了時に異常終了(Fatal Error)の原因となる。

極限の最適化テクニック

1. 明示的な解放: ループ内で使用したオブジェクトは必ず `Set ent = Nothing` で解放せよ。
2. 遅延バインディングの抑制: 必要であれば早期バインディング(Type Library参照)を行い、実行時の解決コストを削減する。
3. システム変数の一時変更: 監査中は `PROXYGRAPHICS` などを安全な値に一時書き換え、バックグラウンドでのプロキシレンダリング負荷を軽減する。

‘ 推奨されるメモリ解放パターン
For Each ent In doc.ModelSpace
‘ 処理…
Set ent = Nothing ‘ ループごとのクリーンアップ
Next ent

4. アーキテクトからの提言:データ整合性を守るために

プロキシ図形を見つけた際、単に警告を出すだけで終わらせてはならない。

  • ログ出力: 誰が、どの図面で、いつプロキシを検知したかをCSV等のログとしてサーバに飛ばせ。
  • WBLOCKによるクリーン化: どうしてもその図面が必要な場合、VBAから `WBLOCK` コマンドを呼び出し、プロキシを排除した新ファイルへの書き出しを強制する運用フローを構築せよ。
  • Object Enablerの強制: 組織内のクライアント端末に、必要なARXアプリケーション(Object Enabler)がインストールされているかを、レジストリ監視または起動時チェックで管理せよ。

結びに

AutoCAD VBAはレガシーと言われるが、そのオブジェクトモデルの深淵には、今なお解決すべき「データ整合性」という課題が眠っている。
プロキシ図形を無視することは、爆弾を抱えて設計するのと同じだ。

システム管理者は、ユーザーの操作に依存せず、プログラムが図面の「健康状態」を監視し、危険な状態であれば即座に遮断する。これこそが、真の自動化エンジニアが為すべき、静かなる守りである。

諸君、コードを書き、図面を守れ。それが、エンジニアとしての矜持だ。

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