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