【テクニカル・上級編】【初心者向け】SaveAsメソッドの引数徹底解説:DWGとDXFの保存形式を正しく切り替える – AutoCAD VBA解析バイブル

スポンサーリンク

【AutoCAD VBA極限解説】SaveAsメソッドの迷宮:バージョン互換とAcSaveAsTypeの全貌

AutoCAD VBAによる図面自動化において、最も破壊的な手戻りを引き起こす要因は何だと思うか?
それは、`ThisDrawing.SaveAs` メソッドにおけるファイル形式の指定ミスだ。

「最新のAutoCADで保存した図面が、協力会社のレガシー環境で開かない」
「DXFで出力したつもりが、ネイティブのDWGとして書き出されて下流システムがパースエラーを起こした」

このようなトラブルは、単なるケアレスミスではない。AutoCADの裏側で動いているAcSaveAsType列挙体の仕様と、COMオブジェクトのライフサイクルに対する無理解が招いた「人災」である。
今回は、シニアエンジニアおよび社内システム管理者が絶対に押さえておくべき、バージョン互換制御とSaveAsの極限の知見を授ける。

—

1. AcSaveAsType列挙体とバージョン互換の闇

AutoCAD VBAで図面を保存する際、`SaveAs` メソッドの第2引数には `AcSaveAsType` 列挙体を指定する。しかし、この列挙体が示す「バージョン」の裏側には、AutoCADの歴史的進化とデータ構造の互換性の罠が潜んでいる。

主なAcSaveAsType定数と実態

| 定数値 (AcSaveAsType) | 内部値 | 対象DWG/DXFバージョン | シニアが知るべき実務上のリスク |
| :— | :— | :— | :— |
| `acR12DXF` | 1 | AutoCAD R12/LT2 DXF | 現代の複雑なオブジェクト(3Dソリッド、動的ブロック等)は完全に消失・破棄される。 |
| `ac2000_DWG` | 12 | AutoCAD 2000 DWG | 極めて古い下流システムとの連携用。アノテーション尺度などは維持されない。 |
| `ac2004_DWG` | 24 | AutoCAD 2004 DWG | 2004〜2006世代の標準。この世代から文字エンコーディングの扱いが変わる。 |
| `ac2007_DWG` | 36 | AutoCAD 2007 DWG | 3DモデリングエンジンがACISに変更された節目のバージョン。 |
| `ac2010_DWG` | 48 | AutoCAD 2010 DWG | パラメトリック制約が導入された。R2010未満の環境では開けない。 |
| `ac2013_DWG` | 60 | AutoCAD 2013 DWG | AutoCAD 2013〜2017の標準。これ以降、DWGの基本構造は長期安定している。 |
| `ac2018_DWG` | 64 | AutoCAD 2018〜最新 | AutoCAD 2018以降の標準。マルチビュードローイング等の最新機能に対応。 |

レガシーシステムとの連携において最も重要なのは、「新しいバージョンで作成された図面を、古い `AcSaveAsType` で無理やり保存すると、メタデータやカスタムオブジェクトのプロキシ情報が欠落する」という事実である。

—

2. メモリ管理とオブジェクトライフサイクルの鉄則

AutoCAD VBAで大量の図面をバッチ処理で `SaveAs` する際、避けて通れないのがメモリリークとCOMコンポーネントの解放漏れだ。
AutoCADのプロセス(`AcadApplication`)は、インスタンスが肥大化しやすく、不適切なオブジェクト参照の保持は確実にメモリーリークを引き起こす。

以下の極限コードは、安全にファイルを別形式で保存しつつ、確実にメモリを解放するための設計パターンである。

【実践コード】安全なバージョン変換・保存プロシージャ

Option Explicit

Public Sub ExportToLegacyVersion(ByVal targetFilePath As String, ByVal outputFilePath As String, ByVal targetVersion As AcSaveAsType)
Dim acadApp As AcadApplication
Dim targetDoc As AcadDocument
Dim isAppRunning As Boolean

