こんにちは。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をマスターしたその先に待っている、究極のカスタマイズ領域です。
—
いかがでしたか?
「ラバーバンドを出す」という小さな実装ですが、ここにはユーザー体験を最大化するための魂が宿っています。まずはこのコードを書き換え、自分の業務に合わせたツールを作ってみてください。
もし、さらに深い「メモリ管理」や「イベント制御」の話が聞きたくなったら、またいつでもここへ戻ってきてください。あなたの自動化の旅を、私はいつでもサポートしますよ。
