序論:出力自動化の深淵――なぜ「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` コマンドを介在させるなどの「外科手術」が必要になる。
—
結論:自動化の本質は「信頼性」にある
ページ設定の自動適用は、一見地味なタスクだ。しかし、この小さな自動化の積み重ねが、設計部門全体の生産性を決定づける。
本稿で紹介したアプローチは、単に動くだけのコードではない。予期せぬエラーに耐え、実行速度を意識し、後続のプロセスに悪影響を与えないための「設計思想」を盛り込んでいる。このコードをベースに、各社の運用ルール(特定のプレフィックスを持つレイアウトのみ処理するなど)を組み込み、鉄壁の自動化ツールへと昇華させてほしい。
技術の真髄は細部に宿る。そして、その細部を支配する者こそが、真のアーキテクトである。
