AutoCAD VBAを「ただ動く」から「速く動く」へ。CMDECHO制御による高速化の極意
こんにちは。AutoCAD開発の世界へようこそ。
マクロの記録から一歩踏み出し、VBAで自作ツールを作り始めた皆さん。きっと、こんな経験があるはずです。
「SendCommandでコマンドを叩くと、画面がチラチラして遅いな……」
そう、その「チラつき」こそが、あなたのマクロを遅くしている最大の犯人です。今日は、AutoCAD VBAの心臓部である`AcadDocument`オブジェクトを操り、「CMDECHO」というシステム変数を使って実行速度を劇的に向上させる魔法を伝授します。
—
なぜ「SendCommand」は遅いのか?
AutoCADの`SendCommand`は、キーボードでコマンドを入力するのと同じ動作をシミュレートする「便利な裏口」です。しかし、この裏口を使うと、AutoCADは律儀にコマンドラインへ「今、何をしているか」を一行ずつ表示し、さらに画面の再描画を繰り返します。
人間が操作する分には親切な機能ですが、プログラムが秒間に何百回もコマンドを叩く際、この「報告」と「描画」はただの重荷でしかありません。
そこで登場するのが、システム変数 `CMDECHO` です。
- CMDECHO = 1 (デフォルト):コマンドラインに詳細なログを出力する。
- CMDECHO = 0 (抑制):コマンドラインへの出力を停止する。
これを制御することで、AutoCADの「お喋り」を止め、処理にだけ集中させることができるのです。
—
【実戦コード】安全で高速なSendCommandのテンプレート
まずは、このテンプレートをコピーして、自分のツールに組み込んでみてください。ここには、熟練エンジニアが必ず守る「エラー対策」の知恵が詰まっています。
Sub FastCommandExecution()
Dim acadDoc As AcadDocument
Dim originalCmdEcho As Integer
‘ 現在のアクティブなドキュメントを取得
Set acadDoc = ThisDrawing
‘ 1. 現在のCMDECHOの状態を保存する(重要!)
‘ 後で元に戻さないと、ユーザーがAutoCADを操作できなくなります
originalCmdEcho = acadDoc.GetVariable(“CMDECHO”)
On Error GoTo ErrorHandler ‘ エラー発生時に必ず変数を戻すための保険
‘ 2. CMDECHOを0にして、出力を抑制する
acadDoc.SetVariable “CMDECHO”, 0
‘ — ここに実行したいコマンドを書く —
‘ 例:円を描く(コマンドラインが汚れない!)
acadDoc.SendCommand “_CIRCLE 0,0,10 ”
‘ ————————————
Cleanup:
‘ 3. 最後に必ず元の設定に戻す
acadDoc.SetVariable “CMDECHO”, originalCmdEcho
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
Resume Cleanup
End Sub
—
コード解説:なぜこの書き方が「プロ」なのか?
1. `GetVariable` と `SetVariable` のセット運用
`SetVariable`で設定を変えるだけでは不十分です。必ず現在の状態を`GetVariable`で取得し、処理の最後で元に戻す(リストアする)のが鉄則です。これを忘れると、ユーザーの環境設定を破壊することになり、現場で「あのマクロを使うと設定が変わっちゃうんだよ」と不評を買うことになります。
2. `On Error GoTo` による安全性
もしコマンド実行中にエラーが発生し、プログラムが途中で止まったらどうなるでしょうか? `CMDECHO`が0のままになり、ユーザーはコマンドラインが見えなくて混乱します。`ErrorHandler`を挟むことで、どんな時でも確実に元の設定に戻る仕組みを作っておくのが、プロのエンジニアの流儀です。
3. `SendCommand` の書き方のコツ
`SendCommand`に渡す文字列の先頭には、念のため `_` (アンダースコア) を付けましょう。これはAutoCADの国際版コマンド名を使用するための指定です。これがないと、日本語環境と英語環境で動作が異なり、思わぬバグを生む原因になります。
—
ステップアップのために:さらに速くするヒント
`CMDECHO`の制御は、AutoCAD VBA高速化の「入り口」に過ぎません。さらに極めたい方は、以下のキーワードを調べてみてください。
- `osmode` の制御:スナップを一時的にオフにすると、描画負荷がさらに減ります。
- `filedia` の制御:ダイアログボックスが出ないようにすると、自動処理が止まりません。
- `AcadObject` への直接アクセス:`SendCommand`に頼らず、`Circle`や`Line`といったオブジェクトを直接生成する「ActiveX Automation」に移行すると、速度は桁違いに速くなります。
最後に:皆さんへ贈る言葉
AutoCAD VBAは、古い技術だと言われることもあります。ですが、現場で「今すぐこの図面を何とかしたい」という要求に応えるには、これほど強力な武器はありません。
まずはこの`CMDECHO`制御をマスターして、自分のツールが「サクサク」動く快感を味わってください。この心地よさこそが、皆さんがより高度な開発を目指す原動力になるはずです。
躓いたら、いつでも戻ってきてください。また一緒にコードを磨きましょう!
