【テクニカル・上級編】【実務中級者向け】保存時の「DWGバージョン自動判別」:相手先のCAD環境に合わせた下位互換セーブ – AutoCAD VBA解析バイブル

スポンサーリンク

現場の「バージョン不適合」を根絶せよ:AutoCAD自動保存の極意

AutoCADのAPIを叩く際、最も軽視され、かつ最も現場を疲弊させるのが「DWGのバージョン制御」だ。

「最新版で保存すればいい」という甘い考えは、下請け企業や異種CADが混在する巨大プロジェクトにおいては、即座に手戻りという名の死を意味する。なぜなら、`AcSaveAsType`の指定を誤ることは、情報の欠落や図面レイアウトの崩壊を招くからだ。

今回は、シニアアーキテクトの視点から、この「バージョン自動判別保存」をシステムとして堅牢に実装するための極限の知見を授ける。

—

1. なぜ「手動保存」がシステムを崩壊させるのか

AutoCADの`Document.SaveAs`メソッドは非常に強力だが、同時に非常に脆い。特に、バックグラウンドでのバッチ処理や複数図面の連続処理において、ユーザーの現在の環境設定に依存した保存を行うことはリスクでしかない。

我々が実装すべきは、「受信側の環境(R2013, R2018, R2024等)をコードで強制定義し、その時点で最も安全なプロキシ図形を生成する」という設計思想だ。

2. 「防御的保存」のための実装アーキテクチャ

単にバージョンを指定するだけでは不十分だ。メモリの解放、データベースのクローズ処理、そしてWin32 APIを用いたファイル属性の確認までを統合する必要がある。

以下に、実運用レベルのクラスモジュールの一部を公開する。

Option Explicit

‘ 保存先バージョンを定義する列挙型(AcSaveAsTypeのラッパー)
Public Enum TargetEnvironment
Env_R2013 = AcSaveAsType.ac2013_dwg
Env_R2018 = AcSaveAsType.ac2018_dwg
Env_R2024 = AcSaveAsType.ac2024_dwg
End Enum

”’

”’ 指定されたバージョンで図面を保存するアーキテクチャ
”’

Public Sub RobustSaveAs(ByVal targetDoc As AcadDocument, _
ByVal filePath As String, _
ByVal version As TargetEnvironment)
On Error GoTo ErrorHandler

‘ 1. 保存前のデータベース最適化(パージ等の事前実行を推奨)
‘ 2. ファイル書き込みの安全性確認(Read-Only属性の解除などが必要な場合)

‘ 重要:保存処理を実行
‘ 第2引数には常に明示的にAcSaveAsTypeを指定する
targetDoc.SaveAs filePath, version

Exit Sub

ErrorHandler:
‘ ここでWindows APIを用いてログを詳細に記録する設計が必要
Debug.Print “Save failed: ” & Err.Description
Err.Raise Err.Number, “RobustSaveAs”, “DWG Version mismatch or I/O error.”
End Sub

3. メモリ解放の神髄:オブジェクトのライフサイクル管理

VBAはガベージコレクションを信用してはならない。特に`AcadDocument`オブジェクトや`AcadDatabase`を扱う際、明示的な解放を怠ると、AutoCADのプロセスがゾンビ化し、次回のバッチ処理でメモリリークを引き起こす。

  • Set obj = Nothing は儀式ではなく義務だ。
  • エラー発生時にも必ず`Cleanup`ルーチンを通すこと。
  • `ThisDrawing`に依存せず、常に明示的な変数に割り当て、スコープを極小化せよ。

4. 現場のシニアエンジニアへ:実装の鉄則

1. バージョンはプロパティファイル化せよ:
ハードコードは悪である。INIファイルやJSONの設定ファイルに `TargetVersion` を保持し、プロジェクトごとに切り替えられるようにせよ。
2. プロキシ図形を恐れるな:
下位バージョンに落とす際、上位版特有のオブジェクトがどう変換されるか、`AcSaveAsType`の挙動を事前に検証(PoC)しておくこと。
3. ファイルロックの検知:
VBA単体でファイルロックを検知するのは困難だ。`Kernel32.dll`の`CreateFile`関数を用いて、ファイルが他プロセスにロックされていないかを確認するラッパー関数を導入することを強く推奨する。

結論:技術は「信頼」を担保するためにある

バージョン不適合によるトラブルは、技術者の怠慢ではなく、アーキテクトの設計ミスである。

今回紹介した「環境依存を排除した保存ルーチン」は、小規模なマクロの域を脱し、組織的なCADデータ管理の基盤となる。コードをコピペして満足するのではなく、自身の環境における「エラーハンドリングの哲学」をこのコードに組み込んでほしい。

AutoCADのAPIを制する者は、設計の現場を制する。そのことを忘れないでいただきたい。

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