【入門編】【上級】AcadDocument.Database.Groupsコレクションによる「論理的な図形グループ」の自動生成と管理 – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは!AutoCAD VBAの世界へようこそ。
マクロの記録ボタンを押して出てくるコードを眺める段階は、もう卒業しましたね。おめでとうございます。ここから先は、AutoCADの内部構造(オブジェクトモデル)を直接手玉に取る、本物の自動化エンジニアの世界です。

今回は、現場でめちゃくちゃ重宝するのに、意外と知られていない「Groups(グループ)コレクション」を徹底解説します。

「ブロックにするほどでもないけれど、複数の図形をひとまとめにして扱いたい」
「プログラムから動的にグループを作って、一括で移動・削除したい」

そんな悩みを一発で解決する極意を、優しく、そしてエンジニアの魂を込めて伝授します。ここをクリアすれば、あなたのVBAスキルは一段と洗練されますよ。さあ、一緒に扉を開けましょう!

1. なぜ「グループ」なのか?(ブロックとの決定的違い)

AutoCADで複数の図形をまとめる方法として、真っ先に思い浮かぶのは「ブロック(Block)」ですよね。しかし、ブロックには以下のような「重さ」や「縛り」があります。

  • ブロック化の弊害: 定義の編集(BEDIT)が必要になり、そのブロックを参照している全ての図形が一斉に変わってしまう。個別の図形だけの色や画層を変えるのが面倒。
  • グループの身軽さ: 図形たちの「関係性」を一時的、あるいは論理的に結びつけるだけ。それぞれの図形は独立した個性を保ったまま、まるで一つの塊のように一括選択・移動・削除ができる。

VBAの裏側から見ても、`AcadDocument.Database.Groups` を使ったグループ操作は、図面データベース(Database)を直接操作する非常にエレガントな手法です。ブロックという「重いコンテナ」を作らずとも、論理的な絆で図形たちを統率できるのです。

2. オブジェクトモデルの構造を理解しよう

コードを書く前に、AutoCAD VBAの地図を確認しておきましょう。

AcadApplication
┗ AcadDocument (アクティブな図面)
┗ Database (図面の根幹データ)
┗ Groups コレクション (すべてのグループの集合体)
┗ AcadGroup オブジェクト (個別のグループ)

私たちは今、「図面の心臓部である `Database` の中にある `Groups` という箱から、新しいグループを取り出したり入れたりする」という操作をしようとしています。この階層構造をイメージできるかどうかが、エラーを防ぐ最大の秘訣です。

3. 【実践】グループを自動生成し、操作するVBAコード

百聞は一見にしかず。実際に動くコードを見てみましょう。
このコードは、モデル空間に適当な図形(ここでは円と線分を想定)を配置し、それらをプログラム側で「論理的なグループ」としてまとめ、一括移動・色変更・そしてグループの解体までを一気通貫で行うサンプルです。

Sub CreateAndManageGroups()
Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing

Dim acadGroups As AcadGroups
Set acadGroups = acadDoc.Database.Groups

On Error GoTo ErrorHandler

‘ —————————————————-
Sstep 1: グループに含める図形(エンティティ)の配列を用意する
‘ —————————————————-
Dim sset As AcadSelectionSet
‘ 既存の同名選択セットがあれば削除しておく(お作法)
On Error Resume Next
acadDoc.SelectionSets.Item(“TempGroupSS”).Delete
On Error GoTo ErrorHandler

Set sset = acadDoc.SelectionSets.Add(“TempGroupSS”)

‘ ここではモデル空間のすべての図形を対象にします(実務ではフィルター推奨)
sset.Select acSelectionSetAll

If sset.Count = 0 Then
MsgBox “グループ化する図形がモデル空間に存在しません。”, vbExclamation
sset.Delete
Exit Sub
End If

