AutoCAD VBAを掌握する極限の知見:GetKwordによる入力制約の完全制御
AutoCADのUI設計において、最も脆弱なのは「ユーザーの自由意志」だ。`GetPoint`や`GetEntity`に頼り切ったスクリプトは、ユーザーの誤操作という名のノイズによって容易に崩壊する。
真の自動化エンジニアは、操作フローを物理的に制限し、想定外の入力を発生させない「堅牢な境界線」を設計する。本稿では、`InitializeUserInput`と`GetKword`を駆使した、入力バリデーションの極致を伝授する。
—
1. ユーザー入力の「防波堤」を築く
AutoCADのVBAにおいて、ユーザーからの入力を受け取る際に最も重要なのは、「何を受け取るか」ではなく「何を拒否するか」である。
`ThisDrawing.Utility.InitializeUserInput`メソッドこそが、その防波堤だ。これを使用せずに`GetKword`を呼び出すのは、鍵のかかっていない玄関に座っているようなものだ。
実践コード:堅牢なコマンド設計
以下は、ユーザーの選択を「Yes」「No」「All」の3択に強制するプロフェッショナルなテンプレートだ。
Public Sub SecureInputExample()
Dim util As AcadUtility
Set util = ThisDrawing.Utility
‘ ユーザーの入力を制限するビットコード
‘ 1: 空入力(Enter)を禁止
‘ 128: 任意の入力(キーワード以外)を禁止
Dim bitCode As Integer
bitCode = 1 + 128
On Error Resume Next
‘ 入力制限の初期化
util.InitializeUserInput bitCode, “Yes No All”
‘ キーワード取得
Dim result As String
result = util.GetKword(vbCrLf & “実行しますか? [Yes/No/All]
‘ エラーハンドリング:ユーザーのESC中断を検知
If Err.Number <> 0 Then
MsgBox “操作がキャンセルされました。”, vbExclamation
GoTo Cleanup
End If
‘ デフォルト入力の補完(Enterが押された場合は空文字が返るため)
If result = “” Then result = “Yes”
MsgBox “選択された値: ” & result
Cleanup:
‘ オブジェクトの明示的解放
Set util = Nothing
End Sub
—
2. アーキテクトの視点:なぜ「ビットコード」と「キーワード文字列」を分離するのか
このコードには、単なるリファレンスには書かれない「現場の知見」が詰まっている。
1. ビットコードの戦略的利用:
`1`(空入力禁止)と`128`(キーワード外拒否)を組み合わせることで、ロジックの入り口で不正なデータを物理的に遮断できる。これにより、後続の`Select Case`文でのエラー処理コードを大幅に削減できる。
2. メモリのライフサイクル管理:
`AcadUtility`のようなドキュメント固有のオブジェクトであっても、大規模なマクロを構築する際は、ローカル変数として取得し、最後に`Set = Nothing`で明示的に解放する癖をつけよ。VBAのガベージコレクションは頼りにならない。レガシー環境でのメモリリークは、数時間稼働した後の不可解なクラッシュの原因となる。
—
3. レガシー環境とWindows APIへの越境
もし、より高度な制御が必要な場合――例えば、特定の入力を受け取った瞬間にダイアログを表示させたり、外部のデータベースと同期させたい場合は、`InitializeUserInput`だけでは限界が来る。
その時、我々は`Windows API`(`GetKeyState`や`GetAsyncKeyState`)を呼び出し、AutoCADのイベントループをバイパスして入力デバイスの状態を直接監視する手法をとる。
しかし、「可能な限りAutoCADのネイティブ機能(Utilityオブジェクト)に寄せる」ことが、保守性を担保する唯一の道だ。APIによるハックは最後の手段である。なぜなら、AutoCADのバージョンアップデートにおいて、APIの挙動は最も破壊されやすい場所だからだ。
—
4. 伝説のエンジニアからの提言
君たちが書くコードは、君たちが現場を去った後も生き残る。
- 入力の正規化: キーワード取得後の値を、必ず大文字小文字を統一して判定せよ。
- エラーの可視化: `Err.Number`を無視するな。ESCキーによる中断は、ユーザーによる正当な意思表示である。それをプログラムの「異常」として扱い、適切に後始末(Cleanup)を行うことこそが、洗練されたアーキテクチャの証だ。
AutoCAD VBAは、決して古びた言語ではない。オブジェクトモデルの深淵を理解したエンジニアにとっては、依然として最強の自動化ツールであり続ける。
次回の講義では、`AcadDocument`のイベントハンドラを駆使した、常駐型入力監視システムについて深掘りする。期待しておけ。
