【テクニカル・上級編】【実務中級】AcadDocument.Utility.GetKwordで「Yes/No/Cancel」以外の独自キーワード(例:Left/Right/Center)をコマンドラインで受け取る方法 – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAを掌握する極限の知見:`InitializeUserInput`でコマンドラインUIを極限まで加速させる

AutoCAD VBAの真価は、単なる図形の自動生成にあるのではない。
「いかにオペレーターのキーストロークとマウス移動を削ぎ落とし、CUI(コマンドラインインターフェース)の応答速度を極限まで高めるか」
ここにこそ、プロフェッショナルが構築する自動化システムの優劣の境界線がある。

多くの初学者は、ダイアログボックスやユーザーフォームに頼りがちだ。しかし、図面に向き合う実務の現場において、視線を画面の端へ移動させ、マウスでボタンをクリックする動作は、極めて大きなタイムロスとなる。

今回は、`AcadDocument.Utility`における`InitializeUserInput`メソッドを駆使し、コマンドライン上で「Yes/No」にとどまらない独自のキーワード群(例:`Left / Right / Center`)をミリ秒単位で処理する方法を解説する。
レガシーなAutoCAD環境を支配し、実務のスピードを圧倒的に加速させるための知見を授けよう。

1. コマンドライン入力のボトルネックと `InitializeUserInput` の本質

標準的な `GetKeyword` メソッドは、ユーザーからの文字列入力を受け付ける。しかし、何の準備もなしにこれを呼び出すと、ユーザーは何でも自由に入力できてしまい、不正値のハンドリングや大文字小文字の揺れ(`LEFT`, `left`, `Left`)の吸収といった不毛なコードを書かざるを得なくなる。

ここで投入すべきが、`InitializeUserInput` である。

このメソッドは、次に実行される `GetKeyword` や `GetReal` などの入力メソッドに対し、AutoCADのコマンドラインエンジンに「入力制限」と「キーワード辞書」を直接インジェクトする

ビットコードによる挙動の制御

