【入門編】【実務中級】AcadDocument.Utility.GetPointで「ラバーバンド」を表示させ、視覚的に分かりやすい図形配置インターフェースを作る – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは。AutoCADの自動化という深淵な世界へようこそ。

「マクロの記録」ボタンを押すだけの世界から、自分の手でAutoCADを意のままに操る世界へ。その扉を開こうとしているあなたに、今日は「ただの点取り虫」から「洗練されたUIエンジニア」へと脱皮するための極意を伝授します。

AutoCADのプロフェッショナルなアドオン開発において、「ユーザーに直感的な操作感を提供する」ことは、機能そのものと同じくらい重要です。特に、図形を配置する際の「ラバーバンド(始点からカーソルまで追従する線)」は、操作の質を劇的に高めます。

さあ、コードの深層へ潜っていきましょう。

1. なぜ「GetPoint」でラバーバンドが必要なのか?

通常、`Utility.GetPoint` メソッドを使うと、ユーザーに点を指定させることはできますが、ただの十字カーソルが表示されるだけです。これでは、「どこを基準に配置しようとしているのか」が視覚的に伝わりません。

`GetPoint` には、実は「基点(BasePoint)」を指定する引数が用意されています。これを与えるだけで、AutoCAD標準のコマンド(LINEやMOVEなど)と同じように、始点からカーソルまで線が伸びる「ラバーバンド」が自動的に描画されるのです。

2. 実装コード:インタラクティブな配置インターフェース

まずは、以下のコードを標準モジュールに貼り付けてみてください。

Sub CreateLineWithRubberBand()
Dim ptStart As Variant
Dim ptEnd As Variant
Dim objLine As AcadLine

‘ 1. 始点の取得(まだラバーバンドは出ない)
On Error Resume Next ‘ キャンセル時のエラー回避
ptStart = ThisDrawing.Utility.GetPoint(, “始点を指定してください: “)

If Err.Number <> 0 Then Exit Sub ‘ キャンセルされたら終了

‘ 2. 終点の取得(ここで「ptStart」を渡すのが最大のポイント!)
‘ 引数にptStartを渡すことで、AutoCADが自動的にラバーバンドを描画してくれる
ptEnd = ThisDrawing.Utility.GetPoint(ptStart, vbCrLf & “終点を指定してください: “)

If Err.Number <> 0 Then Exit Sub

‘ 3. 図形の生成
Set objLine = ThisDrawing.ModelSpace.AddLine(ptStart, ptEnd)
objLine.Update

MsgBox “図形を配置しました。”
End Sub

コードの解説:ここが「プロ」のポイント

  • `GetPoint(ptStart, …)`: この第一引数に始点を与えるだけで、AutoCADのレンダリングエンジンが自動的にラバーバンドを描画します。自分で線を描いて消して…といった面倒な再描画処理は一切不要です。
  • `Err.Number <> 0`: ユーザーがEscキーを押した時、VBAはエラーを吐いて停止します。実務では必ずエラーハンドリングを行い、スマートに終了させるのがマナーです。

3. 初学者が陥りやすい「3つの罠」

このコードを書く際、多くの人がつまずくポイントを整理しました。

① 配列の次元数エラー

`GetPoint` が返すのは「3要素のバリアント型配列」です。もし始点と終点の座標を計算で求めたい場合、`Dim pt(0 To 2) As Double` といった配列を正しく定義しないと、AutoCADは「型が違います」と突き返してきます。常に `Variant` 型で受けるのが、VBAにおける最も安全な作法です。

② モデル空間(ModelSpace)の参照

`ThisDrawing.ModelSpace` を使うのが基本ですが、図面が開かれていない状態で実行すると、当然エラーになります。大規模開発では `On Error GoTo` を使い、環境チェックを行うのが定石です。

③ OSNAP(オブジェクトスナップ)の干渉

`GetPoint` は、ユーザーが設定しているOSNAP(端点や中心点への吸着)をそのまま利用します。もし「吸着させたくない」場合は、実行中に一時的にOSNAPをオフにするような制御が必要になります。

4. さらなる高みへ:なぜこのコードが「美しい」のか

この手法の素晴らしい点は、「AutoCADの標準的な挙動を継承している」ことにあります。

ユーザーは、AutoCADの標準コマンド(LINEコマンドなど)と全く同じUIで操作できるため、ストレスを感じません。「ソフトウェアに操作を強いる」のではなく、「ユーザーの直感に合わせてソフトウェアが動く」。 これが、優れたツールとそうでないツールを分かつ境界線です。

今後のステップアップ案

  • プレビュー機能の強化: `GetPoint` の代わりに、より複雑な操作が必要な場合は「ユーザーフォーム」を使いますが、まずはこの `GetPoint` を使いこなすことが、インタラクティブ開発の第一歩です。
  • リアルタイム追従: 線だけでなく、矩形や円をカーソルに追従させて表示させたい場合は「`Jig`(.NET API)」という技術が必要になります。VBAをマスターしたその先に待っている、究極のカスタマイズ領域です。

いかがでしたか?
「ラバーバンドを出す」という小さな実装ですが、ここにはユーザー体験を最大化するための魂が宿っています。まずはこのコードを書き換え、自分の業務に合わせたツールを作ってみてください。

もし、さらに深い「メモリ管理」や「イベント制御」の話が聞きたくなったら、またいつでもここへ戻ってきてください。あなたの自動化の旅を、私はいつでもサポートしますよ。

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