【テクニカル・上級編】【初心者向け】AcadDocument.SetVariableで「CMDECHO」を制御:SendCommand実行時のコマンドライン出力を抑制し高速化 – AutoCAD VBA解析バイブル

スポンサーリンク

【AutoCAD VBA】SendCommandの「呪縛」を解く:CMDECHO制御による実行速度の最適化とアーキテクチャの品格

AutoCADのオートメーションにおいて、`SendCommand`は諸刃の剣だ。
手軽に既存のコマンドを叩ける一方で、無防備に使えば実行速度は低下し、コマンドラインは無意味なログで埋め尽くされる。

現場で「処理が遅い」と嘆くエンジニアのコードを覗くと、決まってこの`CMDECHO`の制御を怠っている。今回は、伝説的な現場で培った「SendCommandを外科手術のように制御し、描画負荷を最小化する」ための極意を伝授する。

なぜ `CMDECHO` を制御するのか

`SendCommand` を実行すると、AutoCADは内部的にキーボード入力と同じプロセスを経由する。その際、デフォルト設定の `CMDECHO = 1` では、実行されたコマンドの全引数やログがコマンドラインへ逐次出力される。

画面描画(再描画)はAutoCADにとって最大の負荷だ。このログ出力は、単なるテキスト表示ではなく、GUIスレッドへの割り込みとして機能する。数千のオブジェクトを処理するループ内でこれを行えば、パフォーマンスが劇的に劣化するのは必然である。

我々プロフェッショナルは、「不必要な描画更新とログ出力を封印する」ことで、ボトルネックを物理的に叩き潰す。

極限の最適化:安全な状態管理の実装

単に `SetVariable` を呼ぶだけでは素人だ。エラー終了時や予期せぬ中断時にシステム変数が書き換わったまま放置されることは、システムの信頼性を根底から揺るがす。

以下のコードは、例外処理(`On Error`)を組み込み、確実に元の状態へ復元するアーキテクチャである。

‘ ————————————————————————-
‘ 目的: CMDECHOを制御し、SendCommandのオーバーヘッドを最小化する
‘ 著者: Chief Architect
‘ ————————————————————————-
Public Sub OptimizedCommandExecution()
Dim acadApp As AcadApplication
Dim acadDoc As AcadDocument
Dim originalCmdEcho As Integer

Set acadDoc = Application.ActiveDocument

‘ 1. 現在の状態を退避(保守性の確保)
originalCmdEcho = acadDoc.GetVariable(“CMDECHO”)

On Error GoTo Cleanup

‘ 2. ログ出力を抑制(パフォーマンス向上)
acadDoc.SetVariable “CMDECHO”, 0

‘ 3. コマンド実行(ここでは例としてLINEコマンド)
‘ ※可能な限りActiveX API(AddLine等)を優先すべきだが、
‘ どうしてもSendCommandが必要な場合の定石
acadDoc.SendCommand “_LINE 0,0 100,100 ” & vbCr

Cleanup:
‘ 4. 必ず元の状態へ戻す(システム整合性の維持)
acadDoc.SetVariable “CMDECHO”, originalCmdEcho

‘ オブジェクトの明示的解放(メモリ管理の徹底)
Set acadDoc = Nothing

If Err.Number <> 0 Then
MsgBox “実行中に予期せぬエラーが発生しました: ” & Err.Description, vbCritical
End If
End Sub

シニアエンジニアが意識すべき「隠れた真実」

1. SendCommandへの依存を脱却せよ

`SendCommand` はあくまで「最後の手段」である。もしパフォーマンスが最重要課題であるならば、`ActiveX API`(`AddLine`, `AddCircle` 等)や、さらには ObjectARX / .NET API(`Database.Add`)への移行を検討すべきだ。ActiveX APIは、コマンドラインを介さない分、圧倒的に高速である。

2. Windows APIによる割り込みと同期

複雑な外部システム連携(Excel等からの遠隔操作)を行う場合、AutoCADの `SendCommand` は非同期的に動作することがある。もしコマンドの完了を待機させたい場合は、Windows APIの `Sleep` 関数や、AutoCADの `Document.Utility.Prompt` を用いて同期を取る工夫が必要になる場合がある。

3. オブジェクトのライフサイクル

VBAの `Set = Nothing` は単なる行儀の問題ではない。メモリリークを恐れる現場では、特に大規模な図面を扱う際、COM参照を適切に破棄しないことで「AutoCADの起動が重くなる」という現象を引き起こす。常に「スコープを最小にし、解放を確実に行う」という規律を遵守せよ。

結び

システム変数の操作は、AutoCADの心臓部に触れる行為だ。
`CMDECHO` を制御することは、単にログを消すことではない。それは、貴方のシステムが「AutoCADという巨大なエンジンを、いかにエレガントに、かつ強力に制御しているか」の証明に他ならない。

次に書くコードには、常に「後続のエンジニアがこの環境を汚さないための配慮」を埋め込むこと。それが、伝説的なアーキテクトへの第一歩だ。

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