【実務・中級編】【上級】AcadApplication.Preferences.Display.CursorSizeを一時的に100%に変更し、広域図面での「位置合わせ」を支援するVBAツール – AutoCAD VBA解析バイブル

スポンサーリンク

【上級】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を自らの手で構築してほしい。

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