【実務中級】図面内の全ハッチング境界を再定義!AcadHatchオブジェクトのAppendLoopメソッドによる形状追従の自動化
AutoCAD VBAの現場において、最もフラストレーションが溜まる瞬間の一つが、設計変更に伴うハッチング(`AcadHatch`)の再追従作業だ。基幹となる境界線(ポリラインや線分)が移動・リサイズされた際、ハッチングが古い境界にしがみついたまま孤立する、あるいは境界との関連付け(Associativity)が破綻して「ただの塗りの塊」と化す現象は、図面枚数が数千枚規模に膨れ上がるプラントや建築の現場では日常茶飯事である。
UI上で「ハッチングの再指定(Hatch Recreate / Edit)」を一つずつ手作業で行うのは、シニアエンジニアのすることではない。我々はコードでこれを一瞬にして無慈悲に自動化する。
本稿では、`AcadHatch` オブジェクトの内部構造、`AppendLoop` メソッドの挙動の癖、そしてメモリリークを回避しながら図面内の全ハッチングの境界を再定義する実務レベルの極限コードを解説する。
—
1. AutoCADハッチングの裏側:境界ループとアソシエイティブの真実
AutoCADのデータベース(DWG)において、`AcadHatch` は単なる図形ではない。それは1つ以上の境界ループ(Loop)の集合体であり、それぞれのループは複数の図幹(Entity)のトポロジーによって構成されている。
ここで重要なのは、VBAからハッチングの形状を変更する場合、単純に既存のループを触るだけでは不十分という点だ。
1. 既存のループを全て削除する(`DeleteLoop`)。
2. 新しい境界エンティティの配列を定義する。
3. `AppendLoop` メソッドを用いて、新しい境界をハッチングオブジェクトに再登録する。
4. アソシエイティブ(結合)プロパティを `True` に再設定し、次回の図形変形に備える。
この一連のライフサイクルをコードで正確に制御する必要がある。
—
2. 【実務コード】図面内全ハッチングの境界再定義エンジン
以下に提示するのは、モデル空間またはペーパー空間に存在する全ての `AcadHatch` を走査し、アソシエイティブ設定の修復と境界ループの再構築を行う実戦投入可能なプロシージャである。
レガシーなAutoCAD環境でも確実に動作し、かつ不必要なCOMオブジェクトの参照リークを防ぐために明示的な解放(`Set obj = Nothing`)を徹底している。
Option Explicit
Public Sub RebuildAllHatchBoundaries()
‘ —————————————————————–
‘ 概要: 図面内の全AcadHatchオブジェクトの境界を再評価し、
‘ アソシエイティブ状態を強制的に再構築するチーフアーキテクト向けルーチン
‘ —————————————————————–
Dim acadApp As AcadApplication
Dim acadDoc As AcadDocument
Dim modelSpace As AcadModelSpace
Dim ent As AcadEntity
Dim hatchObj As AcadHatch
Dim i As Long
Dim loopCount As Long
Dim successCount As Long
On Error GoTo ErrorHandler
‘ アプリケーションおよびアクティブドキュメントの取得
Set acadApp = ThisDrawing.Application
Set acadDoc = acadApp.ActiveDocument
Set modelSpace = acadDoc.ModelSpace
successCount = 0
‘ トランザクション処理のパフォーマンス向上
acadDoc.StartUndoMark
‘ モデル空間内の全エンティティをスキャン
For i = 0 to modelSpace.Count – 1
Set ent = modelSpace.Item(i)
‘ オブジェクトがHatchであるか判定
If TypeOf ent Is AcadHatch Then
Set hatchObj = ent
‘ デバッグ用: 処理対象のHandleを出力
‘ Debug.Print “Processing Hatch Handle: ” & hatchObj.Handle
‘ アソシエイティブ(関連付け)が有効な場合のみ再定義を試みる
If hatchObj.AssociativeHatch Then
‘ 既存の境界ループを全削除する際の安全策
‘ ※AcadHatchは最低1つのループが必要なため、新規追加してから古いものを消すか、
‘ あるいは再定義ロジックを正確に踏む必要がある。
‘ ここでは、アソシエイティブ再評価メソッド(Evaluate)を呼び出す
‘ 実務上、境界エンティティが移動している場合、Evaluateだけで追従するケースもあるが、
‘ 完全にトポロジーが壊れた場合はAppendLoopによる再構築が必須となる。
hatchObj.Evaluate
successCount = successCount + 1
End If
‘ ループ内でのメモリ解放
Set hatchObj = Nothing
End If
Set ent = Nothing
Next i
acadDoc.EndUndoMark
MsgBox “ハッチングの再構築が完了しました。” & vbCrLf & _
“処理対象ハッチング数: ” & successCount, vbInformation, “AutoCAD VBA Automation”
Exit Sub
ErrorHandler:
acadDoc.EndUndoMark
MsgBox “致命的なエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
‘ 確実なオブジェクト解放
Set hatchObj = Nothing
Set ent = Nothing
Set modelSpace = Nothing
Set acadDoc = Nothing
Set acadApp = Nothing
End Sub
—
3. AppendLoopメソッドの極意と実務上の罠
先ほどのコードでは `Evaluate` メソッドによる簡易修復に触れたが、設計変更があまりにも激しく、境界を示すポリライン自体が再作成(Delete & Create)された場合は、`Evaluate` だけではハッチングは追従しない。
このような「真の境界再定義」を行う場合、以下の手順で `AppendLoop` を叩く必要がある。
Public Sub ForceAppendNewBoundary(targetHatch As AcadHatch, newBoundaryEntities As Variant)
Dim outerLoopType As Integer
outerLoopType = AcHatchLoopTypeDefault ‘ 通常の外側ループ
‘ 1. 既存のすべての境界ループを削除(逆順でループを回すのが鉄則)
Dim j As Long
For j = targetHatch.NumberOfLoops – 1 To 0 Step -1
targetHatch.DeleteLoop (j)
Next j
‘ 2. 新しい境界エンティティ群を配列としてAppendLoopに渡す
targetHatch.AppendLoop outerLoopType, newBoundaryEntities
‘ 3. アソシエイティブを強制有効化し、データベースを更新
targetHatch.AssociativeHatch = True
targetHatch.Evaluate
acadDoc.Regen acActiveViewport
End Sub
チーフアーキテクトからの警告:COMオブジェクトのライフサイクル管理
AutoCAD VBAにおいて、`For Each` や `.Item(i)` で取得したCOMオブジェクトは、VBAの裏側で確実に参照カウンタ(Reference Counter)をインクリメントしている。
これを明示的に `Set xxx = Nothing` で解放せずにループを回し続けると、巨大な図面を処理した際にメモリリークを引き起こし、最悪の場合はAutoCADごとプロセスがクラッシュする。
特にハッチングのループ操作やジオメトリの配列操作を行う際は、「取得したオブジェクトは、そのスコープの抜け際、あるいは次のループの直前に必ず `Nothing` を代入して解放する」という鉄の掟を遵守してほしい。
—
4. システム間連携(外部データベースからのドライバ)への拡張
この `AppendLoop` によるハッチング自動化の真価は、単体スクリプトとしてではなく、外部のBOM(部品表)システムやExcelからの設計変更指示(JSON/CSV)と連動させた「完全自動図面生成パイプライン」の一部として組み込んだ時に発揮される。
Excel側で境界ポリラインの頂点座標が変更されたことを検知し、COM経由でAutoCADをバックグラウンド(非表示)で起動、該当する `AcadHatch` の境界をこのコードで動的に再定義して上書き保存する――。
このアーキテクチャを構築すれば、人間の手による図面修正工数をゼロに近づけることが可能となる。
レガシーと侮るなかれ。AutoCAD VBAのオブジェクトモデルを熟知し、メモリ管理とトポロジーの機微をコントロールできれば、いかなる巨大図面もあなたの意のままに高速自動化できるのだ。
