【実務・中級編】【実務中級】AcadDocument.Utility.GetInputとGetKwordを組み合わせた、条件分岐付きユーザー入力フォームの構築 – AutoCAD VBA解析バイブル

スポンサーリンク

【AutoCAD VBA】現場で死なない「Utility.InitializeUserInput」の極意:堅牢な入力インターフェースの構築

AutoCADの自動化ツールを作成していて、ユーザーに「数値」と「キーワード選択」を同時に求めたい場面はないだろうか?

多くの初心者は `InputBox` を使いたがるが、それはAutoCADの設計思想に対する冒涜だ。作図中にマウスから手を離させ、モーダルダイアログで作業を中断させるツールは、もはや「効率化ツール」ではなく「作業の阻害要因」である。

今回は、AutoCADのコマンドラインを最大限に活用し、かつ堅牢に制御する `Utility.InitializeUserInput` を用いた設計手法を伝授する。

1. なぜ「InitializeUserInput」を使うのか?

`AcadUtility.GetInput` や `GetKeyword` を単体で使うのは危険だ。入力値のバリデーションを毎回自作するのは非効率であり、コードが肥大化する。

`InitializeUserInput` は、「入力のルールを事前に定義する」ためのゲートキーパーだ。これを使うことで、以下の制御をAutoCADのネイティブ機能に丸投げできる。

  • キーワードの登録: ユーザーが入力候補以外の文字列を打った瞬間に弾く。
  • 空入力(Enter)の許可/禁止: ユーザーの操作ミスを未然に防ぐ。
  • 負の数値の除外: `GetReal` で負の値を許容したくない場合に、コードを書かずに制御できる。

2. 実務で「落ちない」ための設計パターン

以下のコードは、数値を入力させるか、特定のキーワード(設定変更など)を拾うためのテンプレートだ。エラーハンドリングと終了判定を組み込んでいるため、そのままプロダクション環境に投入できる。

実装コード例

Public Sub InputWithKeywords()
Dim util As AcadUtility
Set util = ThisDrawing.Utility

Dim userInput As Variant
Dim userValue As Double

On Error Resume Next ‘ ユーザーのESCキー中断をハンドリングする

‘ 1. 入力制御の初期化
‘ ビットコード: 1 (空入力を禁止), 128 (キーワードを有効化)
util.InitializeUserInput 129, “Yes No Settings”

‘ 2. 入力待ち(GetKeywordはキーワードも数値も受け取れる)
userInput = util.GetKeyword(vbCrLf & “数値を入力 または [Yes/No/Settings]: “)

‘ 3. エラーチェック(ESC押下時など)
If Err.Number <> 0 Then
Err.Clear
MsgBox “処理をキャンセルしました。”
Exit Sub
End If

‘ 4. 分岐処理
Select Case userInput
Case “Yes”
MsgBox “Yesが選択されました”
Case “No”
MsgBox “Noが選択されました”
Case “Settings”
‘ ここで設定用フォームを呼び出す等の連携
MsgBox “設定画面を開きます”
Case Else
‘ キーワード以外(数値)が入力された場合
If IsNumeric(userInput) Then
userValue = CDbl(userInput)
MsgBox “入力された数値: ” & userValue
End If
End Select

On Error GoTo 0
End Sub

3. アーキテクトの視点:開発現場で陥る罠

1. `On Error Resume Next` の乱用に注意

上記のコードではESCキーのトラップのために `Resume Next` を使用しているが、これを関数全体に適用してはいけない。AutoCADのオブジェクト操作(図形の作成など)を行う際は、必ず特定の行だけを保護し、すぐに `On Error GoTo 0` で戻すこと。例外を握りつぶすと、メモリリークや図面データベースの破損を検知できなくなる。

2. ファイルやデータベースとの連携タイミング

ユーザー入力を受け取った直後にDB接続を行うのはNGだ。

  • 悪い例: 入力 → その場でDB接続 → 更新 → 次の入力
  • 良い例: 入力 → データをメモリ(構造体やコレクション)に保持 → 最後に一括書き込み

AutoCADのプロセスは重い。外部リソースへのアクセス頻度は最小限に抑え、処理のオーバーヘッドを減らすのが「伝説のエンジニア」の嗜みである。

3. キーワードのローカライズ対策

もしツールを海外支社や異なる言語設定のAutoCADで使う可能性がある場合、キーワードの指定に注意が必要だ。`InitializeUserInput` の引数には、AutoCADの標準コマンド(`_Line` など)と同様に、ローカライズを意識した設計が求められる。今回は日本語環境を前提としているが、グローバル展開を意識するなら定数化して管理する癖をつけておこう。

結論

ユーザーインターフェースをコマンドラインに寄せることは、ユーザーを「AutoCADの達人」に引き上げることと同義だ。ダイアログボックスを無闇に増やすのではなく、`InitializeUserInput` を駆使して、「思考を止めない設計」を追求してほしい。

コードは単に動けばいいというものではない。保守性、堅牢性、そして何よりユーザーが快適に操作できるか。そこまで突き詰めた時、あなたのコードは初めて「資産」へと昇華される。

さあ、次のコミットでは、不要なダイアログを一つ消去することから始めよう。

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