‘ 1. AutoCADプロセスの安全な取得(Late BindingまたはActiveX)
On Error Resume Next
Set acadApp = GetObject(, “AutoCAD.Application”)
If acadApp Is Nothing Then
Set acadApp = New AutoCAD.Application
isAppRunning = False
Else
isAppRunning = True
End If
On Error GoTo 0

If acadApp is Nothing Then
MsgBox “AutoCADの起動に失敗しました。”, vbCritical
Exit Sub
End If

‘ 可視化の制御(バックグラウンド処理ならFalse推奨だが、エラーハンドリングに注意)
acadApp.Visible = True

‘ 2. 対象図面を開く
Set targetDoc = acadApp.Documents.Open(targetFilePath, True)

‘ 3. エラーハンドリングを考慮したSaveAs実行
On Error GoTo ErrorHandler

‘ 重要:SaveAs実行前に図面の状態を検証
If targetDoc.ReadOnly Then
Err.Raise vbObjectError + 512, “ExportToLegacyVersion”, “対象図面が読み取り専用です。”
End If

‘ 指定されたバージョンで保存
‘ ※ここでAcSaveAsTypeを動的に切り替える
targetDoc.SaveAs outputFilePath, targetVersion

‘ 4. ドキュメントの明示的なクローズ
targetDoc.Close False ‘ 変更を破棄して閉じる(SaveAs済みのため)
Set targetDoc = Nothing

‘ 自前で起動したインスタンスなら終了させる(必要に応じて)
If Not isAppRunning Then
acadApp.Quit
End If
Set acadApp = Nothing

MsgBox “指定形式での保存が正常に完了しました。”, vbInformation
Exit Sub

ErrorHandler:
‘ 5. 異常系における確実なオブジェクト解放(メモリリーク防止)
Dim errDesc As String
errDesc = Err.Description

On Error Resume Next
If Not targetDoc Is Nothing Then
targetDoc.Close False
Set targetDoc = Nothing
End If
If Not acadApp Is Nothing And Not isAppRunning Then
acadApp.Quit
Set acadApp = Nothing
End If
On Error GoTo 0

MsgBox “エラーが発生しました: ” & errDesc, vbCritical
End Sub

—

3. シニアエンジニアが現場で直面する「罠」と対策

罠その1:DXF保存時の座標精度とバイナリ/アスキーの選択

`acR12DXF` やその他のDXF形式で保存する場合、`SaveAs` メソッド単体では「アスキー形式か、バイナリ形式か」の細かな制御や、実数の出力精度(丸め誤差)を直接指定できない。
もし下流のCAMシステムや独自パーサーがアスキーDXFしか受け付けない場合、`SaveAs` 後のテキスト置換や、システム変数(`FILEDIA` や `SAVEFORMAT`)の事前操作が必要になるケースがある。

罠その2:非表示(Invisible)実行時のモーダルダイアログブロック

バックグラウンドで `acadApp.Visible = False` にして一括変換スクリプトを回すエンジニアが多いが、ファイルに未保存の変更や修復が必要なエラーが含まれている場合、AutoCADがモーダルダイアログを表示してスクリプトが無限フリーズする。
これを防ぐため、必ずシステム変数 `FILEDIA` を `0` に設定し、警告ダイアログを抑制するアーキテクチャを構築しなければならない。

‘ バッチ処理前の必須環境設定
acadApp.SetSystemVariable “FILEDIA”, 0
acadApp.SetSystemVariable “CMDDIA”, 0

—

総括

AutoCAD VBAにおける `SaveAs` メソッドは、単なるファイルの「名前を付けて保存」ではない。
「異なる世代のCADエンジン間を橋渡しする、厳格なデータシリアライゼーションのインターフェース」である。

列挙体の数値をなんとなく指定するのではなく、図面が内包するオブジェクトのライフサイクルと、メモリ空間の解放までを完全にコントロールすること。それこそが、現場のトラブルをゼロにするプロフェッショナルのアプローチだ。

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