【極限の知見】他社CADとの互換性を支配せよ:PROXYGRAPHICSの動的制御による「見えない図面」の根絶
設計現場において、エンジニアが最も恐れるべき事態は「計算ミス」ではない。「クライアントに渡した図面が、相手の環境では何も見えない(あるいは欠落している)」という、信頼を根底から覆すコミュニケーションの失敗だ。
AutoCAD独自のオブジェクト(Civil 3Dのコリドー、Plant 3Dの配管、あるいはサードパーティ製のアドオンによるカスタムオブジェクト)を含む図面を、BricsCADやZWCAD、あるいは古いバージョンのAutoCADで開いた際、それらが「空っぽ」に見える。これは、AutoCADが保持する高度なデータベース情報が、他社CADには解釈できない「プロキシオブジェクト」として扱われるために起こる。
この問題に対する解は、保存時に`PROXYGRAPHICS`システム変数を適切に制御することにある。しかし、単に「保存前に変数を変える」だけのコードを書くのは二流だ。それは、ユーザーの作業環境を破壊する「破壊的なスクリプト」になりかねない。
本稿では、実務で通用する「堅牢な設計思想」に基づいた、プロキシグラフィックスの動的制御ロジックを伝授する。
1. プロキシグラフィックスの本質:なぜ「保存時」に制御が必要なのか
まず、アーキテクトとして基本原則を整理しておく。`PROXYGRAPHICS`は、図面内に含まれるプロキシオブジェクトの「視覚的表現(グラフィックス)」をDWGファイル内に埋め込むかどうかのスイッチだ。
- ON (1) の場合: オブジェクトの形状データが簡易的なポリラインやメッシュとして保存される。他社CADでも「見た目」は維持されるが、ファイルサイズは増大する。
- OFF (0) の場合: 形状データは保存されない。AutoCAD以外の環境では、そのオブジェクトが存在しないかのように見える。
実務において、我々が自動化すべきは「図面の用途に応じた、保存プロセスの標準化」である。
「社内共有用には軽量なOFFで」「外部納品用には互換性の高いONで」といった制御を、人間の判断(ヒューマンエラーの温床)に委ねてはならない。
2. 陥りやすい設計ミス:なぜ「単純なコード」は現場で死ぬのか
多くの初級開発者が書くコードは、以下のような構造だ。
' --- 典型的な「ダメな」実装例 ---
Sub BadExample()
ThisDrawing.SetVariable "PROXYGRAPHICS", 1
ThisDrawing.SaveAs "C:\Output\Project.dwg"
End Sub
これには、プロフェッショナルとして看過できない3つの致命的な欠陥がある。
1. 環境破壊(State Pollution): システム変数を書き換えた後、元の設定に戻していない。これにより、ユーザーが次に手動で作業する際、意図しない設定が残ってしまう。
2. エラーハンドリングの不在: 図面が「読み取り専用」だった場合、あるいは書き込み権限がないパスを指定した場合、コードは即座にクラッシュし、ユーザーの作業を中断させる。
3. 副作用の無視: `SaveAs`を実行する際、ファイルが既に存在する場合の警告(Overwrite confirmation)を制御できておらず、ユーザー体験を著しく損なう。
3. プロダクション・グレードの設計:堅牢な実装モデル
プロフェッショナルな実装では、「状態の保存と復元(State Management)」と「例外処理(Exception Handling)」を分離して設計する。
以下に、私が実務の自動化ツールで採用している、保守性の高いクラス設計に近い構造のコードを示す。
Option Explicit
''' <summary>
''' 図面の互換性を制御しながら保存を行うプロフェッショナル用ルーチン
''' </summary>
''' <param name="targetPath">保存先のフルパス</param>
''' <param name="enableProxy">プロキシグラフィックスを有効にするか(True=ON, False=OFF)</param>
''' <returns>成功した場合はTrue、失敗した場合はFalse</returns>
Public Function SafeSaveWithProxy(ByVal targetPath As String, ByVal enableProxy As Boolean) As Boolean
On Error GoTo ErrorHandler
Dim currentDoc As AcadDocument
Set currentDoc = ThisDrawing
' 1. 現在の状態をバックアップ(環境破壊を防ぐための鉄則)
Dim originalProxySetting As Integer
originalProxySetting = currentDoc.GetVariable("PROXYGRAPHICS")
' 2. 事前チェック:読み取り専用でないか?
If currentDoc.ReadOnly Then
MsgBox "エラー: 図面が読み取り専用です。保存できません。", vbCritical, "保存失敗"
SafeSaveWithProxy = False
Exit Function
End If
' 3. 設定の適用
Dim targetSetting As Integer
targetSetting = IIf(enableProxy, 1, 0)
' すでに設定が希望通りなら、変更プロセスをスキップして効率化
If originalProxySetting <> targetSetting Then
currentDoc.SetVariable "PROXYGRAPHICS", targetSetting
End If
' 4. 保存の実行
' ※注意: SaveAsは既存ファイルの上書き確認ダイアログを出す可能性がある。
' 本格的なツールでは、事前にFileExists関数でチェックを行うべき。
currentDoc.SaveAs targetPath
' 5. 成功フラグを立てる
SafeSaveWithProxy = True
CleanUp:
' 6. 環境の復元(必ず実行されるセクション)
' ユーザーの作業環境を、変更前の状態に完全に巻き戻す。これがプロの仕事だ。
On Error Resume Next
currentDoc.SetVariable "PROXYGRAPHICS", originalProxySetting
Exit Function
ErrorHandler:
' 7. エラーログの出力(実務ではファイルやDBへの書き出しを推奨)
Debug.Print "Error " & Err.Number & ": " & Err.Description
MsgBox "保存中に致命的なエラーが発生しました。" & vbCrLf & _
"Error No: " & Err.Number & vbCrLf & _
"Description: " & Err.Description, vbCritical, "システムエラー"
SafeSaveWithProxy = False
Resume CleanUp
End Function
''' <summary>
''' メインエントリポイント(実務での呼び出しイメージ)
''' </summary>
Sub ExecuteProductionSave()
Dim savePath As String
savePath = "C:\ProjectData\Client_Delivery_Drawing.dwg"
' 納品用なので、プロキシグラフィックスを「ON」にして保存する
If SafeSaveWithProxy(savePath, True) Then
MsgBox "納品用図面の保存が正常に完了しました。", vbInformation, "完了"
Else
MsgBox "保存プロセスに失敗しました。ログを確認してください。", vbExclamation, "注意"
End If
End Sub
4. アーキテクトの視点:さらに高みを目指すためのアドバイス
このコードをベースに、さらに堅牢なシステムへと昇華させるための視点を授ける。
データベース連携と監査ログ
大規模なプロジェクトでは、「いつ、誰が、どの設定で保存したか」の履歴が重要になる。`SafeSaveWithProxy`の成功/失敗の結果を、CSVファイルやSQL Serverなどのデータベースに記録する仕組みを組み込みなさい。これにより、後からの「図面が見えない」というクレームに対し、保存時の設定をエビデンスとして提示できる。
非同期処理とUIのロック
もしこの処理を、大量の図面をバッチ処理するツールの一部として組み込むなら、`Application.ScreenUpdating = False` を活用し、ユーザーの目に見える描画更新を停止させるべきだ。ただし、エラー発生時には必ず `True` に戻すことを忘れてはならない。
ファイルパスのバリデーション
`targetPath` に渡される文字列が、有効なファイル名か、あるいはディレクトリが存在するかを、`FileSystemObject` を用いて事前に検証すること。これは「バグを防ぐ」のではなく、「バグが入り込む余地を消す」作業だ。
結論
AutoCAD VBAにおける自動化とは、単に「操作を速くすること」ではない。「設計者が意図した品質を、例外なく、誰にでも、何度でも再現可能にすること」である。
`PROXYGRAPHICS`の制御一つをとっても、その背後にある「環境の整合性」と「ユーザーへの責任」を意識できるかどうかが、単なるプログラマーと、伝説的なエンジニアを分かつ境界線となる。
このコードを、君のプロジェクトの「標準」として採用してほしい。
