【実務・中級編】【実務中級者向け】「名前削除(Purge)」と「監査(Audit)」を組み合わせた「超軽量化セーブ」マクロの構築 – AutoCAD VBA解析バイブル

スポンサーリンク

肥大化するDWGに終止符を。AutoCAD VBAで実現する「究極の軽量化セーブ」の実装論

現場でAutoCADを扱っていると、ある日突然、数MBだった図面が数十MBに膨れ上がる現象に遭遇する。これは、AutoCADが「過去の残滓」を律儀にデータベースへ保持し続けるからだ。

「ファイルを開くたびに重い」「保存に時間がかかる」——これは単なるストレスではない。エンジニアとしての怠慢が引き起こす、生産性のドブ捨てだ。

今回は、単なるコマンドの羅列ではない。`Purge`(名前削除)と `Audit`(監査)を組み合わせ、AutoCADのデータベース整合性を極限まで保ちながらファイルをクリーンに保つ「超軽量化セーブ」の実装術を伝授する。

—

1. なぜ「手動のPurge」では不十分なのか

多くの設計者は、手動で `PURGE` コマンドを実行する。しかし、これは致命的な誤解だ。

  • ネストされたゴミ: 一度のPurgeでは削除しきれない階層が存在する。
  • データベースの破損: 肥大化の正体は「未解決の外部参照」や「不正なオブジェクトID」である場合が多い。これらはPurgeだけでは消えない。
  • オートメーションの欠如: 人間の操作は必ずミスを生む。「保存時に自動で行う」という強制力をシステムに組み込まなければ、現場の図面はいつか破綻する。

2. 堅牢な設計指針:コードの「質」を担保する

VBAでこれを制御する場合、以下の3点を遵守せよ。

1. エコーバックの抑制: `CMDECHO` を切り、コマンド実行時の画面チラつきと無駄なログを排除する。
2. ネストPurgeの再帰: AutoCADの仕様上、最低でも3回はPurgeを叩くのが鉄則だ。
3. データベースの整合性: `Audit` を実行し、メモリ上の破損を修復してからディスクへ書き出す。

3. 実装:プロダクションコード(CleanSaveマクロ)

以下のコードは、実務レベルでそのまま組み込める設計としている。`ThisDrawing` を用いた、堅牢な実装だ。

Public Sub OptimizedSave()
Dim doc As AcadDocument
Set doc = ThisDrawing

‘ 1. 環境設定の退避と最適化
Dim oldEcho As Integer
oldEcho = ThisDrawing.GetVariable(“CMDECHO”)
ThisDrawing.SetVariable “CMDECHO”, 0

On Error GoTo Cleanup

‘ 2. 徹底的な名前削除(Purge)
‘ 複数回実行することで、ネストされた不要定義を完全に掃討する
Dim i As Integer
For i = 1 To 3
‘ “_-PURGE” の先頭のアンダースコアは、言語環境を問わずコマンドを呼ぶための定石
doc.SendCommand “_-PURGE” & vbCr & “_All” & vbCr & “” & vbCr & “_No” & vbCr
Next i

‘ 3. データベース監査(Audit)
‘ 内部的なエラーを修復し、データベース構造を正常化する
doc.SendCommand “_AUDIT” & vbCr & “_Yes” & vbCr

‘ 4. 上書き保存
doc.Save

MsgBox “最適化完了:ファイルが軽量化されました。”, vbInformation

Cleanup:
‘ 設定を元に戻す
ThisDrawing.SetVariable “CMDECHO”, oldEcho
If Err.Number <> 0 Then
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End If
End Sub

4. チーフアーキテクトからの助言:注意点と最適化

このマクロを導入する際、以下のポイントを心に刻んでおいてほしい。

  • SendCommandの限界: `SendCommand` は直感的だが、非同期的な側面がある。もし図面が巨大すぎる場合、コマンド完了前に次の処理が走らないよう `DoEvents` を挟むか、より高度な制御が必要な場合は `ObjectARX` や `.NET API` への移行を検討せよ。
  • 保存のトリガー: このマクロを「保存ボタン」に割り当てる際は、`VBE` での `DocumentBeforeSave` イベントを活用するのも一つの手だ。ただし、自動化が過ぎると保存時間が長くなりすぎるため、ユーザーへの事前通知が不可欠となる。
  • 不要なレイヤー・ブロックの削除: もし特定の「絶対に消してはいけないブロック」がある場合は、Purgeの引数を調整し、フィルタリングするロジックを追加せよ。

—

最後に:エンジニアとしての矜持

図面は、設計者の思考を保存する「資産」だ。その資産をゴミで肥大化させ、動作を重くすることは、設計者の思考速度を落とすことに他ならない。

今回提示したコードは、あくまで「最低限のクリーンアップ」だ。ここから先、自社の図面管理ルールに合わせて、外部参照のパスを自動修復したり、不要なレイアウトタブを削除する処理を肉付けしていけばいい。

「動くコード」を書くのは初心者だ。「環境を正しく維持し、チームのパフォーマンスを引き上げるコード」を書く者が、真のエンジニアである。

さあ、今すぐあなたの図面から、無駄な残滓を消し去ってほしい。

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