AutoCAD VBAを掌握する極限の知見
【第1回】図面内の「詳細図」と「全体図」で寸法スタイルを自動的に使い分ける堅牢な設計手法
開発プロジェクトのリーダーである私たちが、現場のオペレーターから最も頻繁に受ける愚痴の一つがこれだ。
「また全体図の寸法スタイルのまま詳細図を描いてしまい、後から全選択してプロパティから一括変更するハメになった……」
人間は手動でモードを切り替える生き物ではない。うっかりミスは「個人の注意力不足」ではなく、「ミスが起きる余地を残したシステム側の設計不良」である。
今回は、AutoCAD VBAの根幹である `AcadDocument` と `ActiveDimStyle` を操り、ワンクリックあるいはイベントトリガーで「詳細図モード」と「全体図モード」を完全自動切替するプロダクションコードを授けよう。
—
なぜ、ただのプロパティ変更では実務で破綻するのか?
初心者向けの解説書を見ると、`ThisDrawing.ActiveDimStyle = ThisDrawing.DimStyles(“MyStyle”)` と一行書いて終わりにする。しかし、実務の現場ではこれだけでは99%の確率でバグる。
1. 対象の寸法スタイルが存在しないリスク
外部から受け取った図面や、テンプレートが異なる図面では、指定した名前のDimStyle(寸法スタイル)が定義されていない。この状態でコードを実行すれば、容赦なく「インデックスが有効範囲にありません」という実行時エラー(Runtime Error)でマクロがクラッシュする。
2. トランザクションと再描画(Regen)の罠
AutoCADのオブジェクトモデルにおいて、カレントスタイルの変更は即座にデータベースへ反映されるべきだが、画面上の既存寸法や、次に生成される寸法のキャッシュが追いつかないケースがある。特に大規模図面では、切り替え直後に `Regen` や `Update` を適切に挟まないと、視覚的な不整合が生じる。
プロのエンジニアであれば、「防御的プログラミング(Defensive Programming)」を徹底し、存在チェック、エラーハンドリング、そして状態の視覚的フィードバックまでを担保しなければならない。
—
実務仕様:寸法スタイル自動切替エンジンの設計方針
今回のモジュールでは、以下の要件を満たす堅牢なプロシージャを構築する。
- 安全なスタイル存在確認: 指定したスタイル名が図面内に存在するかディクショナリを走査し、なければ自動生成(またはフォールバック)する。
- トグル(切替)および個別指定の両対応: 「全体図用(例: `ISO-25`)」と「詳細図用(例: `DETAIL-5`)」を確実に切り替える。
- オペレーターへの視覚的フィードバック: コマンドライン(`AecStatusBar` / `SendCommand` 含む)に現在のモードを明確に通知する。
—
コピペで使えるプロダクションコード
以下のコードをAutoCADのVBAエディタ(`Alt + F11`)の標準モジュールに貼り付けてほしい。実務の現場でそのまま組み込めるよう、エラーハンドリングとコメントを徹底的に記述している。
Option Explicit
‘ ==============================================================================
‘ 開発現場の知見を凝縮した寸法スタイル自動切替モジュール
‘ Author: 業務自動化チーフアーキテクト
‘ ==============================================================================
‘ 定数定義(図面基準に合わせて変更してください)
Private Const STYLE_OVERVIEW As String = “Overall_Style” ‘ 全体図用スタイル名
Private Const STYLE_DETAIL As String = “Detail_Style” ‘ 詳細図用スタイル名
Public Sub SwitchToOverviewMode()
‘ ————————————————————————–
‘ 目的: 全体図用の寸法スタイルへ安全に切り替える
‘ ————————————————————————–
SetCurrentDimStyle STYLE_OVERVIEW, “【全体図モード】”
End Sub
Public Sub SwitchToDetailMode()
‘ ————————————————————————–
‘ 目的: 詳細図用の寸法スタイルへ安全に切り替える
‘ ————————————————————————–
SetCurrentDimStyle STYLE_DETAIL, “【詳細図モード】”
End Sub
Private Sub SetCurrentDimStyle(ByVal targetStyleName As String, ByVal modeMessage As String)
On Error GoTo ErrorHandler
Dim doc As AcadDocument
Set doc = ThisDrawing
‘ 1. 指定された寸法スタイルが図面内に存在するか検証
If Not DimStyleExists(doc, targetStyleName) Then
Err.Raise vbObjectError + 1000, “SetCurrentDimStyle”, _
“指定された寸法スタイル ‘” & targetStyleName & “‘ がこの図面に存在しません。” & vbCrLf & _
“スタイルを読み込むか、テンプレートを確認してください。”
End Sub
‘ 2. カレント寸法スタイルの変更(AcadDocument.ActiveDimStyleの操作)
Dim targetStyle As AcadDimStyle
Set targetStyle = doc.DimStyles(targetStyleName)
Set doc.ActiveDimStyle = targetStyle
‘ 3. システム変数への反映確認と画面の整合性保持
‘ ※ActiveDimStyleの変更はDIMSTYLEシステム変数にも連動する
doc.Regen acActiveViewport
‘ 4. オペレーターへのフィードバック(コマンドライン出力)
doc.Utility.Prompt vbCrLf & “===> ” & modeMessage & ” に切り替えました。 (適用スタイル: ” & targetStyleName & “)” & vbCrLf
Exit Sub
ErrorHandler:
‘ 堅牢なエラーハンドリング:沈黙させず、かつクラッシュさせない
MsgBox “寸法スタイルの切り替えに失敗しました。” & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “AutoCAD VBA 自動化エラー”
‘ 必要に応じたログ出力やイミディエイト窓へのデバッグ出力
Debug.Print “[Error ” & Err.Number & “] ” & Err.Source & “: ” & Err.Description
End Sub
Private Function DimStyleExists(ByVal doc As AcadDocument, ByVal styleName As String) As Boolean
‘ ————————————————————————–
‘ 目的: コレクションを安全にイテレートし、スタイルの存在をチェックする
‘ ————————————————————————–
Dim style As AcadDimStyle
Dim exists As Boolean
exists = False
For Each style In doc.DimStyles
If StrComp(style.Name, styleName, vbTextCompare) = 0 Then
exists = True
Exit For
End If
Next style
DimStyleExists = exists
End Function
—
チーフアーキテクトからの実装アドバイス
1. リボンやツールバーへのバインド
作成した `SwitchToOverviewMode` と `SwitchToDetailMode` は、CUIコマンド(CUIコマンドエディタ)からマクロとして登録し、カスタムリボンやクイックアクセスツールバーに配置せよ。キーボードショートカット(例: `Ctrl + Shift + O` や `Ctrl + Shift + D`)に割り当てるのが、プロのモデラーにとって最も手数が少ない至高のUXとなる。
2. テンプレート(DWT)標準化との組み合わせ
このVBAを社内で展開する際は、必ず大元の設計テンプレート(`.dwt`)側に `Overall_Style` と `Detail_Style` の定義をあらかじめ埋め込んでおくこと。コード側がスタイルを自動生成するアプローチも可能だが、企業の製図基準(JISや社内規格)を厳密に守るためには、「規程のスタイルはテンプレートに常備させ、VBAは切り替えのスイッチングに徹する」という役割分担が最もバグを生みにくい。
手動によるヒューマンエラーをシステムのコードで撲滅せよ。その積み重ねこそが、組織全体の生産性を劇的に引き上げる唯一の道である。
