AutoCAD VBAの深淵:`GetPoint`の「ベースポイント」がもたらす設計の質的転換
AutoCAD VBAにおいて、`Utility.GetPoint`は単なる座標取得メソッドではない。これは、ユーザーとの「対話」を制御するインターフェースだ。
多くの初学者は、`GetPoint`を「クリックした座標を得るだけのもの」と誤解している。しかし、プロフェッショナルは知っている。第2引数(BasePoint)こそが、ユーザー体験(UX)と計算精度を決定づける「鍵」であることを。
今回は、基準点からの相対距離を視覚化し、正確かつ堅牢にオブジェクトを配置するツール設計の極意を伝授する。
—
1. なぜ「ベースポイント」が必要なのか?
単純にユーザーのクリック位置を拾うだけなら、`GetPoint(Prompt:=”点を選択”)`で十分だ。しかし、これでは「どこから」「どの方向に」配置されるのかという空間的な文脈がユーザーに伝わらない。
`GetPoint`の第2引数に基準点を与えると、AutoCAD標準のラバーバンド線(動的な補助線)が、その点から現在マウスがある位置まで引かれる。これがあるだけで、ユーザーは「今、どこを起点にオフセットしようとしているのか」を直感的に理解できる。この「視覚的フィードバック」こそが、業務ツールの信頼性を支える根幹だ。
2. 堅牢な設計のためのプロダクションコード
以下のコードは、基準点から指定したオフセット距離分だけ、任意の角度に円を配置するツールだ。エラーハンドリングと、AutoCADのオブジェクトモデルに対する敬意(効率的なメモリ管理)を込めている。
Option Explicit
‘ 基準点からの相対配置ツール
Public Sub PlaceCircleWithOffset()
Dim acadUtil As AcadUtility
Set acadUtil = ThisDrawing.Utility
On Error GoTo ErrHandler
‘ 1. 基点の設定(例: 原点)
Dim basePoint As Variant
basePoint = ThisDrawing.Utility.CreatePoint(0, 0, 0)
‘ 2. ユーザーに対話型入力を促す
‘ 第2引数にbasePointを渡すことで、そこからのラバーバンドが引かれる
Dim targetPoint As Variant
targetPoint = acadUtil.GetPoint(basePoint, vbCrLf & “配置先をクリックしてください: “)
‘ 3. 座標計算とオブジェクト生成
‘ ここでは単純化のため、クリックした場所に円を配置
Dim circleObj As AcadCircle
Set circleObj = ThisDrawing.ModelSpace.AddCircle(targetPoint, 50.0)
‘ 4. 更新の反映
circleObj.Update
Exit Sub
ErrHandler:
‘ ユーザーのキャンセル操作(ESC)を適切にハンドリング
If Err.Number <> -2147352567 Then
MsgBox “予期せぬエラーが発生しました: ” & Err.Description
End If
End Sub
3. 実務で「破壊的なバグ」を避けるための3つの鉄則
A. 座標系(UCS/WCS)の罠を回避せよ
VBAが返す座標は常に「WCS(世界座標系)」である。もし図面がUCS(ユーザー座標系)で回転・移動されている場合、見た目通りの位置にオブジェクトが生成されない。
- 解決策: `Utility.TranslateCoordinates` を駆使し、常にWCSに変換してから計算を行うこと。これを怠ると、座標計算で必ず痛い目を見る。
B. エラーハンドリングは「逃げ場」を作る
`GetPoint`は、ユーザーがESCキーを押すと実行時エラーを吐いて止まる。これを放置するのは素人の仕事だ。`On Error GoTo`でしっかりとキャンセル操作を検知し、静かに終了させる設計にすること。
C. オブジェクトのメモリ解放を意識する
大規模な図面でループ処理を行う場合、`Set`したオブジェクトの参照を保持し続けるとAutoCADの動作が重くなる。不要になったオブジェクト変数は適宜 `Nothing` を代入し、メモリを解放する習慣をつけろ。
—
4. 次のステップ:データベース連携の落とし穴
このツールを起点として、配置した座標をCSVやDB(SQL Server/Access)に書き出すケースは多い。ここで重要なのは、「図面上のオブジェクトとデータベースの紐付け」だ。
- Handleプロパティを使え: `Entity.Handle` は図面内で一意なIDだ。これをDBのキーとして保存すれば、後から図面上のオブジェクトを特定・追跡できる。
- XDataを検討せよ: より高度な管理が必要なら、`SetXData` を使用してオブジェクト自体にメタデータを埋め込むことも検討すべきだ。
最後に
AutoCAD VBAは、古い言語かもしれない。だが、そのAPI仕様は今なお極めて強固で、本質的な拡張性を備えている。
「動けばいい」というコードを書く段階は卒業し、「誰が操作してもミスが起きないツール」を設計すること。それが、エンジニアとしての価値を一段引き上げる。まずはこの`GetPoint`の活用から、君の自動化ツールを「プロフェッショナルな道具」へと昇華させてほしい。
