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」の世界でお会いしましょう。
