こんにちは!AutoCADの自動化の世界へようこそ。
日々、図面に向き合いながら「同じような作業をボタン一つで終わらせたい!」とVBAの扉を叩いたあなた、素晴らしい着眼点です。
マクロの記録から一歩抜け出し、自らコードを書くようになると、必ずと言っていいほどこんな壁にぶつかります。
「あれ?VBAを実行する前に選択していた図形が、プログラムの中でうまく処理されない……?」
そう、AutoCADには「事前選択(PickFirst)」という強力な仕組みがあります。標準コマンド(MOVEやERASEなど)と同じように、「図形を選んでからコマンド実行」というスマートな動きをVBAで再現するには、この仕組みの裏側を完全に理解し、手なずける必要があるのです。
ここをクリアすれば、あなたの作るマクロは「ただ動くオモチャ」から「プロが現場で使う洗練されたツール」へと生まれ変わります。さあ、一緒にその極意を紐解いていきましょう!
—
1. AutoCADの「事前選択(PickFirst)」ってなに?
まずは、AutoCADの基本動作のおさらいです。
- 事前選択(PickFirst): 図面上でオブジェクトを先に「ポチポチ」と選択状態にしてから、コマンド(移動や削除など)を呼び出す方式。
- 事後選択: コマンドを先に入力(例: `MOVE` と打つ)し、そのあとに「オブジェクトを選択」と言われてから図形を選ぶ方式。
VBAのプログラムを書くとき、何も考えずに図形を操作しようとすると、この「事前選択された図形」が邪魔をしたり、逆にコードが無視してしまったりして、思い通りの動きになりません。
標準のコマンドのように「ユーザーが事前に選んでくれた図形があればそれを料理し、選んでいなければ新しく選択を促す」という優しさをVBAで実装するには、`AcadApplication.Preferences.Selection` にある設定をいじる必要があります。
—
2. 黒幕はこいつだ!`PickFirst` プロパティの正体
AutoCAD VBAにおいて、事前選択の状態をコントロールする鍵が `AcadApplication.Preferences.Selection.PickFirst` です。
これは、AutoCADのオプション画面(「選択」タブにある「オブジェクト選択 (Pickfirst)」)と完全に連動しています。
- `True`:事前選択が有効(図形を先に選べる)
- `False`:事前選択が無効
しかし、私たちがVBAエンジニアとして本当に制御すべきなのは、単なる設定のON/OFFだけではありません。「コードが走る瞬間に、ユーザーがすでに選んでいる図形(ピックファーストセット)をどう安全に回収し、どう料理するか」というライフサイクルの管理です。
—
3. 【実践】事前選択を華麗に裁くプロのコード
百聞は一見に如かず。現場でそのまま使える、極めて実用的なコードを見てみましょう。
このコードは、「ユーザーが事前に図形を選んでいれば、それを一括処理する。選んでいなければ、プログラム側から新たに選択を促す」という、標準コマンドの挙動を完璧に模倣するテンプレートです。
Sub ProcessSelectedObjects()
Dim acadApp As AcadApplication
Dim ssetPickFirst As AcadSelectionSet
Dim ssetCustom As AcadSelectionSet
Dim ent As AcadEntity
Dim ssetName As String
‘ 1. アプリケーションオブジェクトの取得
Set acadApp = ThisDrawing.Application
‘ 2. 既存の同名選択セットがあれば削除(エラー回避の鉄則)
ssetName = “MyActiveSelectionSet”
On Error Resume Next
ThisDrawing.SelectionSets(ssetName).Delete
On Error GoTo 0
‘ 3. 新規選択セットの作成
Set ssetCustom = ThisDrawing.SelectionSets.Add(ssetName)
‘ ==========================================================
‘ 4. 事前選択(PickFirst)されている図形があるかチェック
‘ ==========================================================
‘ PickFirstSelectionsets は、VBA実行前に選択されていたもの群を保持します
Set ssetPickFirst = ThisDrawing.PickFirstSelectionSet
If ssetPickFirst.Count > 0 Then
‘ — パターンA:事前に選択されていた場合 —
MsgBox “事前選択された図形が ” & ssetPickFirst.Count & ” 個見つかりました。”, vbInformation, “スマート処理”
‘ 処理を続行するため、PickFirstのセットをカスタム選択セットに移し替える
‘ (※そのままループを回すと危険な場合があるため、一度配列等で安全に参照します)
Dim i As Long
Dim entArray() As AcadEntity
ReDim entArray(0 To ssetPickFirst.Count – 1)
For i = 0 To ssetPickFirst.Count – 1
Set entArray(i) = ssetPickFirst.Item(i)
Next i
‘ ここで実際の処理を行う(例としてレイヤを変更するなどのダミー処理)
For i = LBound(entArray) To UBound(entArray)
‘ 例:選ばれた図形のハンドルを表示
‘ Debug.Print entArray(i).Handle
Next i
Else
‘ — パターンB:何も選択されていない場合 —
MsgBox “事前に選択されていません。オブジェクトを選んでください。”, vbInformation, “通常選択”
‘ プログラム側からユーザーに選択を促す
ssetCustom.SelectOnScreen
If ssetCustom.Count > 0 Then
MsgBox ssetCustom.Count & ” 個の図形が新しく選択されました。”, vbInformation
Else
MsgBox “選択がキャンセルされました。”, vbExclamation
GoTo Cleanup
End If
End If
Cleanup:
‘ 5. メモリの解放(非常に重要!)
‘ 選択セットはAutoCADのメモリを圧迫するため、不要になったら必ず削除します
ssetCustom.Delete
MsgBox “すべての処理が完了しました。”, vbInformation
End Sub
コードのここがポイント!
- `ThisDrawing.PickFirstSelectionSet` の活用: これがまさに「ユーザーが直前に選んでいた図形たち」の集合体です。このプロパティを知っているだけで、他の人とコードのスマートさが段違いになります。
- エラーハンドリングと後始末: AutoCAD VBAで最も多いトラブルが「選択セットが既に存在しています」というエラーや「メモリリーク」です。使い終わった選択セットは必ず `.Delete` で消去する。これがプロの作法です。
—
4. 初学者が絶対にハマる「3大トラップ」と回避策
最後に、現場で泣きを見る前に知っておいてほしい「陥りやすい罠」をシェアしておきます。
トラップ1: 選択セットの名前が被ってクラッシュする
- 現象: マクロを2回目実行したときに「既に同じ名前のコレクションが存在します」というエラーが出る。
- 対策: 上のコードの通り、生成する前に必ず `On Error Resume Next` を挟んで同名セットを削除する防衛的プログラミングを徹底しましょう。
トラップ2: 選択された図形の中に「削除されたもの」や「ロックされた画層」が含まれている
- 現象: 予期せぬ実行時エラーでマクロが強制終了する。
- 対策: 選択セットをループさせる際は、オブジェクトが生きているか(Validか)をチェックするワンクッションを挟むと完璧です。
トラップ3: 処理が終わったあとに選択状態が残り続けてユーザーがイライラする
- 現象: マクロが終わったのに、図面上の図形が青いグリップ(選択状態)のまま残る。
- 対策: プログラムの最後に `ThisDrawing.SetVariable “PICKFIRST”, 0` と `1` をトグルさせるか、選択セットのクリア(`.Clear`)を行うことで、画面上の見た目をクリーンに保てます。
—
まとめ:ここをクリアすれば、あなたはもう中級者!
お疲れ様でした!今回は `AcadApplication.Preferences.Selection.PickFirst` を起点とした、事前選択の制御について解説しました。
標準のCADコマンドのようにユーザーの操作意図を汲み取り、シームレスに動くマクロを作れるようになると、現場での評価は爆発的に上がります。「おっ、このツール、分かってるな」と使いたくなるような操作感は、こうした細やかなオブジェクトモデルの制御から生まれるのです。
ここをクリアしたあなたなら、もう基本の「モヤモヤ」は抜けているはず。自信を持って、次の自動化のステップへ進んでくださいね。応援しています!
