【実務・中級編】【初心者向け】図面内の全オブジェクトを走査し、特定のプロパティ(画層、色、線種)を持つオブジェクトを抽出する – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAを掌握せよ:全オブジェクト走査の「正しい作法」と「設計思想」

AutoCAD VBAで業務を自動化しようとする際、多くの初心者が最初にぶつかる壁が「図面内のオブジェクトをどう効率的に抽出するか」だ。

「とりあえずFor Eachで回せばいいんでしょ?」――そう思っているなら、今すぐその考えを捨ててほしい。AutoCADのオブジェクトモデルは巨大だ。非効率な走査は、大規模図面を開いた瞬間にPCをフリーズさせ、あなたのコードを「役に立たないお荷物」に変えてしまう。

今日は、伝説的なアーキテクトの視点から、「バグを生まず、かつ爆速で動作する」抽出ロジックの極意を伝授する。

1. なぜ「For Each」だけでは足りないのか

VBAの `For Each` は直感的だが、AutoCADの `ModelSpace`(または `PaperSpace`)が数万オブジェクトを抱えている場合、その実行コストは無視できない。特に、条件判定のたびにオブジェクトのプロパティへ逐一アクセスするのは、メモリの無駄遣いである。

堅牢な設計のための3つの鉄則

1. SelectionSetsの活用: 愚直に全走査するのではなく、CADのフィルタ機能(`SelectOnScreen` や `Select`)を使い、API側で事前絞り込みを行うのが定石だ。
2. 型チェックの徹底: CAD図面には、予期せぬ「非グラフィカルオブジェクト」が混入することがある。`On Error Resume Next` で誤魔化さず、`TypeOf` 演算子で型を厳格に判定せよ。
3. トランザクションとパフォーマンス: ループ内で頻繁にドキュメントを更新する処理を書くな。抽出したオブジェクトは一度配列やコレクションに格納し、最後に一括処理するのが鉄則だ。

2. 実践:高効率なオブジェクト抽出ロジック

以下は、特定の画層・色・線種を持つオブジェクトだけを抽出し、ログを出力する実務用テンプレートだ。このコードをベースに、あなたの業務に合わせてカスタマイズしてほしい。

Option Explicit

‘ ———————————————————
‘ 指定した条件に合致するオブジェクトを効率的に抽出するプロシージャ
‘ @param targetLayer 画層名
‘ @param targetColor 色番号 (acByLayer等は定数で指定)
‘ ———————————————————
Public Sub ExtractEntitiesByProperties(ByVal targetLayer As String, ByVal targetColor As Integer)
Dim objEnt As AcadEntity
Dim objSpace As AcadBlock
Dim count As Long

‘ モデル空間を対象とする(ペーパー空間なら ActiveDocument.PaperSpace に変更)
Set objSpace = ThisDrawing.ModelSpace

‘ 処理開始のログ(デバッグ用)
Debug.Print “走査開始: ” & Now

‘ 効率的な走査:For Eachは実はインデックス参照より高速な場合が多い
‘ ただし、条件分岐を最小限に抑えるのが重要
For Each objEnt In objSpace
‘ 1. エラーハンドリング:非グラフィカルな要素を除外
If Not objEnt Is Nothing Then

‘ 2. プロパティ判定:論理演算を繋げて高速化
If objEnt.Layer = targetLayer And objEnt.Color = targetColor Then

‘ 3. ここで目的の処理を実行(例:ハイライト、プロパティ変更、集計)
Debug.Print “発見: ” & objEnt.ObjectName & ” / Handle: ” & objEnt.Handle
count = count + 1

End If
End If
Next objEnt

MsgBox count & ” 個のオブジェクトを特定しました。”, vbInformation
End Sub

3. 現場で生き残るための「注意点」

ファイルやDB連携の罠

抽出したデータをCSVやExcelに出力する場合、「Handle(ハンドル)」を必ず記録すること。HandleはAutoCAD上のオブジェクト固有のIDだ。一度抽出したデータを外部DBで管理し、後から修正を加えたい場合、このHandleがないと再特定が不可能になる。

保守性を高めるアーキテクチャ

  • ハードコーディングの禁止: 画層名や色などの条件は、コードに直書きせず、設定ファイル(INIやJSON)または定数モジュールに切り出せ。
  • 関数の分離: 「抽出する関数」と「抽出したデータを使って何かをする関数」を分けること。単一責任の原則(SRP)を守らないコードは、半年後の自分を苦しめる。

最後に:エンジニアとしての心構え

AutoCAD VBAはレガシーと言われることもある。しかし、図面内のオブジェクトをミリ秒単位で制御するその力は、現代のGUI自動化ツールにはない強力な武器だ。

「動けばいい」コードを書くのはエンジニアではない。「誰が読んでも意図が明確で、かつ図面の規模が10倍になっても耐えうる設計」こそが、真の自動化エンジニアに求められる資質だ。

さあ、このコードを武器に、単調な繰り返し作業を過去のものにしよう。君の挑戦を期待している。

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