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のデータベースを支配せよ。それが、我々エンジニアに課せられた使命だ。
