AutoCAD VBAの深淵:CopyObjectsによる「図面間高速転送」の極意
AutoCADの自動化において、最も避けるべき禁じ手は何か。それは「クリップボード経由のコピー&ペースト」だ。
業務効率化ツールを開発する諸君。まさか今でも`SendKeys`でCtrl+Cを叩いたり、`Selection.Copy`でクリップボードを汚染させてはいないだろうか。あれはOSのメモリを浪費し、アクティブウィンドウのフォーカスに依存する「不安定の温床」だ。
真に堅牢なエンジニアは、データベースの深層に直接アクセスする。今回は、`Database.CopyObjects`メソッドを用いた、図面間転送のプロフェッショナルな実装手法を伝授する。
—
1. なぜ「CopyObjects」なのか?
`CopyObjects`は、AutoCADのデータベース(`AcDbDatabase`)間でオブジェクトを直接転送する最強のメソッドだ。クリップボードを経由しないため、以下の恩恵がある。
- 完全なバックグラウンド処理: 画面のチラつきや、現在の選択セットの状態に一切依存しない。
- 高速性: メモリ上のバイナリ転送に近い挙動を示すため、数千個の図形でも一瞬で処理が完了する。
- 整合性の維持: 変換マッピング(`IdMapping`)を自動生成するため、画層や線種などの依存関係も適切に解決される。
—
2. 堅牢な実装のためのアーキテクチャ
この処理で最も陥りやすい罠は「IDの不整合」だ。転送先の図面に同名の画層やブロックがない場合、自動的に作成されるが、それらの管理を誤るとデータが腐敗する。
以下のコードは、ソース図面からターゲット図面へオブジェクトを転送するためのテンプレートだ。
‘ — プロダクション実装:図面間オブジェクト転送プロシージャ —
Public Sub FastCopyBetweenDocuments(sourceDoc As AcadDocument, targetDoc As AcadDocument, objArray As Variant)
‘ 1. IdMappingオブジェクトの生成(転送先でのID変化を追跡)
Dim idMap As Object
Set idMap = ThisDrawing.Application.GetInterfaceObject(“AutoCAD.AcIdMapping.” & Left(Application.Version, 2))
‘ 2. データベースの取得
Dim sourceDb As Object, targetDb As Object
Set sourceDb = sourceDoc.Database
Set targetDb = targetDoc.Database
‘ 3. オブジェクトのコピー実行
‘ 第3引数は「所有者(Owner)」。通常はターゲット図面のモデル空間を指定
On Error GoTo ErrorHandler
sourceDb.CopyObjects objArray, targetDb.ModelSpace, idMap
‘ 4. 更新のコミット(AutoCADの内部処理待ち)
targetDoc.Regen acActiveViewport
Exit Sub
ErrorHandler:
MsgBox “転送エラー: ” & Err.Description, vbCritical
End Sub
—
3. 実務で必ず直面する「落とし穴」と対策
このコードをプロダクションに組み込む際、以下の3点に注意せよ。これができるか否かでツール寿命が数年変わる。
① オブジェクトの所有権(Owner)の明確化
`CopyObjects`の第2引数は「コピー先のオブジェクト」を指す。モデル空間に置くのか、特定のブロック定義(`BlockReference`)内に置くのか。ここを曖昧にすると、オブジェクトが宙に浮いた「孤児」状態になり、図面保存時にクラッシュを引き起こす。常に `targetDb.ModelSpace` か `targetDb.PaperSpace` を明示的に渡せ。
② ブロック参照の依存関係
転送するオブジェクトが「ブロック」を含んでいる場合、単純なコピーではブロック定義まで移動しないことがある。複雑な図形を扱う場合は、事前に`Table`や`BlockTable`の整合性を確認するガード句を挟むのが定石だ。
③ クリーンアップの徹底
`IdMapping`オブジェクトはCOMオブジェクトだ。明示的に `Set idMap = Nothing` を実行し、メモリを解放する癖をつけろ。VBAのガベージコレクションを信用してはいけない。
—
4. チーフアーキテクトからの助言
「自動化ツールを作る」ということは、「CADエンジニアの時間を買う」ことと同義だ。
クリップボードに頼るツールは、OSの調子や他ソフトの干渉で壊れる。しかし、`CopyObjects`でデータベースを直接操作するツールは、AutoCADが起動している限り、どこまでも正確に動き続ける。
次にツールを組むときは、「いかにAutoCADのGUI(ユーザーインターフェース)に触れずにデータを操作するか」を意識してほしい。それができれば、君の作成する自動化コードは、数年後も現役で動く「エンジニアリング資産」になるはずだ。
さあ、退屈な手作業のコピー&ペーストとは今日で決別しろ。コードを書け。そして、より高次元な設計を目指せ。
