AutoCAD自動化の深淵:ファイル名「禁止文字」によるクラッシュを根絶する堅牢なアーキテクチャ
AutoCADの運用現場において、最も不毛で、かつ最も頻発するエラーの一つが「ファイル保存時のファイル名不正」だ。
「なぜか保存できない」「名前を付けて保存でエラーが出る」。現場の設計者がこれに遭遇するたび、設計の手は止まり、貴重な思考時間は奪われる。多くのエンジニアはこれを「運用の徹底(教育)」で解決しようとするが、それは敗北だ。システム側で「物理的に不正なファイル名を作らせない」設計こそが、真の業務自動化における黄金律である。
今日は、AutoCAD VBAを用いた「禁止文字自動クリーニング・バリデーター」の実装論を伝授する。これは単なる文字列置換のコードではない。AutoCADのドキュメント・ライフサイクルに介入し、不整合を未然に防ぐための防衛的プログラミングだ。
—
1. なぜ「手動チェック」は失敗するのか
多くの実装者は、ファイル保存直前に `If` 文で力任せにチェックしようとする。だが、それには大きな落とし穴がある。
- UnicodeとOSの壁: Windowsの禁止文字(`\ / : ? ” < > |`)以外にも、社内管理システムが嫌う特殊記号や、全角/半角の混在問題が存在する。
- イベントの競合: `SaveAs` イベント内での複雑な処理は、AutoCADの内部スタックを汚染し、最悪の場合、致命的なクラッシュ(Access Violation)を引き起こす。
- パスの正規化: ファイル名だけでなく、フルパスの長さ(MAX_PATH)も考慮しなければ、現代のCAD運用ではどこかで破綻する。
我々が目指すべきは、「入力の浄化(Sanitization)」と「保存の抽象化」だ。
—
2. 実装:堅牢なファイル名クリーンアップ・エンジン
以下のコードは、単に文字を置換するだけでなく、将来的な保守性を考慮し、ルールを配列で管理する設計にしている。
Option Explicit
‘ プロダクションコードにおける定数定義は外出しが鉄則
Private Const ILLEGAL_CHARS As String = “\/:?””<>|”
”’
”’
Public Function GetSafeFileName(ByVal targetName As String) As String
Dim i As Long
Dim charToReplace As String
Dim sanitizedName As String
sanitizedName = targetName
‘ 不正文字リストを巡回して置換
‘ 開発のヒント: 必要であれば、ここで「社内禁止文字」を配列に追加せよ
For i = 1 To Len(ILLEGAL_CHARS)
charToReplace = Mid(ILLEGAL_CHARS, i, 1)
sanitizedName = Replace(sanitizedName, charToReplace, “_”)
Next i
‘ 連続するアンダースコアを一つにまとめる(視認性向上)
Do While InStr(sanitizedName, “__”) > 0
sanitizedName = Replace(sanitizedName, “__”, “_”)
Loop
GetSafeFileName = Trim(sanitizedName)
End Function
”’
”’
Public Sub SafeSaveDocument(ByVal doc As AcadDocument, ByVal folderPath As String, ByVal fileName As String)
On Error GoTo ErrorHandler
Dim safeName As String
safeName = GetSafeFileName(fileName)
‘ フルパスの整合性チェック
Dim fullPath As String
fullPath = folderPath & “\” & safeName & “.dwg”
‘ 保存実行
doc.SaveAs fullPath
Debug.Print “Success: ” & fullPath
Exit Sub
ErrorHandler:
MsgBox “保存プロセスで予期せぬエラーが発生しました: ” & Err.Description, vbCritical
End Sub
—
3. エンジニアとして押さえるべき重要ポイント
1. 状態の隔離
上記の `GetSafeFileName` は、AutoCADのオブジェクトモデルに依存していない。これはユニットテストが可能であることを意味する。ビジネスロジックとAutoCADのAPI呼び出しを分離することは、将来的なVB.NET移行や、他のCADへの移植性を担保する唯一の手段だ。
2. 「名前を付けて保存」の罠
`Document.SaveAs` メソッドは、呼び出し時に現在開いている図面のパス状態を書き換える。もし、この処理の前後でデータベース連携(設計管理システム等)を行っている場合、「保存が成功したという事実」と「データベース上のレコードID」が一致しているかの整合性確認を必ずコードの直後に入れること。
3. 禁止文字の「動的更新」
上記のコードでは `ILLEGAL_CHARS` を定数にしているが、大規模な開発チームであれば、これをXMLやJSON、あるいは社内ネットワーク上のINIファイルから読み込むように設計すべきだ。プロジェクトの進行とともに「禁止したい文字」は増える傾向にあるからだ。
—
結論:自動化は「エラーを隠す」ことではない
自動化の真髄は、エラーを隠蔽することではなく、エラーが発生し得ない境界条件を設計することにある。
今回紹介した「禁止文字クリーニング」の実装は、一見すると些細な機能だ。しかし、これによって設計者が「保存時のエラー回避」という不毛な心理的負荷から解放されることは、トータルで見れば膨大な生産性向上に繋がる。
さあ、あなたの環境でもこの「守りのコード」を実装し、設計者が本来の創造的な業務に集中できる環境を整えてほしい。伝説的な自動化エンジニアは、常に「ユーザーが失敗する権利」をシステム的に奪い去るものなのだから。
