【上級】AcadApplication.Preferences.Display.CursorSizeを極める:広域図面のアライメントを爆速化するUI補助VBAの実装
図面が巨大化するにつれ、設計者は「見えない線」との格闘を強いられる。
数キロメートル先(あるいは数百万ミリ先)にある基準点と、今まさに配置しようとしている部品の水平・垂直を合わせる。標準のクロスヘアカーソル(十字カーソル)では、画面の端から端まで視線を往復させ、ガイドラインを脳内で延長するしがない。
「カーソルサイズを一時的に100%にできたら……」
AutoCAD VBAのオブジェクトモデルを深く理解していれば、`AcadPreferencesDisplay.CursorSize` プロパティを操作することで、この課題をコード一発で解決できることに気づくだろう。
しかし、プロの現場で使うツールとして昇華させるには、単に値を「100」にして戻すだけでは不十分だ。
今回は、「異常終了時(ESCキーによる中断など)にも必ず元の設定値を復元する堅牢性」と、「トランザクションの本質を見据えた実用的なコマンドフロー」を兼ね備えた、プロダクションレベルのVBAコードを授けよう。
—
1. なぜこのアプローチが必要なのか:アーキテクトの視点
多くの初学者は、VBAでUIの設定を変更する際、次のようなナイーブなコードを書く。
‘ 【アンチパターン】これでは実務で使い物にならない
Sub BadExample()
ThisDrawing.Application.Preferences.Display.CursorSize = 100
‘ 何らかの処理
ThisDrawing.Application.Preferences.Display.CursorSize = 5
End Sub
このコードの何が問題か?
もし「何らかの処理」の最中にユーザーが `ESC` キーを押して処理を中断したり、予期せぬエラーが発生したりした場合、カーソルサイズが100%のまま放置される。ユーザーは激怒し、ツールの信頼性は地に落ちる。
真に堅牢なツールを作るには、エラーハンドリング(Error Handling)による状態の保証が絶対条件となる。
—
2. 設計思想:ステートレスな切替と例外安全
今回のツール(`SmartAlignCursor`)の設計要件は以下の通り:
1. 実行前の状態(元のカーソルサイズ)を確実に退避する
2. 処理の成否、中断(Err発生時)に関わらず、必ず元の設定に復元する(finally句のイディオム)
3. ユーザーが視覚的に迷わないよう、ステータスバーへ現在のモードをフィードバックする
これを満たす実用コードを以下に提示する。
—
3. プロダクションコード例
以下のコードをAutoCADのVBAエディタ(`Alt + F11`)の標準モジュールに貼り付けて実行してほしい。
Option Explicit
‘ ==============================================================================
‘ 業務効率化ツール: 広域図面位置合わせ用 100%クロスヘア制御モジュール
‘ アーキテクト設計による例外安全(Error-Safe)なUI補助実装
‘ ==============================================================================
Public Sub SmartAlignCursor()
Dim acadApp As AcadApplication
Dim originalCursorSize As Integer
Dim userPrompt As String
‘ 1. アプリケーションオブジェクトの取得(CreateObjectではなくThisDrawing経由でセキュアに取得)
On Error GoTo ErrorHandler
Set acadApp = ThisDrawing.Application
‘ 2. 現在のカーソルサイズを退避(通常は5〜100の整数)
originalCursorSize = acadApp.Preferences.Display.CursorSize
‘ 3. カーソルを最大(100%)に変更
acadApp.Preferences.Display.CursorSize = 100
‘ 4. ユーザーへ処理の実行を促す(Utilityオブジェクトを利用したインプット)
userPrompt = vbCrLf & “【位置合わせモード】クロスヘアを100%に拡張しました。” & _
vbCrLf & “基準点を選択し、配置を完了させてください。”
acadApp.Utility.Prompt userPrompt
‘ 5. ここでユーザーインタラクション(オブジェクト選択や移動コマンドなど)をシミュレート
‘ 実務では、このタイミングでユーザーに図形選択や配置を行わせる。
‘ 今回は簡易的に、ユーザーがEnterキーを押すまで待機するプロンプトを挟む。
Dim dummyPoint As Variant
dummyPoint = acadApp.Utility.GetPoint(, “>>> [Enterまたはクリックで配置を確定し、カーソルを元に戻します]”)
CleanUp:
‘ ==========================================================================
‘ 【重要】正常終了・異常終了を問わず、必ず通るクリーンアップブロック
‘ ==========================================================================
If Not acadApp Is Nothing Then
acadApp.Preferences.Display.CursorSize = originalCursorSize
acadApp.Utility.Prompt vbCrLf & “>>> カーソルサイズを元の設定 (” & originalCursorSize & “%) に復元しました。” & vbCrLf
End If
Exit Sub
ErrorHandler:
‘ 万が一のエラーキャッチ
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “SmartAlignCursor 実行エラー”
Resume CleanUp
End Sub
—
4. コードの解説:プロが押さえるべき実装の急所
`AcadPreferences.Display` へのアクセスパス
AutoCADのオブジェクトモデルの頂点である `AcadApplication` から `Preferences`、そして `Display` と階層を辿ることで、オプションダイアログの「表示」タブにある設定をコードから直接書き換えることができる。
この変更はレジストリ、あるいはメモリ上のセッションプロファイルに即座に反映される。
`CleanUp` ラベルによる例外安全の担保
VBAにはVB.NETの `Try…Catch…Finally` のような美しい構文が存在しない。そのため、C言語や古いVBAのイディオムである `On Error GoTo ErrorHandler` と `Resume`(あるいはラベルへのジャンプ) を駆使して、確実にリソースや環境を原状復帰させる構造を構築する必要がある。
今回のコードでは、`CleanUp` ラベルを用意し、エラーが起きた場合も正常に処理が終わった場合も、必ず `originalCursorSize` が代入される経路を通るように設計している。
—
5. 実務展開へのアドバイス
このマクロをリボンメニューやツールバー、あるいはショートカットキー(例: `Ctrl + Shift + C`)に割り当てることで、広域図面におけるアライメント作業のスピードは劇的に向上する。
さらに発展させるならば、このプロシージャをクラスモジュール(Class Module)としてカプセル化し、`Class_Initialize` で退避、`Class_Terminate` で復元を行う「RAII(Resource Acquisition Is Initialization)風のライフサイクル管理」を実装するのも一歩進んだアーキテクチャだ。
図面の規模に負けない、ストレスフリーな開発環境とUIを自らの手で構築してほしい。
