現場の「入力ストレス」を排除せよ:`InitializeUserInput`による入力制御の極意
AutoCADの自動化ツールを開発していて、ユーザーの「予期せぬ入力」に頭を抱えたことはないだろうか?
「負の数値を入れられた」「想定外の文字を入力されてエラー落ちした」「毎回入力のたびにダイアログを出すのは面倒だ」――。
こうした現場の悩みに対する唯一の解こそが、`AcadDocument.Utility.InitializeUserInput`だ。これは単なる入力制限メソッドではない。CADエンジンの深層に介入し、ユーザー入力をコマンドラインレベルで制御する「守護神」である。
今回は、堅牢かつスマートなツールを構築するための、実戦的な実装パターンを伝授する。
—
1. なぜ`InitializeUserInput`が必要なのか?
多くの初心者は、入力を受け取った後に`If`文でエラーチェックを行う。しかし、これは「ゴミを拾ってから捨てる」ようなものだ。
`InitializeUserInput`を使えば、そもそもゴミが混入する余地を断つことができる。
ビットコードの真価
このメソッドの第一引数である「ビットコード」は、複数の制限を組み合わせて指定できる。
- 1: ゼロ入力を禁止
- 2: 負の値を禁止
- 4: ゼロと負の値を禁止
- 8: 図面範囲外の入力を禁止
- 16: 指定したキーワードを強制する(これが本丸だ)
これらを組み合わせることで、ユーザーに「正しい入力を強いる」のではなく、「正しい入力しかできない環境」を提供できる。
—
2. 実践:キーワードと数値を両立させるプロダクションコード
単に数値を制限するだけでは面白くない。業務ツールでは、「数値」を入力させるだけでなく、特定のオプションを「キーワード(文字)」で選択させる必要がある。
以下のコードは、実務で頻出する「ユーザーに数値を入力させるが、特定の状況下では『自動』というキーワードを許可する」パターンだ。
‘ ———————————————————
‘ 堅牢な入力取得用関数: GetSmartValue
‘ @param PromptMessage 表示するプロンプト
‘ @return 取得した値(数値またはキーワード)
‘ ———————————————————
Public Function GetSmartValue(ByVal PromptMessage As String) As Variant
Dim util As AcadUtility
Set util = ThisDrawing.Utility
‘ 1. ビットコード設定
‘ 1(ゼロ禁止) + 2(負数禁止) + 16(キーワード許可) = 19
util.InitializeUserInput 19, “Auto Default”
On Error Resume Next ‘ キャンセルや不正入力をトラップ
Dim retVal As Variant
retVal = util.GetReal(vbCrLf & PromptMessage & ” [Auto/Default]
‘ 2. エラー判定(ユーザーがキーワードを入力した場合、GetRealはエラーを返す)
If Err.Number <> 0 Then
‘ キーワード入力を取得し直す
Err.Clear
retVal = util.GetKeyword(vbCrLf & “キーワードが入力されました: “)
End If
On Error GoTo 0
‘ 3. 結果を返す(値、またはキーワード文字列)
GetSmartValue = retVal
End Function
—
3. 実務で「死なない」ための設計思想
① エラーハンドリングの境界線
`GetReal`や`GetKeyword`は、ユーザーが`Esc`キーを押した瞬間に実行時エラーを吐く。これを無視するとツールは即座にクラッシュする。必ず`On Error Resume Next`を使い、`Err.Number`を確認するガード節を設けること。これが「堅牢なツール」の最低条件だ。
② ファイル・データベース連携への配慮
もしこの入力を元に外部のDBやCSVを参照する場合、`InitializeUserInput`を通したあとの変数は、必ず型変換(`CDbl`など)を明示的に行うこと。`Variant`型のままDBに投げ込むのは、将来のバグを育てる行為である。
③ UXを意識したプロンプト
プロンプト内に `[Auto/Default]` と表示させるのは、AutoCADの標準コマンドの作法だ。これに倣うことで、エンドユーザーは「自分は今、どのモードで入力しているのか」を直感的に理解できる。技術的な正しさだけでなく、操作の心地よさを追求せよ。
—
結論:コードは「対話」である
`InitializeUserInput`を使いこなすことは、AutoCADという巨大なプラットフォームと「対話」することと同義だ。
ユーザーにエラーメッセージを突きつけて突き放すのではなく、コマンドラインという限られた空間の中で、どう振る舞えばツールが円滑に動くのかを優しくガイドする。
その姿勢こそが、単なる「コードを書く人」から「システムを設計するエンジニア」への分水嶺となる。
さあ、あなたの次のツールにこのロジックを実装し、現場のエンジニアたちを驚かせてやってほしい。それが、世界最高峰の自動化への第一歩だ。
