【入門編】【上級】AcadDocument.Database.CopyObjectsを用いた「図面間高速オブジェクトコピー」:クリップボードを経由しない安定実装 – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAの深淵へ:CopyObjectsで「図面間データ転送」を極める

こんにちは。AutoCADの自動化という荒野を切り拓く皆さんに、今日は「脱・素人」のための決定打となるテクニックを授けましょう。

多くの人が図面間で図形をコピーしようとするとき、まず考えるのは「クリップボード経由(Copy/Paste)」です。しかし、業務で数万の図形を扱うなら、クリップボードは禁じ手です。メモリを浪費し、計算途中のフリーズを招き、何より「安定性」に欠けるからです。

今回は、AutoCADの内部データベースを直接操作する`CopyObjects`メソッドを用いた、プロフェッショナルなデータ移行術を解説します。

なぜ「CopyObjects」を使うのか?

クリップボードは人間がGUIで行うための補助機能です。プログラムがこれを使うと、AutoCADは「今どの画面がアクティブか?」「選択セットは有効か?」といったGUI上の制約に振り回されます。

一方、`CopyObjects`はDatabaseレベルの直接コピーです。

  • 超高速: GUIの描画更新を待たずにメモリ上で完結します。
  • 高安定: クリップボードの競合や、図面間コピー特有の「貼り付け位置ズレ」が発生しません。
  • 柔軟性: 必要なオブジェクトをメモリ上で直接指定して別図面へ「移動」させるため、スマートな処理が可能です。

核心コード:図面間コピーの極意

このコードは、現在開いている図面(ソース)から、別の図面(ターゲット)へオブジェクトを送り込む最小構成です。

Sub CopyObjectsAcrossDocuments()
‘ 1. オブジェクトの準備
Dim sourceDoc As AcadDocument
Dim targetDoc As AcadDocument
Dim objCollection(0) As AcadObject
Dim idMapping As Variant

‘ ソースとターゲットを定義(ここではアクティブ図面と開いている二番目の図面と想定)
Set sourceDoc = ThisDrawing
Set targetDoc = Application.Documents.Item(1) ‘ 必要に応じてインデックスを調整

‘ 2. コピーしたいオブジェクトを配列に格納
‘ 実務ではフィルタリングして取得した図形をここにループで入れます
Set objCollection(0) = sourceDoc.ModelSpace.Item(0)

‘ 3. CopyObjectsの魔法
‘ CopyObjects(オブジェクト配列, 貼り付け先空間, マッピング用変数)
sourceDoc.CopyObjects objCollection, targetDoc.ModelSpace, idMapping

‘ 4. 後処理
MsgBox “コピーが完了しました。”
End Sub

このコードの重要ポイント

  • `objCollection`(配列): `CopyObjects`は単体ではなく「配列」で受け取ります。`Variant`型を上手く扱うのがコツです。
  • `targetDoc.ModelSpace`: 貼り付け先はモデル空間だけでなく、ペーパー空間(Layout)にも指定可能です。
  • `idMapping`: ここがプロの領域です。コピーされた後のオブジェクトIDの変換テーブルがここに格納されます。これを使えば、コピー先で「コピーされた図形だけを特定して色を変える」といった二次加工が容易になります。

現場で陥りやすい「罠」と解決策

ここをクリアすれば、あなたはもう初学者ではありません。

1. データベースの不整合(ObjectIDの罠)

コピーした瞬間、オブジェクトは別図面のIDを持ちます。コピー直後に元図面のオブジェクトを操作しようとすると、参照エラーが発生します。常に「今操作しているのはどちらのデータベースか」を意識してください。

2. 画層やブロック定義の欠落

`CopyObjects`は図形そのものをコピーしますが、その図形が依存している「画層設定」「線種定義」「ブロック定義」がコピー先に存在しない場合、AutoCADは気を利かせて勝手に生成しますが、これが重い処理の原因や意図しないプロパティの変更を招きます。
対策: `CopyObjects`の前に、必要な画層やブロックが揃っているか確認する「辞書チェック」を組み込むのが一流の証です。

3. 未保存図面へのアクセス

`Application.Documents`は、保存されていない図面も保持します。処理前に`targetDoc.FullName`が空でないか(名前を付けて保存されているか)をチェックするロジックを入れましょう。

次のステップ:さらなる効率化へ

AutoCAD VBAをマスターするコツは、「画面上で起きていることを、裏側(Database)で再現する」という視点を持つことです。

今回紹介した`CopyObjects`は、単なる移動ツールではありません。図面テンプレートの自動生成や、複数の図面から必要な情報だけを抽出するバッチ処理において、最強の武器となります。

「マクロの記録」で生成された汚いコードを捨て、データベースの構造を理解する。この一歩が、あなたの自動化エンジニアとしてのキャリアを確実に飛躍させます。

何か不明点があれば、またいつでも聞いてください。次は、より複雑な「属性付きブロックの抽出」について深掘りしましょうか。応援していますよ。

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