【実務・中級編】【上級プロフェッショナル向け】図面保存イベント(BeginSave)をフックした「自動パージ&監査」の強制実行 – AutoCAD VBA解析バイブル

スポンサーリンク

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や大規模インフラ設計のような、データ連携が重要な現場では、この「静かなる浄化」こそが、将来のトラブルを未然に防ぐ最強の保険となる。

さあ、コードを書いて、汚れた図面を一つ残らず綺麗にしよう。それがプロの仕事だ。

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