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

スポンサーリンク

AutoCAD VBAの極致:`GetInput`と`GetKeyword`による「コマンドラインの支配」

AutoCADのオートメーションにおいて、ユーザー入力をいかに「制御」するかは、単なる機能実装のレベルを超え、システム全体の堅牢性を決定づける。

若手のエンジニアは、とりあえず `InputBox` を使いたがる。だが、プロの現場でそれは「設計の敗北」と同義だ。マウスから手を離させず、かつコマンドラインで完結するフローこそが、設計者の思考速度を落とさない唯一の解である。

本稿では、`AcadUtility` の深淵に触れ、`InitializeUserInput` を駆使した、プロフェッショナルなユーザー入力インターフェースの実装法を解説する。

1. 入力の制約と自由度を制御する設計思想

AutoCADのコマンドライン入力は、そのままでは単なる文字列の羅列に過ぎない。しかし、`InitializeUserInput` メソッドを組み合わせることで、数値とキーワードを同時に、かつ排他的に受け付けることが可能になる。

ここで重要なのは、「例外処理」ではなく「先行制御」を行うことだ。ユーザーが誤った入力をする前にシステム側で入力を制限する。これが、保守コストを極限まで下げる秘訣である。

実装例:柔軟な入力ハンドリング

以下のコードは、数値入力を基本としつつ、特定のキーワード(Yes/No/Settings)を受け付ける堅牢な構造だ。

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

Dim retVal As Variant
Dim keywordList As String

‘ 1. キーワード設定 (大文字が省略形)
‘ 1: Null入力を許可しない, 128: キーワード入力を許可
util.InitializeUserInput 1 + 128, “Yes No Settings”

On Error Resume Next ‘ ユーザーのESCキー中断をハンドリング
retVal = util.GetInput(“数値を入力、または [Yes/No/Settings] : “)

If Err.Number <> 0 Then
‘ ESCやエラー発生時のクリーンアップ
Err.Clear
Exit Sub
End If
On Error GoTo 0

‘ 2. 条件分岐の真髄
If IsNumeric(retVal) Then
MsgBox “入力された数値: ” & retVal
Else
Select Case LCase(retVal)
Case “yes”, “” ‘ デフォルトを含む
MsgBox “Yesが選択されました。”
Case “no”
MsgBox “Noが選択されました。”
Case “settings”
‘ ここに設定フォームの呼び出しや別ルーチンを記述
Call ShowSettingsForm
End Select
End If

‘ 3. オブジェクトの明示的解放(VBAのメモリ管理の鉄則)
Set util = Nothing
End Sub

2. 現場で生き残るための「最適化」と「保守」

Windows APIとの連携:入力の可視化

VBA標準の機能だけでは、複雑なUIをコマンドラインに同期させるのは限界がある。場合によっては `User32.dll` の `GetCursorPos` を呼び出し、現在のカーソル位置に一時的なオーバーレイを表示させるといった「ハック」が必要になる。VBAはレガシーだが、Windowsのシステムコールを使えば、最新の.NET環境にも引けを取らないUXを構築可能だ。

オブジェクトのライフサイクル管理

AutoCAD VBAのメモリリークは、`AcadDocument` や `AcadUtility` の参照をグローバル変数に安易に保持し続けることで発生する。

  • 鉄則: サブルーチン内で使用するオブジェクトは、そのスコープ内で完結させ、最後に必ず `Nothing` を代入せよ。
  • ガベージコレクションの欠如: VBAには強力なGCが存在しない。特に長時間稼働するシステムでは、参照カウントを意識したコーディングが、AutoCADのクラッシュを防ぐ唯一の盾となる。

3. シニアエンジニアへの提言:なぜVBAなのか

「今さらVBAか?」という声が聞こえてきそうだ。だが、VBAには「AutoCADプロセス直下で動作する」という、外部プロセスからAPIを叩く手法では得られない特権がある。

究極の知見:
真のシステム管理者は、VBAでUIロジックを完結させ、重厚なデータ処理は `C# / .NET` のクラスライブラリに逃がす。VBAを単なる「橋渡し」として使い、コア機能を別DLLで管理するアーキテクチャこそが、10年後も生き残るシステムを生み出す。

最後に

コードを書くことは、ただ動くものを作ることではない。「後任のエンジニアが、読み解いた時に感嘆する構造」を作ることだ。
`InitializeUserInput` をただ使うのではなく、その裏にあるオートデスクの設計思想を読み解け。そうすれば、AutoCADは単なる製図ソフトから、あなた自身の武器へと昇華する。

健闘を祈る。

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