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

スポンサーリンク

こんにちは!AutoCAD VBAの世界へようこそ。
マクロの記録ボタンを押すだけのステップから抜け出し、「自分の手でCADを自在にコントロールしたい」と願うあなたなら、きっと今日のテーマにワクワクするはずです。

今回は、実務で必ず直面する「図面ファイルの保存(セーブ)」に隠された深い闇と、それを美しく克服するプロの知見をお伝えします。

テーマはずばり、「ISAVEPERCENT(増分保存率)」のVBA制御です。
「保存のスピード」と「ファイルサイズ(そして破損リスク)」のトレードオフを完璧に手なずけ、ネットワーク経由の保存でもエラーを恐れない、ワンランク上のセーブ戦略を一緒に手に入れましょう。ここをクリアすれば、AutoCAD VBAの基本と「実務での振る舞い」はバッチリですよ!

—

1. なぜ「保存」で悩むのか?(ISAVEPERCENTの正体)

AutoCADで図面を「上書き保存」したとき、裏側で何が起きているかご存知ですか?

実はAutoCADは、図面全体を一から書き直しているわけではありません。デフォルトでは、変更があった差分だけをファイルの末尾に付け足していく「増分保存(Incremental Save)」という方式をとっています。これにより、巨大な図面であっても一瞬で保存が完了します。

しかし、この便利さの裏には大きな代償があります。

  • メリット: 保存スピードが爆発的に速い。
  • デメリット: 編集を繰り返すと「ゴミデータ」が蓄積し、ファイルサイズが異常に肥大化する。さらに、ネットワーク経由での保存時にファイル破損のリスクが跳ね上がる。

この増分保存の許容量(全体の何パーセントまでゴミの蓄積を許すか)を制御しているのが、システム変数 `ISAVEPERCENT` です。

  • 初期値:50 (ファイルの50%以上がゴミになるまで増分保存を続ける)
  • 極限値:0 (毎回、完全保存=ファイル全体を再構築して保存する。ファイルは最小化するが、保存が遅い)

実務では、普段は高速な増分保存を活かしつつ、夜間バッチ処理や重要なマイルストーンの保存時には `ISAVEPERCENT = 0` に切り替えてクリーンな図面に作り替える、といった動的なコントロールが求められます。これをVBAで完全自動化してみましょう。

—

2. 【実務直結】ISAVEPERCENTを制御するVBAコード

それでは、現場でそのままコピペして使える実践的なコードを公開します。
このコードは、現在の図面の `ISAVEPERCENT` の値を一時的に変更し、完全保存(Purge的な効果も兼ねたクリーンセーブ)を実行した後、元の設定に美しく復元するプロシージャです。

Sub OptimizeAndSaveDrawing()
Dim originalIsavePercent As Integer
Dim doc As AcadDocument
Set doc = ThisDrawing

On Error GoTo ErrorHandler

‘ 1. 現在のISAVEPERCENTの値を退避させておく
originalIsavePercent = ThisDrawing.GetVariable(“ISAVEPERCENT”)

‘ 2. ログ出力(イミディエイトウィンドウに表示)
Debug.Print “— 保存処理を開始します —”
Debug.Print “変更前の ISAVEPERCENT: ” & originalIsavePercent

‘ 3. 爆発的な肥大化を防ぐため、一時的に「0(完全保存)」に変更
‘ これによりファイル内のゴミデータが完全に削ぎ落とされます
ThisDrawing.SetVariable “ISAVEPERCENT”, 0
Debug.Print “ISAVEPERCENT を 0 に設定しました。”

‘ 4. 図面を上書き保存
doc.Save
Debug.Print “図面のクリーン保存が完了しました。”

‘ 5. 設定を元の値に戻す(お行儀の良いコードの鉄則です)
ThisDrawing.SetVariable “ISAVEPERCENT”, originalIsavePercent
Debug.Print “ISAVEPERCENT を元の値 (” & originalIsavePercent & “) に復元しました。”
Debug.Print “— すべての処理が正常に終了しました —”

MsgBox “図面の最適化保存が完了しました!”, vbInformation, “VBA自動保存”
Exit Sub

ErrorHandler:
‘ エラーが発生した場合でも、必ずシステム変数を元に戻す(重要!)
ThisDrawing.SetVariable “ISAVEPERCENT”, originalIsavePercent
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “異常終了”

End Sub

—

3. コードの解説と、エンジニアとしてのこだわり

初心者から一歩抜け出すために、このコードの重要なポイントを3つに噛み砕いて解説します。

① `GetVariable` と `SetVariable` の使いこなし

AutoCADのシステム変数(`GRIDMODE` や `OSMODE` など)は、VBAから `ThisDrawing.GetVariable(“変数名”)` で読み取れ、`ThisDrawing.SetVariable “変数名”, 値` で書き換えられます。
ここで重要なのは、「他人の環境や、ユーザーが設定した元の値を勝手に書き換えてっぱなしにしない」という配慮です。必ず元の値を変数に退避させ、処理の最後(あるいはエラー時)に元に戻すのがプロの作法です。

② 堅牢なエラーハンドリング (`On Error GoTo`)

ネットワークの切断や、ファイルが読み取り専用(Read-Only)であった場合、`doc.Save` は容赦なくエラーを起こして止まります。
もしエラーで止まったときに `ISAVEPERCENT = 0` のまま放置されたらどうなるでしょう? 次回からの保存挙動が変わってしまい、予期せぬトラブルの元になります。
`ErrorHandler`ラベルを用意し、どんな異常事態があろうとも確実にシステム変数を復元させる構造にしている点が、このコードの最も価値のある部分です。

—

4. 陥りやすい罠とアドバイス

最後に、AutoCAD VBAでファイル操作を行う際によくある落とし穴をいくつかご紹介しておきます。

  • 「名前を付けて保存 (`SaveAs`)」との違い

今回のコードは既存のファイルを上書きする `doc.Save` を使っています。もし全く新しいパスに保存したい場合は `doc.SaveAs “C:\Path\To\NewFile.dwg”` を使いますが、その際も `ISAVEPERCENT` を事前に 0 にしておくテクニックはファイルサイズを小さく抑えるために非常に有効です。

  • マルチドキュメント環境 (`SDI` 変数)

複数の図面を開いているとき、`ThisDrawing` は「現在アクティブな図面」を指します。裏で開いている別の図面に影響を与えないよう、操作対象のドキュメントコンテキストが正しいかを常に意識してください。

—

おわりに

いかがでしたでしょうか?
今回は「ISAVEPERCENT」という少しマニアックなシステム変数を題材に、システム変数の退避・復元、そしてエラーハンドリングの重要性を解説しました。

「動くだけのコード」から、「現場の環境やリスクを考慮した優美なコード」へ。
この視点を持てたあなたなら、もう立派なAutoCAD自動化エンジニアの仲間入りです。日々の定型作業をスマートに自動化し、設計の本質的なクリエイティブな時間に集中していきましょう!

それでは、次のステップでお会いしましょう。チューターの先輩エンジニアでした!

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