【入門編】【実務中級】AcadDocumentのUtilityオブジェクト徹底活用!ユーザーとの対話型インターフェース(GetPoint, GetEntity)の実装 – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは!AutoCADの自動化の世界へようこそ。
マクロの記録ボタンを押すだけのステージはもう卒業しましたね。ここから先は、AutoCADの心臓部である「オブジェクトモデル」と対話し、図面とユーザーをダイナミックに繋ぐ本格的なプログラミングの世界です。

今回は、実務の現場で最も使用頻度が高く、かつエンジニアの腕の見せ所でもある`AcadDocument.Utility`オブジェクトを取り上げます。

「画面上でユーザーに点をクリックさせたい」
「特定の図形を選ばせて、そのプロパティをごっそり書き換えたい」

そんなインタラクティブな処理をVBAで実現する方法を、実務直結の知見を交えて徹底解説していきましょう。ここをクリアすれば、あなたの作るマクロは「ただの自動化ツール」から「プロ仕様のアシスタント」へと劇的に進化します。

1. そもそも `Utility` オブジェクトとは何か?

AutoCAD VBAにおいて、`ThisDrawing`(現在の図面=`AcadDocument`)はすべての中心です。その中にぶら下がる `Utility` オブジェクトは、いわば「AutoCADとユーザーを繋ぐ通訳兼コンシェルジュ」です。

図面空間という広大な宇宙の中で、ユーザーに「ここをクリックして!」と指示を出したり、キーボードから数値や文字列を入力させたりする機能(メソッド)は、すべてこの `Utility` が握っています。

よく使う代表的なメソッド

  • `GetPoint`: 画面上の任意の「点(座標)」をユーザーにクリックさせる。
  • `GetEntity`: 画面上の特定の「図形(エンティティ)」をユーザーに選択させる。
  • `GetReal` / `GetString`: 数値や文字をコマンドラインから入力させる。

今回はこの中でも、実務で圧倒的に登場回数が多い `GetPoint``GetEntity` の極意を伝授します。

2. 座標を奪取せよ! `GetPoint` の実務的な使い方

まずは、画面上の任意の場所をクリックしてもらい、その3次元座標(X, Y, Z)を取得するコードを見てみましょう。

基本コード例:クリックした座標に円を描く

Sub DrawCircleAtUserPoint()
Dim acadUtil As AcadUtility
Set acadUtil = ThisDrawing.Utility

On Error GoTo ErrorHandler

‘ 1. ユーザーにプロンプトを表示し、点を取得する
Dim pickedPoint As Variant
pickedPoint = acadUtil.GetPoint(, vbCrLf & “中心点をクリックしてください: “)

‘ 2. 取得した座標を使って円を描画
Dim centerPoint(0 To 2) As Double
centerPoint(0) = pickedPoint(0): centerPoint(1) = pickedPoint(1): centerPoint(2) = pickedPoint(2)

Dim radius As Double
radius = 50.0 ‘ 半径50の円

Dim circObj As AcadCircle
Set circObj = ThisDrawing.ModelSpace.AddCircle(centerPoint, radius)

MsgBox “円を描画しました! X=” & Format(centerPoint(0), “0.00”) & ” Y=” & Format(centerPoint(1), “0.00”), vbInformation
Exit Sub

ErrorHandler:
‘ エラー処理は後ほど詳しく解説します!
If Err.Number <> -2147352567 Then
MsgBox “予期せぬエラー: ” & Err.Description, vbCritical
Else
MsgBox “ユーザーによって操作がキャンセルされました。”, vbExclamation
End If
End Sub

ここがポイント!

`GetPoint` の戻り値は、Variant型(配列)であることに注意してください。AutoCADの座標は常に `X, Y, Z` の3要素を持つため、`Variant` で受け取ってから各軸のインデックス(0, 1, 2)にアクセスします。
また、第1引数に「基準点(ベースポイント)」を指定すると、線分を描くときの「ゴムバンド(ラバーバンドライン)」の起点として利用できます。今回はシンプルに省略しています。

3. 図面オブジェクトを指名手配! `GetEntity` の使い方

次に、図面上ですでに描かれている線や文字、円などの「図形そのもの」をユーザーにクリックさせて取得する `GetEntity` です。

基本コード例:選択した図形の画層(レイヤー)名を取得する

Sub GetSelectedEntityInfo()
Dim acadUtil As AcadUtility
Set acadUtil = ThisDrawing.Utility

