【実務・中級編】【上級プロフェッショナル向け】ネットワーク切断に備えた「ローカル一時保存」と自動リカバリ同期システム – AutoCAD VBA解析バイブル

スポンサーリンク

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)と連携して「誰がどの図面をローカルで握っているか」を可視化するロック管理システムについて解説しよう。

さあ、コードを書け。そして、止まらないワークフローを設計せよ。

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