【入門編】【実務中級者向け】図面保存と連動した「自動e-トランスミット」:外部参照とフォントをパッケージ化して保存する – AutoCAD VBA解析バイブル

スポンサーリンク
スポンサーリンク

図面を「点」ではなく「面」で捉えろ:自動e-トランスミットによる納品プロセスの完全自動化

さて、君たちはもう、ただの「描画ツール」としてのAutoCADではなく、「データ管理ツール」としてのAutoCADを見据える段階に来ているね。

マクロの記録を使って、線を引いたり、レイヤーを変えたりする。それは素晴らしい第一歩だ。しかし、実務の現場――特に設計業務の終盤で君たちを待ち受けているのは、もっと泥臭く、そして恐ろしい作業だ。「図面を納品してください」と言われたとき、君はただ一つのDWGファイルを送るだけで済むだろうか?

「外部参照がリンク切れになっています」「フォントがなくて文字化けしています」「画像が表示されていません」……。

クライアントからのそんな電話に、冷や汗をかきながら対応する日々は、今日で終わりにしよう。今日は、図面単体ではなく、関連するすべての要素(外部参照、フォント、画像)を一つのパッケージとして自動的に収集する「自動e-トランスミット」の極意を伝授するよ。

1. なぜ「保存」だけでは不十分なのか?:オブジェクトの依存関係

プログラミングの世界には「依存関係(Dependency)」という概念がある。

AutoCADの図面ファイル(DWG)は、実は非常に「孤独な存在」ではないんだ。図面の中には、以下のような「外の世界」にある要素への参照が書き込まれている。

  • 外部参照 (Xref): 他のDWGファイル。
  • 画像 (Raster Image): 貼り付けられたJPGやPNG。
  • フォント (SHX/TrueType): 文字の形を決めるデータ。
  • 線種 (CTB/STB): 出力時の線の太さや色の制御。

これらを考慮せずにDWG単体を保存して送るのは、「レシピだけ渡して、材料を渡さない料理人」と同じだ。受け取った側は、料理(図面)を完成させることができない。

自動e-トランスミットとは、この「レシピ(DWG)」から「必要な材料(外部ファイル)」をすべてスキャンし、一つのフォルダに集める作業を自動化することなんだ。

2. 設計図:自動収集のアルゴリズム

いきなりコードを書くのは素人のすることだ。まずは、エンジニアとして「何をすべきか」というロジック(設計図)を整理しよう。

1. 出力先フォルダの作成: 整理整頓された専用のフォルダを用意する。
2. 図面自身のコピー: 現在のDWGファイルを、新しいフォルダへコピーする。
3. 外部参照の走査: `ExternalReferences` コレクションをループで回し、各ファイルのパスを取得してコピーする。
4. フォント・書式の走査: `TextStyles` コレクションを調べ、使用されているSHXファイル等のパスを特定し、コピーする。
5. 完了報告: すべての準備が整ったことをユーザーに伝える。

3. 実装:依存関係を掌握するVBAコード

ここでは、最も重要で、かつ初心者がつまずきやすい「外部参照の収集」に焦点を当てたコードを提示するよ。これをベースに拡張していくのが、プロへの最短ルートだ。

※このコードを動かすには、VBAエディタの「ツール」→「参照設定」から “Microsoft Scripting Runtime” にチェックを入れておいてくれ。ファイル操作(FileSystemObject)を強力に扱うために必要だ。

Option Explicit

