墓場まで持っていく「AutoCADリアルタイム同期」の設計思想
AutoCADのオートメーションにおいて、最も安易で、かつ最も現場を破綻させる実装が「イベントの乱用」だ。特に `EndCommand` をトリガーにした外部DB同期は、一歩間違えればAutoCADのUIスレッドを凍結させ、設計者の生産性を地の底へ叩き落とす。
本稿では、単なる「動くコード」ではなく、エンタープライズ環境で生き残るための「疎結合かつ堅牢な同期アーキテクチャ」の極意を伝授する。
—
1. EndCommandの罠と「遅延実行」の必要性
`EndCommand` イベントは、コマンド終了直後に発火する。しかし、この瞬間にSQL Serverへ直結する同期処理を走らせてはならない。理由は明白だ。
1. トランザクションの未確定: まだ図面データベースが完全に更新を終えていない可能性がある。
2. パフォーマンスのボトルネック: ネットワークのラグがAutoCADの応答性に直結する。
3. イベントの連鎖: `EndCommand` 内で行った修正が、再び `EndCommand` を呼び出す無限ループの危険性。
【極限の解法】
イベント発生時は「フラグを立てる」だけに留め、`Application.OnTime`(あるいはWindows APIのタイマー)を用いて、数ミリ秒後のアイドルタイムに同期処理を委譲せよ。これがUIをロックさせないための鉄則である。
—
2. 実装:堅牢な同期アーキテクチャ
ここでは、`MOVE` や `STRETCH` 後の座標取得ロジックと、ADOを利用したSQL Server連携のコア部分を提示する。
‘ — Class Module: clsSyncManager —
Option Explicit
Private WithEvents acadApp As AcadApplication
Private isPending As Boolean
Private Sub Class_Initialize()
Set acadApp = ThisDrawing.Application
End Sub
‘ EndCommandの補足
Private Sub acadApp_EndCommand(ByVal CommandName As String)
‘ 監視対象コマンドを限定する(重要)
If CommandName = “MOVE” Or CommandName = “STRETCH” Then
‘ ここで即座にDBを叩かず、アイドル時間に処理を回す
isPending = True
‘ 0.5秒後に同期処理を走らせる(環境により調整)
acadApp.OnTime Now + TimeValue(“00:00:01”), “SyncToSQLServer”
End If
End Sub
‘ — Standard Module: modSync —
Public Sub SyncToSQLServer()
Dim conn As Object ‘ ADODB.Connection
Dim cmd As Object ‘ ADODB.Command
‘ SQL Serverへの接続(接続文字列は環境に合わせて最適化すること)
Set conn = CreateObject(“ADODB.Connection”)
conn.ConnectionString = “Provider=SQLOLEDB;Data Source=YourServer;Initial Catalog=BIM_DB;Integrated Security=SSPI;”
conn.Open
‘ ここで座標抽出ロジック(SelectionSetsによる変更オブジェクトの特定)を実装
‘ … 座標取得ロジック …
‘ メモリの明示的解放(VBAのGCを信用するな)
conn.Close
Set conn = Nothing
End Sub
—
3. シニアエンジニアが守るべき「メモリとリソースの流儀」
VBAのガーベジコレクションは信用に値しない。特に、AutoCADという巨大なメモリ空間を扱う以上、以下の作法は「宗教」として遵守せよ。
オブジェクトの明示的解放
`Set obj = Nothing` を怠ることは、メモリリークという名の時限爆弾を仕掛けているのと同じだ。特に、`AcadSelectionSet` や `AcadEntity` をループ内で生成する場合、スコープを抜ける前に必ず参照をクリアしろ。
ADOの非同期実行
SQL Serverへの書き込みは、必ず `Command` オブジェクトの `Execute` メソッドで非同期モードを指定するか、あるいは別スレッド(COM DLL)へ処理を逃がせ。VBAのメインスレッドをDBの応答待ちで止めるのは、エンジニアとして最大の恥である。
—
4. レガシー環境における保守性の極意
このシステムを保守する際、最も恐れるべきは「図面とDBの不整合」だ。
- ハッシュ値による変更検知: 単に座標を送るのではなく、オブジェクトの `Handle` と座標のハッシュ値を照合し、変更がなければ送信をスキップするロジックを噛ませる。
- ログのローカル保持: ネットワーク切断時にSQL送信が失敗した場合、ローカルのCSVやローカルDB(SQLite等)にログをキューイングし、次回起動時に再送する「オフライン同期機能」を実装せよ。
—
最後に:エンジニアへの提言
AutoCAD VBAはレガシーではない。適切に設計されたCOMコンポーネントは、今なお最新のBIM連携システムにおいて高速かつ軽量なインターフェースとして機能する。
「動く」ことは最低条件だ。ユーザーが同期中であることを微塵も感じさせず、かつデータベースが図面の最新状態を正確に反映し続けること。その無音の精度こそが、我々エンジニアが到達すべき「極限」である。
君たちの書くコードが、明日の設計現場を支えるインフラになることを期待している。
