【実務・中級編】【実務中級者向け】最新DWGを旧バージョンへ一括変換:バージョン互換性を保つための注意点 – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAの深淵:バージョン互換性を制する「DWG一括変換」の設計思想

AutoCADのバージョンアップを追うごとに、我々自動化エンジニアの悩みは深まる。「最新版で作成した図面が、現場の古いAutoCADで開けない」——この単純かつ致命的な問題は、手作業で解決すべきではない。

今回は、AutoCAD VBA(およびObjectARX/Managed .NETの知見)を駆使し、「バージョン互換性を担保しながら、堅牢にDWGを一括変換する」という実務の壁を突破する極意を伝授する。

—

1. なぜ「SaveAs」のループ処理は罠なのか

多くの初心者は、単に `Document.SaveAs` をループさせるだけのコードを書く。しかし、それは「破滅への入り口」だ。

  • プロキシオブジェクトの爆弾: 古いバージョンへの書き出し時に、最新機能固有のエンティティが「プロキシ」化され、再保存時にデータ構造が破損するリスクがある。
  • イベントの競合: `SaveAs` 実行中にトリガーされるイベントや、バックグラウンドでのオートセーブがプロセスを阻害する。
  • メモリリーク: AutoCADのオブジェクトモデルはCOMベースだ。`Document` オブジェクトを適切に解放・クローズしなければ、数千ファイルの処理中にメモリが枯渇し、AutoCADは必ずクラッシュする。

設計の鉄則: 「開いて、保存して、閉じる」という単純な処理こそ、エラーハンドリングとメモリ解放を極限まで突き詰めよ。

—

2. 堅牢な一括変換スクリプト:プロダクションコード

以下のコードは、フォルダ内の全DWGを、指定したバージョン(例:2010形式)へ変換する設計である。

Option Explicit

‘ 変換対象のDWGバージョン定数 (ac2010_dwg 等)
‘ 詳細は AcSaveAsType 列挙型を参照のこと
Const TARGET_VERSION As AcSaveAsType = ac2010_dwg

Public Sub BatchConvertDWG()
Dim folderPath As String
Dim fso As Object
Dim folder As Object
Dim file As Object

folderPath = “C:\Projects\TargetFiles\” ‘ 変換対象フォルダ
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set folder = fso.GetFolder(folderPath)

‘ 致命的なエラーを防ぐため、バックグラウンド処理を抑制
On Error Resume Next

For Each file In folder.Files
If LCase(fso.GetExtensionName(file.Path)) = “dwg” Then
ProcessSingleDrawing file.Path
End If
Next

MsgBox “変換処理が完了しました。”, vbInformation
End Sub

Private Sub ProcessSingleDrawing(ByVal filePath As String)
Dim doc As AcadDocument

‘ ファイルオープン時のタイムアウトやダイアログを考慮
‘ 最新版のAutoCADはバックグラウンドオープンがデフォルトだが、
‘ VBAからの操作時はメインウィンドウに明示的にアタッチさせる
Set doc = Application.Documents.Open(filePath, False)

If doc Is Nothing Then Exit Sub

On Error GoTo Cleanup

‘ 監査(Audit)を実行してから保存するのがプロの流儀
‘ 不完全なデータを持ち越さないための防波堤
doc.SendCommand “_AUDIT” & vbCr & “Y” & vbCr

‘ バージョンを指定して保存
doc.SaveAs filePath, TARGET_VERSION

Cleanup:
‘ 確実にメモリから解放する
If Not doc Is Nothing Then
doc.Close False
Set doc = Nothing
End If
End Sub

—

3. バージョン互換を保つための「3つの絶対防衛ライン」

コードを動かすだけでは不十分だ。実務現場で「ファイルが開けない」というクレームをゼロにするための、設計上の注意点を共有する。

① Audit(監査)の強制実行

最新バージョンから旧バージョンへ落とす際、データ構造の不整合がエラーを引き起こすことが多い。`SaveAs` の直前に `SendCommand “_AUDIT” & vbCr & “Y” & vbCr` を挟むことで、DBの整合性を強制的に修復させる。これは非常に強力な防衛手段だ。

② プロキシオブジェクトの制御(システム変数)

`PROXYGRAPHICS` や `PROXYNOTICE` システム変数を調整し、プロキシオブジェクトの表示・警告を制御する必要がある。特に旧バージョンで開いた際に「プロキシ警告」が出るのを防ぐには、図面を保存する前にこれらの設定を最適化しておくことが望ましい。

③ ファイル属性と読み取り専用権限

大規模な一括変換を行う際、ネットワークドライブ上のファイルを直接操作すると、一時ファイルが残存して以降の処理がロックされる。

  • 鉄則: 変換はローカルディスクにコピーしてから行い、完了後に上書き保存する手順を踏むこと。ネットワーク経由の `SaveAs` はパフォーマンスと安定性の観点から「御法度」である。

—

結論:自動化は「予防医学」である

今回紹介したコードは、あくまで「最低限の土台」だ。現場の図面には、外部参照(Xref)やフォント欠損、異常に巨大な画層定義など、計算外のノイズが溢れている。

真に優秀なエンジニアは、コードを書く前に「どのファイルが失敗したか」をログ出力する堅牢なエラーハンドリングを構築する。今回のスクリプトをベースに、`On Error` で失敗したファイルパスをテキストに書き出す処理を加えれば、それはもう「プロフェッショナルな変換ツール」として社内で重宝されるはずだ。

技術は手段に過ぎない。重要なのは、その先の「現場の設計者がストレスなく業務を継続できる環境」を作ることである。健闘を祈る。

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