こんにちは。AutoCADの自動化という深淵な世界へようこそ。
「マクロの記録」という入り口を抜けた先には、オブジェクトという名の「目に見えない歯車」が複雑に噛み合う広大な庭園が広がっています。今日は、その庭園を自在に駆け巡るための、「指定した矩形(Window)内にあるオブジェクトだけをピンポイントで仕留める」という、実務で最も重宝する技術を伝授しましょう。
初心者の方は「選択=マウスでクリック」と考えがちですが、プロは違います。座標という数値を使って、AutoCADの空間を「切り取る」のです。
—
1. なぜ「範囲選択」がプロの必須スキルなのか?
図面全体をループで回して `If` 文で判定する……そんなコードを書いていませんか? それは、広大な図書館から一冊の本を探すのに、すべての本を手に取って確認しているようなもの。非常に非効率ですし、図面が重くなればなるほど、PCは悲鳴を上げます。
`SelectByPolygon` や `Select` メソッドを使いこなし、「AutoCADのエンジンに選別を任せる」こと。これが高速化への第一歩です。
2. 核心:`Select` メソッドの「ウィンドウ選択」を操る
AutoCAD VBAでオブジェクトを捕まえるには `SelectionSets` を使います。ここで重要なのは、`Select` メソッドの引数です。
今回は、2点を指定して矩形(Window)を作り、その中にあるオブジェクトを抽出するロジックを組みます。
実践コード:矩形内オブジェクトの一括操作
Sub SelectObjectsInWindow()
Dim sset As AcadSelectionSet
Dim pt1 As Variant, pt2 As Variant
Dim mode As Integer
‘ 既に同名の選択セットがあれば削除(エラー回避の鉄則)
On Error Resume Next
ThisDrawing.SelectionSets(“MyWindowSet”).Delete
On Error GoTo 0
‘ 新規選択セットを作成
Set sset = ThisDrawing.SelectionSets.Add(“MyWindowSet”)
‘ ユーザーに2点をクリックさせる
pt1 = ThisDrawing.Utility.GetPoint(, “左上の角を指定してください: “)
pt2 = ThisDrawing.Utility.GetCorner(pt1, “右下の角を指定してください: “)
‘ acSelectionSetWindow: 指定した矩形に完全に含まれるものを選択
‘ acSelectionSetCrossing: 矩形に触れているものも選択
mode = acSelectionSetWindow
‘ 抽出実行!
sset.Select mode, pt1, pt2
‘ 結果の確認と処理
If sset.Count > 0 Then
MsgBox sset.Count & ” 個のオブジェクトを捕獲しました。”
‘ 捕獲したオブジェクトをループ処理(例:色を赤に変える)
Dim ent As AcadEntity
For Each ent In sset
ent.Color = acRed
ent.Update
Next ent
Else
MsgBox “範囲内に何もありませんでした。”
End If
‘ 使い終わった選択セットは必ず消す(メモリ管理の美学)
sset.Delete
End Sub
3. このコードを使いこなすための「3つの極意」
① 「既存の選択セット」という罠
AutoCADの `SelectionSets` は一度作成すると、明示的に `Delete` しない限りメモリに残り続けます。同じ名前の選択セットを作ろうとするとエラーで止まります。プロは必ず `On Error Resume Next` を使い、同名があれば削除してから再生成する「クリーンな手順」を組み込みます。
② `acSelectionSetWindow` vs `acSelectionSetCrossing`
- Window: 矩形の中に完全に収まっているものだけ。
- Crossing: 矩形に少しでも触れているもの。
用途に合わせて使い分けるだけで、作業の正確性が劇的に向上します。
③ 座標系(Variant型)への理解
AutoCADのAPIは、点を `Variant` 型の配列(X, Y, Z)として扱います。`GetPoint` で取得する座標は、常に世界座標系(WCS)であることに留意してください。もし複雑なUCS(ユーザー座標系)を扱う場合は、座標変換関数が必要になりますが、まずはこの基本をマスターしましょう。
—
最後に:なぜ「オブジェクト」を直接操作するのか
読者の皆さんが目指すべきは、単に「コマンドを自動化する」ことではありません。AutoCADというソフトウェアの心臓部(API)に直接コマンドを送り、人間の手では不可能な速度で正確に図面を構築することです。
今回紹介した「範囲指定による選択」をマスターすれば、図面の一部だけを抽出して属性を書き換えたり、不要な情報を削除して軽量化したりといった、現場で喉から手が出るほど欲しい機能が自作できるようになります。
まずはこのコードをコピペして、適当な図形で試してみてください。「自分の意図通りにAutoCADが動く」という快感を覚えたら、あなたはもう立派な自動化エンジニアの入り口に立っています。
何か詰まったら、いつでも聞いてください。ここをクリアすれば、AutoCAD VBAの景色がガラリと変わりますよ。応援しています。
