【実務・中級編】【実務中級】AutoCAD VBAによる「eTransmit(転送セット)」の擬似自動化:関連ファイルをFSOで収集しZIP圧縮する – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAを掌握する:eTransmitを「自作」せよ。泥沼の依存関係を制御するアーキテクトの思考法

AutoCADの標準機能「eTransmit(転送セット)」は便利だが、実務の現場では往々にして「融通が利かない」という壁に突き当たる。特定の命名規則でファイルをリネームしたい、関連するPDFを自動で同梱したい、あるいは特定のフォルダ構造を維持したまま転送したい――。

標準機能のブラックボックスを叩くのではなく、「必要なファイルを自ら特定し、抽出する」というエンジニアリング的アプローチこそが、大規模プロジェクトにおける納品管理の最適解だ。

今回は、AutoCAD VBAを駆使し、外部参照(Xref)や画像、印刷スタイルをプログラムで追跡し、堅牢にアーカイブする「擬似eTransmit」の設計思想を伝授する。

1. なぜ「標準機能」に依存してはいけないのか

多くの初心者は、`SendCommand`で無理やりコマンドを呼び出そうとするが、これはエンジニアの悪手だ。UI操作の自動化は不安定であり、環境依存(OSやAutoCADのバージョン)によって容易に崩壊する。

我々が目指すべきは、「データベースとしてのAutoCAD」から情報を抽出し、「ファイルシステム」を制御するという疎結合な設計だ。

職人が押さえるべき設計のポイント

  • フルパスの正規化: Xrefのパスは相対パス、絶対パス、あるいは未解決状態が混在する。`FileSystemObject (FSO)`で存在チェックを徹底すること。
  • 依存関係の再帰的収集: Xrefの中にXrefがある場合(ネスト)、再帰処理が必要になる。
  • ZIPの生成: VBA単体ではZIP圧縮はできない。`Shell.Application`を使うか、外部ライブラリを組み合わせるのが定石だ。

2. 実装:堅牢なファイル収集エンジン

以下に、ドキュメントに紐付く外部参照を解析し、指定フォルダへコピーするコアロジックを提示する。

Option Explicit

‘ 必要なライブラリ: Microsoft Scripting Runtime
‘ 参照設定: Microsoft Shell Controls And Automation

Public Sub ExportProjectFiles()
Dim fso As New FileSystemObject
Dim destFolder As String
destFolder = “C:\Deliverables\” & Format(Now, “yyyyMMdd_HHmmss”)

If Not fso.FolderExists(destFolder) Then fso.CreateFolder destFolder

‘ 1. カレント図面自体のコピー
fso.CopyFile ThisDrawing.FullName, destFolder & “\”

‘ 2. Xrefの収集(再帰処理の呼び出し)
CollectXrefs ThisDrawing.Blocks, destFolder, fso

MsgBox “納品データの収集が完了しました: ” & destFolder
End Sub

Private Sub CollectXrefs(blocks As AcadBlocks, destPath As String, fso As FileSystemObject)
Dim blk As AcadBlock
Dim xrefPath As String

For Each blk In blocks
If blk.IsXRef Then
xrefPath = blk.Path

‘ パスが存在し、未コピーならコピーする
If fso.FileExists(xrefPath) Then
On Error Resume Next ‘ 既にコピー済みなら無視
fso.CopyFile xrefPath, destPath & “\”
On Error GoTo 0

‘ 必要であれば、ここで再帰的に内部のXrefを辿るロジックを追加可能
End If
End If
Next
End Sub

3. アーキテクトの視点:パフォーマンスと安定性への配慮

上記のコードは一見シンプルだが、実務で使うためには以下の「防御的プログラミング」を忘れてはならない。

① パスの解決(Resolve)

AutoCADの`AcadBlock.Path`は、必ずしもフルパスを返さない。「プロジェクトファイル(.apj)やサポートパス」に依存している場合、そのままでは`FSO`はファイルを見つけられない。

  • 対策: `ThisDrawing.GetVariable(“DWGPREFIX”)`を起点とした相対パスの補完や、`FindFile`メソッドを用いた探索ロジックを組み込むこと。

② ZIP圧縮の自動化

`Shell.Application`の`CopyHere`メソッドを使えば、外部ソフトを介さずともZIP圧縮が可能だ。

Sub CreateZip(folderPath As String, zipPath As String)
‘ 空のZIPファイルを作成
Open zipPath For Output As #1
Print #1, Chr$(80) & Chr$(75) & Chr$(5) & Chr$(6) & String(18, 0)
Close #1

Dim shellApp As Object
Set shellApp = CreateObject(“Shell.Application”)
shellApp.Namespace(zipPath).CopyHere shellApp.Namespace(folderPath).Items
End Sub

4. 最後に:なぜ「自作」が勝つのか

標準のeTransmitは「汎用的な機能」を提供するために、不要なファイルまで大量に拾い上げることがある。しかし、実務で必要なのは「今の図面を正しく表現するために必要な最小限のセット」だ。

  • 保守性: 独自の収集ロジックであれば、社内の図面管理ルールに合わせて「特定の命名規則のファイルだけ除外する」「PDFを自動生成して同梱する」といったカスタマイズが自由自在だ。
  • 信頼性: 外部コマンドに依存せず、VBAのメモリ管理下でプロセスが完結するため、ハングアップのリスクが極めて低い。

AutoCAD VBAは、単なる自動化ツールではない。図面という「情報の塊」を制御し、設計のワークフローを再定義するための強力な武器だ。このコードをベースに、君たちのプロジェクトに合わせてカスタマイズを重ねてほしい。

自動化の限界を決めるのは、APIの仕様ではなく、君の想像力だ。さあ、次はどんな効率化を実装する?

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