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` を変えたり、円ではなく線分を引くように改造してみてください。その小さな一歩が、あなたの業務を劇的に変える大きな力になります。
もしコードが動かない、あるいはもっと複雑な座標計算に挑みたいという方は、いつでもまた相談してください。あなたのエンジニアとしての進化を、私は全力でサポートします。
さあ、次はどんな図形を配置してみますか?
