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は単なる製図ソフトから、あなた自身の武器へと昇華する。
健闘を祈る。
