【上級】AcadApplicationのPreferencesオブジェクト攻略:AutoCADのオプション設定を社内標準に強制統一
設計部門の生産性を決定づける要因は何か。最新のワークステーションか、洗練されたカスタムLISPか。それらは重要だが、真のプロフェッショナルであれば「全社的な環境の完全な均一化」こそが、無駄なトラブルと手戻りを撲滅する最大の防壁であることを知っているはずだ。
「ある設計者の図面を開くと、文字化けする」「自動保存のタイミングが異なり、クラッシュ時にデータが消えた」「クロスヘアのサイズが極端で図面が見づらい」。これらは個人の嗜好の問題ではなく、組織としてのガバナンス欠如に起因する致命傷だ。
今回は、AutoCAD VBAの頂点に君臨する `AcadApplication.Preferences` オブジェクトを駆使し、CADの環境設定(パス、表示、選択、ファイル管理など)をコードによって一括制御・強制統一する極限の知見を公開する。レガシーなAutoCAD VBAの寿命を延ばし、堅牢なシステムを構築するためのアーキテクチャを紐解く。
—
1. Preferencesオブジェクトのアーキテクチャとライフサイクル
AutoCADの環境設定(「オプション」ダイアログボックスの内容)は、単一のオブジェクトで管理されているわけではない。`AcadPreferences` オブジェクトを根(ルート)とし、機能領域ごとに細分化された子オブジェクトのツリー構造を形成している。
AcadApplication
└─ Preferences (AcadPreferences)
├─ Files (ファイルパス、サポートパス等)
├─ Display (画面の色、クロスヘア、レイアウト等)
├─ OpenSave (自動保存、保存形式等)
├─ Selection (グリップ、選択プレビュー等)
├─ Drafting (スナップ、マーカー等)
├─ User (右クリック動作、単位等)
└─ Profiles (プロファイル管理)
ライフサイクル上の重大な罠
VBAからこれらを操作する際、多くのプログラマブルな罠が待ち受けている。
1. 変更の即時反映とレジストリ・プロファイルへの永続化: 多くのプロパティは即座にメモリ上のセッションに反映されるが、一部の設定はプロファイル(Profile)に明示的に書き込むか、アプリケーションの再起動を要する。
2. メモリリークとCOMオブジェクトの解放: `ThisDrawing.Application.Preferences` を取得する際、安易にオブジェクト変数をチェーンさせると、裏側でCOMの参照カウンタがインクリメントされ、AutoCADプロセスが終了時にゾンビ化する原因となる。
シニアエンジニアたるもの、オブジェクトの取得と解放は厳格に行うべきである。
—
2. 【実践コード】社内標準環境を強制適用するマスターマクロ
以下のコードは、起動時に社内標準の環境設定(サポートパス、自動保存間隔、画面表示、選択動作)を強制的に上書きし、逸脱を許さない堅牢なイニシャライザの実装例である。
Option Explicit
‘ Windows APIを使用して、確実にレジストリやファイルシステムの状態を同期する場合に備えた宣言(必要に応じて拡張)
If VBA7 then
Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
Else
Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
End If
Public Sub ForceStandardEnvironment()
Dim acadApp As AcadApplication
Dim prefs As AcadPreferences
‘ 1. アプリケーションインスタンスの安全な取得
On Error Resume Next
Set acadApp = ThisDrawing.Application
If acadApp Is Nothing Then
Set acadApp = GetObject(, “AutoCAD.Application”)
End If
On Error GoTo 0
If acadApp Is Nothing Then
MsgBox “AutoCADアプリケーションが見つかりません。”, vbCritical, “致命的エラー”
Exit Sub
End If
‘ 2. プレファレンスルートの取得
Set prefs = acadApp.Preferences
‘ 3. エラーハンドリングを有効化して各セクションを一括適用
On Error GoTo ErrorHandler
‘ —————————————————-
‘ A. 【Files(ファイル)タブの設定】
‘ —————————————————-
With prefs.Files
‘ サポートファイルの検索パスに社内共通サーバーパスを追加(既存を上書きまたは結合)
Dim standardSupportPath As String
standardSupportPath = “R:\CAD\Standard\Support;S:\CAD\Fonts;” & .SupportPath
.SupportPath = standardSupportPath
‘ 印刷スタイルファイルの検索パス
.PrinterStyleSheetPath = “R:\CAD\Standard\Plot Styles”
‘ テンプレートファイルのデフォルト位置
.TemplateFilepath = “R:\CAD\Standard\Templates”
End With
‘ —————————————————-
‘ B. 【OpenSave(開く/保存)タブの設定】
‘ —————————————————-
With prefs.OpenSave
‘ 自動保存を強制有効化 (True)
.AutomaticSave = True
‘ 自動保存の間隔を10分に強制
.AutoSaveInterval = 10
‘ 保存形式をAutoCAD 2018 図面 (.dwg) に固定
.SaveAsType = ac2018_dwg
‘ プレビュー図を保存する
.CreateBackups = True
End With
‘ —————————————————-
‘ C. 【Display(表示)タブの設定】
‘ —————————————————-
With prefs.Display
‘ クロスヘアカーソルサイズを画面の100%に強制(製図効率化のため)
.CursorSize = 100
‘ コマンドラインの履歴行数
.TextWindowLines = 2048
‘ 図面背景色を黒(または白)に固定 (カラーインデックス 256 = 黒/背景依存)
‘ acadApp.ActiveDocument.SetVariable “BkgColor”, 0 ‘ 必要に応じてSystemVariablesも併用
End With
‘ —————————————————-
‘ D. 【Selection(選択)タブの設定】
‘ —————————————————-
With prefs.Selection
‘ グリップサイズの中央値
.GripSize = 4
‘ 選択プレビュー(ホバー時のハイライト)を有効化
.DisplayPreviewsDuringSelection = True
‘ 複数のオブジェクトを選択する際のシフトキー動作の最適化
.PickAdd = True
End With
‘ 4. 設定のプロファイルへの書き込み・強制適用
Dim activeProf As String
activeProf = prefs.Profiles.ActiveProfile
prefs.Profiles.ExportProfile activeProf, “C:\Temp\CurrentBackup.arg” ‘ バックアップ取得のベストプラクティス
‘ 完了通知
MsgBox “社内標準環境の適用が完了しました。”, vbInformation, “AutoCAD環境ガバナンス”
CleanUp:
‘ 5. 明示的なオブジェクト解放によるメモリ最適化(COM参照のリーク防止)
Set prefs = Nothing
Set acadApp = Nothing
Exit Sub
ErrorHandler:
MsgBox “環境設定の適用中にエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
Resume CleanUp
End Sub
—
3. シニアエンジニアが押さえるべき「隠れた落とし穴」と高度な回避策
上記のコードは美しく機能するように見えるが、エンタープライズ環境の実戦に投入するにあたり、以下の「限界」と「対策」を知っておく必要がある。
① Preferencesオブジェクトで触れない領域の補完(SystemVariablesとの併用)
`AcadPreferences` は強力だが、すべてのシステム変数(System Variables)を網羅しているわけではない。例えば、図面依存の設定や、一部の高度なレンダリング・グリッド設定は `Preferences` オブジェクトからはアクセスできない。
これらを補完するためには、`AcadDocument.SetVariable` または `AcadApplication.SetSystemVariable` を併用する必要がある。
‘ 例:OSNAP(オブジェクトスナップ)のデフォルト値をコードから強制設定
acadApp.ActiveDocument.SetVariable “OSMODE”, 4133
‘ 例:ダイナミック入力のオンオフ
acadApp.ActiveDocument.SetVariable “DYNMODE”, 3
② 複数バージョン(マルチテナント)が混在する端末での注意
社内にAutoCAD 2021とAutoCAD 2024が混在する環境では、Type Libraryの参照設定(Early Binding)を行うとコンパイルエラーやバージョン不整合クラッシュを引き起こす。
本番運用するマクロでは、可能な限りレイトバインディング(Late Binding)を採用し、実行時のバージョンに動的に適応させるアーキテクチャが望ましい。
‘ レイトバインディングによるインスタンス化の例
Dim acadApp As Object
Set acadApp = CreateObject(“AutoCAD.Application”)
③ プロファイル(.arg)の強制インポートによる完全統制
VBAコードによる個別のプロパティ変更は柔軟性が高いが、コードの改修漏れや、VBAが無効化されたセキュリティポリシー下では無力化する。真の「強制統一」を目指す場合、あらかじめ社内標準を反映したマスタープロファイル(`.arg` ファイル)を作成し、それをVBAからサイレントインポートする手法が最も堅牢である。
Sub ImportStandardProfile()
Dim prefs As Object
Set prefs = ThisDrawing.Application.Preferences
‘ 社内標準プロファイルをインポートし、それをアクティブにする
Dim profileName As String
profileName = “Corporate_Standard”
On Error Resume Next
prefs.Profiles.Import profileName, “R:\CAD\Standard\Config\CorporateStandard.arg”, True
prefs.Profiles.ActiveProfile = profileName
On Error GoTo 0
Set prefs = Nothing
End Sub
—
4. 総括
AutoCADの `Preferences` オブジェクトを掌握することは、単なる「コードの自動化」にとどまらない。それは、組織全体の設計品質のばらつきをシステム的に排除し、エンジニアリングの信頼性を担保するガバナンスそのものである。
レガシーと揶揄されがちなAutoCAD VBAであっても、その背後にあるCOMアーキテクチャの本質を理解し、メモリ管理と例外処理を徹底すれば、現代の大規模エンタープライズシステムに対抗しうる強力な自動化武器となる。
設計現場の混沌をコードの力で秩序へと変えること――それこそが、我々インフラストラクチャを支えるエンジニアの使命である。
