現場のエンジニアへ告ぐ:AutoCADの「ファイル開閉」に潜む罠と、プロの境界線
AutoCADのオートメーションにおいて、最も軽視され、かつ最もシステム崩壊を招きやすいのが「ファイルを開く」という単純なプロセスだ。
多くの初心者は `Documents.Open` を使い、デフォルトの引数で思考停止する。だが、大規模な図面管理システムや、多人数同時並行のプロジェクトにおいて、その無邪気な実装は「共有違反」や「メモリリーク」、そして最悪の場合は「図面破損」という形で牙を剥く。
今回は、シニアエンジニアとして知っておくべき「Read-Only」と「通常オープン」の極限の使い分け、そして実務で生き残るためのアーキテクチャ論を語る。
—
1. なぜ「読み取り専用」がデフォルトであるべきか
設計思想の根幹に関わる話だ。「変更が必要な時以外は、決して書き込み権限を要求してはならない」。これが鉄則である。
通常オープンはOSのロック機構を専有する。もし君が開発したツールが、単なる「属性抽出」や「図面閲覧」のために通常オープンを行えば、その間、設計担当者は保存ができず、業務はストップする。
実務上の判断基準
- ReadOnlyで開くべきケース:
- 外部参照(XRef)の確認、ブロック定義の抽出、プロパティ情報の取得。
- バッチ処理における集計用ツール。
- ネットワークドライブ上の大量の図面を巡回する場合(書き込みロックがネットワークトラフィックと排他制御を阻害するため)。
- 通常モードで開くべきケース:
- 直接図面に図形を挿入・編集するツール。
- 図面プロパティの書き換えや、レイヤー構成の修正を伴う場合。
—
2. VBAによる制御:Openメソッドの深淵
`Documents.Open` の引数は、ただのスイッチではない。OSレベルのファイルハンドルと、AutoCADのドキュメントライフサイクルを管理する重要な設定だ。
‘ 【極限の最適化:ファイルオープン制御】
Public Function OpenDrawing(ByVal filePath As String, ByVal readOnlyMode As Boolean) As AcadDocument
Dim doc As AcadDocument
‘ 既に開かれているかチェック(パフォーマンス向上のための二重オープン防止)
On Error Resume Next
Set doc = Application.Documents.Item(Dir(filePath))
On Error GoTo 0
If Not doc Is Nothing Then
Set OpenDrawing = doc
Exit Function
End If
‘ 引数の意味:
‘ Name: ファイルパス
‘ ReadOnly: Trueなら排他制御を回避し、高速にオープンする
‘ Password: 必要に応じて指定
Set doc = Application.Documents.Open(filePath, readOnlyMode)
Set OpenDrawing = doc
End Function
重要な知見:オブジェクトの解放とメモリ管理
AutoCAD VBAのメモリ管理は極めて脆弱だ。`AcadDocument` オブジェクトをループで回す際、明示的に `Close` しなければ、AutoCADのインスタンス内に「幽霊ドキュメント」が蓄積され、やがてメモリ不足(OOM)でクラッシュする。
‘ 処理終了後のクリーンアップは義務である
Public Sub CloseDrawing(ByRef doc As AcadDocument, ByVal saveChanges As Boolean)
If Not doc Is Nothing Then
‘ 変更を破棄して閉じることで、不要なトラフィックを抑制
doc.Close saveChanges
‘ 参照を明示的にクリア
Set doc = Nothing
End If
End Sub
—
3. レガシー環境とWindows APIの活用
ネットワーク上の図面を開く際、稀にファイルが「誰かに使用中」であるにもかかわらず、OSが掴み損ねることがある。そんな時は、Windows APIを用いてファイルの状態を先読み(Pre-flight check)するのが、プロの仕事だ。
`CreateFile` APIを使い、`GENERIC_WRITE` 権限を要求せずにファイルが開けるか確認することで、不要な例外を回避できる。
‘ プロの現場で使われるAPI呼び出しの例(概念)
‘ 実際の実装では、OpenProcessやCreateFileでファイルハンドルを確認する
‘ これにより「開いた後にエラーで落ちる」という恥ずかしい事態を防ぐ
—
4. ユーザーへの通知とUXの哲学
自動化ツールは「黒子」であるべきだが、「なぜ今開けないのか」をユーザーに伝える義務がある。
- ReadOnlyで開いた際: 画面のステータスバーや、ツールチップに「読み取り専用モードでプレビュー中」と明示せよ。
- 排他ロックが発生した際: 単なる「エラーです」ではなく、「○○(PC名)が現在編集中のため、読み取り専用で開きますか?」と尋ねるロジックを実装しろ。
—
結論:アーキテクトとしての矜持
コードを書くことは、単に動くものを作ることではない。「他者の作業を阻害せず、かつシステムの堅牢性を担保し続けること」こそが、シニアエンジニアの役割だ。
`ReadOnly` を適切に使いこなすことは、AutoCADという巨大なプラットフォームと、そこで働く人間との間に「調和」をもたらす。今日から、君のコードの `Open` メソッドを見直してほしい。その一行が、明日のチームの生産性を左右するのだから。
—
次回の講義では、COMインターフェースを直接叩き、Documentオブジェクトをバイパスしてファイル情報を抽出する「最速の図面解析術」について解説する。
