【実務・中級編】【上級】AcadApplication.Preferences.Display.CursorSizeを0%から100%へ動的変更:精密な位置合わせを支援するVBA十字カーソル制御 – AutoCAD VBA解析バイブル

スポンサーリンク

【上級】AcadApplication.Preferences.Display.CursorSizeを0%から100%へ動的変更:精密な位置合わせを支援するVBA十字カーソル制御

開発プロジェクトの現場で、こんな要望を受けたことはないだろうか。

「広大な土木図面の中で、特定の微細なオブジェクト同士の位置合わせを行う際、現在の十字カーソルでは小さすぎて位置の整合性が目視で確認しにくい。コマンド実行中だけ、カーソルを画面いっぱいに広げられないか?」

AutoCADの標準機能において、オプション画面からカーソルサイズ(`CursorSize`)を100%に変更することは可能だ。しかし、これを常時100%にしておくと、通常の図面編集時には画面全体が十字線で覆われてしまい、かえって視認性が低下するというジレンマを抱える。

真にプロフェッショナルな自動化エンジニアが目指すべきは、「必要な瞬間だけ動的にカーソルを拡大し、処理が完了すれば瞬時に元のサイズへ復元する」という、UIのコンテキストに応じたスマートな制御である。

今回は、`AcadApplication.Preferences.Display` オブジェクトを極限まで掌握し、バグの温床となる状態異常を完全に排除した堅牢なカーソル制御アーキテクチャを伝授する。

—

1. なぜ「力技のコード」は失敗するのか?(非効率な設計の排除)

多くの初学者や、APIのライフサイクルを理解していないプログラマは、次のようなコードを書きがちだ。

‘ 【アンチパターン】エラーハンドリングを無視した単純な実装
Sub BadCursorResize()
Dim app As AcadApplication
Set app = ThisDrawing.Application

‘ カーソルを100%にする
app.Preferences.Display.CursorSize = 100

‘ 何らかの重い処理やユーザー選択
ThisDrawing.Utility.GetPoint , “点を指定してください: ”

‘ 元に戻す
app.Preferences.Display.CursorSize = 5
End Sub

このコードの何が問題か? 「途中でユーザーが `ESC` キーを押して処理を中断した際、`CursorSize = 5` へ戻る処理がスキップされ、ユーザーの環境が100%のまま強制破壊される」 という致命的な欠陥(状態の汚染)がある。

実務で使うツールにおいて、ユーザーの環境設定を意図せず書き換えたまま放置するプログラムは、バグと同義である。我々は、例外が発生しようとも確実に元の状態を復元する「RAII(Resource Acquisition Is Initialization)的思想」をVBAの限られた構文の中で再現しなければならない。

—

2. 堅牢なカーソル制御モジュールの設計

今回の実装における設計方針は以下の通りだ。

1. 状態の退避と確実な復元: 実行前の `CursorSize` を必ず変数に保持し、`On Error` 構文を活用して異常終了時でも確実に元の値へ戻す。
2. 値の境界値バリデーション: AutoCADの `CursorSize` プロパティは `1` から `100` の整数しか受け付けない。不正な値が設定された場合のエラーを事前に弾く。
3. カプセル化: 呼び出し側がカーソル制御の複雑なロジックを意識せず、ラッパー関数を叩くだけで完結する設計にする。

—

3. プロダクションコード実装例

以下のコードを、標準モジュール(例: `mCursorController`)にそのまま貼り付けて使用してほしい。実務の現場でそのまま動く、エンタープライズ品質のコードだ。

Option Explicit

‘ ==============================================================================
‘ モジュール名: mCursorController
‘ 概要: AutoCADの十字カーソルサイズを動的に制御し、精密作業を支援する
‘ ==============================================================================

‘ AutoCADのPreferencesDisplayが許容する限界値
Private Const CURSOR_SIZE_MIN As Long = 1
Private Const CURSOR_SIZE_MAX As Long = 100

/

  • 指定した処理の間だけ十字カーソルを100%(画面全体)に拡張し、終了時に確実に復元する
  • @param targetSize 拡張時のサイズ(デフォルトは最大値の100)

/
Public Sub ExecuteWithFullCursor(Optional ByVal targetSize As Long = 100)
Dim originalCursorSize As Long
Dim acadPrefDisplay As AcadPreferencesDisplay

