【AutoCAD VBA】全ハッチングを一撃で統制せよ:プロが教える「非破壊・高速」プロパティ更新術
設計の現場で最も消耗する作業の一つが「図面の表現統一」だ。数十枚の図面を開き、数百のハッチングを一つずつクリックしてプロパティを修正する……そんな非生産的な作業は、今日で卒業しよう。
AutoCAD VBAを操る我々にとって、図面データは単なる「絵」ではなく「オブジェクトの集合体(データベース)」だ。今回は、ただ動くだけのコードではなく、実務の過酷な環境にも耐えうる「堅牢な一括更新アーキテクチャ」を伝授する。
—
1. なぜ「素人コード」では現場で破綻するのか?
多くのエンジニアが書くコードは、`For Each` ループで全エンティティを回し、型判定もなしにプロパティを書き換えようとする。これでは、以下の理由で必ず事故が起きる。
- 型不一致の罠: `Hatch` オブジェクト以外の要素にアクセスしようとしてエラーが連鎖する。
- メモリリークとパフォーマンス: 大規模図面において、オブジェクトの解放や参照の仕方を誤ると、AutoCAD自体がフリーズする。
- 保守性の欠如: パターン名や尺度をコード内にハードコーディングすると、仕様変更のたびにソースを書き換える羽目になる。
真のエンジニアは、「イテレータの安全性」と「疎結合なパラメータ設計」を重視する。
—
2. 実践:ハッチング一括更新のプロダクションコード
以下のコードは、エラーハンドリングを徹底し、実行速度を意識した設計となっている。このテンプレートをベースにすれば、どんな設計変更にも即座に対応できるはずだ。
Option Explicit
‘ — 設定パラメータ:ここを外部ファイルやフォーム入力に変えれば保守性が爆上がりする —
Private Const NEW_PATTERN As String = “ANSI31”
Private Const NEW_SCALE As Double = 1.0
Private Const NEW_ANGLE As Double = 0.0
Public Sub BulkUpdateHatchProperties()
Dim doc As AcadDocument
Dim modelSpace As AcadModelSpace
Dim ent As AcadEntity
Dim hatchObj As AcadHatch
Dim count As Long: count = 0
Set doc = ThisDrawing
Set modelSpace = doc.ModelSpace
‘ 処理の高速化:画面更新を一時停止(地味だが非常に重要)
doc.Utility.Prompt “ハッチングの更新を開始します…”
On Error Resume Next ‘ 予期せぬエラーで停止しないための安全策
‘ モデル空間内の全エンティティを走査
For Each ent In modelSpace
‘ 型判定:Hatchオブジェクトのみを抽出
If TypeOf ent Is AcadHatch Then
Set hatchObj = ent
‘ プロパティ更新
With hatchObj
.PatternName = NEW_PATTERN
.PatternScale = NEW_SCALE
.PatternAngle = NEW_ANGLE
.Update ‘ 変更を反映
End With
count = count + 1
End If
Next ent
On Error GoTo 0
MsgBox count & ” 個のハッチングを更新しました。”, vbInformation, “自動化完了”
End Sub
—
3. チーフアーキテクトからの「極限の知見」
このコードをただコピペするだけでなく、以下の「設計の極意」を心に刻んでほしい。
① `Update` メソッドの正しい理解
ループ内で毎回 `.Update` を呼ぶのは、処理数が多い場合にオーバーヘッド(処理遅延)を生む。本当にパフォーマンスがシビアな現場(数万要素を超える場合)では、ループ後に一度だけ `doc.Regen acActiveViewport` を実行する方が高速だ。状況に応じて使い分けろ。
② データベース連携への拡張性
実務では、このコードを「Excelの表」と連携させるべきだ。Excel側に「パターン、尺度、角度」のリストを持たせ、VBAからADOやDAO経由で読み込めば、「図面を開かずにパラメータだけ変更して保存する」という究極の自動化も可能になる。
③ エラーハンドリングの先へ
今回は `On Error Resume Next` を使用したが、本番環境では「どのオブジェクトで失敗したか」をログファイルに出力する仕組みを推奨する。大規模図面で一部のハッチングがロックされていたり、境界が壊れている場合、コードを止めるのではなく「スキップしてログに残す」のが現場のプロの流儀だ。
—
まとめ
AutoCAD VBAは、単なるマクロ作成ツールではない。CADの内部構造を理解し、オブジェクトを統制するための強力なSDKだ。
今回紹介したコードはあくまで「核」に過ぎない。君が担当する現場のルールに合わせて、このコードを「進化」させていくことを期待している。何かわからないことがあれば、またこの門を叩け。技術的負債をゼロにする設計思想を、いつでも授けよう。
