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)を常に頭の中にイメージすること」です。
今回のコードをベースに、「色が変わっていたら赤丸を囲む」といったアクションを追加してみてください。単なる比較ツールから、あなただけの「強力な設計支援エージェント」へと進化するはずです。
ここをクリアしたあなたなら、もう初学者ではありません。自信を持って、次の自動化へ挑戦してください。何かあればいつでも聞いてくださいね。応援しています!
