【テクニカル・上級編】【初心者向け】ThisDrawing.Pathを活用した相対パス保存:プロジェクトフォルダ内での図面整理術 – AutoCAD VBA解析バイブル

スポンサーリンク

【AutoCAD VBAを掌握する極限の知見】ThisDrawing.Pathが生む絶対的自律性:環境依存を断ち切る相対パス保存のアーキテクチャ

AutoCAD VBAによる図面管理の現場において、ハードコーディングされた絶対パス(例: `C:\Projects\2023\A-101.dwg`)ほど、システムの寿命を縮める癌はない。PCの換装、ネットワークドライブの割当変更、あるいは外部協力会社への納品データ作成時、絶対パスは容赦なくエラーを吐き出し、自動化スクリプトを機能停止に追い込む。

真にロバスト(堅牢)なCAD自動化システムを構築するためには、「実行中の図面がどこに存在するか」を起点とし、動的にディレクトリ構造を構築・制御するメカニズムが不可欠だ。

今回は、`ThisDrawing.Path` を核とした相対パス保存の極意を、メモリ管理やWindowsファイルシステムとの協調を含めたシニアアーキテクトの視点から解説する。

—

1. `ThisDrawing.Path` の本質と致命的な落とし穴

`ThisDrawing.Path` プロパティは、アクティブな図面が保存されているディレクトリのパスを返す。非常にシンプルだが、実務で使う際には以下の「AutoCAD特有のライフサイクル上の仕様」を理解していなければならない。

  • 未保存図面における挙動:

新規作成され、一度も保存されていない図面(仮称 `Drawing1.dwg` 等)の場合、`ThisDrawing.Path` は長さゼロの空文字列 `””` を返す。この状態でパス結合処理を行うと、予期せぬカレントディレクトリ(多くは AutoCADのインストールフォルダや最後に開いた場所)にファイルが生成され、行方不明になる。

  • 末尾の区切り文字の有無:

環境やバージョンによって、返り値の末尾にバックスラッシュ(`\`)が含まれる場合と含まれない場合がある(通常は含まれないが、ルートディレクトリ等の特殊環境で挙動が揺らぐ)。そのため、パスを結合する際は必ず自前の正規化関数を通すか、FileSystemObjectを使用すべきである。

—

2. FileSystemObject(FSO)による堅牢なパス解決

VBAの標準関数(`Dir` や `MkDir`)はレガシーであり、エラーハンドリングが複雑化する原因となる。フォルダの自動生成やパスの結合には、必ず `Scripting.FileSystemObject` を採用せよ。

以下に、カレント図面の場所を基準として「Backup」および「Export」フォルダを自動生成し、現在時刻を付与したバックアップを別名保存する、実戦投入可能なモジュールを示す。

実装コード:環境非依存型・自動整理保存マクロ

Option Explicit

‘ —————————————————————–
‘ @Title: 自律型相対パス保存エンジン
‘ @Description: ThisDrawing.Pathを基準にサブフォルダを自動生成し、
‘ 絶対パス依存を排除した安全な図面保存を行う。
‘ —————————————————————–
Public Sub SaveDrawingWithRelativeStructure()
Dim fso As Object
Dim currentPath As String
Dim targetDir As String
Dim backupPath As String
Dim drawingName As String
Dim ext As String

‘ 1. 未保存図面のガード処理
currentPath = ThisDrawing.Path
If currentPath = “” Then
MsgBox “この図面はまだ保存されていません。” & vbCrLf & _
“一度任意の場所に保存してから実行してください。”, vbCritical, “致命的なエラー: 未保存ドキュメント”
Exit Sub
End If

‘ 2. FileSystemObjectの遅延バインディング(参照設定の競合回避)
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ 3. 図面名の取得と拡張子の分離
drawingName = fso.GetBaseName(ThisDrawing.Name)
ext = fso.GetExtensionName(ThisDrawing.Name)

‘ 4. Backupフォルダのパスを構築(存在しない場合は自動生成)
targetDir = fso.BuildPath(currentPath, “Backup”)
If Not fso.FolderExists(targetDir) Then
On Error GoTo ErrorHandler
fso.CreateFolder targetDir
On Error GoTo 0
End If

‘ 5. タイムスタンプ付与による一意のファイル名生成 (YYYYMMDD_HHMMSS)
Dim timeStamp As String
timeStamp = Format(Now, “yyyymmdd_hhnnss”)
backupPath = fso.BuildPath(targetDir, drawingName & “_” & timeStamp & “.” & ext)

‘ 6. AutoCADデータベースの整合性を保ったまま別名保存
‘ ※ SaveAsメソッドは既存ファイルを上書きするため、一意のタイムスタンプが必須
ThisDrawing.SaveAs backupPath

‘ 7. オブジェクトの明示的解放(メモリリーク防止)
Set fso = Nothing

MsgBox “バックアップの作成に成功しました。” & vbCrLf & backupPath, vbInformation, “処理完了”
Exit Sub

ErrorHandler:
Set fso = Nothing
MsgBox “ファイルシステム操作中にエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“詳細: ” & Err.Description, vbCritical, “システムエラー”
End Sub

—

3. シニアアーキテクトが教える「現場の知見」とメモリ最適化

上記のコードは一見スタンダードに見えるが、AutoCAD VBAの裏側の挙動を知る者にとって、いくつかの重要な設計思想が組み込まれている。

① オブジェクトの明示的解放 (`Set fso = Nothing`)

VBAのガベージコレクションは非力である。特に `CreateObject` や `New` で生成したCOMコンポーネント(FileSystemObject等)をスコープアウトする前に解放しないと、CADセッションが長期間稼働する中でメモリ断片化を引き起こす原因となる。例外処理 (`ErrorHandler`) 内でも確実にインスタンスを破棄する構造がプロフェッショナルだ。

② `ThisDrawing.SaveAs` とデータベースのライフサイクル

`SaveAs` を実行すると、カレントデータベースのポインタ自体が新しいファイルパスに向く仕様になっている。もし「作業中のオリジナル図面はそのままで、別名でバックアップだけを別フォルダに作りたい」という要件であれば、`SaveAs` ではなく `Database.SaveAs` メソッド(レイアウトやトランザクション制御を伴う低レベルAPI)を操作する必要がある。
ただし、単純に「プロジェクトフォルダ内での図面整理・世代管理」が目的であれば、今回のコードのようにセッションの保存先を切り替えるアプローチが最もシンプルでバグを生みにくい。

③ ネットワークドライブ(UNCパス)への配慮

社内共有サーバーやクラウドストレージ(OneDrive / SharePointの同期フォルダ等)上で作業する場合、`ThisDrawing.Path` は `\\server\share\project` のようなUNCパスを返す。FileSystemObjectはUNCパスを完全にネイティブサポートしているため、ローカルドライブと同様に `BuildPath` が正常に機能する。これが、レガシーな文字列結合(`Path & “\” & SubFolder`)を行わずFSOを強制する最大の理由である。

—

総括

AutoCAD VBAにおけるファイルパスの制御は、単なる文字列操作ではない。それは「図面ファイル」と「実行環境」の結合度を緩め、システムを環境変化に対して不滅のものにするためのアーキテクチャそのものである。

`ThisDrawing.Path` と FileSystemObject を結合させた自律型スクリプトを組織の標準として展開せよ。それこそが、手動オペレーションの混乱とパス起因のバグを根絶する唯一の解である。

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