AutoCAD VBAの「心臓部」を操る:SelectionSetsで図面を自在に制御せよ
こんにちは。自動化の世界へようこそ。
もしあなたが今、「マクロの記録」ボタンを押して生成された、冗長で修正困難なコードに頭を抱えているなら、今日がその脱却の日です。
AutoCAD VBAにおいて、最も重要かつ強力な概念。それが`SelectionSets`(選択セット)です。これさえマスターすれば、図面内の数千のオブジェクトから、あなたの望むものだけを瞬時に抜き出し、意のままに操ることができます。
さあ、設計の現場を「作業」から「思考」へ変えるための、極限の知見を授けましょう。
—
1. なぜ「手作業の選択」ではダメなのか?
初学者が最初に陥る罠は、「画面上でオブジェクトを選択してからコードを動かす」という手順です。しかし、真の自動化エンジニアは違います。
「プログラムが自ら条件を判断し、必要なものだけを掴み取る」
これが実現できて初めて、AutoCADはあなたの強力な武器になります。`SelectionSets`は、AutoCADのメモリ上に「仮想的なバケツ」を用意し、条件に合うものだけをそこに放り込むような機能です。
—
2. 実践:特定の条件でオブジェクトを抽出する
まずは、最も実用的な「画層」と「オブジェクトタイプ」でフィルタリングするコードを見てみましょう。
Sub SelectObjectsByFilter()
Dim sset As AcadSelectionSet
Dim filterType(0 To 1) As Integer
Dim filterData(0 To 1) As Variant
‘ 1. すでに存在するセット名がある場合のエラーを回避(ここが重要!)
On Error Resume Next
ThisDrawing.SelectionSets(“MyFilterSet”).Delete
On Error GoTo 0
‘ 2. 新しい選択セットを作成
Set sset = ThisDrawing.SelectionSets.Add(“MyFilterSet”)
‘ 3. フィルタ条件の設定
‘ DXFコード 0: オブジェクトタイプ (LINE, CIRCLE, LWPOLYLINEなど)
filterType(0) = 0: filterData(0) = “LINE”
‘ DXFコード 8: 画層名
filterType(1) = 8: filterData(1) = “0”
‘ 4. フィルタを適用して選択(画面全体)
sset.Select acSelectionSetAll, , , filterType, filterData
‘ 5. 結果の確認
MsgBox sset.Count & ” 個の線分を抽出しました。”
‘ 6. 使い終わったらメモリを解放(重要!)
sset.Delete
End Sub
—
3. ここがプロの勘所:陥りやすい罠と対策
① 「名前の重複」でプログラムが死ぬ
`ThisDrawing.SelectionSets.Add(“名前”)` を使う際、同じ名前が既に存在するとエラーになります。上記のコードのように、「まずは一度削除を試みる」というプロセスを挟むのが、現場のエンジニアの鉄則です。
② メモリの掃除(Delete)を忘れない
`SelectionSet`は作成するたびにメモリを消費します。プログラムの最後で必ず `.Delete` してください。これを怠ると、AutoCADの動作が徐々に重くなり、最悪の場合、図面がクラッシュします。「使い終わったらゴミを片付ける」、これはコードの作法です。
③ DXFグループコードを理解する
フィルタリングには「DXFグループコード」というAutoCADの言語を使います。
- `0`: オブジェクトタイプ
- `8`: 画層
- `62`: 色
これらを組み合わせることで、論理的で厳密な選択が可能になります。「赤色で、かつ中心線画層にある円だけ」といった複雑な条件も、この配列を拡張するだけで簡単に実現できるのです。
—
4. 次のステージへ:さらに効率化するために
`SelectionSet`を使いこなせば、以下のような自動化が可能です。
- 図面内の全文字(TEXT/MTEXT)を検索し、特定の文字列を置換する
- 特定の画層のオブジェクトだけを非表示(または削除)にする
- 図面内のブロックを一括で集計し、Excelへ書き出す
これらの作業を、手作業でやっていたら何時間かかりますか? 自動化すれば、わずか数ミリ秒です。
最後に
コードを書くことは、単なる命令ではありません。AutoCADという巨大なエンジンに対して、「何を、どうしたいのか」という意思を明確に伝えるプロセスです。
最初は難しく感じるかもしれませんが、この`SelectionSets`を理解したあなたは、もう初心者ではありません。次はぜひ、取得したオブジェクトのプロパティ(色や線種など)をループ処理で書き換えることに挑戦してみてください。
何か壁にぶつかったら、またここへ戻ってきてください。いつでもあなたのコードをレビューします。
それでは、快適な自動化ライフを!
