AutoCAD VBAの深淵:Documents.Addによる「テンプレート完全制御」の極意
AutoCADの自動化において、最も初歩的でありながら、最も「事故」を引き起こしやすいのが図面の新規作成だ。
「とりあえず `Documents.Add` すればいい」と考えている開発者は、まだアマチュアの域を出ない。なぜなら、環境変数や既存のDWT(テンプレートファイル)のパス、そしてAutoCADが内部的に保持するドキュメントスタックの挙動を理解していないからだ。
今回は、現場でトラブルを一切起こさない、プロフェッショナルな図面初期化のロジックを伝授する。
—
1. なぜ「単純なAdd」が地雷なのか
初心者が書くコードの典型例を見てみよう。
‘ 【アンチパターン】
Documents.Add “acad.dwt”
これには致命的な欠陥が3つある。
1. パスの曖昧さ: `acad.dwt` がテンプレート検索パスに存在しない場合、AutoCADはデフォルトの空図面を立ち上げる。これにより画層や枠線が崩壊し、後続の作図ロジックがエラーを吐く。
2. 非同期的な初期化: 大規模なDWTを読み込む際、AutoCADは内部的に初期化処理を行う。`Add` 直後にオブジェクトを操作しようとすると、まだ図面が完全にロードされておらず、COM例外が発生することがある。
3. カレントドキュメントの喪失: `Add` した瞬間、アクティブな図面が切り替わる。マルチドキュメント環境で複数の図面を操作している場合、どの図面を指しているのかの追跡を失う(いわゆるポインタの迷走)。
—
2. 堅牢なテンプレート制御の設計思想
実務レベルで求められるのは、「指定したパスが確実に存在するか」「正常にロードされたか」を検証し、明示的に制御下へ置くことだ。
以下のコードは、エラーハンドリングとパス検証を統合した、プロダクション(本番)環境で耐えうる設計である。
プロフェッショナル仕様のコード例
Public Function CreateDrawingFromTemplate(ByVal templatePath As String) As AcadDocument
Dim doc As AcadDocument
‘ 1. ファイル存在確認(初歩だが必須)
If Dir(templatePath) = “” Then
Err.Raise vbObjectError + 1000, “CreateDrawingFromTemplate”, “指定されたテンプレートが見つかりません: ” & templatePath
End If
On Error GoTo ErrorHandler
‘ 2. ドキュメントの生成
‘ Documents.Addはテンプレートパスを引数に取る
Set doc = Application.Documents.Add(templatePath)
‘ 3. 図面の初期化待機(重要)
‘ 新規作成直後はApplication.ActiveDocumentを再定義する
‘ 必要に応じて、図面のロードが完了するまでDoEventsで待機させる等の工夫が必要な場合もある
doc.Activate
Set CreateDrawingFromTemplate = doc
Exit Function
ErrorHandler:
MsgBox “図面の初期化に失敗しました: ” & Err.Description, vbCritical
Set CreateDrawingFromTemplate = Nothing
End Function
—
3. 実務担当者が押さえるべき「3つの鉄則」
① パスの絶対指定と環境変数
テンプレートパスをプログラム内にハードコーディングしてはいけない。設定ファイル(iniやjson、あるいはExcel設定シート)から読み込み、`ThisDrawing.Application.Preferences.Files.TemplateDwgPath` との組み合わせで動的にパスを解決せよ。
② 画層・枠線の初期化は「テンプレート」に託せ
VBA内で `Layers.Add` を繰り返すコードを書いていないか? それは非効率の極みだ。画層、線種、寸法スタイル、タイトルブロック(枠)は全てDWT側に事前定義しておく。VBAの役割は「図面を開き、テンプレートが用意した箱にデータを流し込むこと」に徹するべきだ。
③ COMオブジェクトの解放(メモリマネジメント)
`Set doc = Nothing` を疎かにするな。AutoCADのCOMインターフェースはメモリリークを起こしやすい。特に大量の図面をバッチ処理する際は、ループの最後で明示的にオブジェクトを閉じる(`doc.Close False`)処理を忘れてはならない。
—
最後に:自動化の真髄
「動くコード」を書くのは簡単だ。「壊れないコード」を書くのがエンジニアの仕事である。
今回紹介したテンプレート制御は、自動化ツールの「土台」だ。ここが揺らぐと、その後の複雑な作図ロジックもすべて徒労に終わる。まずはこの堅牢な初期化フローを自社の開発ライブラリに組み込んでほしい。
AutoCADのAPIは、使い手によって凶器にも道具にもなる。君が目指すべきは、ツールをただ作るのではなく、「設計者の意図を寸分の狂いなく再現する、静かなる黒衣」を構築することだ。
健闘を祈る。
