AutoCAD設計プロセスの「真のボトルネック」を暴く:VBAによる計測アーキテクチャの極意
設計現場において、「時間がかかっている」という言葉ほど曖昧で、無価値なものはない。我々エンジニアが欲するのは、主観ではなく「データ」だ。
AutoCADのUIを操作する際、右クリックの挙動一つで設計速度は劇的に変わる。今日は、`AcadApplication.Preferences.User`をVBAで動的にハックし、コマンド単位の実行時間を高精度に計測する「ボトルネック可視化エンジン」の構築手法を伝授する。
—
1. なぜ「設定の動的変更」が必要なのか
AutoCADの設定は、往々にしてユーザーの癖に依存する。しかし、システム管理者としてプロセスの最適化を図るには、計測時のみ環境を統一する必要がある。
今回狙うのは `PreferencesUser.ShortcutMenuDisplay` だ。これを制御し、ユーザーの右クリック時間を「コマンド終了のトリガー」として強制的に差し込む。これにより、曖昧な操作時間をミリ秒単位で捕獲する。
—
2. 核心:高精度タイマーとオブジェクト制御
VBA標準の `Timer` 関数は精度が低い。ミリ秒単位の真の実行時間を計測するには、Windows APIの `QueryPerformanceCounter` を使用するのが鉄則だ。
また、AutoCADのオブジェクトモデルは非常にメモリを食う。特に `Preferences` オブジェクトを頻繁に呼び出すと、COM参照のリークを招き、長時間稼働後のAutoCADの不安定化を誘発する。「取得したら必ず解放する」。これがレガシー環境を長生きさせる秘訣だ。
実装コード:計測エンジン
Option Explicit
‘ 高精度カウンタ用API
Private Declare PtrSafe Function QueryPerformanceCounter Lib “kernel32” (lpPerformanceCount As Currency) As Long
Private Declare PtrSafe Function QueryPerformanceFrequency Lib “kernel32” (lpFrequency As Currency) As Long
Private m_Start As Currency
Private m_Freq As Currency
‘ 計測開始
Public Sub StartMeasurement()
QueryPerformanceFrequency m_Freq
QueryPerformanceCounter m_Start
End Sub
‘ 計測終了とログ出力(シニアエンジニア向け:ファイルI/Oは最小限に)
Public Function StopMeasurement(ByVal CommandName As String) As Double
Dim current As Currency
QueryPerformanceCounter current
‘ ミリ秒換算
StopMeasurement = (current – m_Start) / m_Freq 1000
Debug.Print “Command: ” & CommandName & ” | Time: ” & Format(StopMeasurement, “0.00”) & “ms”
End Function
—
3. Preferencesハックによる操作環境の強制
`AcadApplication.Preferences` は、アプリケーション起動中ずっとメモリに常駐するヘビーなオブジェクトだ。これにアクセスする際は、必ず `Set` でローカル変数に格納し、処理後は `Nothing` を明示する。
Public Sub ToggleShortcutMenu(ByVal enable As Boolean)
Dim acadPref As AcadPreferences
Dim userPref As AcadPreferencesUser
‘ 参照の取得
Set acadPref = ThisDrawing.Application.Preferences
Set userPref = acadPref.User
‘ 右クリック設定の強制変更
userPref.ShortcutMenuDisplay = enable
‘ メモリリーク防止のための明示的解放
Set userPref = Nothing
Set acadPref = Nothing
End Sub
—
4. チーフアーキテクトからの忠告
このシステムを導入する際、以下の3点に注意せよ。これらを無視する者は、設計の生産性を上げるどころか、AutoCADをクラッシュさせる爆弾を作ることになる。
1. エラーハンドリングの徹底: `On Error Resume Next` を多用し、万が一計測プロセスが落ちてもAutoCAD本体がフリーズしないよう、`Finally` ブロックに近い実装(VBAならエラーラベルでの後始末)を徹底すること。
2. COM参照の「使い捨て」: グローバル変数で `AcadApplication` を保持し続けるのは悪手だ。必要な瞬間に `ThisDrawing.Application` から参照を引くスタイルを貫け。
3. システム連携: 計測ログを `Debug.Print` で放置するな。`Scripting.FileSystemObject` を使い、ネットワーク上の共有ディレクトリにCSVで追記させるか、SQL Serverへ直接投げ込むアーキテクチャを推奨する。
結びに
「AutoCAD VBAは古い」などと嘯く者に限って、その真のポテンシャルを理解していない。COMインターフェースを介した深いレベルでの制御こそが、ブラックボックス化されたCAD操作を「エンジニアリングの対象」へと昇華させる。
このツールが、あなたのチームの設計プロセスに潜む「見えない停滞」を可視化し、真の最適化の一歩となることを期待する。健闘を祈る。
