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を一つの巨大なデータベースとして捉えること」だ。オブジェクトのプロパティは「列」、図面は「テーブル」である。この視点を持つだけで、君が書くコードの品質は劇的に向上するはずだ。
妥協のない設計こそが、退屈なルーチンワークからの解放を約束する。さあ、実装に取り掛かってほしい。
