【テクニカル・上級編】【実務中級】AutoCAD VBAで図面内の全レイアウト(Layout)を検索し、ページ設定(Page Setup)を自動適用・変更する – AutoCAD VBA解析バイブル

スポンサーリンク

序論:出力自動化の深淵――なぜ「Layouts」と「PageSetup」の制御が重要なのか

AutoCAD VBAを極める道において、図形を描画するフェーズは序の口に過ぎない。真のエンジニアリングの価値は、成果物としての「図面」をいかに正確、かつ迅速にデリバリーできるかにある。

現場のシニアエンジニアであれば、数百枚におよぶ図面ファイルの全レイアウトに対して、手動でページ設定を適用する不毛さを知っているはずだ。プリンタードライバの変更、用紙サイズの統一、尺度設定の微調整。これらを人手に頼れば、必ずヒューマンエラーという名の不純物が混入する。

今回は、AutoCADのオブジェクトモデルの中でも、特に設計者の意図が反映されやすい「Layoutsコレクション」と、その振る舞いを決定づける「PlotConfigurations(ページ設定)」の同期について、極限まで最適化された実装アプローチを解説する。

1. オブジェクトモデルの解剖:Layout と PlotConfiguration の関係

AutoCAD VBAにおいて、各レイアウト(`AcadLayout`)は、独自のプロット設定を保持している。しかし、実務上は「ページ設定」として定義されたテンプレート(`AcadPlotConfiguration`)から設定をコピーするのが定石だ。

ここで留意すべきは、`CopyFrom` メソッドの破壊的威力と、COMオブジェクトの生存期間である。

ページ設定適用のメカニズム

1. 検索: アクティブなドキュメント内の `PlotConfigurations` コレクションから、目的の設定(例:「A1_PDF_Mono」)を特定する。
2. 反復: `Layouts` コレクションを走査する。この際、`Model` 空間を除外するかどうかの論理が必要となる。
3. 同期: `objLayout.CopyFrom(objPlotConfig)` を実行する。
4. リフレッシュ: `objLayout.RefreshPlotDeviceInfo()` を呼び出し、内部のプロットエンジンにデバイス情報の再読み込みを強制する。

2. 実践的実装:全レイアウト一括適用エンジン

以下に示すコードは、単なるループ処理ではない。エラーハンドリング、プロセスの不可視化、そしてリソース解放を念頭に置いた、実戦配備用のアーキテクチャである。

Option Explicit

‘ Windows API: 実行速度計測用の高精度タイマー
Private Declare PtrSafe Function GetTickCount Lib “kernel32″ () As Long

”’

”’ 全レイアウトに対して指定したページ設定を強制適用する
”’

”’ 適用するページ設定名 Public Sub SyncAllLayoutsPageSetup(ByVal setupName As String)
Dim startTime As Long
startTime = GetTickCount()

Dim doc As AcadDocument
Set doc = ThisDrawing

‘ 1. ターゲットとなるページ設定の存在確認
Dim targetSetup As AcadPlotConfiguration
On Error Resume Next
Set targetSetup = doc.PlotConfigurations.Item(setupName)
On Error GoTo 0

If targetSetup Is Nothing Then
MsgBox “指定されたページ設定 [” & setupName & “] が図面内に存在しません。”, vbCritical
Exit Sub
End If

‘ 2. パフォーマンス最適化:再描画の抑制(擬似的なLockWindowUpdate)
‘ AutoCAD VBAではAcadApplication.ScreenUpdatingは存在しないため、
‘ システム変数で制御するのが定石。
Dim originalRegenMode As Integer
originalRegenMode = doc.GetVariable(“REGENMODE”)
doc.SetVariable “REGENMODE”, 0

Dim lay As AcadLayout
Dim successCount As Integer: successCount = 0

On Error GoTo ErrorHandler

‘ 3. 全レイアウトを走査
For Each lay In doc.Layouts
‘ Model空間は除外(必要に応じて変更)
If UCase(lay.Name) <> “MODEL” Then
‘ ページ設定のコピー
lay.CopyFrom targetSetup

‘ デバイス情報の強制更新(これを怠ると印刷時に旧設定が残る場合がある)
lay.RefreshPlotDeviceInfo

successCount = successCount + 1
End If
Next lay

‘ 4. 後処理と統計の表示
doc.SetVariable “REGENMODE”, originalRegenMode
doc.Regen acAllViewports

Debug.Print “— Process Completed —”
Debug.Print “Applied: ” & successCount & ” layouts.”
Debug.Print “Execution Time: ” & (GetTickCount() – startTime) & ” ms”

MsgBox successCount & ” 個のレイアウトに設定を適用しました。”, vbInformation

CleanUp:
‘ オブジェクトの明示的解放(COM参照カウントを適切に管理)
Set targetSetup = Nothing
Set lay = Nothing
Exit Sub

ErrorHandler:
Debug.Print “Error in Layout [” & lay.Name & “]: ” & Err.Description
Resume Next
End Sub

3. シニアエンジニアが押さえるべき「極限の知見」

3.1. `RefreshPlotDeviceInfo` の重み

多くのリファレンスでは無視されがちだが、`RefreshPlotDeviceInfo` の呼び出しは極めて重要だ。AutoCADの内部プロットエンジンは、`CopyFrom` が実行されただけでは、システム上のプリンタードライバ(PC3ファイル等)との整合性を再計算しないことがある。このメソッドを明示的に叩くことで、印刷時の「デバイスが見つかりません」といったランタイムエラーを未然に防ぐことができる。

3.2. メモリ最適化とCOMの解放

VBAはガベージコレクションが甘い。特に大規模な図面セットをバッチ処理する場合、`Set obj = Nothing` をループの外や終了時に徹底することは、AutoCADのゴーストプロセス(acad.exeが終了しても残る現象)を防ぐための最低限のマナーである。

3.3. Windows APIによる実行制御

上記のコードでは `GetTickCount` を使用している。これは単なるデバッグ用ではない。数千枚の図面を処理するシステムを構築する場合、処理時間の推移をログに記録し、ボトルネック(特定の図面だけ処理が異常に遅い等)を特定するための重要な指標となる。

3.4. レガシー環境への配慮

もし、あなたの管理する図面が20年以上前から継承されているものなら、`PlotConfigurations` 自体が破損しているケースがある。その場合は、`CopyFrom` を実行する前に、一度ダミーのページ設定を作成して削除する、あるいは `Purge` コマンドを介在させるなどの「外科手術」が必要になる。

結論:自動化の本質は「信頼性」にある

ページ設定の自動適用は、一見地味なタスクだ。しかし、この小さな自動化の積み重ねが、設計部門全体の生産性を決定づける。

本稿で紹介したアプローチは、単に動くだけのコードではない。予期せぬエラーに耐え、実行速度を意識し、後続のプロセスに悪影響を与えないための「設計思想」を盛り込んでいる。このコードをベースに、各社の運用ルール(特定のプレフィックスを持つレイアウトのみ処理するなど)を組み込み、鉄壁の自動化ツールへと昇華させてほしい。

技術の真髄は細部に宿る。そして、その細部を支配する者こそが、真のアーキテクトである。

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