AutoCADとデータベースの境界を消去せよ:EndCommandイベントによるリアルタイム同期の極意
AutoCADの図面データが「ファイルの中」だけで完結している時代は終わった。真のBIM/CIM環境では、図面はデータベースの一投影に過ぎない。
「MOVE」や「STRETCH」が終わったその瞬間、図面上の座標が即座にSQL Serverへ反映される――。このアーキテクチャを構築することは、単なる自動化を超え、組織のデータガバナンスを根本から変える。
だが、安易な実装はAutoCADの動作を重くし、最悪の場合、致命的なクラッシュを招く。今回は、伝説的アーキテクトの視点から、「EndCommandイベント」を制御し、堅牢な同期システムを構築する鉄則を伝授する。
—
1. なぜ「EndCommand」なのか:設計の哲学
AutoCADのイベント駆動は強力だが、諸刃の剣だ。`EndCommand`はユーザーがコマンドを終了した瞬間に発火する。ここで重要なのは、「どのコマンドが終了したのか」を厳密にフィルタリングすることだ。
全てのコマンド終了時にDBへ接続していては、パフォーマンスは崩壊する。対象とするコマンド(MOVE, STRETCH, ROTATEなど)のみを捕捉し、かつ「非同期」に近い感覚でデータをプッシュする設計が求められる。
2. 堅牢な実装のためのアーキテクチャ
以下のコードは、単に動くものではなく、プロダクション環境での安定稼働を前提としている。
クラスモジュール: `EventController`
AutoCADのイベントを監視するクラスモジュールを定義する。
‘ 【重要】AcadDocumentのイベント監視用クラス
Public WithEvents DocEvents As AcadDocument
Private Sub DocEvents_EndCommand(ByVal CommandName As String)
‘ 監視対象コマンドを限定する(フィルタリングの徹底)
Select Case UCase(CommandName)
Case “MOVE”, “STRETCH”, “ROTATE”, “COPY”
‘ 処理の重いDB接続をメインスレッドから切り離す意識を持つ
Call SyncToDatabase(CommandName)
Case Else
‘ 無関係なコマンドは即座に抜ける
End Select
End Sub
Private Sub SyncToDatabase(ByVal Cmd As String)
On Error GoTo ErrorHandler
‘ SQL Serverへの接続にはADODBを使用(Late Binding推奨)
Dim conn As Object
Set conn = CreateObject(“ADODB.Connection”)
‘ 接続文字列(環境に合わせて最適化すること)
conn.ConnectionString = “Provider=SQLOLEDB;Data Source=SERVER_NAME;Initial Catalog=DB_NAME;Integrated Security=SSPI;”
conn.Open
‘ ここで現在選択されているオブジェクトを走査し、座標をUPDATEする
‘ ※SSSetFirst等を使用して、直前に編集されたオブジェクトを特定する
conn.Close
Set conn = Nothing
Exit Sub
ErrorHandler:
Debug.Print “Sync Error: ” & Err.Description
‘ 本番環境ではログをローカルファイルへ出力する仕組みを併用せよ
End Sub
3. 実務で「絶対に守るべき」3つの鉄則
① 接続のライフサイクル管理
データベース接続をグローバル変数で保持し続けるのは悪手だ。接続は「必要になった瞬間に開き、処理が終われば直ちに閉じる(Disposeする)」。コネクションプーリングを意識し、接続エラーが起きてもAutoCAD自体を落とさないよう、厳格な例外処理(On Error)を記述すること。
② 「変更対象」の特定ロジック
`EndCommand`には「どの図形が動いたか」という情報は含まれない。これを解決するには、コマンド開始前(`BeginCommand`)に現在の選択セットを保存しておき、終了後との差分を比較する手法が最も確実だ。
- 開始時: `SSGet(“I”)` で選択セットを取得。
- 終了時: オブジェクトのハンドルをキーに、座標値を抽出。
③ SQL Serverとの通信は「一括処理」
図形一つ動かすたびに1回のINSERT/UPDATEを発行してはならない。変更された複数のオブジェクトがある場合、それらを配列にまとめ、1回のトランザクションでコミットする。これがネットワーク遅延とDB負荷を最小化する唯一の解だ。
4. 最後に:エンジニアとしての矜持
このシステムを導入すると、設計者は「図面を描く」という行為から、「データを管理する」という意識へ変革される。AutoCAD VBAは古く見えるかもしれないが、適切な設計と最新のDB技術を組み合わせれば、最新のクラウドサービスにも引けを取らない強力な基盤となる。
「動くコード」を書くのはジュニアエンジニアの仕事だ。
「壊れない、重くならない、保守し続けられるコード」を設計するのが、真のアーキテクトである。
さあ、君のAutoCADを、ただの作図ツールから、組織の中核となるデータエンジンへと昇華させてほしい。実装で行き詰まったら、オブジェクトモデルの深い層を見つめ直せ。答えは常に、APIの深淵にある。
