【テクニカル・上級編】【上級】AcadApplication.Preferences.Userの右クリックカスタマイズ設定をVBAで制御し、設計作業のストップウォッチ機能を実装する – AutoCAD VBA解析バイブル

スポンサーリンク

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操作を「エンジニアリングの対象」へと昇華させる。

このツールが、あなたのチームの設計プロセスに潜む「見えない停滞」を可視化し、真の最適化の一歩となることを期待する。健闘を祈る。

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