''' <summary>
''' 図面に関連する外部参照ファイルを収集し、特定のフォルダにパッケージ化する
''' </summary>
Sub AutoPackageDependencies()
    Dim fso As FileSystemObject
    Set fso = New FileSystemObject
    
    Dim targetFolder As String
    Dim currentDWG As String
    Dim xref As AcadExternalReference
    Dim xrefPath As String
    Dim destPath As String
    
    On Error GoTo ErrorHandler

    ' 1. 保存先フォルダの設定(図面と同じ場所に「Package_Output」フォルダを作成)
    currentDWG = ThisDrawing.FullName
    If currentDWG = "" Then
        MsgBox "図面を一度保存してから実行してください。", vbCritical
        Exit Sub
    End If
    
    targetFolder = fso.GetParentFolderName(currentDWG) & "\Package_Output_" & Format(Now, "yyyymmdd_hhnnss")
    
    If Not fso.FolderExists(targetFolder) Then
        fso.CreateFolder targetFolder
    End If
    
    ' 2. 現在の図面をパッケージフォルダへコピー
    destPath = targetFolder & "\" & fso.GetFileName(currentDWG)
    fso.CopyFile currentDWG, destPath
    Debug.Print "Main File Copied: " & destPath

    ' 3. 外部参照 (Xref) の収集ループ
    ' ここがエンジニアとしての腕の見せ所だ。
    ' コレクションを回し、各オブジェクトのプロパティ(Path)を読み解く。
    For Each xref In ThisDrawing.ExternalReferences
        ' 参照が有効(ロードされている)か確認
        If xref.IsAttached Then
            xrefPath = xref.Path
            
            ' 外部参照ファイルの存在確認とコピー
            If fso.FileExists(xrefPath) Then
                ' ファイル名だけを抽出して、コピー先のパスを作成
                Dim fileName As String
                fileName = fso.GetFileName(xrefPath)
                
                ' コピー実行
                fso.CopyFile xrefPath, targetFolder & "\" & fileName
                Debug.Print "Xref Copied: " & fileName
            Else
                Debug.Print "Warning: Xref not found at " & xrefPath
            End If
        End If
    Next xref

    MsgBox "パッケージ化が完了しました!" & vbCrLf & "保存先: " & targetFolder, vbInformation, "Success"
    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました: " & Err.Description, vbCritical, "Error"
End Sub

4. 伝説のアーキテクトからの助言:陥りやすい罠

このコードを動かしてみて、「あれ?」と思うことがあるかもしれない。現場で通用するコードにするために、以下の3つのポイントを肝に銘じておいてほしい。

① 「絶対パス」と「相対パス」の壁

外部参照のパスには、`C:\Projects\Drawing.dwg` のような絶対パスと、`..\Xref\Drawing.dwg` のような相対パスがある。
`xref.Path` を取得したとき、AutoCADが返してくるのは基本的に絶対パスだ。しかし、コピーした後に図面を開き直すと、参照が切れてしまうことがある。

  • 極意: 本格的なツールにするなら、コピーした後に `xref.Path` を書き換えて、新しいフォルダ内のパスへ再設定(Relink)する処理を加えるんだ。これができると、君のコードは「ただのコピー」から「真のパッケージングツール」へと昇華する。

② ファイルのロック(使用中エラー)

もし、外部参照しているファイルが他の誰かによって開かれていたら? `fso.CopyFile` はエラーを吐いて止まってしまう。

  • 極意: 実務では `On Error Resume Next` で無理やり進めるのではなく、エラーハンドリングの中で「どのファイルが原因で止まったのか」をログに残す、あるいはユーザーに通知する設計を心がけなさい。

③ オブジェクトのライフサイクル

`For Each xref In ThisDrawing.ExternalReferences` というループの中で、もし `xref` を削除したり変更したりしようとすると、コレクションのインデックスが狂ってプログラムがクラッシュする。

  • 極意: 「読み取り」と「書き換え」は明確に分けなさい。収集(Collection)が目的なら、オブジェクトのプロパティを読み取るだけに留めるのが鉄則だ。

最後に:君へのエール

「マクロの記録」から「自作のロジック」へ。
このステップを踏むことは、単に作業を速くすることではない。「システムがどう動いているか」という構造を理解することなんだ。

今回紹介したコードは、まだ入り口に過ぎない。ここからフォントの収集、画像の収集、さらにはZIP圧縮まで組み込んでいけば、君専用の最強の納品自動化エンジンが出来上がる。

一歩ずつ、確実に。AutoCADの深淵を楽しんでくれ。君ならできるはずだ。

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