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

スポンサーリンク

AutoCAD VBAを掌握する:eTransmitを「自作」して納品業務を極限まで自動化する

こんにちは。現場の「自動化」を愛する皆さんのための技術指南へようこそ。

AutoCADの標準機能である「eTransmit(転送セット)」は非常に便利ですが、実務では「特定のフォルダに自動で振り分けたい」「特定のファイルを除外したい」といった、痒いところに手が届かない場面が多いはずです。

今日は、マクロの記録から一歩踏み出し、「AutoCADのオブジェクトモデルを自在に操り、自前のeTransmitエンジンを構築する」という、実務中級者向けの極めて実践的なテーマを扱います。

1. なぜ標準のeTransmitではなく「自作」するのか?

標準のeTransmitはGUIベースであり、大量の図面をバッチ処理する際には限界があります。一方、VBAから`FileSystemObject (FSO)`を用いて自作すれば、以下のメリットが得られます。

  • 完全な自動化: 図面を開かずに、あるいはバックグラウンドで関連ファイルを収集可能。
  • 柔軟なディレクトリ構造: 納品先の規定に合わせてフォルダ構成を自動生成できる。
  • フィルタリング: 不要なログファイルやバックアップ(.bak)を事前に排除できる。

「AutoCAD VBAのオブジェクトモデルを理解する」とは、図面の中にある「点と線」だけでなく、その背後にある「関連ファイル(外部参照・フォント・CTB)」のパスをいかに効率よく抜き出すかという知恵そのものです。

2. 収集すべき「関連ファイル」の正体

AutoCAD図面(.dwg)には、以下の情報が含まれています。これらをFSO(FileSystemObject)で追跡するのが今回のミッションです。

1. 外部参照(XRef): `Block`オブジェクトを走査し、`IsXRef`プロパティがTrueのものを探す。
2. 画像・OLE: `RasterImage`オブジェクトからパスを取得。
3. 印刷スタイル(CTB/STB): `Layout`オブジェクトの`StyleSheet`プロパティからパスを特定。
4. フォント: これは少し高度ですが、`TextStyle`から情報を拾い上げます。

3. 実装コード:納品パッケージ収集エンジン

まずは、カレント図面の外部参照を抽出し、指定フォルダにコピーするプロトタイプを作成しましょう。

‘ 必要な参照設定: Microsoft Scripting Runtime
Sub ExportDrawingDependencies()
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)

Dim targetFolder As String
targetFolder = “C:\Deliverables\Project_A\”

‘ 納品フォルダが存在しなければ作成
If Not fso.FolderExists(targetFolder) Then fso.CreateFolder (targetFolder)

‘ 1. 現在の図面をコピー
fso.CopyFile ThisDrawing.FullName, targetFolder & ThisDrawing.Name

‘ 2. 外部参照の収集
Dim blk As AcadBlock
For Each blk In ThisDrawing.Blocks
If blk.IsXRef Then
‘ 外部参照ファイルのパスを取得してコピー
If fso.FileExists(blk.Path) Then
fso.CopyFile blk.Path, targetFolder & fso.GetFileName(blk.Path)
End If
End If
Next blk

MsgBox “納品パッケージの収集が完了しました!”, vbInformation
End Sub

【解説】ここがコードの肝です

  • `ThisDrawing`: `AcadDocument`の代表選手です。開いている図面を操作する際の入り口になります。
  • `IsXRef`プロパティ: 全てのブロックを巡回し、これがTrueのものだけを抽出する。これが「関連ファイル」を特定する最も確実な手法です。
  • `FileSystemObject`: VBA標準の`FileCopy`よりも強力です。フォルダの有無を確認し、パスの結合を安全に行えるため、自動化ツールには必須の道具です。

4. 陥りやすい罠と解決策

初学者が必ず突き当たる「壁」を、伝説のアーキテクトとして伝授します。

① パスにスペースや特殊文字が含まれる問題

`fso.CopyFile`を使う際、パスを必ずダブルクォーテーションで囲む癖をつけましょう。もしくは、パスが正しいか`fso.FileExists`でチェックしてから処理を回すのが、堅牢なコードの鉄則です。

② 印刷スタイル(CTB)の取得タイミング

CTBは`Layout`オブジェクトに紐付いています。

‘ 全レイアウトのCTBを収集する例
Dim lay As AcadLayout
For Each lay In ThisDrawing.Layouts
Debug.Print lay.StyleSheet ‘ ここにCTBのファイル名が入っています
Next lay

ここでのポイントは、「CTBはAutoCADのサポートパス内にあるか?」を判定することです。`fso.FileExists`でパスが見つからない場合は、AutoCADのシステム変数 `PRINTERSTYLEPATH` を取得して補完するロジックを組み込むのが上級者のやり方です。

5. 次なるステップへ:ZIP圧縮まで自動化する

ここまでのコードでファイル収集は完璧です。最後にZIP化する際は、Windows標準の圧縮機能を利用するか、`Shell`関数で外部コマンドを叩くのがスマートです。

「マクロの記録」に頼っていた時期は終わりです。オブジェクトモデルの構造を理解し、FileSystemObjectを使いこなす。 この技術を手に入れたあなたは、もうCADオペレーターではなく、CAD環境を設計するエンジニアです。

まずはこのコードを、自分の手元の図面で動かしてみてください。何かエラーが出たら、それは「AutoCADがあなたに何かを教えようとしている」合図です。そのエラーこそが、エンジニアとしての成長の糧になりますよ。

応援しています!次は「図面を開かずに情報を抽出する ObjectDBX」の世界でお会いしましょう。

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