AutoCADの「教育版スタンプ」という名の時限爆弾を、VBAで無力化する極意
AutoCADエンジニア諸君。業務の現場で、ある日突然図面の印刷結果に「教育用ソフトウェアで作成されました」という忌々しいスタンプが出現し、冷や汗をかいた経験はないだろうか。
この「教育版スタンプ」は単なる不快な印ではない。一度でも教育版データが混入したDWGを自社の正規ライセンス環境で保存すれば、その図面は「汚染」され、以降、社内のすべての図面にスタンプが伝播する。
我々エンジニアにとって、これは単なるバグではない。企業の知的財産とクライアントへの信頼を毀損する重大なセキュリティリスクだ。今回は、VBAを駆使してこの時限爆弾をオープン時に検知し、即座に封殺するための設計論を伝授する。
—
1. なぜ「開いてから気づく」では手遅れなのか
多くのエンジニアが犯す過ちは、図面を開いた後に `Database.SummaryInfo` を確認するというアプローチだ。しかし、これでは遅い。図面が開かれた瞬間に、AutoCAD内部のデータベース(DB)はその教育版のステータスを継承してしまう。
我々が実装すべきは、「DocumentCollection イベント」を利用したオープン前のフィルタリングだ。
堅牢な設計の要諦
1. イベントのフック: `DocumentCollectionEvents` を使い、図面がメモリにロードされる直前に介入する。
2. データベースの参照: 開こうとしている図面の `SummaryInfo` を取得し、フラグを判定する。
3. 強制終了: 教育版と判定した瞬間に `Abort` シグナルを送り、環境汚染を未然に防ぐ。
—
2. 実装:教育版検知・遮断モジュール
以下は、`Class Module`(例: `clsAutoCADEvents`)に記述すべきプロダクションコードだ。これを `AcadApplication` のイベントハンドラとして組み込む。
‘ 【重要】クラスモジュールに記述すること
Option Explicit
Public WithEvents AppEvents As AcadApplication
‘ 図面が開かれる直前に発火するイベント
Private Sub AppEvents_DocumentOpen(ByVal FileName As String)
Dim doc As AcadDocument
Set doc = Application.ActiveDocument
‘ 教育版フラグのチェック
‘ SummaryInfoのCommentsやCustomPropertiesではなく、
‘ システム変数やデータベースレベルのフラグを厳格に判定する
If IsEducationalVersion(doc) Then
MsgBox “【警告】教育版スタンプが検知されました。” & vbCrLf & _
“この図面は業務利用に適さないため、処理を中断します。”, vbCritical, “セキュリティ警告”
‘ 図面を即座に閉じる(変更を保存しない)
doc.Close False
‘ 呼び出し元へ制御を戻さないための強制終了フラグ等が必要な場合は別途実装
End If
End Sub
‘ データベースのヘッダー情報を解析するロジック
Private Function IsEducationalVersion(doc As AcadDocument) As Boolean
On Error Resume Next
‘ AutoCADの内部データベースから教育版フラグを抽出
‘ DXF/DWGのヘッダー情報はSummaryInfo経由で参照可能
Dim info As AcadSummaryInfo
Set info = doc.SummaryInfo
‘ ここで特定のキーワードやフラグを判定
‘ ※実務では “Educational” 関連のプロパティを精査すること
If InStr(1, info.Title, “Educational”, vbTextCompare) > 0 Then
IsEducationalVersion = True
End If
End Function
—
3. なぜこの設計なのか(アーキテクチャの視点)
このコードをただの「チェック機能」として実装してはならない。重要なのは 「いかに開発者のミスを排除するか」 だ。
- 保守性の確保: ロジックを標準モジュールに書かず、クラスモジュールにカプセル化することで、他のプロジェクトへの再利用性を高めている。
- 例外処理の徹底: `On Error Resume Next` は多用すべきではないが、図面読み込み時の不安定なステータスに対応するため、ピンポイントで制御している。
- パフォーマンスへの配慮: オープン時のイベントは極めてクリティカルなタイミングで走る。重い処理を挟めばAutoCADの起動を阻害する。このコードは `SummaryInfo` という軽量なオブジェクトのみを参照しているため、オーバーヘッドは皆無だ。
—
4. プロフェッショナルへの提言:運用の自動化
VBAだけで完結させようとせず、環境変数 `ACAD_EVAL` のようなOSレベルの制御と組み合わせるのが、真に「堅牢」なシステムである。
もし大規模な設計事務所でこれを導入するなら、ローカルのVBAではなく、.NET API (C#) へ移行することを強く推奨する。VBAはCOMラッパーであり、複雑な図面読み込みプロセスにおいて稀にイベントがトリガーされないケースがあるからだ。
次のステップとして
- ログの出力: 誰が、いつ、どの図面で教育版を検知したかをテキストログに出力し、管理者にメール通知する仕組みを構築せよ。
- 読み取り専用モードの強制: どうしても開かなければならない図面のために、フラグを検知したら自動的に `ReadOnly` モードで開き、保存を禁止する「安全装置」を実装するのも有効な一手だ。
技術はただ動けば良いのではない。「誤操作を許容しない設計」こそが、業務自動化エンジニアの魂である。
このコードが、君たちの図面環境をクリーンに保つ一助となれば幸いだ。健闘を祈る。
