【入門編】【実務中級】AcadDocument.Regen(再描画)のタイミング最適化:大量オブジェクト作成時の描画負荷を最小限に抑える – AutoCAD VBA解析バイブル

スポンサーリンク

【AutoCAD VBAの真髄】なぜ君のコードは遅いのか?「Regenの呪縛」を解き放つ最適化術

こんにちは。現場で日々、膨大な図面データと格闘している皆さん。AutoCADの自動化、順調に進んでいますか?

「マクロを動かすと、画面がチラチラして終わるまで時間がかかる」
「数千個の円を描くだけなのに、なぜかPCが固まる」

もしそんな悩みを抱えているなら、おめでとうございます。それはあなたが「AutoCADの描画エンジン」という、この世で最も贅沢なリソースを無意識に酷使している証拠です。

今日は、AutoCAD VBAをマスターするための第一歩であり、最大の壁である「Regen(再描画)のコントロール」について、現場の知見を詰め込んで解説します。ここを理解すれば、あなたのマクロは数倍、場合によっては数十倍速くなります。

1. なぜ「Regen」は重いのか?

AutoCADのオブジェクト(線、円、文字など)は、作成されるたびに「データベースへの登録」と「画面へのレンダリング(描画)」という二つの工程を踏みます。

通常、`AddLine`や`AddCircle`メソッドを実行するたびに、AutoCADは律儀に「あ、新しい図形が増えた! 最新の状態を計算して、画面を更新しなきゃ!」と働き始めます。

  • 1個なら瞬きのような時間
  • 1,000個なら1,000回の再計算

これが「マクロが遅い」最大の原因です。「描画は、最後にまとめて一回やればいい」。これが、プロのエンジニアが持つべき最初の大原則です。

2. パフォーマンス最適化の鉄則コード

では、実際にどう書くのが正解か。以下のコードを見てください。

Sub OptimizeDrawingProcess()
‘ — 準備フェーズ —
‘ 画面更新を一時的に停止し、再描画の負荷を排除する
Dim oldSysVar As Variant
oldSysVar = ThisDrawing.GetVariable(“CMDECHO”)
ThisDrawing.SetVariable “CMDECHO”, 0 ‘ コマンドラインの出力を抑制

‘ Application.ScreenUpdating的な機能はAutoCADにはないため、
‘ 「再描画を抑える」設定を最大活用する

Dim i As Long
Dim pt(0 To 2) As Double

‘ — ループ処理(ここを最速にする) —
For i = 0 To 1000
‘ 連続して図形を作成
‘ この時点では画面上の表示を気にしない
ThisDrawing.ModelSpace.AddCircle pt, 10
Next i

‘ — 完了フェーズ —
‘ すべての処理が終わった後に、一度だけRegen(再描画)を行う
ThisDrawing.Regen acActiveViewport

‘ 設定を元に戻す
ThisDrawing.SetVariable “CMDECHO”, oldSysVar

MsgBox “処理が完了しました。画面更新を最小限に抑えています。”
End Sub

コードのポイント解説

1. `CMDECHO`の制御: コマンドラインへの出力を止めます。これだけで、内部的なオーバーヘッドが劇的に減ります。
2. ループ内のクリーンさ: ループの中には「作成処理」以外、何も入れないのが鉄則です。`Regen`や`Update`メソッドは、絶対にループの中に入れてはいけません。
3. `ThisDrawing.Regen acActiveViewport`: 全てを終えた後の「仕上げ」です。これで初めて、最新の図面状態が画面に反映されます。

3. 陥りやすい罠:`Update`メソッドとの違い

初心者の頃によくやってしまうのが、`Object.Update`をループ内で呼んでしまうこと。

  • `Update`: 特定のオブジェクトだけを再描画する。
  • `Regen`: データベース全体を再計算して描画する。

どちらも「頻繁に呼ぶ」こと自体がパフォーマンス低下の要因です。「基本は放置、どうしても必要な時だけ最後にまとめて」。この感覚を身につけてください。

4. プロの現場からのアドバイス

AutoCAD VBAにおいて、最も高価な資源は「ユーザーの待ち時間」「CPUの計算サイクル」です。

もし数万単位のオブジェクトを扱うような高度な処理を行う場合は、VBA単体ではなく、`ObjectARX`や`.NET API`への移行を検討するタイミングかもしれません。しかし、VBAであっても、今回紹介した「不要な再描画の抑制」を徹底するだけで、ほとんどの業務効率化は達成可能です。

まとめ:ここをクリアすれば大丈夫!

  • ループ内で`Regen`は絶対に呼ばない。
  • システム変数を操作して、余計な出力を止める。
  • 処理の最後に「一撃」で再描画する。

このリズムを意識するだけで、あなたの書くマクロは「動くだけのスクリプト」から「現場を支えるエンジン」へと進化します。

次は、これらを応用して「トランザクション管理」や「エラーハンドリング」を組み合わせるステップへ進みましょう。何か分からないことがあれば、いつでも聞いてくださいね。あなたのエンジニアライフを応援しています!

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