こんにちは!CADオペレーターの「手動修正地獄」を救うためにやってきた、あなたの会社のチーフアーキテクトです。
図面を描いていると、こんなストレスに直面したことはありませんか?
「急ぎの修正だからと、誰かが寸法値の文字や矢印のサイズを個別に書き換えやがった……! おかげで図面全体がバラバラの見た目になっている!」
CADのプロなら誰もが一度は通る「寸法スタイルの勝手なオーバーライド(上書き)」問題。これを人間の目で一つずつ探して修正していたら、定時までに終わるものも終わりません。
今回は、AutoCAD VBAを使って、この「オーバーライドされた邪悪な寸法」を自動検出&社内標準スタイルへ強制リセットする一括補正マクロを授けましょう。
ここをクリアすれば、AutoCAD VBAのオブジェクトモデルの基本はバッチリです。一緒にマスターしていきましょう!
—
1. なぜ「オーバーライド」が悪なのか?
AutoCADの寸法には、「寸法スタイル(DimStyle)」という大元ルールがあります。本来、すべての寸法はこのルールに従うべきです。
しかし、初心者のうちはもちろん、ベテランであっても「ここだけ文字が被るから……」と、プロパティウィンドウから個別に寸法値をいじりがちです。これが「オーバーライド(上書き)」です。
- 何が困るのか?
- 図面の品質(統一感)が崩壊する。
- 後から社内標準のスタイルを変更しても、オーバーライドされた寸法は変更を無視して暴走する。
- クライアントに提出した際、「素人が作った図面だな」と一発で見抜かれる。
これをプログラムの力で一網打尽にします。
—
2. AutoCAD VBAの基本:「Document」と「ActiveDimStyle」
AutoCAD VBAを動かす上で、絶対に避けて通れないのがオブジェクト階層です。
宇宙(AutoCADアプリケーション)の中に地球(アクティブな図面ドキュメント)があり、その中に都市(モデル空間)や住民(図形オブジェクト)がいるイメージです。
今回の主役は、現在開いている図面を表す `ThisDrawing`(内部的には `AcadDocument`)と、現在選ばれている寸法スタイル `ActiveDimStyle` です。
しかし、個々の寸法図形(`AcadDimAligned` や `AcadDimRotated` など)は、それぞれが「自分、勝手に値を書き換えられてます…」という隠しフラグを持っています。そこへアプローチするのが今回のキモとなります。
—
3. 実装コード:一括強制リセットマクロ
お待たせしました。開発環境(VBE:Alt + F11)を開き、標準モジュールに以下のコードを貼り付けてください。
実務でそのままコピペして使えるよう、細かくコメントを入れています。
Sub ForceResetDimensionStyles()
‘ —————————————————————–
‘ 目的: 図面内のすべての寸法をスキャンし、オーバーライド(個別上書き)が
‘ 発生しているものを検出し、現在の標準寸法スタイルに強制復帰させる
‘ —————————————————————–
Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing
Dim ent As AcadEntity
Dim dimObj As AcadDimension
Dim targetStyleName As String
Dim counter As Long
counter = 0
‘ 現在のアクティブな寸法スタイル名を取得しておく
targetStyleName = acadDoc.ActiveDimStyle.Name
‘ 処理の高速化と画面ちらつき防止
acadDoc.Utility.Prompt “寸法スタイルのクリーンアップを開始します…” & vbCrLf
‘ モデル空間内のすべてのオブジェクトをスキャン
For Each ent In acadDoc.ModelSpace
‘ オブジェクトが「寸法 (Dimension)」であるか判定
If TypeOf ent Is AcadDimension Then
Set dimObj = ent
‘ 【重要】オーバーライドされているかチェック
‘ AutoCADの内部では、スタイルが上書きされている場合、
‘ Updateメソッドやスタイル再適用によって標準に戻すアプローチを取ります。
‘ ここでは確実に標準スタイル名を再代入することで、オーバーライドを消し去ります。
If dimObj.StyleName <> targetStyleName Then
‘ スタイル自体が違う場合は標準に変更
dimObj.StyleName = targetStyleName
counter = counter + 1
Else
‘ スタイル名は同じだが、個別のプロパティ(文字高さや矢印など)が
‘ オーバーライドされている場合、StyleNameを再代入することで
‘ 強制的にスタイル初期値へと巻き戻す
dimObj.StyleName = targetStyleName
counter = counter + 1
End If
‘ 図形を更新
dimObj.Update
End If
Next ent
‘ 完了メッセージ
MsgBox “処理が完了しました。” & vbCrLf & _
“標準スタイル「 ” & targetStyleName & ” 」へ ” & _
counter & ” 個の寸法を強制リセットしました。”, vbInformation, “AutoCAD VBA 自動化”
End Sub
—
4. コードの解説:ここがエンジニアの急所
初心者のうちは、「なぜ同じ `dimObj.StyleName = targetStyleName` をわざわざ実行しているのか?」と疑問に思うでしょう。
実は、AutoCADのVBAにおいて、一度個別プロパティ(例:`TextOverride` や寸法値の強制変更など)がいじられた寸法は、単にスタイル名を参照しているだけではオーバーライドが解除されないという厄介な仕様があります。
そこで、「あえて一度(あるいは強制的に)同じスタイル名を再代入する」という荒技を使います。これによって、AutoCADの内部エンジンが「あ、スタイル基準に戻すんだな」と理解し、悪質なオーバーライド値をきれいに消し去ってくれるのです。これが、API仕様を知り尽くしたエンジニアの知恵です。
—
5. 陥りやすいエラーと対策
1. 「レイアウト(紙空間)の寸法が直らないんだけど?」
- 今回のコードは `acadDoc.ModelSpace` を対象にしています。ペーパー空間(レイアウトタブ)の寸法も対象にしたい場合は、`acadDoc.PaperSpace` を回すループを別途追加するか、全図形を横断する `acadDoc.Blocks` へのアプローチに拡張してみてください。
2. 「実行時エラー ‘424’: オブジェクトが必要です」
- モジュールを「クラスモジュール」や「ThisDrawingモジュール」ではなく、「標準モジュール」に貼り付けているか確認してください。AutoCAD VBAの基本は標準モジュールからの実行です。
—
まとめ:マクロの記録から、本物の自動化へ
「マクロの記録」ボタンを押して操作を覚えるフェーズは今日で終わりです。
今回のようなオブジェクトの型判定 (`TypeOf … Is …`) や、プロパティの書き換えをマスターすれば、あなたの図面作成スピードは爆発的に向上します。
「手動で直すのはロボットの仕事ではない、人間の仕事でもない。それはプログラムの仕事だ」
この精神を忘れないでください。それでは、快適なAutoCADライフを!