‘ 配列のサイズを動的に決定
Dim i As Long
ReDim entityArray(0 To sset.Count – 1) As AcadEntity
For i = 0 To sset.Count – 1
Set entityArray(i) = sset.Item(i)
Next i

‘ 選択セットは役目を終えたのでメモリから解放
sset.Delete

‘ —————————————————-
Step 2: Groupsコレクションに新しいグループを追加する
—————————————————-
Dim myGroup As AcadGroup
Dim groupName As String
groupName = “MyAutomatedGroup_” & Format(Now, “hhmmss”)

‘ グループの新規作成(同名グループが存在する場合のエラーに注意)
Set myGroup = acadGroups.Add(groupName)

‘ 作成したグループに図形配列を流し込む!
myGroup.AppendItems entityArray

MsgBox “グループ「” & groupName & “」を生成し、” & UBound(entityArray) + 1 & “個の図形をまとめました!”, vbInformation

‘ —————————————————-
Step 3: グループ単位で一括操作を行ってみる
—————————————————-
‘ 例:グループ全体をX方向に 50, Y方向に 30 移動する
Dim vector(0 To 2) As Double
vector(0) = 50#: vector(1) = 30#: vector(2) = 0#
myGroup.Move vector(0), vector(1), vector(2) ‘ ※AcadGroupには直接Moveメソッドがあります

MsgBox “グループを一括で移動しました。次はグループを削除(解体)します。”, vbInformation

‘ —————————————————-
Step 4: グループの削除(※図形本体は消えません!)
—————————————————-
‘ Deleteメソッドは「グループという結びつき」を消すだけで、中身の図形は生き残ります
myGroup.Delete

MsgBox “グループの結びつきを解除しました(図形本体は残っています)。”, vbInformation
Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
If Not sset Is Nothing Then sset.Delete
End Sub

4. エンジニアなら知っておくべき「陥りやすい罠」と回避策

上記のコードを書いて実際に動かしてみると、いくつかの「AutoCAD VBA特有の罠」にぶつかります。ここを知っているかどうかが、プロとアマの分水嶺です。

罠その1:同名のグループがすでに存在すると `Add` で即死する

`AcadGroups.Add(“グループ名”)` は、もし図面内にすでに同じ名前のグループが存在する場合、容赦なく実行時エラーを吐いてクラッシュします。

  • 対策: 事前にループを回して同名グループの有無をチェックするか、上記のサンプルコードのように一意のタイムスタンプを名前に付与する工夫をしましょう。

罠その2:`AcadGroup.Delete` の本当の意味を勘違いする

「Delete」という言葉を見ると、ついつい「グループに入っている図形ごと全部消し去るのか」とビビってしまいますよね。

  • 真実: ここでの `Delete` は「グループという論理的な結びつきを解除する(消去する)」という意味です。中身の図形(CircleやLineなど)は、モデル空間にポツンと残ります。図形自体を消したい場合は、個別に `entity.Delete` を呼ぶ必要があります。この仕様の違い、絶対に覚えておいてください。

罠その3:オブジェクトのライフサイクルとメモリ管理

VBAからAutoCADを操作するとき、`SelectionSet` や `Group` などの一時オブジェクトは、処理が終わったら速やかに `.Delete` や `Set xxx = Nothing` でメモリから解放してあげるのが、大人のエンジニアの作法です。これを怠ると、図面ファイルが重くなったり、メモリリークの原因になります。

5. おわりに

お疲れ様でした!
今回は `AcadDocument.Database.Groups` を使った、論理グループの自動生成と管理について解説しました。

「ブロックにするほどではないけれど、プログラムから一括でゴッソリ制御したい」というシーンは、実務の図面自動化において本当によく出てきます。この `Groups` コレクションを使いこなせるようになると、図面データ構造の操り方が一気にプロフェッショナルなものになります。

ここをクリアしたあなたなら、もうマクロの記録の枠組みを大きく飛び越えています。自信を持って、次の自動化の扉を叩いてください。
それでは、快適なAutoCADライフを!

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