【入門編】【実務中級】図面内の「グループ(Group)」オブジェクト操作:関連する図形を一括でまとめ、効率的に編集・移動するVBAコード – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは!AutoCADの自動化の海へようこそ。
マクロの記録ボタンを押して「動いたはいいけれど、中身が全然カスタマイズできない……」と悩んでいませんか?
その壁を越えて、いよいよあなたを「真のAutoCAD VBA使い」へと引き上げる領域に踏み込みましょう。

今回は、実務で死ぬほど役に立つ「グループ(Group)オブジェクト」の操作を徹底解説します。

「選択セット(SelectionSets)とな何が違うの?」
「図面を閉じても記憶させておきたいんだけど……」

そんな疑問をすべて氷解させます。ここをクリアすれば、図形を意のままに束ね、操る快感を味わえますよ。さあ、一緒に扉を開きましょう!

1. 選択セット(SelectionSets)と「グループ」の決定的な違い

まず、心構えとしてこの違いを叩き込んでおきます。ここがAutoCAD VBAのオブジェクトモデルの肝です。

  • 選択セット(SelectionSet):

いわば「一時的な作業トレイ」です。現在開いているセッション中だけの儚い存在で、図面を閉じたら綺麗サッパリ消滅します。

  • グループ(Group):

いわば「永続的なチーム(組織)」です。一度コードや手動で作って図面を保存すれば、次にその図面を開いたときも、グループとしての絆(結びつき)はそのまま残ります。

実務では、「特定の機器のパーツ群をひとまとめにして管理し、後から一括で移動・変形させたい」という要件が山のように出てきます。そんなときは、迷わずこの「グループ」オブジェクトをVBAから召喚すべきです。

2. 【実務直結】グループの基本操作フロー

グループを扱うVBAコードの全体像を見てみましょう。
以下のコードは、図面上のすべての線分(Line)を自動で探し出し、「MyAwesomeGroup」という名前のグループに強制的にぶち込み、さらにそのグループ全体を一気に移動させるというものです。

VBAエディタ(Alt + F11)を開き、標準モジュールにペーストしてみてください。

Sub ManageDrawingGroups()
Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing.ActiveDocument

Dim targetGroup As AcadGroup
Dim groupName As String
groupName = “MyAwesomeGroup”

On Error GoTo ErrorHandler

‘ —————————————————-
‘ 1. 同名のグループが既に存在する場合は削除(クリーンアップ)
‘ —————————————————-
Dim i As Integer
For i = 0 To acadDoc.Groups.Count – 1
If acadDoc.Groups(i).Name = groupName Then
acadDoc.Groups(i).Delete
Exit For
End If
Next i

‘ —————————————————-
‘ 2. 新規グループの作成
‘ —————————————————-
Set targetGroup = acadDoc.Groups.Add(groupName)

‘ —————————————————-
‘ 3. 図面内の対象図形をかき集めて配列にする
‘ —————————————————-
Dim ent As AcadEntity
Dim objList() As AcadEntity
Dim count As Long
count = 0

‘ まず配列のサイズを決め打ち(効率化のため全エンティティ数を最大値とする)
ReDim objList(0 To acadDoc.ModelSpace.Count – 1)

For Each ent In acadDoc.ModelSpace
‘ ここでは例として「線分 (Line)」だけに絞り込んでグループ化します
If TypeOf ent Is AcadLine Then
Set objList(count) = ent
count = count + 1
End If
Next ent

‘ 実際に抽出できた数に配列をリサイズ(これぞプロの技!)
If count > 0 Then
ReDim Preserve objList(0 – 1 + count) ‘ 0ベースの調整

‘ —————————————————-
‘ 4. グループへ図形を一括追加
‘ —————————————————-
targetGroup.AppendItems objList

MsgBox groupName & ” に ” & count & ” 個の線分を追加しました!”, vbInformation, “グループ化成功”

‘ —————————————————-
‘ 5. グループ単位で一括移動(X方向へ 100mm 移動)
‘ —————————————————-
Dim vecMove(0 To 2) As Double
vecMove(0) = 100.0: vecMove(1) = 0.0: vecMove(2) = 0.0

‘ グループ自体には Move メソッドが無いため、
‘ 構成要素をループするか、SelectionSets等に一時展開して動かします
‘ (※実務ではここがポイント!後述の解説へ)

Else
MsgBox “対象となる線分が見つかりませんでした。”, vbExclamation, “警告”
End If

Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical
End Sub

3. 現場で絶対にハマる「落とし穴」と回避テクニック

上記のコードを動かしたとき、あるいは自分で応用するときに、必ずといっていいほどエンジニアが直面する「罠」が2つあります。ここを知っているかどうかが、初級者から中級者への分水嶺です。

罠その1:`AppendItems` に渡す配列の型エラー

`AppendItems` メソッドに渡す引数は、「AcadEntityオブジェクトの1次元配列」である必要があります。
よくやりがちなのが、`Dim objList() As Object` のように曖昧な型にしてしまうミス。これだとAutoCADの内部COMが混乱し、「型が一致しません(Error 13)」という冷酷なエラーを返してきます。必ず `Dim objList() As AcadEntity` と厳密に型を宣言してください。

罠その2:「グループオブジェクト」には一括移動(Move)メソッドがない!

これが一番のトラップです。
「グループを作ったんだから、`targetGroup.Move …` って書けば一網打尽に動くはず!」と思いますよね?
残念ながら、AcadGroupオブジェクトに直接 Move や Rotate メソッドはありません。

ではどうするか? 実務では以下のいずれかのアプローチをとります。

1. グループのメンバをループして1つずつ動かす

Dim item As Variant
For Each item In targetGroup
item.Move pnt1, pnt2
Next item

2. 一時的な選択セットにグループのメンバを突っ込んでから動かす
(※パフォーマンスや図面上のハイライト状態を制御したい場合に有効)

グループはあくまで「論理的な結びつき(データベース上の管理単位)」であって、描画操作のショートカットではない、というオブジェクトモデルの哲学を理解しておくと、迷いがなくなります。

4. グループからの「図形の追加・削除」も自由自在

グループは作って終わりではありません。設計変更によって「この線はこのグループから外したい」「新しいパーツを追加したい」という動的な要求が必ず発生します。

  • メンバーの追加: `targetGroup.AppendItems 配列`
  • メンバーの削除: `targetGroup.Removetems 配列`

たったこれだけです。データベースのトランザクションを意識するかのように、必要な図形を出し入れすることができます。

5. まとめ:ここをクリアすれば、AutoCAD VBAの基本はバッチリ!

お疲れ様でした!今回は少し踏み込んだ「グループオブジェクト」の生態系について解説しました。

  • 選択セットは「その場限りの使い捨てお盆」。
  • グループは「図面に刻まれる永続的なチーム」。
  • 操作時は型(AcadEntity)メソッドの有無(直接Moveできない仕様)に注意する。

この3つさえ押さえておけば、複雑なプラント図面や建築図面のパーツ管理であっても、あなたの書いたVBAが鮮やかに、そして正確に裁いてくれます。

マクロの記録の呪縛を解き放ち、自分の手でオブジェクトを支配するエンジニアリングの楽しさを、ぜひ現場で存分に発揮してください。あなたのオートメーションライフを、これからも応援しています!

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