AutoCAD VBAの「SendCommand」を極める:CMDECHO制御による高速化と堅牢な実行環境の構築
AutoCADの自動化において、`SendCommand`メソッドは避けて通れない「禁断の果実」です。APIが用意されていない古いコマンドや、複雑な操作を再現する際に強力な武器になります。
しかし、多くの初心者はここで躓く。「コマンドを叩くたびに画面が激しく点滅し、処理が異常に遅い」と。
これはAutoCADがコマンドラインの出力を描画し、視覚的なフィードバックを逐一生成しているからです。今日は、システム変数`CMDECHO`を制御し、マクロの実行を「プロフェッショナルなレベル」まで高速化する技術を伝授します。
—
1. なぜ「CMDECHO」を制御するのか
`SendCommand`は、ユーザーがキーボードでコマンドを入力する行為をエミュレーションします。デフォルトでは、AutoCADは入力されたコマンドと結果をコマンドラインウィンドウに表示し、同時に画面の再描画を行います。
数回なら問題ありません。しかし、数百のブロックを配置したり、大量の線分を操作したりする際、この「描画のオーバーヘッド」が処理時間を指数関数的に増大させます。
解決策は明確です:実行前に`CMDECHO`を「0」にし、コマンドラインの冗長な出力を抑制すること。 これだけで、体感速度は劇的に向上します。
—
2. 【プロダクションコード】堅牢な実行プロトタイプ
単に`SetVariable`を呼ぶだけでは不十分です。エラーでマクロが中断された際に`CMDECHO`が「0」のまま残ると、ユーザーは操作状況を確認できず、混乱を招きます。
プロフェッショナルは「エラーハンドリングを伴う状態の復元」を徹底します。
Public Sub ExecuteHighSpeedCommand()
Dim doc As AcadDocument
Set doc = ThisDrawing
Dim originalCmdEcho As Integer
‘ 現在のCMDECHOを退避させる
originalCmdEcho = doc.GetVariable(“CMDECHO”)
On Error GoTo Cleanup ‘ 予期せぬエラー発生時に確実に元に戻す
‘ 高速化のため出力を抑制
doc.SetVariable “CMDECHO”, 0
‘ — ここからメイン処理 —
‘ 例:円を描画するコマンドを連続実行
doc.SendCommand “_CIRCLE 0,0 10 ”
doc.SendCommand “_CIRCLE 10,10 5 ”
‘ ————————-
Cleanup:
‘ 正常終了時もエラー時も確実に元の状態へ復元
doc.SetVariable “CMDECHO”, originalCmdEcho
If Err.Number <> 0 Then
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End If
End Sub
—
3. 現場で生き残るための「鉄則」
① 「On Error GoTo」は必須の儀式
上記のコードで示した通り、`Cleanup`ラベルへのジャンプは必須です。これを怠ると、マクロが途中でクラッシュした際、AutoCADが「沈黙した状態」になり、ユーザーがコマンド入力したのかどうかも分からなくなる「負のUX」を生み出します。
② データベース連携時の注意
もしCSVやExcelからデータを読み込んで`SendCommand`で図形化する場合、ファイルのオープン・クローズ処理は必ずこの「CMDECHO制御」の外側で行ってください。データの読み込み中にシステム変数をいじる必要はありません。あくまで「AutoCADの描画エンジンに負荷をかける操作」にのみ適用するのが鉄則です。
③ 「SendCommand」は最後の手段
AutoCAD VBAの熟練者は、可能な限り`AddCircle`や`AddLine`といった「ActiveX Automation API」を優先します。`SendCommand`は「どうしてもAPIで実装できない特殊なコマンド」に限定して使用すべきです。APIはメモリ上で直接オブジェクトを生成するため、`SendCommand`よりも遥かに高速で安定しています。
—
アーキテクトからの助言
「自動化ツールを作る」ということは、「自分の時間を守る」ことではなく、「現場の作業者の時間を守る」ことです。
今回紹介した`CMDECHO`の制御は、AutoCAD自動化における最初のステップに過ぎません。しかし、この「環境変数を汚さず、エラー時に原状復帰する」という思想こそが、何千行ものコードを保守し続けるための背骨になります。
ツールを作るときは、常に「もし今、このプログラムが強制終了したら、次に使う人は困らないか?」と自問してください。その視点を持つだけで、あなたの書くコードは一気にプロフェッショナルの領域へと昇華します。
さあ、コードを書いて、設計に魂を込めてください。
