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

スポンサーリンク

AutoCAD VBAの深淵:`InitializeUserInput`を制御し、対話型UIを「兵器」へと昇華させる

AutoCADのオートメーションにおいて、ユーザー入力を漫然と`InputBox`で受けているようでは、素人同然だ。真のエンジニアは、AutoCADのネイティブコマンドが持つ「あの操作感」をAPIレベルで再現し、ユーザーの思考を止めないインターフェースを構築する。

今回は、`Utility.InitializeUserInput`を用いたビットコード制御を軸に、堅牢かつ洗練された対話型入力ロジックを解説する。

1. ビットコードの真理:入力を「統制」する

`InitializeUserInput`の引数に渡すビットコードは、単なるオプションではない。ユーザーの「気まぐれな入力」をシステム側でいかに捌くかという、設計思想そのものだ。

  • 1 (AllowNone): 空Enterを許容する。デフォルト値運用の要。
  • 2 (AllowZero): 0の入力を許容する。
  • 4 (AllowNegative): 負の値を許容する(距離や角度入力での誤検知を防ぐ)。
  • 32 (UseDashedLine): 破線入力の許容。

これらを組み合わせる際、ビット演算(`1 + 2 + 4`など)を用いるのは当然だが、重要なのは「なぜその制約を課すのか」という文脈だ。例えば、寸法値の入力で負値を許可すべきではないなら、ビット4を排すことで入力フェーズでのバリデーションをAPIレベルで完結させる。これが工数削減の第一歩だ。

2. 実装:デフォルト値を持つ堅牢な入力関数

実務において、入力関数を毎回記述するのは冗長であり、バグの温床となる。以下に、例外処理を包括し、オブジェクトのライフサイクルを考慮したラッパー関数を示す。

‘ @brief ユーザー入力を制御するラッパー関数
‘ @param Prompt 入力プロンプト
‘ @param DefaultValue デフォルト値(空Enter時)
‘ @param BitCode InitializeUserInput用のビットコード
‘ @return ユーザー入力値
Public Function GetInputSafe(ByVal Prompt As String, _
ByVal DefaultValue As Double, _
Optional ByVal BitCode As Integer = 1) As Double
Dim util As AcadUtility
Set util = ThisDrawing.Utility

‘ 入力制限の適用
util.InitializeUserInput BitCode, “”

On Error Resume Next ‘ ユーザーのEscキー入力をハンドリング
Dim inputVal As Variant
inputVal = util.GetReal(vbCrLf & Prompt & ” <" & DefaultValue & ">: “)

If Err.Number <> 0 Then
‘ Escキーが押された場合はデフォルト値を返すか、終了処理へ
GetInputSafe = DefaultValue
Err.Clear
Else
‘ 空Enterの場合は入力値が空になるため、デフォルト値を返す
If IsEmpty(inputVal) Or inputVal = 0 Then
GetInputSafe = DefaultValue
Else
GetInputSafe = inputVal
End If
End If

‘ 明示的な解放:VBAのメモリ管理は楽観視するな
Set util = Nothing
End Function

3. シニアエンジニアが意識すべき「メモリとパフォーマンス」

オブジェクトの明示的解放

VBAはCOMベースの言語であり、`AcadApplication`や`AcadDocument`を頻繁に参照する場合、参照カウントがインクリメントされ続ける。特にループ内で`ThisDrawing.Utility`を何度も生成してはならない。必ずローカル変数に格納し、処理の終端で`Nothing`を代入してメモリリークを防ぐこと。これは大規模プロジェクトにおける「暗黙の規律」である。

Windows APIによる「逃げ道」の確保

AutoCAD VBAの標準機能では、稀に非同期処理の制御が甘くなることがある。もし、入力中に外部DBとの通信や複雑な計算を並行させる必要があるなら、`GetInput`の直前で`Sleep`関数(`kernel32`)を呼び出し、CPU負荷を一時的に解放する設計も検討すべきだ。

If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As LongPtr)
Else
Private Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
End If

4. 最後に:UIは「対話」である

優れたシステムは、ユーザーに「入力させられている」と感じさせない。
`InitializeUserInput`のビットコードを使い分け、デフォルト値を提示し、誤入力を未然に遮断する。この小さな積み重ねが、AutoCADの操作性を向上させ、エンジニアリングにおける「ヒューマンエラー」を限りなくゼロに近づける。

レガシーなVBAであっても、書き方次第でモダンなアプリケーションと同等の体験を提供できる。コードは嘘をつかない。あなたの設計思想を、その一行に叩き込め。


追記:
次回の記事では、`AcadSelectionSet`を用いたフィルタリングの極致と、メモリを圧迫しない大量エンティティの高速処理について深掘りする予定だ。期待して待っていてほしい。

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