【実務・中級編】【上級プロフェッショナル】AcadApplicationのイベントハンドリングを活用し、図面保存やコマンド終了をトリガーに外部DBを自動更新する – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAを掌握せよ:イベント駆動型アーキテクチャで「図面とDB」を同期する極意

AutoCADのオートメーションにおいて、初心者は「ボタンを押してマクロを走らせる」という受動的な設計に留まります。しかし、真のエンジニアは「AutoCADという生き物」の状態を常に監視し、変化をトリガーにシステムを自律駆動させることに注力します。

本稿では、`AcadApplication`のイベントハンドリングを駆使し、図面保存やコマンド終了をトリガーに外部データベース(DB)を自動更新する、堅牢なシステム設計の核心を伝授します。

1. なぜ「ポーリング」ではなく「イベント駆動」なのか

多くの開発者が陥る非効率な設計は、タイマーや定期的なチェックによる「ポーリング」です。これはリソースの無駄であり、タイミングの競合によるデータ不整合の温床です。

AutoCADのオブジェクトモデルは、`AcadApplication`や`AcadDocument`に強力なイベントフックを提供しています。これを利用すれば、「何かが起きた瞬間にコードを叩き込む」という、極めて低負荷で即時性の高い連携が可能になります。

2. 堅牢なイベントハンドリングの「作法」

VBAでイベントを扱うには、クラスモジュールによる「イベントシンク」の構築が必須です。標準モジュールに書こうとするのは、初心者特有の過ちです。

ステップ1:クラスモジュールの作成(例:`ClsAppEvents.cls`)

`WithEvents`キーワードを使い、イベントをキャッチする窓口を作成します。

‘ クラスモジュール: ClsAppEvents
Public WithEvents AppEvents As AcadApplication

‘ 図面保存時にトリガーされるイベント
Private Sub AppEvents_BeginSave(ByVal FileName As String)
On Error GoTo ErrHandler

‘ ここにDB更新ロジックを記述
Debug.Print “Save Start: ” & FileName
Call UpdateExternalDatabase(FileName)

Exit Sub
ErrHandler:
MsgBox “DB同期エラー: ” & Err.Description, vbCritical
End Sub

‘ コマンド終了時にトリガーされるイベント
Private Sub AppEvents_EndCommand(ByVal CommandName As String)
‘ 特定のコマンド終了時のみDB更新を行うなどのフィルタリングが可能
If CommandName = “LINE” Or CommandName = “CIRCLE” Then
‘ 変更検知ロジック
End If
End Sub

ステップ2:インスタンスの生存期間を制御する

イベントハンドラは、変数が破棄されると同時に沈黙します。標準モジュールでグローバル変数を宣言し、確実にメモリ上に保持させることが「動かない」を防ぐ秘訣です。

‘ 標準モジュール: MainModule
Public AppObserver As ClsAppEvents

Public Sub StartAutoSync()
‘ インスタンス化してイベントを接続
Set AppObserver = New ClsAppEvents
Set AppObserver.AppEvents = ThisDrawing.Application
MsgBox “イベント監視を開始しました。”, vbInformation
End Sub

3. 実務で「死なない」ための3つの鉄則

外部DB連携は、ネットワーク遅延やロック競合という「物理的な障害」と隣り合わせです。以下の設計思想を必ず実装してください。

1. 非同期的なエラーハンドリング: DB更新が失敗しても、CADのセーブ処理を妨げてはいけません。`On Error Resume Next`を適切に配置し、ログファイルにのみ出力する設計を推奨します。
2. 排他制御の考慮: 保存処理中に他のプロセスがDBにアクセスしている可能性があります。ADO接続時に接続タイムアウトを設定し、接続時間を最小化してください。
3. シングルトンパターンの意識: イベントハンドラは一度だけ初期化してください。何度も初期化すると、イベントが多重登録され、DBへの二重書き込みという大惨事を招きます。

4. プロダクションレベルのDB更新ロジック(雛形)

ADOを利用したシンプルな更新例です。ここをベースに、JSONやCSVエクスポートなど、要件に合わせて拡張してください。

Private Sub UpdateExternalDatabase(ByVal FileName As String)
Dim conn As Object
Set conn = CreateObject(“ADODB.Connection”)

‘ 接続文字列(環境に合わせて調整)
conn.ConnectionString = “Provider=SQLOLEDB;Data Source=ServerName;Initial Catalog=CAD_DB;Integrated Security=SSPI;”

On Error Resume Next
conn.Open
If conn.State = 1 Then
‘ 図面情報をDBへ反映(パラメータ化クエリを強く推奨)
conn.Execute “UPDATE DrawingMeta SET LastSaved = GETDATE() WHERE FilePath = ‘” & FileName & “‘”
conn.Close
End If
Set conn = Nothing
End Sub

結論:エンジニアの誇りとして

今回紹介したイベント駆動型設計は、単なる機能追加ではありません。「人間が介在しなくても、CADが勝手に情報を管理する」という、業務の自動化における一つの到達点です。

イベントハンドラを制する者は、AutoCADの複雑な挙動を制します。コードを書く際は、常に「この処理が予期せぬタイミングで走ったらどうなるか?」を想像してください。その鋭い想像力こそが、あなたのコードを「ただ動くもの」から「止まらない資産」へと昇華させるのです。

さあ、あなたのコードで設計現場の常識を覆してください。健闘を祈ります。

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