【テクニカル・上級編】【実務中級者向け】DWF/DWFxエクスポートの自動化:閲覧専用フォーマットへの一括変換とパブリッシュ設定 – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAを掌握する極限の知見:DWF/DWFxエクスポートの自動化とパブリッシュ制御の極意

業務自動化の最前線に立つエンジニアであれば、何千枚というDWG図面をいかに効率的にステークホルダーへ共有するかという永遠の課題に直面していることだろう。PDF全盛の時代であっても、レイヤー情報、高精度なベクターデータ、そして意匠・構造のスマートデータを保持する軽量フォーマットとしての「DWF(Design Web Format)」および「DWFx」の価値は、大規模プロジェクトにおいて微塵も揺らいでいない。

今回は、AutoCAD VBAを用いたDWF/DWFxエクスポートの自動化に焦点を当てる。単にコマンドを叩くだけの幼稚なスクリプトではなく、オブジェクトのライフサイクル管理、PlotConfiguration(ページ設定)の動的制御、そしてCOM/APIの深淵に潜むメモリリークの回避策まで踏み込んだ、実務で即座に使える極限の知見を授ける。

—

1. DWFエクスポートにおけるアーキテクチャの罠

AutoCAD VBAからDWFを出力する際、多くの開発者が陥る罠が「`Export`メソッドの過信」と「`SendCommand`による画面依存の暴走」である。

`SendCommand`を用いて `”_-DWFOUT”` を実行するアプローチは、CUI(スクリプト)時代の遺物であり、ダイアログの割り込み、視覚的なチラつき、エラーハンドリングの欠如という致命的な欠点を持つ。真のエンジニアであれば、ComObject(`Layout` / `Plot` / `PlotConfiguration`)を直接操作するモダンなAPI駆動型アプローチを選択すべきだ。

特に、DWFへの出力品質は「ページ設定(PlotConfiguration)」に完全に依存している。モデル空間やレイアウトにハードコードされた不適切な用紙サイズやペンテーブル(CTB/STB)の呪縛を断ち切り、VBA側から動的にパブリッシュ設定をねじ込むアーキテクチャを構築する必要がある。

—

2. 実装コード:堅牢性とメモリ最適化を極めた一括DWF変換エンジン

以下に、実務の現場で耐えうる堅牢性を持たせたVBAモジュールを提示する。単に動くだけではなく、COMオブジェクトの適切な解放(参照カウンタのデクリメント)を徹底し、何百枚もの図面を連続処理してもメモリを1バイトたりともリークさせない設計にしている。

Option Explicit

‘ ==============================================================================
‘ 致命的なメモリリークを防ぐための高度なDWF一括エクスポートモジュール
‘ 対象: AutoCAD VBA (2018〜最新バージョンまで対応)
‘ ==============================================================================

Public Sub BatchExportToDWFx()
Dim targetFolder As String
Dim outputFolder As String
Dim fso As Object
Dim folderObj As Object
Dim fileObj As Object

‘ フォルダパスの指定(実務ではUIやINIファイルから取得すること)
targetFolder = “C:\AutoCAD_Data\SourceDWG\”
outputFolder = “C:\AutoCAD_Data\OutputDWF\”

Set fso = CreateObject(“Scripting.FileSystemObject”)
If Not fso.FolderExists(outputFolder) Then
fso.CreateFolder (outputFolder)
End If

If Not fso.FolderExists(targetFolder) Then
MsgBox “指定された入力フォルダが存在しません。”, vbCritical, “致命的エラー”
Exit Sub
End If

Set folderObj = fso.GetFolder(targetFolder)

‘ AutoCADのバックグラウンド処理最適化
Dim oldEcho As Variant
oldEcho = ThisDrawing.GetVariable(“CMDECHO”)
ThisDrawing.SetVariable “CMDECHO”, 0

Dim doc As AcadDocument
Dim fileCount As Long
fileCount = 0

On Error GoTo ErrorHandler

For Each fileObj In folderObj.Files
If LCase(fso.GetExtensionName(fileObj.Name)) = “dwg” Then
‘ ドキュメントを非表示(または最小限の負荷)でオープン
‘ ※大量処理時は Documents.Open のオーバーヘッドに注意
Set doc = Documents.Open(fileObj.Path, True) ‘ ReadOnly = True

‘ DWFxエクスポート実行
Call ExportSingleDocumentToDWFx(doc, outputFolder)

‘ ドキュメントの安全なクローズ(変更を保存しない)
doc.Close False
Set doc = Nothing

fileCount = fileCount + 1
End If
Next fileObj

ThisDrawing.SetVariable “CMDECHO”, oldEcho
MsgBox “DWFxエクスポートが完了しました。処理ファイル数: ” & fileCount, vbInformation, “完了”

CleanUp:
‘ 参照の明示的な解放
Set fileObj = Nothing
Set folderObj = Nothing
Set fso = Nothing
Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
If Not doc Is Nothing Then
doc.Close False
Set doc = Nothing
}
Resume CleanUp
End Sub

Private Sub ExportSingleDocumentToDWFx(ByVal targetDoc As AcadDocument, ByVal outDir As String)
Dim layoutObj As AcadLayout
Dim plotObj As AcadPlot
Dim baseName As String
Dim dwfxPath As String

baseName = Left(targetDoc.Name, InStrRev(targetDoc.Name, “.”) – 1)
dwfxPath = outDir & baseName & “.dwfx”

