腐ったレガシーを叩き斬る:AutoCADファイル形式変換の「真実」
AutoCADのファイル変換、いわゆる「DWGからDXFへ、その逆も然り」という作業を、手動の『名前を付けて保存』で行っているなら、今すぐその手を止めろ。それはエンジニアの仕事ではない。ただの肉体労働だ。
今日は、AutoCAD VBAの深淵に触れつつ、システム管理者やシニアエンジニアが避けて通れない「ファイル形式の自動変換」を、メモリを汚さず、かつ堅牢に実装するためのアーキテクチャを伝授する。
—
1. なぜ「SaveAs」の多用がシステムを殺すのか
AutoCADの `Document.SaveAs` メソッドは強力だが、安易にループで回すと、AutoCADのドキュメントライフサイクル管理を食い破る。特に大量のファイルを扱う場合、`AcadDocument` オブジェクトの解放漏れは、メモリリークの温床となり、やがて `acaddoc.exe` は沈黙する。
極限の知見:
- バックグラウンド処理の鉄則: ファイルを開く際は必ず `Application.Documents.Open` を使用し、処理が終われば即座に `Document.Close` を呼ぶこと。
- イベントの無効化: 自動保存や外部参照の再ロードといったイベントは、バッチ処理中にはノイズでしかない。`Application.AutoSaveInterval` を一時的に0にする、あるいは `SysVar` を制御して不要な計算コストを排除せよ。
—
2. ファイル変換の極致:実装コード
以下は、単なる変換スクリプトではない。エラーハンドリングとオブジェクト管理を最小限のオーバーヘッドで実装した、現場で即戦力となるコードだ。
‘ @brief ファイル形式変換のプロトタイプ
‘ @param filePath 変換元フルパス
‘ @param targetPath 変換先フルパス
‘ @param fileFormat acSaveAsType定数 (例: acR12_DXF, ac2018_DWG)
Public Sub ConvertDrawing(ByVal filePath As String, ByVal targetPath As String, ByVal fileFormat As Long)
Dim doc As AcadDocument
Dim acadApp As AcadApplication
Set acadApp = ThisDrawing.Application
‘ 例外を拾うためのガード
On Error GoTo Cleanup
‘ 外部参照や重いイベントを一時停止して読み込み
acadApp.Visible = True ‘ 必要に応じてFalseにするが、描画エンジンを起動させること
Set doc = acadApp.Documents.Open(filePath, True) ‘ ReadOnlyで開くのがセオリー
‘ 変換実行
doc.SaveAs targetPath, fileFormat
Cleanup:
‘ オブジェクトの明示的解放はVBAの作法
If Not doc Is Nothing Then
doc.Close False ‘ 変更を保存せずに閉じる
Set doc = Nothing
End If
If Err.Number <> 0 Then
Debug.Print “Error ” & Err.Number & “: ” & Err.Description
End If
End Sub
—
3. システム管理者への警告:Windows APIと安定性
もし君が数百、数千の図面を夜間にバッチ処理しようとしているなら、VBA単体では力不足だ。AutoCADのプロセスは、長時間稼働させると「ゴミ」が溜まる。
極限の最適化Tips:
1. プロセスの再起動: 100ファイル処理するごとに、一度AutoCADインスタンス自体を終了させ、再起動するロジックを組め。これはVBAから `Shell` コマンドでメインの制御スクリプトをタスクスケジューラからキックすることで実現できる。
2. Windows API `GetExitCodeProcess`: 外部からAutoCADの終了を監視せよ。AutoCADがハングした際、VBA側で `TerminateProcess` を叩く勇気も必要だ。
3. DXFのバージョン選定: DXFへの変換は、書き出す先のアプリケーションの互換性を考慮せよ。特に `acR12_DXF` は最小公倍数的な互換性を持つが、現代の複雑なジオメトリを破壊する可能性がある。必ず検証用のダミーファイルでテストすること。
—
4. 最後に:プロの矜持
「動けばいい」コードは素人が書くものだ。我々が書くべきは、「翌朝、何事もなかったかのようにログファイルだけが完璧に残っている」コードだ。
図面変換という単純作業の中に、どれだけのエラーキャッチを仕込み、どれだけメモリの寿命を延ばせるか。その細部への執着こそが、チーフアーキテクトと単なるプログラマーを分かつ境界線である。
さあ、今すぐ退屈な手作業を自動化し、君の貴重な脳のリソースを、より高次元のシステム設計へ向けてほしい。
健闘を祈る。
