現場の「バージョン不適合」を根絶せよ: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を制する者は、設計の現場を制する。そのことを忘れないでいただきたい。
