AutoCAD DWG一括変換の深淵:バージョン互換性を制するアーキテクチャの極意
AutoCADのバージョン管理は、多くのエンジニアにとって「終わりのない泥沼」だ。最新のDWGをレガシー環境へ落とし込む際、単純な`SaveAs`メソッドの呼び出しだけで済ませているなら、それはエンジニアとしての怠慢と言わざるを得ない。
今日は、数千枚単位の図面を、メモリを枯渇させることなく、かつ互換性という名の罠を回避しながら一括変換するための、実務の最前線で磨き抜かれた知見を共有する。
—
1. なぜ「単純なSaveAs」では失敗するのか
AutoCADの`SaveAs`メソッドには、暗黙的なメモリリークの温床と、COMインターフェース特有の「解放漏れ」が存在する。また、バージョンを下げる際、`AcSaveAsType`定数を正しく指定するだけでは不十分だ。
- Proxyオブジェクトの爆弾: 最新版のAutoCADで作成された特殊なオブジェクト(注釈尺度やCivil 3D固有の拡張データ)は、旧バージョンでは「プロキシ」として扱われ、最悪の場合、図面を開いた瞬間にAutoCADごとクラッシュする。
- メモリの断片化: `Application.Documents.Open`を繰り返すと、VBAのガベージコレクションは追いつかない。`AcadDocument`オブジェクトを明示的に開放し、メモリを強制解放するアーキテクチャが不可欠だ。
—
2. 堅牢な一括変換エンジンの実装
以下に、メモリを最適化し、安全にDWGを書き出すためのコアロジックを提示する。
‘ 伝説的な安定性を誇るバッチ処理モジュール
Public Sub BatchSaveAsVersion(folderPath As String, targetVersion As AcSaveAsType)
Dim fso As Object: Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim folder As Object: Set folder = fso.GetFolder(folderPath)
Dim file As Object
Dim doc As AcadDocument
‘ エラーハンドリングを徹底し、1ファイルで全工程を止めない
On Error Resume Next
For Each file In folder.Files
If LCase(fso.GetExtensionName(file.Name)) = “dwg” Then
‘ ドキュメントを非表示に近い状態で開く(高速化の定石)
Set doc = Application.Documents.Open(file.Path, True)
If Not doc Is Nothing Then
‘ プロキシの警告ダイアログ等を抑制するためのシステム変数操作
ThisDrawing.SetVariable “FILEDIA”, 0
‘ バージョンを指定して保存
‘ 重要なのは「保存直後のDocument.Close」のタイミング
doc.SaveAs file.Path, targetVersion
‘ メモリの強制解放:ここを疎かにする者が現場で泣く
doc.Close False
Set doc = Nothing
ThisDrawing.SetVariable “FILEDIA”, 1
End If
End If
Next file
MsgBox “変換プロセスが完了しました。”
End Sub
—
3. シニアエンジニアが押さえるべき「3つの極限の知見」
① システム変数による「静的な強制力」
`FILEDIA`や`CMDECHO`を操作するのは基本だが、さらに深掘りするなら`PROXYGRAPHICS`と`PROXYNOTICE`の設定を考慮せよ。旧バージョンへ渡す前にこれらを調整しておかなければ、受け取り側のAutoCADがダイアログ地獄に陥る。
② メモリ最適化のための「COMの作法」
VBAはCOMラッパーである。`Set doc = Nothing`だけでは不十分な場合がある。大規模なバッチ処理を行う際は、定期的に`DoEvents`を挟むか、あるいはWindows API (`SetProcessWorkingSetSize`) を呼び出し、AutoCADのプロセスに割り当てられた物理メモリをOSに返還させる必要がある。
③ バージョン互換の真実
`acR15_DWG` (AutoCAD 2000) から `acNative` まで、`AcSaveAsType`列挙体は多岐にわたる。しかし、注意が必要なのは「Civil 3DやArchitectureなど、特定業種向けAutoCADで作成されたオブジェクト」だ。これらは単純な保存だけでは、旧版AutoCADで「表示はできるが編集はできない」という状況になりやすい。必要に応じて`ExportToAutoCAD`コマンドをVBAから発行し、純粋な線形オブジェクトへ分解することを検討せよ。
—
4. 最後に:保守という名の美学
システム管理者の諸君、自動化とは「コードを書いて終わり」ではない。変換後の図面にプロキシが残っていないか、文字化けしていないかを確認する「検証ルーチン」までを自動化システムに組み込むこと。
真のエンジニアは、動くものを作るのではない。「誰が使っても壊れない、静寂なシステム」を構築するのだ。
このコードが、君たちのレガシー環境と最新環境の架け橋となり、無駄な残業から解放される一助となれば幸いだ。健闘を祈る。
