【実務・中級編】【初心者向け】AutoCAD VBAで図面上のテキスト(Text)とMTextオブジェクトのフォント・高さを一括変更する – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAの深淵:なぜ「ただ動くコード」が現場を破滅させるのか

AutoCADの自動化において、テキストの一括置換は「Hello World」の次に誰もが通る道だ。しかし、多くのエンジニアがここで躓く。ループを回してプロパティを書き換えるだけのコードを書き、それが複雑な図面や外部参照(Xref)、ブロック定義の中に潜むテキストに触れた瞬間、メモリリークや「予期せぬエラー」でCADごとクラッシュさせるのだ。

今日は、単なる「動くコード」ではなく、「堅牢に生き残るためのアーキテクチャ」を伝授する。

1. 破壊的なコードを書かないための鉄則

初心者が陥る罠は、「現在の空間(ModelSpace/PaperSpace)だけを舐めて満足する」ことだ。AutoCADのテキストは、ブロック定義の中や、ネストされたグループの中に隠れている。また、`TextStyle`(文字スタイル)を無視して個別にプロパティを書き換えると、図面の標準ルールが崩壊し、後から修正が効かなくなる。

堅牢な設計のための3つの指針

1. SelectionSetsを乱用しない: 図面全体を走査する際は、`Block`オブジェクトを再帰的に巡回するのが最も安全かつ高速だ。
2. 型を厳格に定義する: `Object`型で済ませず、`AcadText`および`AcadMText`を明示的に扱うことで、コンパイル時エラーを確実に拾う。
3. Undoスタックの制御: ツール実行中に予期せぬエラーが起きた際、図面が中途半端な状態にならないよう、必ずトランザクション(Undoグループ)で囲むこと。

2. 実務レベルのプロダクションコード

以下のコードは、図面内の全テキスト(ブロック内を含む)を走査し、安全に属性を書き換えるための設計図だ。

Option Explicit

‘ ———————————————————
‘ メイン処理:図面内の全テキストを一括更新する
‘ ———————————————————
Public Sub BulkUpdateTextAttributes()
Dim doc As AcadDocument
Set doc = ThisDrawing

‘ 処理の高速化とUndoの簡略化
doc.StartUndoMark

‘ モデル空間、ペーパースペース、ブロック定義を巡回
Dim block As AcadBlock
For Each block In doc.Blocks
‘ 外部参照(Xref)は編集不可のためスキップ
If Not block.IsXRef Then
UpdateEntitiesInBlock block
End If
Next block

doc.EndUndoMark
MsgBox “テキスト属性の更新が完了しました。”, vbInformation
End Sub

‘ ———————————————————
‘ 各ブロック内のエンティティを走査するサブルーチン
‘ ———————————————————
Private Sub UpdateEntitiesInBlock(blk As AcadBlock)
Dim ent As AcadEntity

For Each ent In blk
‘ Textオブジェクトの場合
If TypeOf ent Is AcadText Then
Dim txt As AcadText
Set txt = ent
txt.Height = 2.5 ‘ 指定の高さ
txt.StyleName = “Standard” ‘ 指定のスタイル(フォント含む)
txt.Update

‘ MTextオブジェクトの場合
ElseIf TypeOf ent Is AcadMText Then
Dim mtxt As AcadMText
Set mtxt = ent
mtxt.Height = 2.5
mtxt.TextStyle = “Standard”
mtxt.Update
End If
Next ent
End Sub

3. なぜこのコードが「プロフェッショナル」なのか

① `doc.StartUndoMark` の重要性

CADは複雑なデータの塊だ。もしコードの途中でエラーが発生し、処理が中断された場合、ユーザーは「どこまで変更されたか」を知る術がない。`UndoMark`で囲むことで、Ctrl+Zを一度押すだけで、全処理を「無かったこと」にできる。これが自動化ツールにおける「誠実さ」である。

② `IsXRef` の判定

外部参照(Xref)を無理やり書き換えようとすると、AutoCADは拒絶するか、最悪の場合はファイル整合性を損なう。`IsXRef`プロパティをチェックし、触れてはいけない領域を保護する設計こそが、大規模プロジェクトでの事故を防ぐ鍵だ。

③ なぜ `TextStyle` を弄るべきか

個別のオブジェクトに直接フォントを設定するのは「地獄への入り口」だ。将来的にフォントを一括変更したいとき、個別にプロパティを書き換えたオブジェクトは、スタイル変更の影響を受けなくなる。可能な限り `TextStyle` を更新し、オブジェクト側はスタイルに従わせる運用を推奨する。

4. さらなる高みを目指すエンジニアへ

今回紹介した手法をマスターしたら、次は「データベース連携」を視野に入れろ。Excelに「スタイル名・高さ・フォント」の定義リストを持たせ、それを読み込んでCAD側を制御する。そうすれば、設計部門ごとに異なる図面スタイルを、ワンクリックで全社統一することが可能になる。

AutoCAD VBAはレガシーな言語だ。しかし、その分、設計思想がすべてを決定する。君が書くコードが、他の誰かの作業時間を1時間減らすのか、それともバグ対応で1日を奪うのか。

「動くコード」の先にある、「保守可能なコード」を目指せ。それが、君を伝説のエンジニアへと押し上げる唯一の道だ。

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