AutoCAD VBAを掌握する:`PickFirstSelectionSet`で実現する「直感的」な自動化の極意
AutoCADの自動化において、ユーザーのストレスを最小化する唯一の鍵は「ユーザーが今何をしているか」を忖度することにあります。
多くの初心者は、コマンドを実行するたびに「オブジェクトを選択してください」とユーザーに求めます。しかし、熟練の設計者は違います。彼らは、ユーザーが図面上で既に選択しているオブジェクトをVBA側が先回りして取得する手法を駆使します。
本稿では、AutoCAD VBAにおける「現在の選択セット(PickFirstSelectionSet)」の扱いを、プロの現場で通用するレベルで解説します。
—
1. なぜ「PickFirst」なのか?
AutoCADの標準的な操作フローは「動詞+名詞」と「名詞+動詞」の2通りあります。VBAツールを作る際、後者の「先に図形を選択し、その後にボタンを押す」というフローをサポートしなければ、現場のオペレーターからは即座に「使えないツール」という烙印を押されます。
これを実現するのが `PickFirstSelectionSet` です。
—
2. 実践的プロダクションコード
単に「取得するだけ」のコードはネットに溢れていますが、現場で必要なのは「選択がない場合のエラーハンドリング」と「既存の選択セットとの競合回避」です。以下のコードをテンプレートとしてください。
‘ ———————————————————
‘ 現在の選択セットを取得し、処理対象とするための堅牢な関数
‘ ———————————————————
Public Sub ProcessPickFirstSelection()
Dim sset As AcadSelectionSet
Dim ent As AcadEntity
‘ 1. 名前付き選択セットの重複エラーを避けるため、既存のセットを破棄
On Error Resume Next
ThisDrawing.SelectionSets.Item(“MyToolSelection”).Delete
On Error GoTo 0
‘ 2. 新規選択セットを作成
Set sset = ThisDrawing.SelectionSets.Add(“MyToolSelection”)
‘ 3. 現在の選択セット(PickFirst)を取得
sset.GetPickFirst
‘ 4. 選択がない場合(ユーザーが何も選んでいない場合)のガード節
If sset.Count = 0 Then
MsgBox “対象オブジェクトが選択されていません。” & vbCrLf & _
“先に図形を選択してから実行してください。”, vbInformation
sset.Delete
Exit Sub
End If
‘ 5. 処理実行
For Each ent In sset
‘ ここで各エンティティに対する処理を行う
Debug.Print “選択されたオブジェクト: ” & ent.ObjectName
Next ent
‘ 6. 後処理(メモリ解放とクリア)
sset.Clear
sset.Delete
End Sub
—
3. エンジニアが守るべき3つの鉄則
このコードを「動くコード」から「保守可能な資産」に変えるために、以下の3点を徹底してください。
① 選択セットの「削除」を忘れない
`ThisDrawing.SelectionSets` は、AutoCADのドキュメントが閉じられるまでメモリ上に永続化されます。`Add` した後に `Delete` を行わないと、次に同じ名前のセットを作ろうとした瞬間に「既に存在します」という致命的なエラーが発生します。`On Error Resume Next` で削除を試みるのは、AutoCAD VBAにおける生存戦略の基本です。
② 明示的な「クリア」の重要性
処理が終わった後、選択セットを `Delete` するだけでなく、`Clear` を呼ぶ癖をつけてください。これにより、AutoCAD側の「グリップ(青い点)」の表示状態が適切に更新されます。
③ データベース連携時の注意点
もし選択した図形の属性情報をExcelやSQL Serverへ転送する場合、`For Each` ループの中で即座に書き込みを行わないでください。処理件数が数千件を超えると、AutoCADと外部アプリ間のオーバーヘッドで動作が重くなります。
「取得(Array化)」→「処理」→「一括反映」というバッチ処理の原則を守りましょう。
—
4. 結論:ユーザーの思考を止めないために
「現在の選択セットを取得する」という行為は、単なるプログラミングのテクニックではありません。ユーザーが「今、この線を選択した」という直感的な作業を、ツールがそのまま引き継ぐための架け橋です。
今回紹介したコードは、極めてシンプルですが、エラーハンドリングとメモリ管理という「エンジニアの矜持」が詰まっています。これをベースに、あなたの業務フローに合わせた独自の自動化ツールを構築してください。
AutoCADのAPIは、使い手次第でただの「描画ソフト」から「最強の設計エンジン」へと進化します。次回の記事では、`SelectionSets` を使ったフィルタリング(特定の画層や色だけを抽出する高度な手法)について深掘りしましょう。
健闘を祈ります。
