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

スポンサーリンク

AutoCAD VBAを掌握する極限の知見

【実務中級】AcadDocumentのUtilityオブジェクト徹底活用!ユーザーとの対話型インターフェース(GetPoint, GetEntity)の実装

開発プロジェクトのリーダーである私から、現場でそのまま使える「本物のノウハウ」を授けよう。

世に溢れる退屈なVBA入門書は、「`MsgBox`で文字を出力しよう」「セルに値を代入しよう」といったお遊戯レベルの話ばかりだ。しかし、AutoCAD VBAの真価はそこにはない。CADのライフサイクル、そしてユーザーとリアルタイムに対話する「空間演算インターフェース」をいかに手中に収めるか。これが、業務自動化の成否を分ける境界線だ。

今回は、`AcadDocument` の心臓部とも言える `Utility` オブジェクトに焦点を当てる。`GetPoint` や `GetEntity` を使いこなし、プロフェッショナルなツールを作り上げるための極限の知見を伝授する。

1. なぜ `Utility` オブジェクトの理解がプロとアマを分けるのか?

業務効率化ツールを作るとき、座標や選択オブジェクトをハードコーディング(固定値)しているエンジニアを見かけるが、それは論外だ。実務の図面は生き物であり、日々変化する。

ユーザーに動的に指示を仰ぐ「対話型インターフェース」を実装するためには、`AcadDocument.Utility` オブジェクトを避けて通ることはできない。

しかし、ここで多くの開発者が挫折する。それが 「ユーザーの右クリック(キャンセル)」による実行時エラー だ。この壁をロジカルに突破できないようでは、プロダクション環境にコードを投入することは許されない。

2. 悪夢の Error -2147352567 を完全無力化するエラーハンドリング

まずは、最も重要な実務の知見から入ろう。
`Utility.GetPoint` や `Utility.GetEntity` の実行中に、ユーザーが `ESC` キーを押すか、右クリックして入力をキャンセルした場合、AutoCADは容赦なく以下のエラーを発生させる。

  • エラー番号: `Err.Number = -2147352567` (16進数表記: `&H80020009`)
  • 内容: 「ユーザーが入力を取り消しました」

これを対策せずに放置すると、マクロが突然強制終了し、現場のオペレーターは恐怖に震え上がる。アマチュアのコードはここで終わるが、プロは違う。明示的なトラップを仕掛け、優雅に処理を継続させなければならない。

堅牢なエラーハンドリングの基本構造

Public Sub SafeGetPointExample()
Dim acadUtility As AcadUtility
Set acadUtility = ThisDrawing.Utility

Dim pickedPoint As Variant

‘ エラー監視の有効化
On Error GoTo ErrorHandler

‘ ユーザーに基点入力を促す
pickedPoint = acadUtility.GetPoint(, vbCrLf & “基準点を指定してください: “)

‘ 通常処理
MsgBox “選択された座標: X=” & pickedPoint(0) & “, Y=” & pickedPoint(1)

Exit Sub

ErrorHandler:
‘ Err.Number -2147352567 (Automation Error) の捕捉
If Err.Number = -2147352567 Or Err.Number &H80020009 Then
MsgBox “ユーザーによって操作がキャンセルされました。”, vbInformation, “処理中断”
Else
‘ 想定外のシステムエラー
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical
End If

‘ エラーのクリア
Err.Clear
End Sub

3. 【実践】GetPoint と GetEntity を駆使した「実務レベルのオブジェクト移動ツール」

ここからは、実務で即戦力となるプロダクションコードを提示する。
「任意の図形を選択し、指定した基準点から目的の点へ正確に移動させる」という、自動化の現場で最も需要の高いタスクをVBAで実装しよう。

このコードには、以下のプロの技が詰め込まれている。
1. `GetEntity` によるオブジェクトと選択座標の同時取得
2. 2点間のベクトル計算(`Dx, Dy, Dz`)による正確な図形移動
3. 完璧なキャンセル処理

プロダクションコード:`MoveEntityInteractive.bas`

Option Explicit

Public Sub MoveEntityInteractive()
Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing

Dim acadUtil As AcadUtility
Set acadUtil = acadDoc.Utility

Dim selectedObj As AcadEntity
Dim basePoint As Variant
Dim targetPoint As Variant
Dim pickCoord As Variant

On Error GoTo ErrorHandler

‘ 1. 対象図形の選択
‘ 引数に変数を用意することで、クリックした正確な座標(pickCoord)も同時に取得できる
acadUtil.GetEntity selectedObj, pickCoord, vbCrLf & “移動するオブジェクトを選択してください: ”

‘ 2. 移動基準点の取得
basePoint = acadUtil.GetPoint(, vbCrLf & “移動の基準点を指定してください: “)

‘ 3. 移動先(目標点)の取得。ベースポイントからのラバーバンド(ゴムひき)を表示させる
targetPoint = acadUtil.GetPoint(basePoint, vbCrLf & “目的点を指定してください: “)

‘ 4. ベクトル計算と移動実行
Dim displacement(0 To 2) As Double
displacement(0) = targetPoint(0) – basePoint(0)
displacement(1) = targetPoint(1) – basePoint(1)
displacement(2) = targetPoint(2) – basePoint(2)

‘ AutoCADオブジェクトの標準メソッドである Move を実行
selectedObj.Move basePoint, targetPoint

‘ 画面の強制再描画(VBA処理後の描画崩れを防ぐためのお作法)
acadDoc.Regen acActiveViewport

MsgBox “オブジェクトの移動が正常に完了しました。”, vbInformation, “完了”
Exit Sub

ErrorHandler:
‘ ユーザーキャンセル(-2147352567)のスマートなハンドリング
If Err.Number = -2147352567 Then
‘ ユーザーの意図的なキャンセルなので沈黙(Silent Exit)させるか、控えめな通知にする
MsgBox “操作がキャンセルされました。”, vbExclamation, “中断”
Else
MsgBox “エラーが発生しました [” & Err.Number & “]: ” & Err.Description, vbCritical, “システムエラー”
End If
Err.Clear
End Sub

4. コードの深層解説:なぜこの書き方が「最強」なのか

1. `GetPoint` の第一引数(BasePoint)の魔力

上記のコードで、`targetPoint = acadUtil.GetPoint(basePoint, …)` と記述している点に注目してほしい。
第一引数に `basePoint` を渡すことで、AutoCADの画面上には、基準点から現在マウスカーソルまでの「ラバーバンド(破線のガイドライン)」がリアルタイムで描画される
これにより、オペレーターは視覚的にどれだけ移動するかを把握しながら正確な位置を指定できる。細部へのこだわりが、ツールの「使いやすさ(UX)」を劇的に向上させるのだ。

2. トランザクションとエラー後の安全地帯

VBAで図面オブジェクトを操作する際、メモリリークや図面の破損を防ぐためには、エラー発生時にオブジェクト変数を適切に解放し、`Err.Clear` でステータスをクリアすることが鉄則となる。今回示したコードは、このライフサイクル管理を完全に網羅している。

5. チーフアーキテクトからの総括

AutoCAD VBAは、レガシーな言語フールと侮られがちだ。しかし、今回解説した `AcadDocument.Utility` オブジェクトの挙動を深く理解し、適切なエラーハンドリングとユーザービリティを考慮した設計を行えば、市販の専用アドオンソフトをも凌駕する「現場のニーズに100%フィットしたキラーツール」を最短最速で構築できる。

コピペして終わりにするな。コードの行間に込められた「なぜそう書くのか」という必然性をあなたの血肉にし、明日の業務自動化を圧倒的なクオリティでリードしてほしい。

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