AutoCAD VBAを極める:AcadGroupによる「論理パッケージング」の真髄
現場で図面を修正している際、「一部の線分だけ選択し忘れて、移動後に図面が崩壊した」という苦い経験はないだろうか?
AutoCADの`Group`は、単なる「選択補助」ではない。「論理的な一塊(パッケージ)」として図面情報の整合性を担保するための最強の防壁だ。今回は、ただのグループ作成ツールではなく、業務の堅牢性を高めるための「グループ自動生成アーキテクチャ」について解説する。
—
なぜ「グループ」なのか?——設計思想の転換
多くの初心者は、図形を塊にするために「ブロック」を使う。しかし、ブロックは定義を伴い、名前空間を汚染する。一方、`Group`は「名前付きの選択セット」であり、図面データベース(`AcadDatabase`)のメタデータとして軽く、柔軟だ。
実務では、以下のシーンで真価を発揮する。
- 動的編集の保護: 構成要素を不可分にし、誤操作による一部欠落を物理的に防ぐ。
- メタ情報の付与: 物理的な形状に関わらず、論理的に紐づけたい要素(属性文字と線分など)を一体化する。
—
堅牢な実装:プロダクションコードの鉄則
グループ生成で最も多い失敗は、「同名のグループが既に存在する場合の例外処理漏れ」と「空のグループによるメモリリーク」だ。以下に、実務でそのまま使える堅牢なクラス設計のコードを提示する。
‘ ———————————————————
‘ 論理グループ作成エンジンの核となるプロシージャ
‘ ———————————————————
Public Sub CreateSecureGroup(ByVal groupName As String, ByRef entities() As AcadEntity)
Dim acadGroup As AcadGroup
Dim i As Long
‘ 1. グループ名の重複をチェック(既存があれば削除して作り直すか、エラーを返す)
On Error Resume Next
Set acadGroup = ThisDrawing.Groups.Item(groupName)
If Err.Number = 0 Then
‘ 既存グループが存在する場合、削除して再定義する(保守性を考慮)
acadGroup.Delete
End If
On Error GoTo 0
‘ 2. グループの生成(エラーハンドリングを介在させる)
Set acadGroup = ThisDrawing.Groups.Add(groupName)
‘ 3. オブジェクトの安全な追加
‘ 一度Variant配列にキャストするのがAutoCAD APIの作法
Dim entityArray As Variant
entityArray = entities
acadGroup.AppendItems entityArray
‘ 4. 可読性と保守性を高める更新通知
ThisDrawing.Regen acActiveViewport
Debug.Print “Group ‘” & groupName & “‘ successfully created with ” & UBound(entities) + 1 & ” objects.”
End Sub
‘ — 使用例 —
Sub Example_Usage()
Dim objs(0 To 1) As AcadEntity
Set objs(0) = ThisDrawing.ModelSpace.Item(0) ‘ 最初のオブジェクト
Set objs(1) = ThisDrawing.ModelSpace.Item(1) ‘ 次のオブジェクト
Call CreateSecureGroup(“UNIT_001_ASSEMBLY”, objs)
End Sub
—
プロフェッショナルが守るべき3つの設計規約
1. エラーハンドリングの先回りと無効化
AutoCAD VBAにおいて、`On Error Resume Next`は悪ではない。むしろ、APIの仕様上、オブジェクトが存在するか確認するために、わざとエラーを投げさせる手法は「賢い防御」だ。ただし、処理の直後に必ず`On Error GoTo 0`で監視を戻すこと。これを怠ると、デバッグが地獄を見る。
2. アトミックな操作の意識
グループ化する際は、対象となるオブジェクトが「削除済み(Deleted)」でないか、あるいは「ロックされたレイヤー」に存在しないかを事前チェックするロジックを噛ませるべきだ。APIはエラーを返すが、その前に`If obj.Layer.Lock = False Then …`と判定するだけで、ツールの安定性は飛躍的に向上する。
3. 命名規則による構造化
グループ名には必ずプレフィックスを付けること(例:`GRP_`)。`ThisDrawing.Groups`をループ処理で走査する際、図面全体の全グループを探索対象にすると、汎用的なツールと干渉するリスクがある。命名規則で管理領域を分離するのが、大規模開発の定石だ。
—
最後に:自動化は「責任」である
ツールを配布するということは、誰かの作業の「正しさ」を保証するということだ。
今回紹介したグループ化の手法は、単に作業を楽にするためではない。「図面の構成要素を意図通りに維持する」という、CAD運用の本質的なリスクを回避するための仕組みだ。
このコードを土台に、あなたの現場の「守るべき要素」をパッケージ化してほしい。エンジニアリングとは、優れたコードを書くことではなく、現場の不条理を技術で消し去ることに他ならない。
健闘を祈る。
