【入門編】【実務中級】AcadDocument.Utility.GetPointの「ベースポイント」引数を活用し、基準点からの相対距離で図形を配置する対話型ツールの開発 – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAを掌握する極限の知見:GetPointの「ベースポイント」で操作性を極める

こんにちは。AutoCADの自動化の世界へようこそ。
「マクロの記録」ボタンを押すだけの日常から脱却したいあなたへ。今日は、AutoCAD VBAの真髄である「対話型インターフェース」の構築について、実務レベルの知見をお伝えします。

多くの初心者が躓くのが、「ユーザーからの入力をどう制御するか」です。単に座標を取るだけなら`GetPoint`を使えば簡単ですが、プロのツールは「ラバーバンド(ゴム紐)」の使い方が違います。

今日は、`GetPoint`の引数「ベースポイント」を駆使し、基準点から正確なオフセット距離で配置するツールを開発しましょう。

1. GetPointの「ベースポイント」引数とは何か?

通常の `Utility.GetPoint` は、ユーザーが画面をクリックした座標を返すだけです。しかし、第1引数に `BasePoint` を渡すと、AutoCADの画面上には、指定した点からカーソルに向かってゴム紐が伸びるような視覚的ガイドが出現します。

これを使うと、ユーザーは「どこからどこまで」距離があるのかを直感的に把握できます。これが「使いやすいツール」と「ストレスを生むツール」の境界線です。

2. 実装コード:基準点から離れた場所に図形を配置する

以下のコードは、ユーザーがクリックした「基準点」から、指定した方向に任意の距離(今回はオフセット)で円を配置するツールです。

Sub DrawCircleFromBasePoint()
Dim basePt As Variant
Dim targetPt As Variant
Dim circleObj As AcadCircle
Dim radius As Double: radius = 50.0 ‘円の半径
Dim offsetDist As Double: offsetDist = 100.0 ‘配置したい距離

On Error Resume Next ‘ユーザーがESCを押した時のエラー回避

‘ 1. 基準となるポイントを取得
basePt = ThisDrawing.Utility.GetPoint(, “基準点を選択してください: “)

‘ 2. ベースポイントを渡し、ラバーバンドを表示させる
‘ これにより、ユーザーは基準点からの距離や方向を視覚的に確認できる
targetPt = ThisDrawing.Utility.GetPoint(basePt, vbCrLf & “配置場所をクリックしてください: “)

If Err.Number <> 0 Then Exit Sub ‘キャンセル時は終了

‘ 3. 図形配置(ここでは単純な円)
‘ 実務ではここでベクトル計算を行い、正確な距離に調整することが多い
Set circleObj = ThisDrawing.ModelSpace.AddCircle(targetPt, radius)

circleObj.Update
MsgBox “オブジェクトを配置しました。”
End Sub

3. ここで差がつく!「プロの思考」のポイント

① 「On Error Resume Next」の正しい使いどころ

AutoCADの対話型入力では、ユーザーが途中で `ESC` キーを押すことが頻繁にあります。ここでプログラムがエラー終了すると、ユーザーは「壊れた」と感じます。「ユーザーのキャンセルは異常ではなく、操作の一部である」と捉え、エラーをトラップしてスマートに抜けるのが鉄則です。

② なぜVariant型を使うのか?

`GetPoint` が返す値は「3要素の配列(X, Y, Z)」です。VBAではこれを `Variant` 型で受け取るのが定石です。`Double` 型の配列として宣言しても良いですが、`Variant` はAutoCADのオブジェクトモデルとの親和性が高く、型変換のオーバーヘッドを気にする必要がない場面では最も安全です。

③ ラバーバンドの魔法

`GetPoint(basePt, …)` と書くことで、AutoCADは自動的に「ベースポイント」から「現在のカーソル位置」までのラインを描画してくれます。これを実装するだけで、ツールとしての格が一段上がります。

4. 陥りやすいエラー:座標系の罠

中級者へのステップアップとして覚えておいてほしいのが、「OCS(オブジェクト座標系)とWCS(ワールド座標系)」の概念です。

`GetPoint` で取得した値は、常に現在のユーザー座標系(UCS)に基づいています。もし、図面が傾いていたり、ビューが回転している場合、単純に `targetPt` をそのまま使うと意図しない位置に配置されることがあります。

  • 解決策: 複雑な計算が必要な場合は、`Utility.TranslateCoordinates` メソッドを使用して、常にWCS(世界座標系)に変換してから計算する癖をつけましょう。

最後に:自動化は「対話」である

AutoCADのプログラミングは、単にコードを書くことではありません。「AutoCADという生き物と、ユーザーの意思をどう橋渡しするか」というUXのデザインそのものです。

まずはこのコードをコピーして、`offsetDist` を変えたり、円ではなく線分を引くように改造してみてください。その小さな一歩が、あなたの業務を劇的に変える大きな力になります。

もしコードが動かない、あるいはもっと複雑な座標計算に挑みたいという方は、いつでもまた相談してください。あなたのエンジニアとしての進化を、私は全力でサポートします。

さあ、次はどんな図形を配置してみますか?

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