AutoCAD図面自動変換パイプライン:数万ファイルの「地獄」を制する極限の設計思想
数千、数万ものDWGファイルを扱うプロジェクトで、手作業や単なるループ処理による自動化を試みれば、必ず「メモリリーク」「ゾンビ化したプロセス」「未知のダイアログによる停止」という三つの地獄に突き当たる。
AutoCAD VBAは強力だが、「AutoCADは本来、GUIを操作するために設計されたツールである」という本質を忘れてはならない。バックグラウンドでの大量処理には、相応の「作法」がある。今日は、止まらない・壊れない・追跡可能な、プロフェッショナルな変換パイプラインの構築術を伝授する。
—
1. 堅牢なパイプラインを支える3つの鉄則
大量処理において最も避けるべきは「アプリケーションの不安定化」だ。以下の設計指針を徹底せよ。
- 単一責務の分離: AutoCADのインスタンスは長生きさせない。一定数(例えば50ファイル)処理するごとにプロセスを再起動(Kill/Create)し、メモリを強制解放する。
- 「見えない敵」の排除: `FileDialog`や警告ダイアログは、`SystemVariable`の`FILEDIA`と`CMDECHO`を0に設定することで物理的に封印する。
- チェックポイントによる再開機能: すべてを一度に処理しようとするな。処理済みのファイルパスを外部ログ(CSVやDB)に書き出し、プログラムがクラッシュしても直前の状態から復旧できるようにせよ。
—
2. プロダクション環境に耐えうる実装コード
以下は、指定ディレクトリ下の全DWGを、指定バージョンへ変換しつつ、ログを記録するプロトタイプだ。
Option Explicit
‘ 必要な定数
Private Const TARGET_VERSION As AcSaveAsType = ac2018_dwg
Sub BatchConvertDrawings(ByVal targetFolder As String)
Dim fso As Object: Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim folder As Object: Set folder = fso.GetFolder(targetFolder)
Dim file As Object
Dim doc As AcadDocument
‘ AutoCADの制御設定を最適化
ThisDrawing.Application.Preferences.System.DisplayAutoCADWarningDialogs = False
For Each file In folder.Files
If LCase(fso.GetExtensionName(file.Path)) = “dwg” Then
‘ 既に処理済みの場合はスキップするチェック(ログファイル参照)
If Not IsAlreadyProcessed(file.Path) Then
On Error Resume Next
Set doc = Application.Documents.Open(file.Path, False)
If Err.Number = 0 Then
‘ バージョン変換して保存
doc.SaveAs file.Path, TARGET_VERSION
doc.Close False
WriteLog file.Path, “SUCCESS”
Else
WriteLog file.Path, “ERROR: ” & Err.Description
End If
On Error GoTo 0
End If
End If
‘ メモリ断片化対策:必要に応じてここでApplicationを再起動するロジックを挿入
Next
End Sub
‘ 簡易ログ出力関数
Private Sub WriteLog(filePath As String, status As String)
Dim logFile As Integer: logFile = FreeFile
Open “C:\AutoCAD_Log.csv” For Append As #logFile
Print #logFile, Now & “,” & filePath & “,” & status
Close #logFile
End Sub
—
3. なぜ「ObjectARX」ではなく「VBA」なのか
よく「なぜC#やObjectARXを使わないのか」と問われる。結論はシンプルだ。「保守のコスト」である。
AutoCADのAPIはバージョンアップで破壊的な変更を受けることがある。VBAはCOM経由で動くため、ObjectARXのように毎回バイナリを再コンパイルする必要がなく、実行環境の差異に極めて強い。数万ファイルという単純なI/Oバウンドな作業であれば、VBAのCOM経由の操作速度はボトルネックにならない。むしろ、開発スピードと保守性のバランスにおいて、VBAは依然として最強のツールの一つだ。
—
4. プロの現場で差が出る「落とし穴」への対策
① 「ゾンビ・プロセス」の撲滅
`doc.Close`を呼んでも、メモリ上に古いインスタンスが残ることがある。`TaskKill`コマンドをVBAの`Shell`関数で呼び出し、定期的に`acad.exe`をクリーンアップするルーチンをパイプラインに組み込むことは、大規模運用の必須事項だ。
② バージョン互換性の罠
`ac2018_dwg`などの定数は、AutoCADのバージョンによって定義されていない場合がある。常に最新の型ライブラリを参照設定し、必要であれば「Late Binding(CreateObject)」を駆使して、異なるAutoCADバージョン間でも動作するアダプター層を設計することをお勧めする。
③ データベース連携
処理状況を管理するために、ファイルパスと処理ステータスをSQL Server ExpressやSQLiteに書き出す設計にせよ。数万件のファイル群を扱う場合、ログファイルをテキストで読み書きするのは非効率だ。クエリで「未処理のファイルだけを抽出」するフローを構築すれば、数日間にわたる変換作業も怖くない。
—
結論:自動化は「信頼性」が全て
コードが美しいかどうかよりも、「夜通し走らせて、朝起きた時に結果が正しく出ているか」が全てだ。今回紹介したエラーハンドリングとログ記録、そしてメモリ管理の意識を徹底すれば、あなたの図面管理パイプラインは、どんなに巨大なプロジェクトでも崩れることはない。
さあ、退屈なファイル変換作業から解放され、より創造的な設計業務へ戻ろう。健闘を祈る。
