【入門編】【実務中級】図面比較を自動化!2つの図面の差分を検出するVBAテクニック – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCADの自動化の世界へようこそ。

「マクロの記録」ボタンを押して、生成されたコードの解読に頭を抱える日々はもう終わりにしましょう。あなたが今、設計現場で直面している「図面Aと図面B、どこが変わったのか?」という地獄のような確認作業。これをコードで解決することは、単なる効率化ではありません。「設計の整合性を守る」というエンジニアの聖域を、プログラムに委ねる第一歩なのです。

今日は、AutoCAD VBAの心臓部であるオブジェクトモデルを操作し、図面間の差分を検出するプロフェッショナルな手法を伝授します。

1. なぜ「図面比較」は難しいのか?

AutoCADの図面データは、単なる線の集まりではありません。`ModelSpace`という広大な宇宙の中に、無数の`AcadEntity`(線、円、ブロック、文字など)が浮遊しています。

図面比較を自動化する際、初心者が陥る罠は「見た目(座標)だけで判断しようとする」ことです。しかし、プロは「ハンドル(Handle)」を見ます。
AutoCADの各オブジェクトには、生成時に一意に割り振られる「ハンドル」というIDがあります。これを使えば、変更前後を追跡することが可能になります。

2. 比較ロジックの設計図

今回は「図面A」を基準として、以下の3ステップで判定します。

1. 辞書オブジェクト(Scripting.Dictionary)に、基準図面の全オブジェクトのハンドルを格納する。
2. 比較図面を開き、同じハンドルを持つオブジェクトが存在するか確認する。
3. 存在しなければ「削除」、存在すれば「プロパティ(色や画層など)の変化」をチェックする。

3. 実践:差分検出VBAコード

このコードは、現在アクティブな図面(基準)と、指定したパスの図面を比較します。

Option Explicit

‘ 参照設定: Microsoft Scripting Runtime を有効にしてください
Sub CompareDrawings()
Dim docBase As AcadDocument
Dim docComp As AcadDocument
Dim dictBase As Object
Set dictBase = CreateObject(“Scripting.Dictionary”)

Set docBase = ThisDrawing

‘ 1. 基準図面のハンドルを辞書に格納
Dim ent As AcadEntity
For Each ent In docBase.ModelSpace
dictBase.Add ent.Handle, ent
Next

‘ 2. 比較対象の図面を開く
Dim compPath As String
compPath = “C:\Projects\ComparisonTarget.dwg”
Set docComp = Application.Documents.Open(compPath)

‘ 3. 比較処理
Dim entComp As AcadEntity
For Each entComp In docComp.ModelSpace
If dictBase.Exists(entComp.Handle) Then
‘ ハンドルが同じ=既存オブジェクト。ここでプロパティを比較
If Not CompareProperties(dictBase(entComp.Handle), entComp) Then
Debug.Print “変更あり: ” & entComp.Handle
End If
Else
‘ 辞書にない=新規追加
Debug.Print “新規追加: ” & entComp.Handle
End If
Next

MsgBox “比較完了。イミディエイトウィンドウを確認してください。”
End Sub

‘ プロパティ比較用関数
Function CompareProperties(ent1 As AcadEntity, ent2 As AcadEntity) As Boolean
‘ 例:画層が同じかチェック
If ent1.Layer <> ent2.Layer Then
CompareProperties = False
Exit Function
End If
CompareProperties = True
End Function

4. 陥りやすいエラーと回避策

①「参照エラー」の罠

コード内の`Scripting.Dictionary`を使うには、VBAエディタのメニューから[ツール] -> [参照設定] -> `Microsoft Scripting Runtime`にチェックを入れる必要があります。これを忘れると「ユーザー定義型は定義されていません」と怒られます。

② モデル空間の「重さ」

図面内のオブジェクトが数万を超えると、`For Each`ループは極端に遅くなります。その場合は、`SelectionSet`(選択セット)を使用して、必要なオブジェクトだけをフィルタリングして抽出してください。これが「パフォーマンスの重みを知る」という現場の鉄則です。

③ 図面が閉じない!

コード中で`Documents.Open`した図面は、自動的には閉じません。`docComp.Close False`を最後に入れて、メモリリークを確実に防ぎましょう。

先輩エンジニアからのアドバイス

AutoCAD VBAをマスターするコツは、「まずは動く小さなプログラムを書くこと」、そして「オブジェクトの階層構造(Application > Document > ModelSpace > Entity)を常に頭の中にイメージすること」です。

今回のコードをベースに、「色が変わっていたら赤丸を囲む」といったアクションを追加してみてください。単なる比較ツールから、あなただけの「強力な設計支援エージェント」へと進化するはずです。

ここをクリアしたあなたなら、もう初学者ではありません。自信を持って、次の自動化へ挑戦してください。何かあればいつでも聞いてくださいね。応援しています!

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