【AutoCAD VBA】巨大な図面から「必要なレイアウト」だけを抜き出す!部分納品用抽出ツールの極意
こんにちは。AutoCADの自動化の世界へようこそ。
現場でよくある悩み、それは「1つのDWGファイルに全図面を詰め込みすぎて、取引先や協力会社に渡すときに不要な情報まで漏れてしまう」という問題です。
「このレイアウトだけを別ファイルにして送ってくれ」と言われたとき、皆さんはどうしていますか? コピー&ペーストで新しい図面に貼り付けていませんか? それ、AutoCAD VBAで一瞬で終わらせましょう。
今回は、単なるコピペを超えた、実務で使える「レイアウト抽出ツール」の作り方を伝授します。
—
なぜ「コピー&ペースト」ではダメなのか?
手作業のコピペは、以下のリスクを孕んでいます。
- 画層やブロック定義のゴミが残る: 不要なデータまで付いてきて、ファイルサイズが肥大化する。
- 尺度設定やページ設定の継承漏れ: 印刷したらレイアウトが崩れる。
- ヒューマンエラー: 別のレイアウトを誤って選択してしまう。
これから書くVBAコードは、「既存の図面からレイアウトをコピーし、新しいDWGファイルとして保存する」というプロセスを自動化します。これができるようになると、皆さんの業務効率は劇的に変わります。
—
核心となるロジック:CopyObjectsメソッド
AutoCAD VBAでレイアウトを移動・コピーする際、最も重要なのが `CopyObjects` メソッドです。しかし、実はもっと手軽で安全な方法があります。それは、`Layout` オブジェクトの `Copy` メソッドを使うことです。
今回作成するツールの設計図
1. 抽出したいレイアウトを選択する。
2. 新規図面(テンプレート)を作成する。
3. 目的のレイアウトを新規図面にインポートする。
4. 余分な「レイアウト1(初期値)」を削除して保存する。
—
実践コード:レイアウト抽出ツール
以下のコードをVBAエディタ(`Alt + F11`)に貼り付けてみてください。
Public Sub ExportSelectedLayout()
Dim sourceDoc As AcadDocument
Dim targetDoc As AcadDocument
Dim layoutName As String
Dim templatePath As String
‘ 抽出したいレイアウト名(実務ではインプットボックスやフォームから取得してください)
layoutName = “詳細図A”
templatePath = “acad.dwt” ‘ 標準テンプレート
Set sourceDoc = ThisDrawing
‘ 1. 新規図面を作成
Set targetDoc = Application.Documents.Add(templatePath)
‘ 2. レイアウトのコピー元と先を定義
‘ AutoCADの仕様上、Layouts.Itemで指定したレイアウトをコピーして移動させる
On Error Resume Next
sourceDoc.Layouts.Item(layoutName).Copy layoutName
‘ エラー処理:レイアウトが見つからない場合
If Err.Number <> 0 Then
MsgBox “レイアウトが見つかりません!”, vbCritical
targetDoc.Close False
Exit Sub
End If
On Error GoTo 0
‘ 3. 新規図面側の初期レイアウトを削除(クリーンな状態にする)
‘ ※AutoCADは最低1つのレイアウトが必要なため、一度追加してから削除するのがコツ
targetDoc.Layouts.Item(“Layout1”).Delete
MsgBox “レイアウトの抽出が完了しました!名前を付けて保存してください。”
End Sub
—
ここが技術の分かれ道:開発者が知るべき「3つの注意点」
1. テンプレートの選定
`Application.Documents.Add` で使用するテンプレートは、自社の標準設定が含まれたDWTファイルを使うのが鉄則です。ここを適当にすると、出力後の図面の画層設定や線種尺度が狂います。
2. オブジェクトのライフサイクル
VBAで図面を操作する際、`ThisDrawing` は「現在アクティブな図面」を指します。コード実行中に画面が切り替わると、意図しない図面を操作してしまう危険があります。必ず `sourceDoc` や `targetDoc` のように、対象のオブジェクトを変数に格納して操作する癖をつけてください。
3. 「レイアウトの削除」は奥が深い
AutoCADは、図面に最低1つのレイアウトが存在しなければならないという制約があります。そのため、新規作成直後に「Layout1」を削除しようとするとエラーになります。必ず「目的のレイアウトをコピーしてから、Layout1を削除する」という順序を守ってください。
—
次のステップへ:ここをクリアすれば「中級者」
このコードをマスターしたら、次は以下のステップに挑戦してみてください。
- UIの拡張: `UserForm` を作成し、現在開いている図面の全レイアウトをリストボックスに表示して、チェックを入れたものだけを抽出するようにする。
- バッチ処理: フォルダ内の全DWGから、特定のレイアウトを全件抽出して別フォルダに保存する「一括処理ツール」へ進化させる。
AutoCAD VBAは、単なる「作業短縮」の道具ではありません。「図面データという資産を、いかに正確に切り出し、管理するか」というデータマネジメントの基礎そのものです。
このコードが、皆さんの退屈な手作業を一つでも減らすきっかけになれば幸いです。また何かあれば、いつでも聞きに来てくださいね。応援しています!
