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

スポンサーリンク

AutoCAD VBAの深淵:ハッチング一括制御で「手作業の地獄」を自動化する

AutoCADの業務効率化において、ハッチング(Hatch)の操作は避けて通れない関門だ。設計変更のたびに「全ハッチの尺度を調整し直す」「パターンを統一する」といった作業をマウスで行うのは、もはやプロの仕事ではない。

今回は、単にコードを動かすことだけを目的とせず、「数万個のオブジェクトが存在する巨大な図面でもフリーズさせない」という、実務で不可欠な堅牢性を備えた設計手法を伝授する。

1. なぜ「単純なループ」で設計してはいけないのか

多くの初心者は、単純に `For Each` ループを回してプロパティを書き換えるだけのコードを書く。しかし、AutoCADのオブジェクトモデルにおいて、ハッチングオブジェクトは非常に重い。

  • データベースへのアクセス負荷: 1オブジェクトごとにプロパティを書き換えるたびに、AutoCADの内部データベース(DWG Database)は再計算や更新処理を行う。数千単位のハッチを一括処理すると、パフォーマンスは劇的に低下する。
  • エラーの温床: 特定のハッチが「境界の再生成」に失敗していたり、破損している場合、ループ全体がクラッシュするリスクがある。

極限の設計指針:
1. SelectionSetsを適切に活用する: 図面全体を舐めるのではなく、フィルタリングして必要なオブジェクトだけを抽出する。
2. トランザクション的な思考を持つ: エラーハンドリングを個別のオブジェクト単位で行い、一つがダメでも全体を止まらせない。

2. 実務向けプロダクションコード:HatchManager

以下のコードは、図面内の全てのハッチングをターゲットにし、安全性と効率を両立させたクラス設計の雛形だ。

Option Explicit

‘ ———————————————————
‘ 目的: 図面内の全ハッチングのプロパティを一括更新する
‘ 備考: パフォーマンスを考慮し、SelectionSetsを利用
‘ ———————————————————
Public Sub BulkUpdateHatches()
Dim sset As AcadSelectionSet
Dim hatchObj As AcadHatch
Dim ent As AcadEntity

‘ 1. SelectionSetの初期化(既に存在する場合は削除する堅牢な実装)
On Error Resume Next
ThisDrawing.SelectionSets(“HatchSelector”).Delete
On Error GoTo 0
Set sset = ThisDrawing.SelectionSets.Add(“HatchSelector”)

‘ 2. フィルタ設定:Hatchオブジェクトのみを抽出
Dim grpCode(0) As Integer: grpCode(0) = 0
Dim grpValue(0) As Variant: grpValue(0) = “HATCH”

sset.Select acSelectionSetAll, , , grpCode, grpValue

‘ 3. エラーハンドリングを伴うループ処理
Dim i As Long
For Each ent In sset
Set hatchObj = ent

On Error Resume Next ‘ 個別のハッチング異常による停止を防ぐ
With hatchObj
.PatternScale = 10.0 ‘ 尺度設定
.PatternAngle = 0.5 ‘ 角度設定(ラジアン)
.Update ‘ 画面反映の強制
End With

If Err.Number <> 0 Then
Debug.Print “Error in Object: ” & hatchObj.Handle
Err.Clear
End If
On Error GoTo 0
Next ent

‘ 4. 後始末
sset.Delete
MsgBox “ハッチングの一括更新が完了しました。”, vbInformation
End Sub

3. このコードが「プロ仕様」である理由

① SelectionSetsの管理

`SelectionSets` を作成する際、同名のセットが既に存在するとエラーになる。これを回避するための「生成・削除・再生成」のイディオムは、大規模図面の開発では必須の作法だ。

② `On Error Resume Next` の限定的運用

プログラミングの鉄則として「エラー無視は悪」とされるが、CADのバッチ処理においては話が別だ。破損したハッチングが1つあるだけで、図面全体の修正が止まるのは業務上の損失が大きい。「ログを出しつつ処理を継続させる」という設計が、現場の運用には適している。

③ `Update` メソッドの重要性

プロパティを変更しただけでは、AutoCADの描画キャッシュが更新されない場合がある。最後に `.Update` を叩くことで、画面上の見た目とデータベース上の整合性を担保している。

4. さらなる高みへ:データベースとの連携

もし「Excelの表でハッチングの設定を管理したい」という要件があるなら、`Dictionary` オブジェクトを使ってExcel側からパターン名や尺度を読み込み、上記の `For Each` ループ内で `Select Case` や `Dictionary.Exists` を使って条件分岐させる構成に拡張してほしい。

エンジニアへの助言:
AutoCAD VBAをマスターするコツは、「AutoCADを一つの巨大なデータベースとして捉えること」だ。オブジェクトのプロパティは「列」、図面は「テーブル」である。この視点を持つだけで、君が書くコードの品質は劇的に向上するはずだ。

妥協のない設計こそが、退屈なルーチンワークからの解放を約束する。さあ、実装に取り掛かってほしい。

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