【実務・中級編】【実務中級者向け】「PROXYGRAPHICS」の動的制御:他社CADでの閲覧互換性を高める保存時設定の自動化 – AutoCAD VBA解析バイブル

スポンサーリンク
スポンサーリンク

【極限の知見】他社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`の制御一つをとっても、その背後にある「環境の整合性」と「ユーザーへの責任」を意識できるかどうかが、単なるプログラマーと、伝説的なエンジニアを分かつ境界線となる。

このコードを、君のプロジェクトの「標準」として採用してほしい。

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