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

スポンサーリンク

AutoCAD VBAを掌握する極限の知見
第1回:コマンドラインUIの極意 — `InitializeUserInput`で独自のキーワード選択を完全制御する

こんにちは。チーフアーキテクトの私だ。
日々の図面修正、何百回と繰り返す「文字の位置合わせ」「線のタイプ選択」……マウスで右クリックしてメニューを辿る、あるいはダイアログボックスをいちいち開く。そんな非効率なUIでエンジニアの貴重な時間を溶かしていないか?

AutoCAD VBAの真価は、単なる図形の一括生成ではない。「プロフェッショナルが使うネイティブコマンドと同等の、ストレスフリーな対話型インターフェース」を構築できる点にある。

今回は、実務で圧倒的なスピード差を生み出す『`AcadDocument.Utility.GetKword` と `InitializeUserInput` の組み合わせ』について、妥協のないプロダクションコードと共に解説する。

1. なぜ「単なる `InputBox`」では実務で使い物にならないのか?

VBA初心者が最初に陥る罠が、`InputBox` や標準の `MsgBox` によるユーザー入力を採用することだ。

これらはCADの作図画面からユーザーの視線を強制的に外し、マウスの焦点を狂わせる。さらに、オブジェクトのスナップや選択と並行して実行できない致命的な欠点がある。

AutoCADのプロフェッショナル環境において、入力はすべて「コマンドライン(CUI)」で完結させるべきだ。作図の手を止めず、視線を動かさず、キーボードの数打で処理を分岐させる。これを実現するのが `GetKword` メソッドである。

2. `InitializeUserInput` の鉄則と設計思想

`GetKword` を単体で呼び出すと、デフォルトでは「Yes/No」のような限定的なキーワードしか受け付けないか、予期せぬ文字列を受け入れてしまいエラーになる。

ここで登場するのが、`AcadUtility.InitializeUserInput` だ。
このメソッドは、次に実行する入力メソッド(`GetKword`, `GetPoint` など)に対して「何を受け入れるか」の制約ルールを事前にマフィアの契約のように厳格に定義する役割を持つ。

ビットフラグの設計(実務で使える主要な値)

`InitializeUserInput` の第一引数(`BitFlags`)には、バイナリの足し算(または論理和)で挙動を制御する。

  • 1:空エンター(何も入力せずにEnter)を許可する
  • 2:負の数の入力を許可する(今回は文字列なので除外)
  • 4:図面上のゼロ(0)入力を許可する
  • 32:キーワード入力において、大文字・小文字を区別する(基本は0=区別しない)

そして最も重要なのが第二引数(`Keywords`)だ。
ここにスペース区切りで独自キーワードを渡すことで、コマンドラインのプロンプトを完全に掌握できる。

3. 【プロダクションコード】実務仕様のキーワード選択ルーチン

百聞は一見に如かず。以下のコードを見てほしい。
これは、選択した文字オブジェクト(Text/MText)の位置合わせ(Left / Center / Right)を、コマンドラインからスマートに切り替える実務直結のプロシージャだ。

エラーハンドリング、ESCキーによる中断(キャンセル)の捕捉、そして大文字小文字の吸収まで完璧に実装された、そのまま現場に投入できるコードである。

Sub SetTextAlignmentPro()
Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing

‘ 1. オブジェクト選択の事前検証
Dim acadObj As AcadEntity
Dim basePt As Variant

On Error GoTo ErrorHandler

‘ ユーザーに文字オブジェクトを選択させる
acadDoc.Utility.GetEntity acadObj, basePt, vbCr & “位置を変更する文字を選択してください: ”

‘ 選択されたエンティティが Text または MText かチェック
If Not (TypeOf acadObj Is AcadText0rMText_Custom_Check(acadObj)) Then
‘ 簡易的な型判定(実務ではTypeOfで分岐)
If TypeOf acadObj Is AcadText Or TypeOf acadObj Is AcadMText Then
‘ OK
Else
MsgBox “選択されたオブジェクトは文字ではありません。”, vbExclamation, “処理中断”
Exit Sub
End If
End If

‘ 2. キーワード入力の初期化(ここが今回の核心)
‘ 第1引数: 1 = 空エンターを許可(デフォルト動作の設定に利用可)
‘ 第2引数: スペース区切りで独自キーワードを定義(略称をカッコで示すのがAutoCAD流)
Dim keywordList As String
keywordList = “Left Center Right”

