こんにちは、現場の最前線でCAD自動化の設計を司るチーフアーキテクトです。
マクロの記録を卒業し、自分のコードでAutoCADを操り始めたあなたへ。次に目指すべきは「ユーザーとの対話(インタラクション)」です。
単に数値を入力させるだけのツールは、味気ないだけでなく、入力ミスの原因にもなります。プロが作るツールには、必ずと言っていいほど「視覚的なフィードバック」が組み込まれています。
今回は、AutoCAD VBAの心臓部の一つである`Utility`オブジェクトを使い、「ベースポイント(基準点)を指定して、ラバーバンド(伸縮する線)を表示させながら距離を取得する」という、実務で一段上の操作感を実現するテクニックを伝授します。
ここをマスターすれば、あなたの作るマクロは「ただのプログラム」から「洗練されたツール」へと進化しますよ。
—
1. なぜ「ベースポイント」が重要なのか?
AutoCADで線を描くとき、1点目をクリックした後にマウスを動かすと、1点目からカーソルまで「白い線」が伸びますよね。これがラバーバンドです。
`GetDistance`メソッドは、単独で使うと単に2点間の距離を測るだけですが、引数に「ベースポイント」を渡してあげることで、このラバーバンドを表示させることができます。
- ベースポイントなし: 画面上のどこか2点をクリック。操作中、何が起きているか視覚的に分かりにくい。
- ベースポイントあり: 基準点から線が伸びる。直感的に「あ、今ここからの距離を測っているんだな」とユーザーが確信できる。
この「確信」こそが、業務ツールの誤操作を防ぐ最大の鍵なのです。
—
2. GetDistance メソッドの構造を知る
まずは、武器となるメソッドの構文を整理しましょう。
RetVal = AcadDocument.Utility.GetDistance([Point], [Prompt])
1. Point (省略可能): 距離計測の起点となる座標(3要素のDouble型配列)。これを指定するとラバーバンドが出ます。
2. Prompt (省略可能): コマンドラインに表示するメッセージ。
ここで初心者が最も躓くのが、「座標データの型」です。AutoCAD VBAは、座標を「要素3つのDouble型配列」として扱いますが、メソッドに渡すときは`Variant`型に包んであげる必要があります。
—
3. 実践:ラバーバンド付き距離入力コード
では、実際に動くコードを見てみましょう。このコードは、「まず基準点をクリックさせ、そこからラバーバンドを表示して距離を取得する」という流れです。
Sub InteractiveGetDistance()
Dim basePt As Variant
Dim dist As Double
‘ 1. 基準点(ベースポイント)を取得する
‘ GetPointはユーザーに座標をクリックさせるメソッドです
On Error Resume Next ‘ ユーザーがESCを押した時のためのエラーハンドリング
basePt = ThisDrawing.Utility.GetPoint(, “基準点を選択してください: “)
If Err.Number <> 0 Then
MsgBox “操作がキャンセルされました。”
Exit Sub
End If
‘ 2. ベースポイントを指定して距離を取得する
‘ ここで第1引数に basePt を渡すのがポイント!
dist = ThisDrawing.Utility.GetDistance(basePt, “距離を指定、または2点目をクリック: “)
If Err.Number <> 0 Then
MsgBox “操作がキャンセルされました。”
Exit Sub
End If
On Error GoTo 0 ‘ エラーハンドリングを通常に戻す
‘ 3. 結果を表示
MsgBox “取得した距離は ” & Format(dist, “0.00”) & ” mm です。”, vbInformation, “完了”
End Sub
コードの解説
- `ThisDrawing.Utility`: AutoCADとユーザーの橋渡しをするオブジェクトです。入力関係(GetXXX)はすべてここに含まれます。
- `On Error Resume Next`: これが非常に重要です。ユーザーが操作の途中で「やっぱりやめた」と ESCキー を押した場合、VBAはエラーを吐いて止まってしまいます。それを防ぎ、スマートに終了させるのがプロの作法です。
- `basePt`: `GetPoint`で得られた座標が格納されます。これを次の`GetDistance`に引き継ぐことで、ラバーバンドが実現します。
—
4. 陥りやすい罠:座標の「型」と「エラー」
罠①:配列の宣言ミス
VBAに慣れてくると `Dim basePt(0 To 2) As Double` と書きたくなりますが、`GetPoint` の戻り値を受け取る変数は `Variant` で宣言してください。AutoCAD側が配列をパッケージ化して返してくるからです。
罠②:ESCキーでの強制終了
対話型ツールにおいて、ユーザーは常に「中断する権利」を持っています。
もし `On Error Resume Next` を書かずに `GetDistance` を実行し、ユーザーがESCを押すと、「実行時エラー」が表示されてマクロがブチ切れてしまいます。これはツールとして非常に格好悪いものです。必ずエラーハンドリングをセットで覚えましょう。
—
5. ステップアップ:取得した距離をどう使うか?
距離が取れたら、次はその距離を使って何かを描画したくなりますよね。
例えば、「基準点から、入力した距離だけ離れた場所に円を描く」といった応用が考えられます。
‘ 応用例:取得した距離を半径にして円を描く
Dim circleObj As AcadCircle
Set circleObj = ThisDrawing.ModelSpace.AddCircle(basePt, dist)
circleObj.Update
このように、`GetDistance` で得た `dist` をそのまま他のメソッドの引数に流用することで、流れるような自動化処理が構築できます。
—
終わりに
`AcadDocument.Utility.GetDistance` を使いこなし、ラバーバンドを表示させる。
これは、あなたのプログラムに「AutoCADらしさ」という命を吹き込む作業です。
ユーザーが画面上で直感的に操作でき、期待通りの動きをする。この積み重ねが、現場で信頼されるツールを生み出します。まずは今回のコードをコピペして、実際にAutoCAD上で線が伸びる心地よさを体感してみてください。
ここをクリアすれば、AutoCAD VBAの基本はバッチリですよ。次は、取得した値を使って図形を正確に配置する「ベクトル演算」の世界でお会いしましょう。
応援しています!