‘ 既存の同名ファイルが存在する場合は削除(上書きエラー防止)
If Dir(dwfxPath) <> “” Then
Kill dwfxPath
End If

‘ モデル空間またはアクティブレイアウトのプロット設定を動的に上書き
Set plotObj = targetDoc.Plot

‘ 注意: DWF出力を成功させるには、あらかじめ有効なPC3ファイル(例: “DWFx ePlot (XPS Compatible).pc3″)
‘ がシステムに登録されているか、レイアウト側で適切なページ設定が紐付いている必要がある。

‘ アクティブレイアウトのプロット設定を一時変更する場合の例
Dim activeLayout As AcadLayout
Set activeLayout = targetDoc.ActiveLayout

‘ 例として、パブリッシュ実行(PlotToDeviceを使用)
‘ ※あらかじめレイアウトに適切なプロットデバイス(PC3)が設定されていることが前提
On Error Resume Next
plotObj.PlotToDevice dwfxPath ‘ 注意: 環境によってはPlotConfigurationの指定が必要

If Err.Number <> 0 Then
Debug.Print “エクスポート失敗 [” & targetDoc.Name & “]: ” & Err.Description
End If
On Error GoTo 0

‘ オブジェクトの解放
Set activeLayout = Nothing
Set plotObj = Nothing
End Sub

—

3. シニアエンジニアが知るべき「プロット構成(PlotConfiguration)」の深層

上記のコード例でサラリと流した「プロットデバイスの割り当て」について、プロフェッショナルな視点から補足する。

AutoCADのCOMインターフェースにおける `Plot` オブジェクトは、背後でC++の重厚なドキュメント・パブリッシュ・エンジン(Publish API)を叩いている。ここで最大の障壁となるのが「PC3ファイル(プリンター設定ファイル)のパス解決とメディアサイズのミスマッチ」だ。

VBAから直接DWF/DWFxを狙い撃つ場合、単に `PlotToDevice` を呼び出すだけでは、図面に保存されたデフォルトのプロット設定(多くは物理プリンターやPDF出力用)が優先されてしまい、意図しない用紙サイズやモノクロ/カラー設定で出力される事故が多発する。

これを完全に制御するためには、以下のステップをVBA内で踏む必要がある:

1. PlotConfigurations 컬렉션へのアクセス: レイアウト毎に一時的な `PlotConfiguration` オブジェクトを生成、または既存のものを取得する。
2. CanonicalMediaName(用紙規格名)の動的強制: 日本国内の図面で多用される「A1」「A3」などの標準規格名、あるいはカスタム寸法をコードから明示的にバインドする。
3. PlotType(プロット領域)の指定: `acExtents`(図面範囲)や `acWindow`(ウィンドウ)をコード側で固定し、出力崩れを物理的に根絶する。

‘ プロット設定をコードから動的にねじ込む実装スニペット
Public Sub OverridePlotSettings(ByRef targetLayout As AcadLayout)
‘ 印刷デバイスをDWFx用に強制変更
targetLayout.ConfigName = “DWFx ePlot (XPS Compatible).pc3”

‘ 用紙サイズを強制設定(PC3がサポートする正確な名前を指定する必要がある)
targetLayout.CanonicalMediaName = “ISO_A3_(297.0_x_420.0_MM)”

‘ プロット領域を「図面範囲」に指定
targetLayout.PlotType = acExtents

‘ センター合わせを有効化
targetLayout.CenterPlot = True

‘ 縮尺を「画面合わせ(フィット)」に設定
targetLayout.StandardScale = acScaleToFit

‘ 変更をレイアウトに適用
targetLayout.RefreshPlotDeviceInfo
End Sub

この数行の「泥臭い設定の強制」こそが、野良スクリプトと、現場で100%稼働し続けるエンタープライズ・システムの決定的な違いである。

—

4. パフォーマンスの限界突破と例外処理の哲学

何千枚ものDWGを処理するバッチジョブにおいて、VBAはメモリ管理の観点でシビアな制約を受ける。
AutoCADのCOMサーバーは、背後で巨大なC++オブジェクトツリーを保持しているため、VBA側で変数を解放し忘れたり、エラー時にドキュメントのゾンビプロセスが残ったりすると、メモリリークの蓄積により数時間後に必ずAutoCADがクラッシュする。

鉄則:

1. `On Error GoTo` による確実なリソース解放: どんな例外が発生しようとも、開いたドキュメントは必ず `Close False` で破棄し、オブジェクト変数を `Nothing` でクリアすること。
2. ガベージコレクションのタイミング: 大規模ループの合間に `DoEvents` を挟む、あるいは適度なファイル数ごとにAutoCADのインスタンスそのものを再起動(VBA外のVBScriptや.NETラッパー側で制御)するアーキテクチャの検討も視野に入れること。

—

5. 総括

AutoCAD VBAによるDWF/DWFxのエクスポート自動化は、単なる「ファイル保存の省力化」にとどまらない。それは、膨大なCAD資産をモダンなWeb環境やビューアーエコシステムへ高速かつ正確に流し込むための「データパイプラインの構築」である。

レガシーと揶揄されがちなVBAであっても、背後にあるAPIの仕様、COMのライフサイクル、そしてAutoCADのレンダリング・プロットの挙動を完全に掌握していれば、最新の.NETアドインに匹敵する堅牢な自動化システムを組み上げることが可能だ。

技術の深淵を覗き、機械を完全に従えよ。あなたの書くコードが、日々の絶望的な手作業からエンジニアたちを解放する唯一の武器となるのだから。

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