【入門編】【実務中級】図面内の「ネストされたブロック」まで徹底的に掃除:再帰的なPurgeAllの実装 – AutoCAD VBA解析バイブル

スポンサーリンク

【AutoCAD VBA】図面を極限まで軽量化せよ:再帰的「PurgeAll」でネストされた死骸を消し去る術

こんにちは。AutoCADの自動化の世界へようこそ。
日々、重たい図面と格闘している皆さんなら、一度は「PURGE(名前削除)コマンド」を使ったことがあるはずです。しかし、実はAutoCAD標準のコマンドや、単純な`Purge`メソッドだけでは、「ブロックの中に眠っている、もう使われていないブロック(ネストされた未使用オブジェクト)」までは完璧に掃除できないことが多いのです。

今日は、マクロの記録から脱却し、AutoCADのオブジェクトモデルを深く理解したいあなたに向けて、「再帰的なPurgeAll」の構築手法を伝授します。

1. なぜ「PurgeAll」が必要なのか?

AutoCADの図面データベースは「ツリー構造」をしています。
例えば、「親ブロックA」の中に「子ブロックB」が含まれているとします。このとき、図面上の配置を消去しても、親ブロックAという定義が残っている限り、子ブロックBは「使われている」と判定され、通常のPURGEでは消えません。

これを解決するには、「子がいなくなったことを確認してから、親を消す」という再帰的な処理が必要です。これを自動化できれば、図面サイズは驚くほど軽量化され、描画のレスポンスも向上します。

2. オブジェクトモデルの基礎:AcadApplicationとAcadDocument

コードを書く前に、この2つの「背骨」を理解しましょう。

  • AcadApplication: AutoCADそのもの。全ての頂点です。
  • AcadDocument: 現在開いている図面ファイル。この中に `Blocks`(ブロック定義の集合)や `Layers`(画層)が格納されています。

VBAでこれらを操作する際は、`ThisDrawing`という特別なオブジェクトが利用可能です。まずはこれを使って、図面の深淵にアクセスする準備を整えます。

3. 実践:再帰的PurgeAllの実装

以下のコードは、単に消すだけでなく、依存関係を考慮して「消せるまで何度も繰り返す」というロジックを組んでいます。

Public Sub RecursivePurgeAll()
Dim i As Integer
Dim initialCount As Integer
Dim currentCount As Integer

‘ 図面内の全オブジェクトの整理を繰り返す
‘ 「消せるものを消しきれば、それまで消せなかった親ブロックが消せるようになる」
‘ という状態をループで処理します
Do
initialCount = ThisDrawing.Blocks.Count

‘ 1. 未使用のブロック定義を削除
PurgeUnusedBlocks

‘ 2. 未使用の画層・線種なども適宜追加可能
‘ (今回はブロックに特化)

currentCount = ThisDrawing.Blocks.Count

‘ ブロック数が変わらなくなるまで(=全て消し終わるまで)繰り返す
Loop While initialCount <> currentCount

MsgBox “図面のクリーニングが完了しました!”, vbInformation
End Sub

Private Sub PurgeUnusedBlocks()
Dim blk As AcadBlock

‘ ブロック定義を逆順でループする
‘ (削除してインデックスがずれるのを防ぐため)
For i = ThisDrawing.Blocks.Count – 1 To 0 Step -1
Set blk = ThisDrawing.Blocks.Item(i)

‘ 外部参照(Xref)やレイアウトは削除対象外にするのが鉄則
If Not blk.IsXRef And Not blk.IsLayout Then
‘ 参照数が0(どこにも使われていない)なら削除
If blk.Count = 0 Then
On Error Resume Next ‘ 削除不可のシステムブロックを回避
blk.Delete
On Error GoTo 0
End If
End If
Next i
End Sub

4. プロのエンジニアが陥りやすい罠

このコードを実装する上で、必ず注意すべき点が2つあります。

① インデックスの逆順処理(`Step -1`)

コレクション(`Blocks`など)をループしながらその要素を削除すると、インデックスが詰まり、残りの要素がスキップされてしまいます。必ず「後ろから前へ」処理するのが鉄則です。

② システムブロックの保護

AutoCADには、削除しようとすると即座にエラーになる「モデル空間」「ペーパー空間」などのシステムブロックが存在します。`On Error Resume Next` でこれらを無視するだけでなく、`IsLayout` プロパティなどをチェックし、削除対象を厳密に制御するのがプロの作法です。

5. まとめ:ここをクリアすれば、あなたはもう脱初心者

今回紹介した「再帰的なPurgeAll」は、単なるクリーンアップツール以上の意味を持ちます。

  • オブジェクトの依存関係を理解すること
  • ループ処理とコレクションの性質を制御すること
  • エラーハンドリングを適切に配置すること

これら全てが、AutoCAD VBAをマスターするための登竜門です。

「マクロの記録」ボタンを押すだけでは到達できない、あなたの手でAutoCADを制御する快感を、ぜひこのコードから感じ取ってください。図面という広大な海を、あなたの書いたプログラムで美しく保ちましょう。

質問があれば、いつでもコメント欄で教えてくださいね。応援しています!

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