【AutoCAD VBA】「先に選んで、後で動かす」を極める:PickFirstSelectionSetの真髄
こんにちは。AutoCADの自動化の世界へようこそ。
日々、図面と格闘している皆さんにとって、VBAは単なるツールではなく「あなたの思考を高速化する相棒」です。
さて、自動化の第一歩として多くの人が躓くのが「ユーザーが今、画面上で何を選択しているか」をプログラムに教えることです。
「ボタンを押してから選択させる」のではなく、「図面上で図形を選んでからボタンを押す(先選択)」。このUX(ユーザー体験)を実現できるかどうかが、プロのツールと素人のおもちゃを分かつ境界線です。
今回は、AutoCAD VBAにおける「先選択(PickFirst)」の極意を伝授しましょう。
—
1. なぜ「PickFirstSelectionSet」なのか?
通常の選択セット(`SelectionSet`)は、プログラムの中で「ユーザーに選ばせる」ことが一般的です。しかし、業務効率を劇的に上げるには、ユーザーがすでに選んでいる状態(コマンド実行前の状態)をプログラムが「察する」必要があります。
この「先選択されたオブジェクト」を格納している特別な箱が、`PickFirstSelectionSet` です。
この技術を習得するメリット
- 操作の手間が減る: 「コマンド起動 → オブジェクト選択 → Enter」のプロセスを「選択 → コマンド起動」の1ステップに短縮できる。
- プロ感が出る: 市販のCADアドオンと同じUXが提供できる。
- 直感的な操作: ユーザーが「今これをいじりたい」と思った瞬間の状態を直接捕まえられる。
—
2. 実践:PickFirstSelectionSetを取得するコード
百聞は一見に如かず。まずは、現在選択されている図形の数をメッセージボックスに表示するコードを見てみましょう。
Sub GetCurrentSelection()
Dim sset As AcadSelectionSet
Dim doc As AcadDocument
‘ アクティブなドキュメントを取得
Set doc = ThisDrawing
‘ 既存の選択セットがあればクリアして取得する(重要!)
‘ 名前が重複するとエラーになるため、一度削除してから作成するのが鉄則
On Error Resume Next
Set sset = doc.SelectionSets.Add(“MyTempSelection”)
If Err.Number <> 0 Then
Set sset = doc.SelectionSets.Item(“MyTempSelection”)
sset.Clear
End If
On Error GoTo 0
‘ 【ここが核心】PickFirst(先選択)されたオブジェクトを格納
sset.GetPickFirst
‘ 選択されている個数を表示
MsgBox “現在選択されている図形は ” & sset.Count & ” 個です。”
‘ 処理が終わったら必ず削除(メモリ解放の作法)
sset.Delete
End Sub
—
3. 初学者が必ずハマる「3つの落とし穴」
このコードをただコピペするだけでは、現場では通用しません。伝説的なアーキテクトが教える、避けるべき「落とし穴」は以下の通りです。
① 「名前の重複」エラーを軽視する
`SelectionSets.Add` は、同じ名前のセットが既に存在すると容赦なくエラーを吐きます。VBAでは「エラーが起きたら取得し、なければ新しく作る」という例外処理のパターンをテンプレートとして持つことが必須です。
② メモリの掃除を忘れる(重要!)
`SelectionSet` は作成するたびにメモリを食います。処理の最後で `sset.Delete` を行わないと、AutoCADが極端に重くなったり、最悪の場合はクラッシュします。「使い終わったら必ず捨てる」。これはコードを書く際の鉄則です。
③ 選択セットが「空」の時のケア
ユーザーが何も選択していない状態で実行すると、`sset.Count` が 0 になります。ここからループ処理に入るとエラーになる可能性があるため、必ず `If sset.Count > 0 Then …` とガード節を入れましょう。
—
4. 応用:選択したオブジェクトを加工する
最後に、選択された図形が「線(Line)」だった場合のみ、色を赤に変更する実用的なスニペットを贈ります。
Sub ChangeSelectedLinesToRed()
Dim sset As AcadSelectionSet
Dim ent As AcadEntity
‘ — (前述の初期化処理は省略) —
sset.GetPickFirst
If sset.Count = 0 Then
MsgBox “図形が選択されていません。”
Exit Sub
End If
‘ 選択された図形を一つずつ確認
For Each ent In sset
If TypeOf ent Is AcadLine Then
ent.Color = acRed ‘ 赤に変更
ent.Update ‘ 画面を更新
End If
Next ent
sset.Delete
End Sub
—
最後に:エンジニアとしてのマインドセット
AutoCAD VBAを掌握するコツは、「AutoCADという広大なオブジェクトモデルを、自分好みの小さなパーツとして切り取る」感覚を持つことです。
`PickFirstSelectionSet` を使いこなせれば、あなたはもう「マクロの記録」の枠組みを超えています。次は「どの図形が選ばれたか」だけでなく、「レイヤー名や属性値(属性ブロック)をどう読み取って自動化するか」という領域へ踏み込んでいきましょう。
あなたのコードが、現場の誰かの時間を1秒でも短縮できることを願っています。
不明な点があれば、いつでも聞いてください。基本が分かれば、AutoCADはもっと自由になれるはずです。
