【AutoCAD VBA極限最適化】DXF保存時の精度制御でファイルサイズを極限まで削ぎ落とす技術
開発プロジェクトの現場において、他社や外部システムへ引き渡すためのDXFファイル出力で頭を悩ませたことはないだろうか。
「たった数MBの図面のはずが、なぜか数十MBに膨れ上がっている」
「データ交換用のバッチ処理を回したら、サーバーのストレージがすぐに圧迫された」
原因の多くは、必要のない「小数点以下の過剰な精度」がそのままテキスト形式のDXFに書き出されていることにある。AutoCADのデフォルト設定は「あらゆる状況で数値を正確に保つ」こと最優先にしているため、データ交換用としては完全なオーバースペックだ。
今回は、AutoCAD VBAを駆使して、保存直前にシステム変数を動的にコントロールし、図面の品質を損なわずにファイルサイズを劇的に軽量化する「プロフェッショナル・プラクティス」を伝授する。
—
1. なぜデフォルトのDXF保存は非効率なのか?
DXF(Drawing Interchange Format)はテキストベースのファイルである。そのため、座標値や寸法値の小数点以下の桁数がそのままファイル容量に直結する。
例えば、`123.456789012345` という座標値があったとする。機械加工や一般的なBIM/CIMのデータ連携において、果たして小数点以下12桁(ナノメートルオーダー)の精度が必要だろうか? ほとんどのケースで小数点以下3〜4桁(ミリ・マイクロオーダー)あれば十分である。
人間が目視で確認し、一括置換などでこれを削るのはナンセンスだ。我々はエンジニアである。AutoCADの内部システム変数をVBAでスマートに操り、保存の瞬間だけ精度を最適化する仕組みをコードで担保しなければならない。
—
2. 制御すべき核心システム変数
DXF保存時の数値精度やオブジェクトの出力形式に影響を与える主要なシステム変数は以下の通りだ。VBAからこれらを安全に操作する必要がある。
- `LUPREC` (Linear Units Precision)
- 距離および座標の小数点以下の表示・出力桁数を制御する。
- 設定値: `0`(0桁)〜 `8`(8桁)。実務的な軽量化では `3` または `4` がスイートスポット。
- `AUPREC` (Angular Units Precision)
- 角度の小数点以下の精度を制御する。
- 設定値: `0` 〜 `8`。角度にそこまでの精度は不要な場合が多く、ここも絞るターゲットになる。
- `DWGCODEPAGE`
- 文字コードの制御。必要に応じた適切なコードページ設定も容量・文字化け対策として重要だが、今回は「数値精度」にフォーカスする。
—
3. 【実装コード】安全かつ堅牢なプロダクションコード
実務で使えるVBAモジュールを提示する。
単にシステム変数を書き換えるだけでは、「エラー落ちした際に元の設定に戻らない(図面が汚染される)」という致命的なバグを生む。必ず `Error Handler` を実装し、トランザクション的な安全性(ステートの復元)を担保するのがプロの作法だ。
以下のコードをVBAの標準モジュールに貼り付けて使用してほしい。
Option Explicit
‘ ==============================================================================
‘ モジュール名: modDxfOptimizer
‘ 概要 : 不要な精度を削ぎ落とし、極限まで軽量化したDXFをエクスポートする
‘ 著者 : 業務自動化チーフアーキテクト
‘ ==============================================================================
Public Sub ExportOptimizedDXF()
Dim targetPath As String
Dim originalLuprec As Integer
Dim originalAuprec As Integer
‘ 1. 出力先パスの定義(環境に合わせて変更してください)
targetPath = “C:\Output\OptimizedDrawing_” & Format(Now, “YYYYMMDD_HHMMSS”) & “.dxf”
‘ 2. エラーハンドリングの有効化(環境汚染防止の要)
On Error GoTo ErrorHandler
‘ 3. 現在のシステム変数を退避(ステートの保存)
originalLuprec = ThisDrawing.GetVariable(“LUPREC”)
originalAuprec = ThisDrawing.GetVariable(“AUPREC”)
‘ ==========================================================================
‘ 4. 最適化パラメータの適用(ここで精度を大胆に削る)
‘ ==========================================================================
‘ LUPRECを「3」(小数点以下3桁:ミリ単位)に設定
ThisDrawing.SetVariable “LUPREC”, 3
‘ AUPRECを「2」(小数点以下2桁:度単位の小数)に設定
ThisDrawing.SetVariable “AUPREC”, 2
‘ 5. DXF保存の実行
‘ ※ AutoCADのSaveAsメソッドを使用し、DXFのバージョンを指定(例: AutoCAD 2018 DXF形式)
‘ ac2018_dxf 等の定数を使用するためには適切なライブラリ参照が必要ですが、
‘ 文字列や数値(ACAD_2018の場合は別途定義)で安全に渡します。
‘ ここでは汎用的な現在セッションでのネイティブ保存コマンドを利用します。
‘ コマンドライン経由での確実なエクスポート(ダイアログ非表示)
ThisDrawing.SendCommand “_-EXPORTSAVE ” & targetPath & ” _DXF _V _2018 ”
‘ ※もし純粋なDocument.SaveAsを使う場合は以下のように記述します:
‘ ThisDrawing.SaveAs targetPath, ac2018_dxf ‘ 要Enum確認
‘ 6. 退避していたシステム変数を即座に復元
ThisDrawing.SetVariable “LUPREC”, originalLuprec
ThisDrawing.SetVariable “AUPREC”, originalAuprec
MsgBox “DXFの最適化エクスポートが完了しました。” & vbCrLf & “保存先: ” & targetPath, vbInformation, “最適化完了”
Exit Sub
ErrorHandler:
‘ 異常終了時でも必ずシステム変数を元に戻す(死活管理)
On Error Resume Next
ThisDrawing.SetVariable “LUPREC”, originalLuprec
ThisDrawing.SetVariable “AUPREC”, originalAuprec
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”
End Sub
—
4. チーフアーキテクトが教える、実装上の重要インサイト
① 「SendCommand」と「SaveAs」の使い分けの罠
上記のコードでは、確実にバージョン指定とフォーマットを指定するために `SendCommand` による `-EXPORTSAVE` を採用している。AutoCADのAPIにおける `SaveAs` は、バックグラウンドのドキュメントステートによっては予期せぬダイアログをポップアップさせ、バッチ処理をハングアップさせるリスクがある。
完全自動化(ヘッドレスに近い状態)を目指すなら、コマンドライン経由の制御の方が圧倒的に堅牢である。
② なぜ「LUPREC = 3」なのか?
建築・土木・機械の多くの図面において、ミリメートル(mm)を基本単位として扱っている場合、小数点以下3桁(マイクロメートル単位)を超える精度は、CADの浮動小数点演算の誤差領域にすぎない。ここを削るだけで、テキスト行数が減り、GZIPなどの圧縮効率も劇的に向上する。
③ データベース連携・CIM/BIM運用におけるメリット
昨今のBIM/CIM原則適用や、外部のクラウドデータベース(WebViewerなど)へCADデータを連携するプロジェクトにおいて、「パースの軽さ」「転送速度」はプロジェクト自体の成否を分ける。重厚長大なDXFをそのままアップロードする愚は避け、このVBAスクリプトを組み込んだ一括処理フローを構築してほしい。
—
5. まとめ
AutoCAD VBAは、単なる「定型作業の自動化ツール」ではない。システムの内部挙動(システム変数)をミリ秒単位・変数単位でハックし、ビジネスのコスト(ストレージ容量、ネットワーク転送時間、人間が待つ時間)を物理的に削減するための武器である。
今回紹介したDXF精度の最適化手法を既存のワークフローに組み込むことで、あなたのチームの生産性は確実に次のステージへと引き上げられるだろう。今すぐ開発環境を開き、このコードをデプロイしてその軽量化の効果を体感してほしい。
