「保存が遅い」を卒業する。AutoCAD VBAで図面サムネイルを制御し、ネットワーク越しのパフォーマンスを極限まで引き出す技術
こんにちは。現場のエンジニアリングを支えるアーキテクトです。
「マクロの記録」から一歩踏み出し、自分でコードを書き始めたあなたへ。素晴らしい挑戦です。記録されたコードを眺める段階から、「なぜこのコードが動くのか?」「どうすればもっと効率的なツールになるのか?」を考える段階へ進むことが、プロへの第一歩です。
今日は、実務で直面する「非常に地味だけれど、極めて深刻な問題」を解決するテクニックを伝授します。
それは、「図面保存時の速度低下」への対策です。
1. なぜ、あなたの図面保存は重いのか?
ネットワーク上のサーバーに保存されたDWGファイルを開いて、作業して、保存する……。この一連の流れで、「保存に時間がかかるな」と感じたことはありませんか?
多くの人は「図面が複雑すぎるからだ」とか「ネットワークが遅いからだ」と考えます。もちろんそれも正解ですが、実はAutoCADの「親切機能」が原因の一つになっていることをご存知でしょうか。
それが、「サムネイルプレビュー(Thumbnail Preview)」です。
サムネイルプレビューの正体
AutoCADのファイル(DWG)には、Windowsのエクスプローラーなどで図面の中身をパッと確認できるように、小さな画像データが埋め込まれています。
一見、便利な機能です。しかし、エンジニアリングの視点で見ると、以下の「コスト(代償)」を支払っています。
1. ファイルサイズの肥大化: 画像データがDWGの中に蓄積されるため、ファイル容量が増えます。
2. I/O(入出力)のオーバーヘッド: 保存するたびに、AutoCADは「今の画面を画像として書き出し、それをファイルに書き込む」という追加作業を行います。
3. ネットワーク負荷: ネットワーク越しに保存する場合、この余計な画像データが通信帯域を圧迫し、保存完了までの待ち時間を増大させます。
大量の図面を扱う現場では、この「わずかな差」が積み重なり、業務全体の生産性を著しく低下させるのです。
2. 救世主、システム変数 `THUMBSAVE`
ここで登場するのが、AutoCADのシステム変数 `THUMBSAVE` です。
この変数は、図面を保存する際にサムネイル画像を生成するかどうかを制御しています。
- `THUMBSAVE = 1` (既定値): サムネイルを作成して保存する(親切モード)。
- `THUMBSAVE = 0`: サムネイルを作成せずに保存する(高速モード)。
「じゃあ、常に `0` にしておけばいいじゃないか」と思うかもしれません。しかし、個人のPC設定を全員分書き換えるのは現実的ではありません。
そこで、「プログラムで実行している間だけ、一時的に `0` にし、保存が終わったら元に戻す」という、スマートな制御が必要になるのです。
3. 実践:プロフェッショナルなVBA実装
マクロの記録では、単に「設定を変える」ことしか記録できません。しかし、プロのコードは「環境を汚さない」ことを重視します。
もし、プログラムが途中でエラーを起こして止まってしまったら? `THUMBSAVE` が `0` のままになってしまい、ユーザーが「なぜかサムネイルが表示されない!」と混乱するかもしれません。
これを防ぐための、堅牢なコードを見てみましょう。
Option Explicit
''' <summary>
''' サムネイル生成を無効化して、高速に図面を保存するルーチン
''' </summary>
Sub ProfessionalFastSave()
Dim currentThumbsave As Integer
Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing
' 1. 現在の設定値をバックアップしておく(ここがプロの作法!)
' 後で元の状態に戻すために、現在の設定を覚えておきます。
On Error Resume Next
currentThumbsave = acadDoc.GetVariable("THUMBSAVE")
If Err.Number <> 0 Then
MsgBox "システム変数の取得に失敗しました。", vbCritical
Exit Sub
End If
On Error GoTo 0
' 2. エラーハンドリングの設定
' 万が一、保存中にエラーが起きても、設定を元に戻せるようにします。
On Error GoTo ErrorHandler
' 3. サムネイル生成をOFFにする
Debug.Print "Optimization: Disabling THUMBSAVE..."
acadDoc.SetVariable "THUMBSAVE", 0
' 4. 図面を保存する
' ここで実際の保存処理を行います。
Debug.Print "Saving drawing..."
acadDoc.Save
MsgBox "高速保存が完了しました。", vbInformation
CleanUp:
' 5. 【重要】設定を元の状態に戻す(クリーンアップ)
' これを行わないと、ユーザーの環境設定を勝手に書き換えたことになります。
On Error Resume Next
acadDoc.SetVariable "THUMBSAVE", currentThumbsave
Debug.Print "Optimization: Restored THUMBSAVE to " & currentThumbsave
Exit Sub
ErrorHandler:
' エラーが発生した場合の処理
MsgBox "エラーが発生しました: " & Err.Description, vbExclamation
Resume CleanUp
End Sub
コードの解説:ここが「極限の知見」
このコードには、初学者が脱却すべき3つのポイントが詰まっています。
# ① 「状態の保存と復元」というライフサイクル
プロの自動化エンジニアは、「ツールを実行する前の状態に戻す」ことを絶対のルールとしています。`currentThumbsave` という変数を用意して、現在の値を記憶しておく。これが、他のユーザーや他の作業に悪影響を与えないための「礼儀」です。
# ② `On Error GoTo ErrorHandler` による防衛
プログラムは必ず失敗する可能性があります(ファイルが読み取り専用だった、ネットワークが切れた等)。エラーが起きたときに、そのままプログラムが強制終了すると、`THUMBSAVE` を戻す処理まで辿り着けません。`ErrorHandler` を通じて、必ず `CleanUp`(後片付け)へ誘導する設計にしています。
# ③ `SetVariable` と `GetVariable` の使い分け
AutoCAD VBAにおいて、システム変数を操作するのは `SetVariable` です。これはオブジェクトのプロパティ(`ThisDrawing.Path` など)とは異なり、AutoCADという巨大なシステムの「スイッチ」を操作するイメージです。
4. まとめ:ツールを作ることは、環境を守ること
今回の手法は、単に「保存を速くする」だけではありません。「必要な時だけ、一時的に最適化された環境を作り出し、終わったら元の快適な環境に戻す」という、高度な制御技術です。
マクロの記録は「操作の自動化」ですが、VBAによるプログラミングは「環境の制御」です。
- ファイルサイズを削る
- 通信のオーバーヘッドを減らす
- エラーが起きても、ユーザーの環境を壊さない
これらを意識できるようになれば、あなたの作るツールは「ただ動くもの」から「現場で信頼されるプロの道具」へと進化します。
一歩ずつ、着実に。
コードの向こう側にある「ユーザーの使い心地」を想像しながら、学習を続けていきましょう。応援していますよ!
