AutoCADの「サイレント起動」を極める:Visibleプロパティの先にあるメモリの深淵
AutoCADのオートメーションにおいて、`AcadApplication.Visible = False` を単なる「画面を隠す設定」だと思っているなら、それは大きな誤解だ。
GUIを抑制することは、単なる視覚的な演出ではない。それはAutoCADという巨大なモンスターの「描画エンジン」をシャットダウンし、消費リソースを演算(Computation)へと全振りするための、いわば「兵站(ロジスティクス)の最適化」である。
今回は、この制御を単なるコードの断片ではなく、堅牢なシステムとして実装するための「極限の知見」を共有する。
—
1. なぜVisible = Falseが「高速化」に直結するのか
AutoCADのレンダリングパイプラインは、たとえユーザーが操作していなくても、画面上のオブジェクト更新、再描画のキュー処理、イベントリスナーの監視に多大なCPUサイクルを費やす。
`Visible = False` に設定することで、以下の負荷が劇的に低減される。
- GDI/DirectXの描画命令の停止: GPUリソースの解放。
- イベントハンドラの抑制: 画面更新に関連する不要なイベント発火の最小化。
- メモリ・スワップの削減: UIスレッドの待機時間がなくなることで、バックグラウンド処理の排他制御がスムーズになる。
—
2. 実装の要諦:オブジェクトのライフサイクル管理
初心者ほど「アプリを起動して、VisibleをFalseにして、終わり」というコードを書くが、それはメモリリークの温床だ。AutoCADのプロセスは、一度ゾンビ化するとタスクマネージャーから消せなくなる。
「終了時には必ず明示的に解放する」。これがエンジニアとしての最低限の誓約だ。
実践的コード:セーフなバックグラウンド実行
Public Sub ExecuteSilentBatch()
Dim acadApp As Object
Dim acadDoc As Object
‘ 既存プロセスへの接続、または新規作成
On Error Resume Next
Set acadApp = GetObject(, “AutoCAD.Application”)
If acadApp Is Nothing Then
Set acadApp = CreateObject(“AutoCAD.Application”)
End If
On Error GoTo 0
‘ ここが核心:Visibleプロパティによる描画抑制
‘ 注意: 処理開始前に設定しなければならない
acadApp.Visible = False
Set acadDoc = acadApp.Documents.Open(“C:\Projects\TargetDrawing.dwg”)
‘ — ここに重厚なバッチ処理を記述 —
ProcessGeometry acadDoc
acadDoc.Close SaveChanges:=True
‘ 終了処理:VisibleをTrueに戻すか、QUITするかを判断する
‘ 自前で起動したインスタンスならQUITさせるのが鉄則
acadApp.Quit
‘ オブジェクトの明示的解放(重要)
Set acadDoc = Nothing
Set acadApp = Nothing
End Sub
—
3. レガシー環境での「隠れエラー」を制御する
`Visible = False` の最大の弱点は、「ダイアログが背後で停止しても気づけない」ことにある。例えば、ファイルを開く際にプロキシ図形やフォントの欠落ダイアログが出ると、プログラムは永久に停止(ハングアップ)する。
この問題を解決するには、`SysVar`(システム変数)の操作が不可欠だ。
安定性を高めるための「鉄の掟」
- `FILEDIA = 0`: ファイルダイアログを抑制する。
- `CMDDIA = 0`: コマンドラインのみの操作を強制する。
- `PICKFIRST = 0`: 選択セットの競合を避ける。
これらを `acadDoc.SetVariable` で制御することで、バックグラウンドでの安定性は劇的に向上する。
—
4. チーフアーキテクトからの忠告:Windows APIとの共存
大規模なバッチ処理を行う際、AutoCADがバックグラウンドでクラッシュすると、Windowsのメモリ上にプロセスの残骸が残る。これを放置してバッチを再実行すると、メモリ不足でシステム全体が崩壊する。
必要に応じて、Windows APIを用いてプロセスを監視・強制終了するラッパーを組み込むべきだ。
‘ プロセスIDを取得し、強制終了させるためのAPI定義例
If Win64 Then
Private Declare PtrSafe Function TerminateProcess Lib “kernel32” (ByVal hProcess As LongPtr, ByVal uExitCode As Long) As Long
End If
※ 本来は `Quit` メソッドが推奨されるが、無限ループや予期せぬエラーで制御不能になった際の「最終防衛線」として用意しておくのが、真のプロフェッショナルの設計だ。
—
総括:自動化の真髄
AutoCADの自動化において、「Visibleを制御する」とは、単なる設定変更ではなく、「CADエンジンを純粋な計算機として再定義する行為」である。
- 処理の前後で必ず環境を元に戻す(エラーハンドリングによる保証)。
- オブジェクトは最後の一滴まで解放する(`Nothing`代入の徹底)。
- ダイアログとUIは完全に遮断する(`SysVar`による制御)。
この3点を守るだけで、あなたのバッチシステムは、不安定な「マクロ」から、堅牢な「自動化インフラ」へと進化する。
現場でトラブルが起きたとき、ログ出力すら行われていないコードは死に体と同義だ。常に「サイレント」な世界でも、裏側で何が起きているかをトレースできる設計を心がけてほしい。健闘を祈る。
