AutoCAD自動化の「作法」:共有環境を麻痺させないためのReadOnlyオープン戦略
現場のエンジニア諸君。AutoCADの自動化において、最も犯してはならない罪は何か。それは「共有サーバー上の図面を不用意にフルアクセスで掴み、他の設計者の業務を凍結させること」だ。
バッチ処理で集計やデータ抽出を行う際、デフォルトの挙動でファイルを開くのは素人の所業。我々プロフェッショナルは、OSのリソース管理とAutoCADのドキュメントライフサイクルを完全に制御下に置かなければならない。
今回は、ReadOnlyモードの極限活用と、それに伴うメモリ管理の鉄則を授ける。
—
1. ReadOnlyオープンの本質とリスク回避
`Application.Documents.Open`メソッドには、第2引数に`ReadOnly`を指定できる。これを`True`に設定することで、AutoCADはロックファイルを生成せず、他ユーザーの書き込み権限を奪わない。
しかし、ここで多くの開発者が陥る罠がある。それは「例外処理とオブジェクトの解放」だ。バッチ処理中にエラーで停止すれば、AutoCADのプロセスはゾンビ化し、メモリ上に中途半端なドキュメントオブジェクトが残留する。これが積み重なれば、サーバーのパフォーマンス低下と、致命的なメモリリークを招く。
2. 実装:堅牢なReadOnlyオープンのテンプレート
以下に、実務で耐えうる最低限の構成を示す。ここでは`On Error`によるトラップと、確実にメモリを解放する`Finally`に近い構文パターンを提示する。
‘ @brief ファイルをReadOnlyで開き、安全に処理するアーキテクチャ
Public Sub ProcessDrawingSafely(ByVal dwgPath As String)
Dim doc As AcadDocument
Dim isOpened As Boolean: isOpened = False
‘ ファイル存在チェック(Win32 APIで確認するのが最も高速)
If Dir(dwgPath) = “” Then Exit Sub
On Error GoTo ErrorHandler
‘ ReadOnly引数をTrueに設定:これが設計者の業務を止めないための生命線
Set doc = Application.Documents.Open(dwgPath, True)
isOpened = True
‘ — ここにデータ抽出や集計のロジックを記述 —
Debug.Print “Processing: ” & doc.Name
‘ 処理終了後、速やかに閉じる
doc.Close (False) ‘ SaveChangesをFalseに強制
Set doc = Nothing
isOpened = False
Exit Sub
ErrorHandler:
‘ 致命的なエラー発生時もプロセスを残さない
If isOpened And Not doc Is Nothing Then
doc.Close (False)
Set doc = Nothing
End If
MsgBox “Error: ” & Err.Description, vbCritical
End Sub
—
3. チーフアーキテクトからの深掘り:メモリ最適化の極意
VBAのガーベジコレクションを過信してはいけない。`Set doc = Nothing`は単なる参照の解除であり、メモリの即時開放を保証するものではない。
- Documentオブジェクトの寿命管理: `Documents.Open`を繰り返すと、AutoCADは内部テーブルにドキュメント情報を保持し続ける。大規模バッチを行う際は、定期的に`Application.Update`を呼び出すか、あるいは一定数処理するごとにAutoCADプロセス自体を再起動するような「外側からの制御(VBScriptやPowerShellによるラップ)」を推奨する。
- Windows APIによるロック監視: 厳密なシステムを構築する場合、`CreateFile` APIを使用して`FILE_SHARE_READ`属性でファイルを開けるかテストすることで、AutoCADを開く前に現在のロック状態を検知できる。これにより、無駄なプロセス起動を未然に防ぐことが可能だ。
4. レガシー環境と今後の展望
現在、AutoCADのバージョン混在環境(2015〜2024など)で開発している諸君も多いだろう。バージョン互換を制御する場合、`Open`メソッドの`Password`引数や、バージョンごとの`SaveAs`メソッドの引数差異に注意が必要だ。
特に、DXF経由でデータをやり取りする場合、文字コード変換による情報欠落のリスクがある。可能であれば、AutoCADがネイティブで持つ`ObjectARX`インターフェース(.NET API)へ移行するのが理想だが、VBAで完結させるならば、「開いたら即座にCloseする」という原則を徹底するだけで、トラブルの9割は防げる。
—
結び:エンジニアの誇り
自動化とは、単に人間を楽にすることではない。「組織全体の生産性を、システムレベルで守り抜くこと」にある。
他者の仕事を止めない、メモリを汚さない、そして異常終了を許さない。この3点を突き詰めた先に、初めて「自動化エンジニア」と名乗る資格が生まれる。コードは嘘をつかない。君たちの書く数行のVBAが、明日の設計現場の空気を変えるのだ。
健闘を祈る。
