【実務・中級編】【初心者向け】AcadApplication.Visibleの切り替えで「画面のちらつき」を抑え、マクロの体感速度を向上させる基本テクニック – AutoCAD VBA解析バイブル

スポンサーリンク

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の完全非表示は「どうしても避けられない重処理」のみに限定するのが、堅牢なシステム設計の極意だ。

最後に:エンジニアとしての矜持

自動化とは、ただ動くものを作ることではない。「ユーザーが処理の終わりを待っている間に、どれだけ違和感を感じさせないか」という配慮の積み重ねこそが、洗練されたツールの証だ。

今日から、泥臭い画面のちらつきと決別せよ。コードの細部まで「論理」を通したとき、あなたのツールは単なるスクリプトから、現場を支える「エンジニアリング」へと昇華される。

タイトルとURLをコピーしました