AutoCADの「保存失敗」で泣かないために:VPN環境を制するローカル・バッファリング戦略
AutoCADで図面を編集している最中、VPNの瞬断やサーバーのタイムアウトで「保存に失敗しました」という悪夢のようなダイアログに遭遇したことはないだろうか。
多くのエンジニアは「ネットワークを安定させろ」という非現実的な要求を繰り返すが、我々アーキテクトが考えるべきは「環境が不安定であることを前提とした、止まらないシステム」の構築だ。本記事では、AutoCAD VBAを活用し、ローカルへの一時退避と同期を自動化する、現場の生存率を最大化する設計思想を伝授する。
—
1. なぜ「直接保存」がNGなのか
AutoCADがネットワークドライブに対して直接書き込みを行う際、ファイルのロック、一時ファイルの生成、そして最終的な上書きというプロセスが発生する。ネットワークの不安定さは、特にこの「ファイルロックの解除」のタイミングで致命的な競合を引き起こす。
極限の設計指針:
1. 分離: 作業中の書き込みは常にローカルストレージ(SSD)に行う。
2. 非同期: サーバーへの同期は、AutoCADの保存プロセスから切り離す。
3. 整合性: サーバー側のファイルが最新であることを保証するためのチェックサム(あるいはタイムスタンプ)管理を行う。
—
2. 実装:ローカル・バッファリング・エンジン
以下のVBAモジュールは、`ThisDrawing.SaveAs`をフックし、強制的にローカルへ保存した後、バックグラウンド(シェル実行)で同期を試みる設計だ。
プロダクション・コード:`AutoSyncManager.bas`
Option Explicit
‘ 物理的なローカル作業ディレクトリ
Const LOCAL_TEMP_DIR As String = “C:\CAD_Temp_Buffer\”
‘ サーバー上の保存先
Const SERVER_PATH As String = “\\Server\Projects\Drawing.dwg”
Public Sub SecureSave()
Dim doc As AcadDocument
Set doc = ThisDrawing
Dim localPath As String
localPath = LOCAL_TEMP_DIR & doc.Name
On Error GoTo ErrorHandler
‘ 1. まずローカルに最新を保持する
doc.SaveAs localPath
‘ 2. ネットワーク経由でサーバーへ同期(非同期実行でAutoCADを止めない)
‘ シェルコマンドで同期処理を実行し、AutoCADのUIスレッドを解放する
Dim shellCmd As String
shellCmd = “cmd.exe /c copy /Y “”” & localPath & “”” “”” & SERVER_PATH & “”””
Dim wsh As Object
Set wsh = CreateObject(“WScript.Shell”)
wsh.Run shellCmd, 0, False ‘ 非同期実行
MsgBox “ローカルへ保存完了。バックグラウンドでサーバー同期を開始しました。”, vbInformation
Exit Sub
ErrorHandler:
MsgBox “致命的エラー: ローカル保存に失敗しました。” & vbCrLf & Err.Description, vbCritical
End Sub
—
3. アーキテクトの視点:堅牢性を高めるための「3つの鉄則」
① ファイルロックの競合を回避せよ
上記のコードでは`copy`コマンドを使用しているが、本格的な運用では「排他制御」を考慮する必要がある。サーバー側で誰かがファイルを開いている場合、単純な上書きは失敗する。その場合は、`Drawing_V1.dwg`, `Drawing_V2.dwg`のようにバージョンを付与する「世代管理」をファイル名に組み込むのが、最も安全な運用だ。
② VBScriptではなくPowerShellを賢く使え
同期処理を単なる`copy`コマンドで済ませてはいけない。ネットワーク復旧後に自動的に再試行するロジックが必要だ。VBAからPowerShellスクリプトを呼び出し、`Do-Until`ループでネットワーク疎通を確認してからコピーを実行するような、知的なラッパーを噛ませるべきだ。
③ クリーンアップの自動化
ローカルの`C:\CAD_Temp_Buffer\`は肥大化する。AutoCADの`End`イベントまたは`Close`イベントに、古いファイルを削除するプロシージャを登録し、常に最小限のキャッシュを保つ設計を怠るな。
—
4. 総括:システムは「壊れる」ことを前提に作る
「ネットワークが切れないようにする」という努力は、インフラエンジニアの領域だ。我々AutoCADエンジニアの領域は、「ネットワークが切れても、設計者の思考とデータだけは守り抜く」という堅牢な防御壁を築くことにある。
このコードをそのままコピペして終わりにするのではなく、貴社のネットワーク環境に合わせて`Shell`コマンドの引数を最適化し、ログ出力機能を付与してほしい。それができる者だけが、真の「業務自動化アーキテクト」と呼べる。
次回の記事では、この同期システムをさらに発展させ、データベース(SQLite)と連携して「誰がどの図面をローカルで握っているか」を可視化するロック管理システムについて解説しよう。
さあ、コードを書け。そして、止まらないワークフローを設計せよ。
