【入門編】【実務中級】AcadDocument.Database.Groupsの走査:図面内の「グループ名」から特定の構成パーツを自動抽出する – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは!AutoCAD VBAの世界へようこそ。
マクロの記録ボタンを押して「動いたはいいけれど、中身が全然読めない……」そんな壁にぶぶつかっていませんか?

大丈夫。今日あなたと一緒に紐解くのは、実務で死ぬほど役立つ「図面内のグループ(Groups)の走査と、そこからのパーツ自動抽出」です。

ブロックにするほど固めたくないけれど、設計上のユニット(まとまり)として扱いたい。そんなときに現場で重宝されるのがAutoCADの「グループ機能」です。これをVBAから自由自在に操れるようになると、あなたの自動化スキルは一気に中級エンジニアの領域へ駆け上がります。

さあ、基本から本質まで、優しく丁寧にお話ししていきましょう。ここをクリアすれば、AutoCAD VBAの基本構造はバッチリですよ!

—

1. AutoCADオブジェクトモデルの「心臓部」を理解する

まずは、AutoCAD VBAの全体像を頭に思い描いてみましょう。
AutoCADの背骨には、次のような厳格な階層構造(オブジェクトモデル)が存在します。

AcadApplication (AutoCAD本体)
┗ ActiveDocument (今開いている図面)
┗ Database (図面のデータ置き場)
┣ Blocks (ブロック定義の集まり)
┣ Layers (画層の集まり)
┗ Groups (グループの集まり ★今日の本丸)

私たちが操作する「図面」の中身は、すべて `Database` という巨大なコンテナの中にしまわれています。その中にある `Groups`(グループコレクション)にアクセスすることで、「ユーザーが名前をつけてまとめた図形たちの集合体」をごっそり召喚することができるのです。

ブロックとグループの決定的な違い

  • ブロック (Block): 実体が1つに統合され、定義としてメモリに焼き付けられるもの。
  • グループ (Group): 個々のバラバラの図形(線や円など)が、「論理的な絆」で結ばれているだけのもの。

今日のテーマである「グループ」を走査するとは、この「絆のリスト」を上から順にめくり、お目当てのグループ名を探し出して、中に含まれるパーツを取り出す作業を指します。

—

2. 【実務直結】グループ名からパーツを自動抽出するVBAコード

百聞は一見に如かず。開発の現場でそのままコピペして、すぐに動かせる実用コードを用意しました。
VBAエディタ([Alt] + [F11])を開き、標準モジュールに貼り付けてみてください。

Sub ExtractPartsFromGroup()
Dim acadApp As AcadApplication
Dim acadDoc As AcadDocument
Dim targetGroup As AcadGroup
Dim ent As AcadEntity
Dim groupName As String
Dim i As Long
Dim memberCount As Long

‘ 1. アプリケーションとアクティブドキュメントの取得
Set acadDoc = ThisDrawing

‘ ※実務では必ず「今開いている図面」を基準にします
If acadDoc Is Nothing Then
MsgBox “有効な図面が開かれていません。”, vbCritical
Exit Sub
End If

‘ 2. 検索したいグループ名を指定(※図面内に存在するグループ名に書き換えてください)
groupName = “UNIT_PUMP_01”

‘ 3. 該当するグループが存在するかエラーハンドリング付きで安全に取得
On Error Resume Next
Set targetGroup = acadDoc.Groups.Item(groupName)
On Error GoTo 0 ‘ エラー監視を元に戻す

If targetGroup Is Nothing Then
MsgBox “指定されたグループ [” & groupName & “] が見つかりませんでした。”, vbExclamation
Exit Sub
End If

‘ 4. グループ内の構成パーツ(エンティティ)を走査する
memberCount = targetGroup.Count
Debug.Print “=== グループ名: ” & groupName & ” (構成数: ” & memberCount & “件) ===”

‘ グループ内の全メンバーをループ処理
For i = 0 To memberCount – 1
Set ent = targetGroup.Item(i)

‘ パーツの種類(画層やオブジェクト名)をイミディエイトウインドウに出力
Debug.Print ” – パーツ種類: ” & ent.ObjectName & ” / 画層: ” & ent.Layer

‘ 【応用例】特定の条件(例: 線の色を赤に変えるなど)の処理をここに記述
‘ ent.Color = acRed

Next i

MsgBox “グループの走査が完了しました。イミディエイトウインドウを確認してください。”, vbInformation

End Sub

—

3. コードの急所を解説!ここが分かれば怖くない

上記のコードで、特に重要なポイントを3つに絞って解説します。

① `ThisDrawing` の正体

コード内で `ThisDrawing` を使っていますが、これは `AcadApplication.ActiveDocument` のショートカットです。
「今、目の前でユーザーが作業している図面」をダイレクトに指し示すため、実務のスクリプトでは最も頻繁に使うお馴染みのオブジェクトです。

② `On Error Resume Next` による安全対策

ここがプロの技の見せどころです。
もし指定したグループ名(例: `”UNIT_PUMP_01″`)が図面内に存在しなかった場合、通常は「インデックスが範囲外です」という実行時エラー(Runtime Error)が発生してマクロが強制終了してしまいます。

On Error Resume Next
Set targetGroup = acadDoc.Groups.Item(groupName)
On Error GoTo 0

この挟み撃ちの記述により、「もしエラーが起きてもとりあえず無視して次の行に進む」ようにし、その直後の `If targetGroup Is Nothing Then` で「あ、グループが無かったんだな」と優しく判定してあげるわけです。この防衛的プログラミングが、現場で信頼されるマクロの条件です。

③ 0起点(ゼロオリジン)のループ

AutoCAD VBAの多くのコレクション(GroupsやSelectionSetなど)は、インデックスが `0` からスタートします。
そのため、メンバー数が `5` 個であれば、ループは `0` から `4` まで(`memberCount – 1`)回す必要があります。ここを `1 To memberCount` にしてしまうと、最後のエレメントを取り損ねるかエラーになるので注意しましょう。

—

4. 陥りやすい罠とトラブルシューティング

最後に、初心者が絶対にハマる「グループ操作の落とし穴」を共有しておきます。

  • 罠1: グループがネスト(入れ子)されている場合の誤解

AutoCADのグループの中に、さらに別のグループを直接入れることはできません。グループのメンバーはすべてフラットな `AcadEntity`(線、円、ブロック参照など)の集まりです。そのため、今回のコードのようにシンプルな `For` ループで完全に網羅できます。

  • 罠2: 削除されたグループを指し続けるメモリリーク

一度取得した `AcadGroup` オブジェクトの変数(`targetGroup`)は、ユーザーが画面上でグループを解散(UNGROUP)した後もメモリに残ることがあります。処理の最後や不要になったタイミングで `Set targetGroup = Nothing` と明示的に解放してあげるのが、綺麗で軽いコードを書くエンジニアの作法です。

—

おわりに

お疲れ様でした!
「図面の中にあるグループという単位をプログラムから見つけ出し、中身のパーツを1つずつ点検する」という一連の流れ、イメージできましたか?

この技術を応用すれば、

  • 「特定のユニットグループだけを別図面に書き出す」
  • 「特定のグループ内のボルトの本数を自動集計してExcelに飛ばす」

といった、高度な設計支援ツールの開発へ簡単につながっていきます。

ご自身の図面を開いて、ぜひ手を動かして試してみてくださいね。あなたのAutoCADライフが、もっと快適でエキサイティングなものになりますように!

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