AutoCAD VBAを掌握する:`InitializeUserInput`で実現する「神レベル」の入力制御
AutoCADの自動化ツールを開発する際、多くのエンジニアが陥る罠がある。それは「ユーザー入力の甘さ」だ。`ThisDrawing.Utility.GetReal` や `GetPoint` を単に呼び出すだけのコードは、プロの現場では「試作品」に過ぎない。
ユーザーは空エンターを押す。意図せずマイナス値を入力する。あるいは、ツールが期待する型とは異なる文字列を打ち込む。これらの「例外」を全てトラップし、かつCADの操作性を損なわないUIこそが、真に現場で愛される自動化ツールだ。
今回は、`InitializeUserInput` メソッドを極め、堅牢かつ柔軟な入力制御を実装するための極意を伝授する。
—
1. なぜ `InitializeUserInput` なのか?
AutoCADの入力メソッドは、デフォルトでは「空エンター(ユーザーによるキャンセル)」や「不正な数値」に対して非常に脆弱だ。エラーハンドリング(`On Error Resume Next`)で力技で回避するコードをよく見かけるが、あれは保守性を著しく下げる「悪手」である。
`InitializeUserInput` を使うべき理由は以下の3点だ。
- ユーザー体験(UX)の統一: AutoCAD標準のコマンド(LINEやCIRCLEなど)と同じ挙動を再現できる。
- 型安全性の担保: 入力ループを書かずに、CADの内部エンジンに入力チェックを委譲できる。
- デフォルト値の明示: 空エンターを「デフォルト値の選択」として処理できるため、ユーザーのキーストロークを削減できる。
—
2. ビットコード:制御の鍵
`InitializeUserInput` の第一引数である「ビットコード」は、入力の制約を足し合わせることで決定する。
| ビットコード | 意味 |
| :— | :— |
| 1 | 空エンター(入力なし)を許可 |
| 2 | 負の値を禁止 |
| 4 | ゼロを禁止 |
| 8 | 入力値がない場合の「点」の入力を禁止 |
例えば、「正の数値のみを許可し、空エンターでデフォルト値(例えば 10.0)を返す」 という仕様なら、`1 + 2 + 4 = 7` を指定することになる。
—
3. 実践:保守性の高いプロダクションコード
以下の関数は、実務でそのまま利用可能な「堅牢な入力取得」のパターンだ。エラー処理をラップし、再利用性を高めている。
‘ ——————————————————————
‘ @brief 数値入力を取得し、キャンセルまたは空エンターに対応する
‘ @param promptStr プロンプトに表示するメッセージ
‘ @param defaultValue 空エンター時に返されるデフォルト値
‘ @return ユーザー入力値またはデフォルト値
‘ ——————————————————————
Public Function GetSafeReal(ByVal promptStr As String, ByVal defaultValue As Double) As Double
Dim util As AcadUtility
Set util = ThisDrawing.Utility
‘ ビットコード定義: 1(空許可) + 2(負禁止) + 4(ゼロ禁止) = 7
Dim bitCode As Integer
bitCode = 7
On Error Resume Next ‘ ユーザーのESCキー中断をトラップするため
util.InitializeUserInput bitCode, “”
‘ プロンプトにデフォルト値を表示し、入力待機
Dim userInput As Double
userInput = util.GetReal(promptStr & ” <" & Format(defaultValue, "0.
“) & “>: “)
If Err.Number <> 0 Then
‘ エラー番号 -2147352567 はユーザーによるキャンセル
‘ 空エンターの場合は Err.Number が 0 になるか、または入力値が保持される挙動を利用
GetSafeReal = defaultValue
Else
GetSafeReal = userInput
End If
On Error GoTo 0
End Function
このコードのポイント
- UIの親切設計: `promptStr` にデフォルト値を付記することで、ユーザーは「今何を入力すべきか」と「何もしなければどうなるか」を即座に理解できる。
- エラーハンドリングの局所化: `On Error Resume Next` のスコープを最小限に絞り、予期せぬクラッシュを防いでいる。
—
4. 運用上の注意点:データベース連携との境界線
この関数を使って取得した値をデータベース(SQL ServerやAccess)に送信する場合、必ず「サニタイズ(無害化)」を意識せよ。
CADから取得したデータは型が保証されているように見えて、実はAutoCAD特有の浮動小数点誤差が含まれていることがある。データベースに書き込む直前には、`Round()` 関数等で桁数を揃えるか、`CDbl()` で厳密に型変換を行うのが鉄則だ。
- 境界値チェック: `GetReal` で取得した値が、設計許容範囲内であるかを必ず検証する。
- トランザクション: 複数の入力を組み合わせる場合は、`Document.StartUndoMark` を使用し、一連の処理を一つの「Undo(取り消し)」単位として登録することを忘れてはならない。
—
結論:コードは「対話」である
AutoCAD VBAで最も重要なことは、計算ロジックを書くことではない。「ユーザーが次に何をするか」を予測し、選択肢を提示することだ。
`InitializeUserInput` を使いこなすことは、ユーザーとの対話を制御することと同義である。この小さなビットコードの積み重ねが、あなたの開発するツールを「単なるスクリプト」から「現場に不可欠なアプリケーション」へと昇華させる。
次は、これを `GetEntity` や `GetPoint` と組み合わせ、より高度な選択フィルターを実装するステップへ進んでほしい。あなたのコードが、現場のストレスを一つでも減らすことを願っている。