‘ 1. バリデーション
If targetSize < CURSOR_SIZE_MIN Or targetSize > CURSOR_SIZE_MAX Then
MsgBox “カーソルサイズは ” & CURSOR_SIZE_MIN & ” から ” & CURSOR_SIZE_MAX & ” の間で指定してください。”, vbCritical, “パラメータエラー”
Exit Sub
End If

On Error GoTo ErrorHandler

‘ 2. 現在のアプリケーション参照と設定の取得
Set acadPrefDisplay = ThisDrawing.Application.Preferences.Display

‘ 3. 現在のサイズを退避(状態の保存)
originalCursorSize = acadPrefDisplay.CursorSize

‘ すでに同じサイズであれば無駄な書き込みを行わない
If originalCursorSize <> targetSize Then
acadPrefDisplay.CursorSize = targetSize
End If

‘ ==========================================================================
‘ 【メイン処理の実行領域】
‘ ここに精密な位置合わせを必要とするインタラクティブな処理を記述する
‘ ==========================================================================
Call RunPrecisionTask

‘ 4. 正常終了時の復元
acadPrefDisplay.CursorSize = originalCursorSize
Exit Sub

ErrorHandler:
‘ 5. 異常終了時(ESCキーによる中断など)のフェイルセーフ復元
On Error Resume Next
If Not acadPrefDisplay Is Nothing Then
acadPrefDisplay.CursorSize = originalCursorSize
End If

If Err.Number <> 0 Then
MsgBox “カーソル制御中に予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”
End If
End Sub

/

  • 精密位置合わせを伴うメインタスクのサンプル
  • (実際の業務ロジックに置き換えて使用してください)

/
Private Sub RunPrecisionTask()
Dim selectedPoint As Variant

‘ ユーザーに画面上の精密な点指定を促す(ここで100%の十字カーソルが真価を発揮する)
Err.Clear
On Error GoTo Cancelled

selectedPoint = ThisDrawing.Utility.GetPoint(, vbCrLf & “【精密モード】位置合わせを行う点を指定してください: “)

MsgBox “点が指定されました。” & vbCrLf & _
“X: ” & selectedPoint(0) & vbCrLf & _
“Y: ” & selectedPoint(1), vbInformation, “処理完了”

Exit Sub
Cancelled:
‘ ユーザーがESCでキャンセルした場合のエラー(Err.Number = -2147352567 等)をハンドリング
If Err.Number <> 0 Then
‘ キャンセル時は静かに抜ける
End If
End Sub

—

4. コードの解説とアーキテクチャの急所

`AcadPreferencesDisplay` へのアクセスパス

AutoCADのオブジェクトモデルにおいて、アプリケーションレベルの設定は `Application.Preferences` の下にぶら下がっている。`ThisDrawing.Application.Preferences.Display` を経由することで、現在アクティブなセッションの表示設定に直接アクセスできる。

`On Error` を用いた確実なクリーンアップ

前述の通り、`GetPoint` などのインタラクティブなメソッド実行中にユーザーが `ESC` を押すと、VBAは実行時エラー(トラップ可能なエラー)を発生させて処理を中断する。
この時、`ErrorHandler` ラベルへジャンプさせ、「エラーが発生しようとも、必ず退避させておいた `originalCursorSize` を書き戻す」 という防御的プログラミングを徹底している点が、プロとアマを分ける決定的な境界線となる。

パフォーマンスとAPIへの負荷配慮

AutoCADのレジストリや内部設定を変更するプロパティ書き込みは、頻繁に行うとパフォーマンスの低下や内部キャッシュの整合性乱れを招く。コード内にある `If originalCursorSize <> targetSize Then` というガード節は、無意味なプロパティの書き込みを防ぎ、AutoCADのCOMサーバーへの負荷を最小限に抑えるための知見である。

—

5. おわりに:現場のストレスを消し去るUI自動化へ

たかが「カーソルサイズを変更するだけ」の処理に、ここまで厳密な設計を持ち込むのは過剰フガシだと思うかもしれない。しかし、現場の設計者たちが何時間もモニターに向かい、広大な図面で目を凝らして作業しているその背後で、ツールが原因で設定が狂ったり、予期せぬ挙動を起こしたりするストレスは、開発者に対する信頼を確実に削り取っていく。

「かゆいところに手が届き、かつ絶対に壊れない」――これこそが、業務自動化エンジニアが提供すべき究極のバリューである。
ぜひ自身のプロジェクトにこの堅牢なカーソル制御を組み込み、設計チームの生産性を次のステージへと引き上げてほしい。

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