【実務・中級編】【実務中級者向け】図面保存時の「ISAVEPERCENT」最適化:ファイルサイズと保存速度のトレードオフをVBAで制御 – AutoCAD VBA解析バイブル

スポンサーリンク

図面保存の裏側を知る:なぜ `ISAVEPERCENT` が業務効率を左右するのか

AutoCADで日々の設計業務を行っていると、図面の肥大化と保存時の「フリーズ時間」にイライラさせられることが増えてくる。特に数MBから数十MBに及ぶ大規模なプラント図面や建築図面を扱う現場において、`QSAVE` や `SAVE` を実行した瞬間に数秒間画面が固まる現象は、トータルで見れば膨大な生産性のロスだ。

多くのエンジニアは「AutoCADの標準設定だから」とこれを放置しがちだが、ここにメスを入れるのがシニアエンジニアの仕事である。

今回は、図面のファイルサイズと保存速度のトレードオフを支配するシステム変数 `ISAVEPERCENT`(増分保存割合) に焦点を当て、VBAを用いてこれをプログラム的に制御する「堅牢なセーブ戦略」を伝授する。

—

`ISAVEPERCENT` とは何か?(非効率なデフォルト値の罠)

AutoCADは図面を保存する際、ファイル全体を毎回丸ごと書き出しているわけではない。デフォルトでは、変更があった差分データだけをファイルの末尾に追加していく「増分保存(Incremental Save)」という方式をとっている。これにより、保存処理のスピードを劇的に向上させている。

この増分保存の許容量をパーセンテージで制御しているのが `ISAVEPERCENT` だ。

  • デフォルト値: `50`
  • 意味:ファイル全体のサイズに対して、未使用領域(ゴミデータ)の割合が50%を超えるまで、完全保存(ファイルの再構築)を行わずに増分保存を続ける。

デフォルト値が抱える2つの致命的な問題

1. ファイルサイズの肥大化: 編集と保存を繰り返すうちに、ファイル内には不要になった古いオブジェクトの残骸(ゴミデータ)が蓄積し続ける。10MBで済むはずの図面が、気づけば50MBに膨れ上がっている原因はこれだ。
2. ネットワーク・I/Oの圧迫: 肥大化したDWGファイルを社内サーバーやクラウドストレージ(BIM 360 / Autodesk Docs等)へ保存する際、無駄なデータまで同期されるため、ネットワーク帯域を圧迫し、保存・バックアッププロセス全体が重くなる。

かといって、常に `ISAVEPERCENT = 0`(完全保存のみ)に設定すると、保存のたびにファイル全体を再構築するため、保存速度が絶望的に遅くなる。

ここに、実務における「スピード」と「スリム化」のトレードオフが存在する。

—

実務におけるセーブ戦略:VBAによる動的制御

このトレードオフをクリアするベストプラクティスは、「普段の作業中は増分保存で爆速を維持し、大容量図面のバッチ処理や、一日の終わりの最終保存時のみ、強制的に完全保存を走らせる(または `ISAVEPERCENT` を絞る)」 というハイブリッド戦略だ。

これを手動で行うのはヒューマンエラーの元であるため、VBAのマクロ(またはイベントプロシージャ)によって自動制御する。

バグを防ぐための設計思想

1. 環境の復元 (State Restoration): マクロ内でシステム変数を変更した場合、処理が途中でエラー落ちしても元の値に復元されるよう、`On Error GoTo` を必ず実装する。
2. ドキュメントロックとアクティブチェック: 図面が開かれていない状態での実行を防ぐ。
3. レジストリではなく図面ごとのスコープ: `ISAVEPERCENT` はアプリケーション変数ではなくデータベース(図面)に依存する挙動をする場合があるため、明示的にドキュメントスコープを意識する。

—

プロダクションコード:最適化保存を実行するVBAモジュール

以下のコードは、図面の肥大化を防ぎつつ安全に保存を行う実務仕様のVBAプロシージャである。そのままプロジェクトに組み込んで使用できる。

Option Explicit

” ===================================================================
” 模块名: ModSaveOptimizer
” 用途 : ISAVEPERCENTを動的に制御し、ファイルサイズと保存速度を最適化する
” 著作権: 現場のプロフェッショナルエンジニア向け
” ===================================================================

Public Sub OptimizedSaveRoutine()
Dim acadDoc As AutoCAD.AcadDocument
Dim originalIsavePercent As Integer
Dim originalFileLock As Boolean