acadDoc.Utility.InitializeUserInput 1, keywordList

‘ 3. キーワードの取得
‘ プロンプト内に選択肢を明示するのがプロのUIデザイン
Dim userChoice As String
userChoice = acadDoc.Utility.GetKword(vbCr & “文字揃えを選択 [左(L)/中央(C)/右(R)]

: “)

‘ 4. 空エンター(””)が返った場合のデフォルト処理
If userChoice = “” Then
userChoice = “Center” ‘ デフォルト値
End If

‘ 5. 選択結果に基づくビジネスロジックの実行
Select Case UCase(userChoice)
Case “LEFT”, “L”
Call ApplyAlignment(acadObj, acAlignmentLeft)
Case “CENTER”, “C”
Call ApplyAlignment(acadObj, acAlignmentCenter)
Case “RIGHT”, “R”
Call ApplyAlignment(acadObj, acAlignmentRight)
Case Else
‘ 通常ここには到達しないが安全策
Exit Sub
End Select

acadDoc.Utility.Prompt vbCr & “文字位置の変更が完了しました。” & vbCrLf
Exit Sub

ErrorHandler:
‘ ユーザーがESCキーで中断した場合のエラー番号(Err.Number = -2147352567 または 429など環境依存)をキャッチ
If Err.Number <> 0 Then
‘ エラー内容がユーザーキャンセル(操作の中断)である場合の処理
‘ AutoCAD VBAではErr.Descriptionにキャンセルが含まれることが多い
If InStr(Err.Description, “Cancel”) > 0 Or Err.Number = -2147467259 Then
acadDoc.Utility.Prompt vbCr & “処理がキャンセルされました。” & vbCrLf
Else
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical
End If
End If
End Sub

‘ 補助関数:TextとMTextのプロパティ構造の違いを吸収してアライメントを設定するヘルパー
Private Sub ApplyAlignment(ByRef ent As AcadEntity, alignmentType As Integer)
If TypeOf ent Is AcadText Then
Dim tObj As AcadText
Set tObj = ent
‘ MTextとTextでアライメント設定の仕様が異なるため分岐
If alignmentType = acAlignmentLeft Then
tObj.Alignment = acAlignmentLeft
ElseIf alignmentType = acAlignmentCenter Then
tObj.Alignment = acAlignmentCenter
ElseIf alignmentType = acAlignmentRight Then
tObj.Alignment = acAlignmentRight
End If
tObj.Update
ElseIf TypeOf ent Is AcadMText Then
Dim mtObj As AcadMText
Set mtObj = ent
mtObj.AttachmentPoint = alignmentType
mtObj.Update
End If
End Sub

4. コードレビュー:なぜこの設計が「プロ」なのか?

1. プロンプトの心理的誘導
`[左(L)/中央(C)/右(R)]

` という表記を見てほしい。これは本家AutoCADの標準コマンド(`LINE` や `CIRCLE` など)と完全に同一のUXだ。ユーザーは迷うことなく `C` と叩くか、そのまま `Enter` を押せばいい。
2. 大文字・小文字の完全吸収
`UCase(userChoice)` を用いることで、ユーザーが小文字で `left` と入力しようが、大文字で `CENTER` と入力しようが、確実にロジックへルーティングできる。
3. 堅牢なエラーハンドリング
CADのVBA開発で最も多いクレームが「ESCキーを押したらデバッグ画面が出てフリーズしたように見える」というものだ。`On Error GoTo` を適切に配置し、ユーザーの意図的な中断を静かにキャッチして終了する配慮が、ツール全体の品質を底上げする。

5. チーフからの実践アドバイス

実務において、この `InitializeUserInput` をマスターすると、ツールの可能性が無限に広がる。
例えば、外部データベース(AccessやSQL Server、あるいはExcelマスタ)から「レイヤ名の一覧」や「ブロック名の一覧」を動的に取得し、それをスペース区切りの文字列に結合して `InitializeUserInput` に流し込むことも可能だ。

「ハードコーディングされた選択肢」から脱却し、「動的でセキュアなコマンドラインUI」を構築すること。
それこそが、現場の設計者から「神ツール」と称賛される自動化スクリプトを生み出す唯一の道である。

次の現場では、泥臭いダイアログボックスを捨て、洗練されたコマンドライン対話を実装して見せたまえ。健闘を祈る。

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