AutoCAD VBAの「画面のちらつき」を撲滅せよ:描画更新を制する者が自動化を制す
AutoCADの自動化において、初心者が最初に直面する壁。それは「処理中に画面が激しく点滅し、ユーザーを不安にさせる」という現象だ。
単なる「見た目の問題」と侮ってはならない。描画更新はAutoCADにとって極めて重い負荷だ。数千の図形を生成するたびにCPUとGPUが描画処理にリソースを割けば、実行時間は無意味に肥大化する。
今回は、`Application.Visible` や `Application.ScreenUpdating` に頼り切るような甘い設計を卒業し、プロフェッショナルな現場で求められる「描画更新の完全制御」を伝授する。
—
1. なぜ「描画の抑制」が不可欠なのか
AutoCADのオブジェクトモデルにおいて、`ActiveDocument.ModelSpace` に図形を追加する際、AutoCADはデフォルトでその都度「再作図」のフラグを立てようとする。
画面更新を抑制しないコードは、いわば「1行書くたびにウィンドウを閉じたり開いたりしている」ようなものだ。これでは、どんなに強力なPCでも本来のパフォーマンスを発揮できない。我々エンジニアの使命は、処理の「間」を削り、ユーザーにストレスというノイズを一切与えないことにある。
—
2. 実務で使える堅牢な制御コード
「単に画面を隠す」だけでは不十分だ。エラー発生時に画面が戻らなくなるようなコードは、プロダクション環境では即刻失格となる。「必ず元に戻す(Finallyの精神)」を徹底した設計がこれだ。
Option Explicit
‘ プロダクション環境で必須となる「描画抑制」のラッパーパターン
Public Sub ExecuteHighSpeedDrawing()
Dim app As AcadApplication
Dim doc As AcadDocument
Set app = ThisDrawing.Application
Set doc = ThisDrawing
‘ 1. 描画更新の抑制(システム変数を活用する)
‘ ECOMODEを0にすることで、再作図の頻度を極限まで下げる
Dim oldEcomode As Integer
oldEcomode = app.GetVariable(“ECOMODE”)
app.SetVariable “ECOMODE”, 0
‘ 2. 画面のちらつき防止(Application.Visibleは最終手段)
‘ 大規模処理時は画面更新そのものをフリーズさせるのが鉄則
Dim wasVisible As Boolean
wasVisible = app.Visible
‘ app.Visible = False ‘ ※完全に消すとデバッグが困難になるため、実務では以下を推奨
On Error GoTo Cleanup ‘ エラー時も確実に復旧させる
‘ — ここに重い処理を記述 —
ProcessMassiveDrawing doc
Cleanup:
‘ 3. 必ず設定を元に戻す(ここが抜けるとAutoCADが不安定になる)
app.SetVariable “ECOMODE”, oldEcomode
app.Visible = wasVisible
If Err.Number <> 0 Then
MsgBox “処理中にエラーが発生しました: ” & Err.Description, vbCritical
End If
End Sub
Private Sub ProcessMassiveDrawing(doc As AcadDocument)
Dim i As Long
‘ 大量作成時のボトルネックを回避するため、画面更新を待たない記述を心がける
For i = 1 To 1000
‘ 図形作成ロジック
doc.ModelSpace.AddCircle ThisDrawing.Utility.CreatePoint(i, i, 0), 10
Next i
‘ 処理完了後に強制再作図を行う
doc.Regen acActiveViewport
End Sub
—
3. チーフアーキテクトからの「極限の知見」
① `ECOMODE` を軽視するな
多くの記事が `Application.Visible = False` を推奨するが、それだけでは足りない。システム変数 `ECOMODE` を操作することで、AutoCAD内部の再作図エンジンを制御できる。これを `0` に設定することで、不要な中間描画を排し、処理速度を劇的に向上させることが可能だ。
② データベース連携時の落とし穴
ファイルや外部データベース(Excel/Access)からデータを読み込み、AutoCADへ描画する場合、「読み込み」と「描画」を完全に分離せよ。
ループの中で `Open #1` して `Print #1` するようなコードは論外だ。一度メモリ上の配列やコレクションに全データをロードし、AutoCADのオブジェクト生成を最短ルートで行う。これが、数百メガバイトの図面を扱う際の大前提となる。
③ なぜ「Visible = False」を安易に使わないのか
`Visible = False` を使うと、マクロが途中でクラッシュした際に、ユーザーから「AutoCADが消えた(プロセスだけ残る)」という報告が多発する。「プロセス制御」は最も保守コストが高い。
可能な限りシステム変数(`CMDECHO`, `OSMODE`, `ECOMODE`)の制御で解決し、UIの完全非表示は「どうしても避けられない重処理」のみに限定するのが、堅牢なシステム設計の極意だ。
—
最後に:エンジニアとしての矜持
自動化とは、ただ動くものを作ることではない。「ユーザーが処理の終わりを待っている間に、どれだけ違和感を感じさせないか」という配慮の積み重ねこそが、洗練されたツールの証だ。
今日から、泥臭い画面のちらつきと決別せよ。コードの細部まで「論理」を通したとき、あなたのツールは単なるスクリプトから、現場を支える「エンジニアリング」へと昇華される。
