AutoCAD VBAを極限まで加速せよ:図面大量処理における「メモリ解放」と「遅延読み込み」の最適解
AutoCADの自動化ツールを開発していると、必ず「大量の図面を処理する際、後半になるにつれて極端に重くなる」「AutoCADが突然クラッシュする」という壁にぶつかる。
中級者レベルのエンジニアは「`Documents.Open` で開いて、`Close` すればいい」と考えがちだ。しかし、それはメモリリークという時限爆弾を抱えたまま走っているのと同じだ。
今日は、数千枚単位の図面を捌くプロの現場で、AutoCADを息切れさせずに完走させるための「アーキテクチャの鉄則」を伝授する。
—
1. なぜ「Close」だけでは不十分なのか?
AutoCAD VBA(COM/ActiveX)において、`Document.Close` を呼んだだけでは、メモリ空間からオブジェクトが完全に掃き出されないケースが多い。特に参照型のオブジェクトや、意図せず保持されたCOMポインタがGC(ガベージコレクション)のタイミングを狂わせる。
鉄則:オブジェクトの「完全破壊」を徹底せよ
VBAには自動GC機能があるが、AutoCADの巨大なCOMオブジェクトは「待ち」が許されない。明示的な解放を行わないと、次の図面を開く際に前の図面の残骸を抱えたままメモリを浪費する。
‘ 【推奨】オブジェクトを確実に解放するプロシージャ
Public Sub SafeCloseDocument(ByRef doc As AcadDocument)
If doc Is Nothing Then Exit Sub
‘ 図面を閉じる(保存の有無は要件に合わせて調整)
doc.Close SaveChanges:=False
‘ オブジェクトへの参照を明示的に切る(重要)
Set doc = Nothing
‘ プロセッサに一時停止を促す(大量処理時のスタック回避)
DoEvents
End Sub
—
2. パフォーマンスの真犯人「XREF」と「読み込み制御」
図面を開く際、最も時間を食うのは「外部参照(XREF)の再ロード」と「プロキシオブジェクトの解析」だ。大量処理を行う場合、これらを無視して `Open` を叩くのは自殺行為である。
遅延読み込みの戦略:システム変数による最適化
`Documents.Open` を実行する前に、図面の挙動を制御するシステム変数を書き換えるのがプロの流儀だ。
- `XLOADCTL`: 外部参照の読み込みを一時的に制限する。
- `PROXYGRAPHICS`: プロキシ表示をオフにすることで読み込み速度を向上させる。
Public Sub OptimizedOpen(filePath As String)
Dim doc As AcadDocument
‘ システム変数の退避
Dim oldXload As Integer
oldXload = ThisDrawing.GetVariable(“XLOADCTL”)
‘ XREFを無視する設定へ変更(0: 無効)
ThisDrawing.SetVariable “XLOADCTL”, 0
‘ 図面を開く
Set doc = Application.Documents.Open(filePath)
‘ — ここで必要な処理を実行 —
‘ 処理終了後、必ず元の設定に戻す
ThisDrawing.SetVariable “XLOADCTL”, oldXload
SafeCloseDocument doc
End Sub
—
3. 実践:保守性と堅牢性を両立するループ構造
大量の図面を処理する際、1つのエラーが全行程を止めるような設計は許されない。エラーハンドリングと処理の分離が、真の堅牢性を生む。
Public Sub BatchProcessing(fileList As Collection)
Dim i As Long
Dim currentPath As Variant
On Error GoTo ErrorHandler
For Each currentPath In fileList
‘ 1枚ごとに独立したプロセスとして管理するイメージで記述
ProcessSingleFile CStr(currentPath)
Next currentPath
Exit Sub
ErrorHandler:
‘ 致命的なエラーでも次の図面へ進むためのリカバリ
Debug.Print “Error occurred at: ” & Err.Description
Resume Next
End Sub
Private Sub ProcessSingleFile(path As String)
‘ この中で最適化されたOpenを行い、処理後は確実に閉じる
‘ 処理中にエラーが発生しても、呼び出し元に戻れるように設計する
End Sub
—
4. プロの現場で差がつく「メモリ管理」の極意
ここまでのテクニックを実装してもなお重くなる場合、それは「ドキュメント以外のオブジェクト」がメモリを食い潰している。
1. SelectionSetsのクリア: `ThisDrawing.SelectionSets` を使い回している場合、毎回 `Clear` しないと前回の選択セットが残り続け、メモリ圧迫の原因になる。
2. `DoEvents` の適切な挿入: 連続処理でUIがフリーズするのを防ぐだけでなく、Windowsのメッセージキューをクリアすることで、メモリの解放処理をOSに促す役割がある。
3. データベースへの接続保持: 図面データ以外(ExcelやSQL Server)と連携する場合、接続は「必要最小限のスコープ」で開き、`Close` を徹底すること。
総括:自動化は「掃除」までが仕事である
「動けばいい」コードから「止まらない」コードへ。
AutoCADのAPIを叩くということは、巨大なアプリケーションのライフサイクルを制御するということだ。今回紹介した「オブジェクトの明示的解放」「システム変数の最適化」「エラーからの復帰設計」は、あなたのツールを堅牢な業務基盤へと変えるはずだ。
次は、もっと深い領域――`ObjectARX`や`.NET API`を使ったさらなる高速化についても触れたい。だが、まずは目の前のVBAを完璧に使いこなすことから始めてほしい。それが、君が伝説のエンジニアになるための第一歩だ。
