【テクニカル・上級編】【実務中級者向け】マルチレイアウト図面の「全レイアウト別ファイル保存」自動化スクリプト – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD自動化の深淵:マルチレイアウトを「個別のDWG」へ解体する極意

AutoCADの運用において、最も忌むべきは「肥大化した図面」と「人為的な切り出し作業」だ。特に納品直前のマルチレイアウト図面から、特定のレイアウトだけを抽出する作業をマニュアルで行うなど、エンジニアのプライドが許さない。

今日は、VBAの限界を突き詰め、メモリの断片化を回避しながら、高速かつ確実に図面を分離する「プロフェッショナルな解体術」を授ける。

—

1. 勘所:なぜ「単なるコピー」ではいけないのか

多くの初学者は `CopyObjects` や `WBlock` を闇雲に使い、結果として図面内に「ゾンビ定義(不要なブロック定義や画層、線種)」を大量に残す。

大規模プロジェクトにおいて、これは後に致命的なパフォーマンス低下を招く。我々が求めるのは、「クリーンな個別ファイル」である。これを実現するには、`WBlock` メソッドの挙動を完全に制御し、図面データベースの整合性を維持したまま、メモリリークを許さないコードを書く必要がある。

—

2. 極限の設計:レイアウト分離スクリプト

以下のコードは、単にファイルを保存するだけではない。オブジェクトの明示的な解放と、AutoCADのドキュメントスタックを汚さないための「セーフティ・ガード」を備えている。

Option Explicit

‘ 伝説のエンジニアのための、クリーンなレイアウト分離ルーチン
Public Sub ExportAllLayoutsToDWG()
Dim acadApp As Object
Dim acadDoc As AcadDocument
Dim layout As AcadLayout
Dim newDoc As AcadDocument
Dim savePath As String
Dim folderPath As String

‘ フォルダ選択のロジックは別途シェルオブジェクト等で実装せよ
folderPath = “C:\Output\SplitFiles\”

Set acadDoc = ThisDrawing

‘ データベースの整合性を保護するため、レイアウトをループ処理
For Each layout In acadDoc.Layouts
‘ “Model”レイアウトは除外するのが定石
If layout.Name <> “Model” Then

‘ WBlockメソッドを実行
‘ 第2引数にレイアウト名を渡すことで、その領域のみを抽出する
On Error Resume Next
Set newDoc = acadDoc.Wblock(folderPath & layout.Name & “.dwg”, layout)

If Err.Number <> 0 Then
Debug.Print “Error on layout: ” & layout.Name & ” – ” & Err.Description
Err.Clear
Else
‘ 保存後のファイルに対して監査(Audit)や不要定義のパージを
‘ 自動化パイプラインで組み込むのが真のプロだ
newDoc.Close False
End If
On Error GoTo 0

End If
Next layout

‘ オブジェクトの明示的解放(VBAのGCを待たない)
Set newDoc = Nothing
Set acadDoc = Nothing
End Sub

—

3. シニアエンジニアが意識すべき「メモリと安定性」の知見

① COMオブジェクトのライフサイクル管理

VBAはCOMラッパーである。`Set newDoc = Nothing` を怠ることは、AutoCADのプロセス上にメモリリークの種を撒くことに等しい。特に数百枚規模のレイアウトを扱う場合、ガベージコレクションを待つ余裕などない。ループ内でのインスタンス管理は厳密に行え。

② Windows APIによるファイルシステム操作

上記のコードでは保存先を固定しているが、実務では `GetSaveFileName` 等のWindows APIを呼び出し、ユーザーにディレクトリ選択を委ねるべきだ。VBAの `FileDialog` は稀に不安定な挙動を見せるため、堅牢なシステムを組むなら `comdlg32.dll` の直接呼び出しが最も信頼性が高い。

③ システム間連携の要:バージョン互換制御

納品データとして書き出す際、`WBlock` は「現在の図面バージョン」を継承する。もし取引先が古いバージョンのAutoCADを使用している場合、`SaveAs` メソッドと組み合わせて、明示的に `ac2013_DWG` や `ac2010_DWG` 等の定数を指定するルーチンを追加せよ。

‘ バージョン指定による保存例
newDoc.SaveAs folderPath & layout.Name & “.dwg”, ac2010_DWG

—

4. 最後に:自動化の真髄

「自動化」とは、単に人間を楽にすることではない。「再現可能な品質を、システムに担保させること」である。

レイアウトの切り出し一つとっても、命名規則、不要な画層の削除、プロキシ図形の処理など、考慮すべき点は山ほどある。今回提示したロジックをベースに、貴殿の現場にある「独自の命名規則」や「標準画層の強制」を組み込むことで、初めてそれは貴殿の強力な武器となる。

コードは嘘をつかない。だが、手抜きをすれば必ずしっぺ返しが来る。
アーキテクチャの根幹を理解し、AutoCADのデータベースを支配せよ。それが、我々エンジニアに課せられた使命だ。

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