‘ エラーハンドリングの準備(環境復元の担保)
On Error GoTo ErrorHandler

‘ アクティブドキュメントの取得チェック
If Application.Documents.Count = 0 Then
MsgBox “処理対象となる図面が開かれていません。”, vbCritical, “セーブ最適化エラー”
Exit Sub
End If

Set acadDoc = Application.ActiveDocument

‘ 1. 現在のISAVEPERCENTの値を退避
originalIsavePercent = acadDoc.GetVariable(“ISAVEPERCENT”)

‘ — 【戦略的設定】 —
‘ ここでは「ファイルサイズを最小化する完全保存に近い状態」へ一時的に変更
‘ ※完全にゴミを削ぎ落としたい場合は 0 を指定(ただし保存時間は延びます)
‘ 実務的なバランスとして「5」〜「10」を推奨
Const TARGET_ISAVEPERCENT As Integer = 5

acadDoc.SetVariable “ISAVEPERCENT”, TARGET_ISAVEPERCENT

‘ 2. 最適化を伴う保存の実行
‘ 単なる QSAVE だと ISAVEPERCENT が効かない場合があるため、
‘ 一度値を変更した上で明示的に SAVEAS または SAVE を走らせる、
‘ もしくは完全保存を強制するコマンドを送信する。
‘ ※完全保存(完全パージ&リビルド)を確実に行うには ISAVEPERCENT = 0 が最も確実。

acadDoc.SendCommand “(command “”_.qsave””) ”

‘ 3. 設定を元の値にリストア
acadDoc.SetVariable “ISAVEPERCENT”, originalIsavePercent

MsgBox “図面の保存と最適化が完了しました。” & vbCrLf & _
“適用されたISAVEPERCENT: ” & TARGET_ISAVEPERCENT & vbCrLf & _
“元のISAVEPERCENTに復元しました: ” & originalIsavePercent, _
vbInformation, “最適化保存完了”

Exit Sub

ErrorHandler:
‘ 異常終了時でも必ずシステム変数を元に戻す(環境汚染の防止)
On Error Resume Next
If Not acadDoc Is Nothing Then
acadDoc.SetVariable “ISAVEPERCENT”, originalIsavePercent
End If

MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”

End Sub

—

コードの解説とアーキテクトからの助言

1. なぜ `SendCommand` を使っているのか?
VBAのオブジェクトモデル(`acadDoc.Save` など)は内部挙動がブラックボックス化しており、システム変数変更直後のセーブタイミングにおいて変数が即時反映されないケースが稀にある。LISP式を模した `SendCommand` を用いることで、AutoCADのコマンドラインインタープリタに確実に意図した順序で命令をexecさせることができる。
2. `On Error GoTo` による安全性
VBA開発で最もやってはいけないのが、「マクロ途中のエラーによってCADの環境(システム変数)が改変されたまま放置されること」だ。このコードでは、例外発生時であっても確実に元の `ISAVEPERCENT` の値に戻すセーフティネットを張っている。

—

データベース連携・大規模運用における注意点

もしこのVBAを、夜間のタスクスケジューラや外部DB(Access / SQL Server等)と連携した「数百枚単位のDWG一括クリーニング・保存バッチ」の一部として組み込む場合は、以下の点に留意してほしい。

  • AECC / Civil 3D オブジェクトの混入: 土木系の図面でCivil 3Dオブジェクトが存在する場合、`ISAVEPERCENT` をいじるとプロキシ図形のバインドやデータベースの破損リスクがわずかに跳ね上がる。バッチ処理の前に必ず `AUDIT` コマンド(修復)をサイレント実行するロジックを挟むこと。
  • ネットワーク遅延の考慮: クラウドストレージ上にファイルを直接保存するマクロ組込を行うと、APIのロック競合により `SendCommand` がタイムアウトすることがある。ローカルドライブへ一度保存してからアップロードするパイプライン設計が望ましい。

結論

`ISAVEPERCENT` のコントロールは、単なる「おまじない」ではない。ネットワーク帯域の節約、サーバー容量の圧迫防止、そして何より日々のエンジニアのストレス軽減(フリーズ時間の削減)に直結する、極めて費用対効果の高いアーキテクチャ上の布石である。

ぜひ今回のコードを自身の開発環境に組み込み、チーム全体の図面資産の健康状態を最適化してほしい。

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