On Error GoTo ErrorHandler

Dim selectedObj As AcadEntity
Dim pickedPoint As Variant

‘ ユーザーにオブジェクトを選択させる(オブジェクト変数と、クリックした座標が返る)
acadUtil.GetEntity selectedObj, pickedPoint, vbCrLf & “情報を取得したいオブジェクトを選択してください: ”

‘ 選択されたオブジェクトの情報を表示
MsgBox “選択されたオブジェクトの種類: ” & selectedObj.ObjectName & vbCrLf & _
“所属レイヤー: ” & selectedObj.Layer, vbInformation

Exit Sub

ErrorHandler:
If Err.Number <> -2147352567 Then
MsgBox “予期せぬエラー: ” & Err.Description, vbCritical
Else
MsgBox “選択がキャンセルされました。”, vbExclamation
End If
End Sub

ここがポイント!

`GetEntity` の引数は少し特殊です。
1つ目の引数には「選択されたオブジェクトを受け取る変数(`AcadEntity` 等)」を、2つ目の引数には「実際にクリックされた位置の座標(Variant)」を渡します。これらはメソッドを実行した後にAutoCAD側が自動的に値を入れてくれる(参照渡し)仕組みになっています。

4. 【最重要】「Escキーでマクロがクラッシュする現象」の完全回避策

さて、ここからが本記事のメインディッシュです。実務で `Utility` メソッドを使うとき、絶対に避けて通れない最大の罠があります。

それは、ユーザーが操作中に「Escキー」を押してキャンセルしたときのエラーです。

先ほどのコードに `On Error GoTo ErrorHandler` を仕込んでいた理由がこれです。もしエラー処理を書いていないと、ユーザーがEscキーを押した瞬間にVBAは実行時エラーを起こし、マクロが無残に強制終了してしまいます。

悪名高きエラー番号:`-2147352567`

ユーザーが対話型入力を途中でキャンセルしたとき、AutoCAD VBAは以下のエラーを発生させます。

  • Err.Number: `-2147352567` (16進数表現では `&H80020009`、Automation Error)
  • 意味: 「ユーザーがプロンプトをキャンセルしました(AcadErrorStatus.eUserCancelled 等に起因)」

これは「プログラムのバグ」ではなく「正常なユーザーのキャンセル操作」です。したがって、このエラー番号が飛んできたときは、赤字のエラーメッセージを出して慌てるのではなく、「単に処理を静かに抜ける(あるいはループを抜ける)」ようにハンドリングするのがプロの作法です。

黄金のエラーハンドリング構文

実務の現場では、次のように「キャンセルされた場合」と「本当のエラー」を明確に切り分けます。

On Error GoTo ErrorHandler

‘ — 何らかの Utility メソッド —
Dim myPoint As Variant
myPoint = ThisDrawing.Utility.GetPoint(, “点を指定: “)

Exit Sub ‘ エラーがなければここで終了

ErrorHandler:
‘ ユーザーによるキャンセル(Escキー)を検知
If Err.Number = -2147352567 Then
‘ ここには怒りのメッセージを出さない!優しくスルーまたは終了する
Exit Sub
Else
‘ 本当の予期せぬエラー
MsgBox “予期せぬエラーが発生しました (Error ” & Err.Number & “): ” & Err.Description, vbCritical
Exit Sub
End If

このお作法をテンプレートとして頭に叩き込んでおくだけで、あなたの書くVBAマクロの品質はプロのエンジニア水準へと跳ね上がります。

5. まとめ

今回は、`AcadDocument.Utility` オブジェクトを用いたユーザーとの対話型インターフェースの実装方法と、実務で必須となるキャンセルエラー(`-2147352567`)の回避策を解説しました。

  • `Utility` は図面とユーザーを繋ぐコンシェルジュである。
  • 座標が欲しいときは `GetPoint`、図形が欲しいときは `GetEntity` を使う。
  • Escキーによるキャンセルはエラー番号 `-2147352567` でキャッチし、優しくいなす。

ここをクリアすれば、定型処理だけでなく、ユーザーの操作に柔軟に寄り添うインタラクティブなCADツールを自在に構築できるようになります。

「ここをこう応用すれば、自分の会社のあの面倒な業務も自動化できるかも……!」
そんなワクワクを感じてもらえたなら、エンジニアとしてこれ以上の喜びはありません。

それでは、次回の実践的な自動化テクニックでお会いしましょう。お疲れ様でした!

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