AutoCAD VBAの呪縛を解く:DXF変換を「ただの保存」で終わらせない堅牢なアーキテクチャ
AutoCADの自動化において、`SaveAs`メソッドは最も初歩的でありながら、最も地雷が埋まっている領域だ。特にDWGからDXFへの変換は、単に拡張子を変えればいいというものではない。バージョン互換性とデータベースの整合性を無視したコードは、必ず後になって「開けないファイル」「壊れたレイヤデータ」という形で現場に牙を剥く。
今回は、実務レベルで「絶対に失敗しない」DXF変換の極意を伝授する。
—
なぜ、ただの`SaveAs`では不十分なのか?
初心者が陥る最大の間違いは、開いている図面をそのままの状態で、何の考慮もせずに`SaveAs`することだ。
1. アクティブドキュメントの非同期性: `ThisDrawing`に依存しすぎると、別図面のバッチ処理時に予期せぬ挙動を生む。
2. データベースの整合性: AutoCADはメモリ上で複雑なオブジェクトグラフを構築している。保存前に`Update`や`Audit`(監査)を挟まない保存は、データの欠損を誘発する。
3. バージョン互換の罠: DXFはバージョンごとにサポートされるエンティティが異なる。最新のDWGにある高度なオブジェクト(注釈尺度やダイナミックブロックの特殊パラメータなど)は、古いDXF形式では「ただの線」や「無価値なデータ」に化ける可能性がある。
—
プロダクション環境に耐えうる「DXF変換」コード
このコードは、単に保存するだけでなく、エラーハンドリングとファイルシステムの安全性を考慮したテンプレートだ。
Option Explicit
‘ @brief 指定したDWGを特定のDXFバージョンで保存する堅牢な関数
‘ @param filePath 保存先のフルパス(拡張子は.dxf)
‘ @param dxfVersion ACAD_VERSION列挙体などを指定(例: acR12_DXF, acR2013_DXF等)
Public Sub ExportToDXF(ByVal targetDoc As AcadDocument, ByVal savePath As String, ByVal dxfVersion As AcSaveAsType)
On Error GoTo ErrorHandler
‘ 1. 保存前のアシュアランス:データベースの整合性を確保する
targetDoc.Regen acActiveViewport
‘ 2. ファイル存在チェック(上書き確認のオーバーヘッドを回避)
If Dir(savePath) <> “” Then
‘ 必要に応じて既存ファイルを削除、あるいは別名保存を促すロジックを入れる
‘ Kill savePath
End If
‘ 3. SaveAsの実行
‘ 第2引数のVersionは、AcSaveAsTypeで指定する
‘ ここがDXF互換性の肝となる
targetDoc.SaveAs savePath, dxfVersion
Exit Sub
ErrorHandler:
MsgBox “DXF変換エラー: ” & Err.Description, vbCritical
‘ 必要に応じてログ出力処理をここに記述
End Sub
‘ 実行用ラッパー
Public Sub BatchConvertCurrentDrawing()
Dim targetDoc As AcadDocument
Set targetDoc = ThisDrawing
‘ 例: AutoCAD 2013形式のDXFで保存
‘ ※互換性重視なら acR12_DXF を選択するのが業界標準
Call ExportToDXF(targetDoc, “C:\Temp\ExportedDrawing.dxf”, acR2013_DXF)
MsgBox “変換完了”
End Sub
—
アーキテクトからの設計アドバイス
1. バージョン選択の「正解」
「最新ならいいだろう」という考えは捨てよ。相手先が使用しているCADのバージョン、あるいは利用する外部システム(CAMソフトやBIM連携ツール)が解析できる形式をピンポイントで指定すること。特に、レガシーなシステムであれば `acR12_DXF` を選ぶのが鉄則だ。R12形式は余計なメタデータを持たないため、データ交換の「最小公倍数」として非常に優秀である。
2. ファイルシステムの競合を避ける
`SaveAs`を行う際、ネットワークドライブ上のファイルを直接操作するのは避けるべきだ。
- ローカルへコピー -> 変換処理 -> 目的のパスへ移動
この手順を踏むだけで、ネットワーク切断による破損リスクは劇的に下がる。
3. 監査(Audit)の重要性
DXF変換の直前に `SendCommand` で `_.AUDIT` コマンドを実行し、Yオプションを渡すテクニックがある。自動化において、データベースが破損したままDXF化されるのを防ぐ唯一の防波堤となる。
最後に:自動化は「品質」への挑戦である
コードを書くことは手段に過ぎない。君たちが目指すべきは、「誰がいつ実行しても、同じ品質のデータが吐き出される」仕組みを作ることだ。
今回紹介したコードは、あくまで「骨組み」だ。これにログ出力、フォルダの再帰的走査、そしてエラー時のメール通知などを統合していけば、それは単なるマクロから「自動化基盤」へと進化する。
迷わず実装し、現場の非効率を根絶せよ。検討を祈る。
