【実務・中級編】図面上の特定のオブジェクトを自動選択!AcadDocumentのSelectionSets – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAを掌握せよ:SelectionSetsの「作法」と生存戦略

AutoCADの自動化において、最も頻繁に、そして最も多くのエンジニアが「適当に実装して後で泣きを見る」箇所が `SelectionSets` です。

「とりあえず動けばいい」というコードは、図面が重くなった瞬間に沈黙し、メモリリークでAutoCADをクラッシュさせます。伝説的なコードを書きたければ、メモリのライフサイクルとオブジェクトの生存期間を完全に制御する意識を持ってください。

1. 忌むべき「名前の衝突」を回避する唯一の設計

VBAで `SelectionSets` を扱う際、最大の罠は「前回の実行で作成したセットがメモリに残っている」ことです。これを放置すると、次回実行時に「この名前は既に存在します」というエラーでプログラムは停止します。

多くの初心者はエラーハンドラで逃げますが、それは対症療法に過ぎません。「存在しなければ作成し、存在すれば即座にクリアする」。この排他制御こそが、プロの設計です。

2. 実務で「壊れない」プロダクションコード

以下は、特定の画層にある特定のオブジェクトを抽出するためのテンプレートです。これをベースに、あなたの業務に合わせてカスタマイズしてください。

Option Explicit

‘ ———————————————————
‘ 目的: 特定の画層の特定のオブジェクトを安全に選択する
‘ メリット: メモリリークを防止し、再実行時のエラーを排除する
‘ ———————————————————
Public Sub SelectObjectsByCriteria()
Dim sset As AcadSelectionSet
Dim filterType(0) As Integer
Dim filterData(0) As Variant

‘ 1. SelectionSetsのクリーンアップ(生存制御)
On Error Resume Next
Set sset = ThisDrawing.SelectionSets.Item(“MyTargetSet”)
If Not sset Is Nothing Then
sset.Delete
End If
On Error GoTo 0

‘ 2. セットの新規作成
Set sset = ThisDrawing.SelectionSets.Add(“MyTargetSet”)

‘ 3. フィルタ定義(例:画層 “DIM” にある “LINE” オブジェクト)
filterType(0) = 8 ‘ DXFグループコード: 画層
filterData(0) = “DIM” ‘ 対象画層名

‘ 4. 選択実行
‘ acSelectionSetAll: 図面全体から検索
‘ 他にも acSelectionSetWindow, acSelectionSetCrossing 等がある
sset.Select acSelectionSetAll, , , filterType, filterData

‘ 5. 結果の検証と処理
If sset.Count = 0 Then
MsgBox “対象オブジェクトが見つかりませんでした。”, vbInformation
Exit Sub
End If

‘ ここで抽出したオブジェクトに対する処理を展開する
Debug.Print “選択数: ” & sset.Count

‘ 6. 後始末(重要:メモリ解放)
sset.Delete
End Sub

3. 現場で生き残るための「3つの鉄則」

① `Delete` を怠るな

`sset.Delete` は単なる削除ではありません。AutoCADのメモリ領域からそのオブジェクトを解放する儀式です。これを忘れると、大規模図面でツールを何度も走らせるたびにAutoCADの動作が徐々に重くなり、最終的に不安定になります。

② DXFコードを味方につける

`filterType` と `filterData` を使いこなすことは、検索速度を劇的に改善します。

  • `0` : オブジェクトタイプ(”LINE”, “CIRCLE” 等)
  • `8` : 画層名
  • `62` : 色番号

これらを組み合わせれば、`For Each` ループで全オブジェクトを回すような「素人実装」とは比較にならない速度で目的のオブジェクトに到達できます。

③ データベース連携時の注意点

もしこの選択結果をExcelやデータベースに書き出す場合、「選択した瞬間に図面が変更されないか」を考慮してください。トランザクションの概念がないVBAでは、読み取り中に図面編集が行われると参照整合性が崩れる可能性があります。書き出し処理中は `Application.ScreenUpdating = False` (またはそれに準ずる制御)を行い、CADの再描画を一時的に止めるのが定石です。

最後に:コードは「読み手」のために書く

あなたが書くコードは、半年後のあなた自身、あるいは後任者が修正することになります。
「なぜこの条件でフィルタリングしているのか」「なぜこの名前でセットを作っているのか」。コメント一行に、設計思想を込めてください。

AutoCADのAPIを操るということは、CADという巨大なエンジンの内部に直接干渉するということです。その責任の重さを自覚し、堅牢なコードを積み上げる。それが、真の業務自動化エンジニアへの唯一の道です。

さあ、あなたの図面から「退屈な手作業」を根絶してください。

タイトルとURLをコピーしました