`InitializeUserInput` の第一引数(`BitFlags`)は、入力挙動を制御するビットマスクである。実務上、以下のフラグの組み合わせを完全に把握しておく必要がある。

  • `1`: ゼロ(0)入力を禁止する
  • `2`: 負の数値を禁止する
  • `4`: 図面上の距離(マウスによる点指定)入力を禁止する
  • `8`: キーワード以外の入力を禁止する(これが最重要
  • `32`: 大文字小文字を区別する(通常は含めない=大文字小文字を同一視させる)

我々が独自キーワードを受け取る際、`BitFlags` には `1 + 8 = 9`(または必要に応じて `4` を加えた `13`)を指定する。これにより、ユーザーが余計な文字を入力した瞬間、AutoCADの標準機能としてエラーメッセージがコマンドラインに弾き返され、スクリプト側で無駄なバリデーションを書く必要が消滅する。

2. 実装コード:実務仕様の独自キーワード選択エンジン

以下に、実務の現場で即座に組み込める堅牢なVBAコードを示す。
オブジェクトのライフサイクルとメモリ管理、そして予期せぬエラー(ユーザーのESC中断など)への対策を完璧に施したプロダクションコードだ。

Option Explicit

‘ ==============================================================================
‘ 処理名: 独自キーワードによるアライメント選択ルーチン
‘ 概要 : InitializeUserInputを使用して、コマンドラインから効率的に
‘ Left / Right / Center のいずれかを選択させる。
‘ ==============================================================================
Public Sub SetTextAlignmentInteractive()
Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing.Application.ActiveDocument

‘ 厳密なエラーハンドリングのスコープを設定
On Error GoTo ErrorHandler

‘ AutoCADのエコーバックを一時的に制御する場合の準備
‘ (必要に応じてシステム変数を退避・変更するが、今回はUIに集中する)

Dim bitFlags As Integer
Dim keywordList As String
Dim userChoice As String

‘ 【ビットフラグの設計】
‘ 1: ゼロ入力を受け付けない
‘ 8: キーワードリストに含まれない文字列の入力を拒否する
‘ 合計: 9
bitFlags = 9

‘ 【キーワード辞書の定義】
‘ スペース区切りでキーワードを列挙する。
‘ 最初の文字が大文字になっているものが、デフォルト(またはショートカット)として扱われることが多いが、
‘ 各単語の先頭文字(L, R, C)が自動的にアクセラレーターキーとして機能する。
keywordList = “Left Right Center”

‘ 1. キーワードの初期化(必ず入力メソッドの直前に実行する)
acadDoc.Utility.InitializeUserInput bitFlags, keywordList

‘ 2. プロンプトの構築とキーワードの取得
‘ ユーザーは “Left/Right/Center” のいずれかを入力するか、頭文字(L/R/C)のみを入力できる。
userChoice = acadDoc.Utility.GetKeyword(vbCrLf & “テキストの配置を選択 [Left/Right/Center]

: “)

‘ 【極限の知見】
‘ ユーザーが何も入力せずに[Enter]を押した場合、GetKeywordは空文字列(“”)を返す。
‘ その場合のデフォルト値をここで補完する。
If userChoice = “” Then
userChoice = “Center”
End If

‘ 3. 取得したキーワードに応じた実務処理の分岐
Select Case UCase(userChoice)
Case “LEFT”
Call ExecuteLeftAlignmentLogic(acadDoc)

Case “RIGHT”
Call ExecuteRightAlignmentLogic(acadDoc)

Case “CENTER”
Call ExecuteCenterAlignmentLogic(acadDoc)

Case Else
‘ ビットフラグ 8 により理論上ここには到達しないが、堅牢性のために記述
Err.Raise vbObjectError + 1000, “SetTextAlignmentInteractive”, “予期せぬ入力エラーです。”
End Select

CleanUp:
‘ オブジェクト変数の明示的な解放
Set acadDoc = Nothing
Exit Sub

ErrorHandler:
‘ ユーザーによる [ESC] キー中断(エラー番号: -2147352567 / 0x80020009 など、環境依存のキャンセル検知)をハンドリング
If Err.Number = -2147352567 Or Err.Number <> 0 Then
‘ キャンセル時は静かに抜ける
MsgBox “処理がキャンセルされました。”, vbInformation, “AutoCAD VBA”
Else
MsgBox “エラー番号: ” & Err.Number & vbCrLf & “内容: ” & Err.Description, vbCritical
End If
Resume CleanUp
End Sub

‘ — 以下、各処理の実体(スタブ) —
Private Sub ExecuteLeftAlignmentLogic(ByRef doc As AcadDocument)
doc.Utility.Prompt vbCrLf & “-> 左寄せ処理を実行しました。” & vbCrLf
‘ 実務的なエンティティ走査やプロパティ変更処理をここに記述
End Sub

Private Sub ExecuteRightAlignmentLogic(ByRef doc As AcadDocument)
doc.Utility.Prompt vbCrLf & “-> 右寄せ処理を実行しました。” & vbCrLf
End Sub

Private Sub ExecuteCenterAlignmentLogic(ByRef doc As AcadDocument)
doc.Utility.Prompt vbCrLf & “-> 中央揃え処理を実行しました。” & vbCrLf
End Sub

3. チーフアーキテクトが指摘する「実装の罠」とメモリ管理

このコードを一瞥して、「ただの基本通りのコードではないか」と思った読者がいるならば、それはAutoCADの深いメモリ構造とCOM相互運用性の闇を知らない証拠だ。実務レベルでこのコードを運用するにあたり、以下の3点を心に刻むべきである。

A. COMオブジェクトの参照リーク防衛

`ThisDrawing.Application.ActiveDocument` や `AcadDocument.Utility` を呼び出す際、VBAの内部ではCOMコンポーネントへの参照(インターフェースポインタ)が生成される。
これをローカル変数に格納して処理を行った後、ルーチンの脱出時に `Set acadDoc = Nothing` と明示的に解放しなければ、AutoCADのプロセス内にゴミ参照が残り、長時間のバッチ処理や連続図面処理においてメモリリーク(最悪の場合はAutoCAD自体の強制終了)を引き起こす。
「VBAだから勝手にメモリが解放される」という甘えた考えは、シニアエンジニアの辞書には存在しない。

B. コマンドラインの「エコーバック」とパフォーマンス

`Utility.Prompt` や `GetKeyword` は、内部的にAutoCADのエディタセッションをブロックする。
大量の図面要素を一度に書き換えるようなスクリプトの中で、このようなインタラクティブな入力をループのたびに挟むのは最悪のアンチパターンだ。
ユーザーインタラクションは処理の最初(初期設定フェーズ)に一箇所に集約し、一度取得したパラメータをベースに、後続の図面操作(`ModelSpace` への一括アプローチなど)は一切画面描画を挟まずに一気に駆け抜けるのが、パフォーマンスを極限まで引き出す鉄則である。

4. 総括

`InitializeUserInput` を用いた独自キーワードの制御は、単なる「入力文字の制限」ではない。それは、AutoCADという巨大なCADエンジンのネイティブな入力インターフェースと、VBAのロジック層を完全に同期させるための極めて洗練されたアーキテクチャである。

マウスの移動を減らし、キーボードのストロークだけで完結するUI設計を取り入れたマクロは、現場のエンジニアから熱狂的な支持を受ける。
レガシーと侮るなかれ。AutoCAD VBAの底力を引き出すのは、いつの時代もこうした「細部へのこだわり」と「正確無比なオブジェクト制御」に他ならない。

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