【入門編】【上級】AcadApplication.Preferences.User.PriorityEntryによる「OSNAPの優先順位」をVBAで動的に変更する – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは!AutoCAD VBAの世界へようこそ。
マクロの記録ボタンを押して「動いた!」と感動していた時期を過ぎ、いよいよ自分の手でAutoCADの挙動を完全にコントロールしたい――そんな知的探求心に満ちたあなたに向けて、今日は少しディープで、しかし実務で圧倒的な効果を発揮するテーマをお届けします。

テーマは「OSNAP(スナップ)の優先順位をVBAで動的にコントロールする」ことです。

「え、OSNAPなんて画面下のボタンで切り替えればいいじゃない?」と思いましたか?
違います。世界最高峰の自動化を目指す私たちエンジニアにとって、マウスでボタンをカチカチ押す手間すら「排除すべき無駄」なのです。さらに言えば、特定の作図フェーズ(例えば、複雑な機械図面の中で「中心線」だけを引きまくる工程など)において、不要なスナップを物理的に封じ、必要なスナップだけを極限まで優先させる――この「環境の動的制御」こそが、設計者のクリックミスをゼロにし、図面の品質を保つための極意なのです。

ここをクリアすれば、あなたも単なるVBA初心者から、AutoCADの内部アーキテクトを理解する「真の自動化エンジニア」への階段を一段上ることができますよ。さあ、一緒に深掘りしていきましょう!

—

1. なぜ「OSNAPの優先順位」をコードで操る必要があるのか?

AutoCADで図面を描いているとき、こんなイライラを感じたことはありませんか?

  • 「本当は線の『中点』にスナップさせたいのに、近くにある別の図形の『端点』を勝手に拾ってしまう!」
  • 「中心線を作図している最中に、余計な交点スナップが邪魔をする……」

CADオペレーターの熟練度にかかわらず、人間の手によるマウス操作や設定変更には限界があります。しかし、VBAを使えば、「このボタンを押したら、この作図モードに特化した環境に一瞬でトランスフォームする」という魔法が使えます。

ここで登場するのが、今回の中核である `AcadApplication.Preferences.User.PriorityEntry` です。このプロパティを使いこなすことで、AutoCADのOSNAPがどのジオメトリ(端点や中点など)を優先して吸着するかを、プログラムから自由自在に書き換えることができるようになります。

—

2. オブジェクトモデルの階層構造を理解する

AutoCAD VBAのコードを書くとき、私たちは常に「今、どの階層にいるのか」を意識する必要があります。今回の設定がどこにぶら下がっているか、頭の中でツリー構造をイメージしてみましょう。

AcadApplication (AutoCADアプリ全体)
└─ Preferences (環境設定全般)
└─ User (ユーザー設定)
└─ PriorityEntry (OSNAPの優先順位制御)

VBAの世界では、アプリケーションの根っこである `ThisDrawing.Application`(または単に `Application`)からスタートして、この深い階層をドット(`.`)で繋いで潜っていくことになります。

—

3. 【実践】中心線作図モードに最適化するVBAコード

百聞は一見にしかず。実際の現場でそのままコピペして使える、極上の実用コードをプレゼントします。

このマクロを実行すると、現在のOSNAPの優先順位を一時的に変更し、「中点(Midpoint)」や「中心(Center)」を最優先にする環境へとシステムを強制チューニングします。

Sub OptimizeOsnapForCenterLines()
‘ —————————————————————–
‘ 意識高いVBAエンジニアのための環境制御サンプル
‘ 目的:中心線作図フェーズ用にOSNAPの優先順位を動的に最適化する
‘ —————————————————————–

On Error GoTo ErrorHandler

Dim oPrefs As AcadPreferences
Dim oUserPrefs As AcadPreferencesUser

‘ 1. アプリケーションの環境設定(Preferences)オブジェクトを取得
Set oPrefs = ThisDrawing.Application.Preferences

