【実務・中級編】【実務中級】AcadDocument.Utility.GetInputとビットコードの組み合わせ:空エンターや負の値を許容する柔軟な入力制御 – AutoCAD VBA解析バイブル

スポンサーリンク

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` と組み合わせ、より高度な選択フィルターを実装するステップへ進んでほしい。あなたのコードが、現場のストレスを一つでも減らすことを願っている。

タイトルとURLをコピーしました