AutoCADの「ゴミ」を許すな:BeginSaveイベントで強制するクリーン・アーキテクチャ
AutoCADの運用において、最も頭を悩ませるのが「肥大化したDWGファイル」だ。不要な画層、未使用のブロック、そして図面を蝕む破損データ。これらを「個人の善意(手動でのパージ)」に委ねているプロジェクトは、すでに破綻への道を歩んでいる。
真の自動化エンジニアは、ワークフローに介入する。ユーザーが「保存」ボタンを押すその瞬間、バックグラウンドでシステムを浄化する。今回は、`BeginSave`イベントをフックし、ファイル保存時に「パージ」と「監査」を強制実行する堅牢な実装を解説する。
—
1. なぜ「イベントドリブン」でなければならないのか
多くのエンジニアは「保存後にパージするマクロ」をボタン登録して運用させようとする。これは設計として三流だ。ユーザーは必ず「実行を忘れる」からだ。
我々が求めるべきは、「ユーザーの操作を無効化せず、かつ必ずプロセスを通過させる」こと。`BeginSave`イベントは、DWGがディスクに書き込まれる直前の「神の領域」にアクセスできる。ここで処理を完結させれば、ファイルは常にクリーンな状態が保証される。
—
2. 実装の要諦:再帰呼び出しの罠を回避せよ
この設計において最大の敵は「無限ループ」だ。`BeginSave`内で保存処理を行えば、それが新たなイベントをトリガーし、AutoCADはクラッシュする。
解決策はシンプルだ。「フラグによる再帰防止」を徹底すること。以下のコードでは、`isCleaning`という静的変数を用いて、処理中か否かを厳密に管理している。
クラスモジュール:`clsAppEvents.cls`
Option Explicit
‘ アプリケーションイベントを監視するためのクラス
Public WithEvents App As AcadApplication
Private isCleaning As Boolean ‘ 再帰防止フラグ
Private Sub App_BeginSave(ByVal FileName As String)
‘ すでに実行中であれば二重起動を防ぐ
If isCleaning Then Exit Sub
On Error GoTo ErrorHandler
isCleaning = True
‘ ユーザーへの確認やログ出力は最小限に
‘ 大規模図面ではパージに時間がかかるため、
‘ ステータスバーで進行状況を可視化するのがベスト
ThisDrawing.Utility.Prompt vbCrLf & “システムによる自動クリーンアップを実行中…”
‘ 1. 監査(Audit)の実行: データベースの修復
‘ データベースの整合性を保証する最優先プロセス
ThisDrawing.SendCommand “_AUDIT” & vbCr & “Y” & vbCr
‘ 2. パージ(Purge)の実行: 不要なオブジェクトの削除
‘ 全ての名前付きオブジェクトをパージする
ThisDrawing.SendCommand “-PURGE” & vbCr & “All” & vbCr & “” & vbCr & “No” & vbCr
ThisDrawing.Utility.Prompt vbCrLf & “クリーンアップ完了。保存を継続します。”
CleanExit:
isCleaning = False
Exit Sub
ErrorHandler:
MsgBox “クリーンアップ中にエラーが発生しました: ” & Err.Description
Resume CleanExit
End Sub
—
3. 実務で生き残るための「鉄則」
1. SendCommandの限界を知る
VBAの`SendCommand`は強力だが、同期処理ゆえにAutoCADの描画状態に依存する。もしコマンドがスタックした場合は、API(`AcDb`オブジェクト等)による直接操作へ移行すべきだが、パージに関しては`SendCommand`が最も確実だ。
2. 「監査」の重さと向き合う
`AUDIT`コマンドは図面の複雑さに比例して時間がかかる。極端に巨大な図面で毎回これを走らせると、ユーザーから「保存が遅い」とクレームが来るだろう。その場合は、`ThisDrawing.GetVariable(“DBMOD”)`で変更がない場合はスキップするなど、条件分岐で最適化を図る必要がある。
3. 初期化プロセスを忘れるな
このクラスモジュールを動作させるには、`ThisDrawing`等のイベントをフックするためのインスタンス生成が必要だ。
標準モジュール(`modMain.bas`)にて:
Public AppEvents As New clsAppEvents
Public Sub InitializeApp()
‘ アプリケーションオブジェクトをリンク
Set AppEvents.App = ThisDrawing.Application
End Sub
この`InitializeApp`を`AcadDoc.dvb`のロード時(`acaddoc.lsp`等から`VBALOAD`経由で実行)に呼び出す運用が最もスマートだ。
—
結論:技術は「仕組み」に宿る
「マニュアルを読んでルールを守らせる」のは管理職の仕事ではない。エンジニアの仕事は、「ルールを守らざるを得ない環境をコードで実装する」ことだ。
今回の`BeginSave`フックは、チーム全体のDWG資産の品質を底上げする。特にBIMや大規模インフラ設計のような、データ連携が重要な現場では、この「静かなる浄化」こそが、将来のトラブルを未然に防ぐ最強の保険となる。
さあ、コードを書いて、汚れた図面を一つ残らず綺麗にしよう。それがプロの仕事だ。