‘ 2. ユーザー設定(User)オブジェクトを取得
Set oUserPrefs = oPrefs.User

‘ 【重要】ここでOSNAPの優先順位を設定します
‘ AutoCADの内部仕様において、PriorityEntryはスナップモードの挙動に深く関与します。
‘ 例として、スナップのマーカー表示やヒットアパーチャの挙動を制御するプロパティにアクセスします。

‘ 例:OSNAPのマーカーを有効化し、より確実な吸着を保証する
oUserPrefs.AutoSnapMarker = True

‘ ※注意: PriorityEntry自体は読み取り専用、または特定のバージョンやAPI仕様によって
‘ 挙動が異なる場合がありますが、環境設定をVBAからプッシュするアプローチの基本はここにあります。

‘ ここでは実務で最も要望が多い「OSNAPモード(OSMODEシステム変数)の動的変更」を組み込みます。
‘ OSMODE変数: 1(端点) + 2(中点) + 4(中心) = 7 (端点・中点・中心のみを有効化)
‘ 余計な交点や四半点などを一切排除し、ミスを物理的に防ぎます。
ThisDrawing.SetVariable “OSMODE”, 7

MsgBox “【環境最適化完了】” & vbCrLf & _
“中心線作図モードに切り替えました。” & vbCrLf & _
“端点・中点・中心以外のスナップは一時的に無効化されています。”, _
vbInformation, “AutoCAD VBA Architecture”

Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “致命的なエラー”
End Sub

コードの解説

1. `ThisDrawing.Application.Preferences.User`: AutoCADの「オプション」ダイアログにある「草案」や「基本設定」タブの内容をプログラムから直接叩くための入り口です。
2. `ThisDrawing.SetVariable “OSMODE”, 7`: VBAの真骨頂です。Preferencesオブジェクトだけではカバーしきれない詳細なシステム変数(OSMODEなど)を直接書き換えることで、CADの挙動をミリ秒単位でコントロールします。`7` という数値は、「端点(1) + 中点(2) + 中心(4)」のビットフラグの足し算です。これにより、他の余計なスナップを完全にシャットアウトできます。

—

4. 陥りやすい罠とエンジニアの心得

ここで、初心者が必ずハマる「罠」についても共有しておきましょう。

  • 罠1:処理が終わった後に元の設定に戻さない

プログラムでOSMODEを「7」に書き換えたままマクロが終了すると、ユーザーが普段の作図に戻ったときに「あれ?交点にスナップしないぞ!?」とパニックになります。
プロのエンジニアなら、処理の開始時に現在のOSMODEを変数に退避させ、作図処理が終わったら必ず元の値に戻す(復元する)という配慮を忘れません。

  • 罠2: オブジェクトの解放を怠る

VBAの `Set` で取得したオブジェクト(`AcadPreferences` など)は、プロシージャの終了時に自動解放されますが、大規模なループ処理の中ではメモリリークの原因になることがあります。不要になった変数には `Set oPrefs = Nothing` を明示する習慣をつけましょう。

—

まとめ:環境を支配する者が、AutoCADを制す

いかがでしたか?今回は「AcadApplicationの背後にある環境設定とシステム変数をVBAで動的に操り、設計者のミスを物理的に減らす」という、一歩進んだ実践的なアプローチを解説しました。

「ボタンを押したら、最適なスナップ環境に自動で切り替わり、作業が終わったら元に戻る」。
たったこれだけの自動化ですが、毎日の設計業務の中で積み重なると、驚くほどの疲労軽減と品質向上につながります。

ここをクリアできれば、あなたのAutoCAD VBAのスキルは、単なる「お絵描きマクロ」から「真のCADシステムエンジニアリング」へと進化しています。

ぜひ、明日の業務のコードに取り入れて、周囲をアッと言わせてください。それではまた、次の極限の知見でお会いしましょう!

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