【実務・中級編】【実務中級】AutoCAD VBAで図面内の全ハッチング(Hatch)オブジェクトのパターン、尺度、角度をまとめて変更する – AutoCAD VBA解析バイブル

スポンサーリンク

【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だ。

今回紹介したコードはあくまで「核」に過ぎない。君が担当する現場のルールに合わせて、このコードを「進化」させていくことを期待している。何かわからないことがあれば、またこの門を叩け。技術的負債をゼロにする設計思想を、いつでも授けよう。

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