AutoCAD VBAの流儀:Utility.GetKwordによる「多機能モード切替」の設計と実装
AutoCADのUIにおいて、ツールバーのボタンを一つ増やすことは、すなわちメンテナンスコストを一つ増やすことを意味する。実務の現場において、私たちは常に「多機能化」と「UIの簡潔化」という矛盾する要求の狭間に立たされる。
今回は、`AcadDocument.Utility.GetKword`を駆使し、一つのコマンドエントリポイントで「作図モード」と「集計モード」をシームレスに切り替える、プロフェッショナルなUI構築手法を伝授する。これは単なる分岐処理ではない。VBAのオブジェクトモデルを熟知した者だけが辿り着く、メモリ効率とUXを両立させるための設計思想である。
—
1. なぜ「GetKword」を選択するのか
AutoCAD VBAにおいてユーザー入力を待つ手法はいくつか存在するが、`Utility.GetKword`は最強の武器だ。その理由は以下の通りである。
- コマンドラインとの親和性: ユーザーがコマンド履歴を見ながら入力できるため、AutoCADの作図フローを阻害しない。
- オートコンプリート機能: ユーザーは最初の数文字を入力するだけで、あるいは矢印キーでキーワードを選択してEnterを押すだけで処理を分岐できる。
- オーバーヘッドの最小化: ダイアログを表示するコスト(メモリ消費・フォーカス遷移)を回避し、プロセスを軽量に保てる。
—
2. 極限のモード切替実装コード
以下に、実務環境で即戦力となる実装例を示す。単に分岐するだけでなく、オブジェクトの生存期間を意識し、メモリ管理を徹底した設計だ。
Option Explicit
‘ 伝説のアーキテクトが推奨する、クリーンなモード切替パターン
Public Sub MainEntryPoint()
Dim util As AcadUtility
Set util = ThisDrawing.Utility
‘ 1. キーワード定義
‘ 大文字部分がショートカットとして認識される
util.InitializeUserInput 1, “Draw Calculation”
‘ 2. 入力取得(エラーハンドリングを包含)
Dim retKword As String
On Error Resume Next
retKword = util.GetKword(vbCrLf & “モードを選択 [作図(Draw)/集計(Calculation)]: “)
If Err.Number <> 0 Then
‘ ESCキー等で中断された場合はクリーンに終了
Err.Clear
Exit Sub
End If
On Error GoTo 0
‘ 3. ロジックのデリゲーション(責務の分離)
Select Case retKword
Case “Draw”: RunDrawingMode
Case “Calculation”: RunCalculationMode
End Select
‘ 4. 明示的な解放(VBAのガベージコレクションを信用しない)
Set util = Nothing
End Sub
Private Sub RunDrawingMode()
‘ ここに作図処理を記述
‘ パフォーマンスを維持するため、処理中は画面更新を一時停止するのが鉄則
ThisDrawing.Application.BeginUndoMark
‘ … 処理本体 …
ThisDrawing.Application.EndUndoMark
End Sub
Private Sub RunCalculationMode()
‘ ここに集計処理を記述
‘ 大規模図面を扱う場合、オブジェクトの参照は最小限に留める
End Sub
—
3. チーフアーキテクトの深層知見:現場で生き残るための3つの鉄則
① オブジェクトの明示的解放(メモリ最適化)
VBAはCOMラッパーの上で動作している。`Set util = Nothing`を怠ると、AutoCADが終了するまでメモリ上に参照が残り続ける可能性がある。特に大規模図面で何度もコマンドを叩く場合、この小さな「塵」が「山」となり、メモリリークによる強制終了を引き起こす。
② UndoMarkの戦略的配置
`BeginUndoMark`と`EndUndoMark`は単なる「戻る」ボタンのためではない。処理全体を一つのアトミックなトランザクションとして定義することで、予期せぬエラー時に図面が中途半端な状態で破壊されるのを防ぐ。これはシステム管理者が守るべき「データの整合性」の防波堤だ。
③ Windows APIとの連携による「強制フォーカス」
もし、処理の途中で外部データベースやExcelと連携する場合、AutoCADがフォーカスを奪い返して操作を中断させることがある。そのようなレガシー環境特有の問題を解決するには、`SetForegroundWindow`等のWin32 APIを呼び出し、プロセス制御を明示的に行う必要がある。
If Win64 Then
Private Declare PtrSafe Function SetForegroundWindow Lib “user32” (ByVal hwnd As LongPtr) As Long
Else
Private Declare Function SetForegroundWindow Lib “user32” (ByVal hwnd As Long) As Long
End If
※ 64bit環境における`PtrSafe`の付与は、現代のAutoCADアドオン開発における最低限の作法である。
—
結びに代えて
AutoCAD VBAはレガシーと言われて久しい。しかし、その根底にあるオブジェクトモデルの強靭さは、現代の言語にも引けを取らない。
今回紹介した「キーワードによるモード切替」は、単なるUIの工夫ではない。「いかに少ない手数で、いかに堅牢な制御を行うか」という、エンジニアとしての矜持そのものである。
ツールを作るな。フローをデザインせよ。
真の自動化は、コードを書いた後、ユーザーがその存在すら忘れるほど自然に馴染んだ時に初めて完成する。
