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

スポンサーリンク

【AutoCAD VBA】eTransmitの軛(くびき)を断つ:関連ファイル抽出とパッケージングの自動化

AutoCADの標準機能である「eTransmit」は、GUI上では優秀だが、自動化の文脈では悪夢だ。COMインターフェースは限定的で、大規模プロジェクトのバッチ処理に組み込もうとすれば、UIのハングアップやセッションの不安定さに足元をすくわれる。

真に自動化を極めるエンジニアは、標準機能に依存しない。「自ら依存関係を解析し、ファイルを収集し、セキュアに圧縮する」。これが、レガシーを克服し、持続可能な納品パイプラインを構築する唯一の解だ。

今日は、AutoCAD VBAのオブジェクトモデルを掌握し、Windows APIとFSO(FileSystemObject)を駆使した「脱・標準機能」の戦略を伝授する。

1. 依存関係解析のアーキテクチャ

eTransmitの本質は「Xref(外部参照)」「画像」「フォント」「プロットスタイル(CTB/STB)」の追跡だ。これを解決するには、以下の順序でメモリ空間を操作する。

1. `AcadDatabase`の走査: `Blocks`コレクションを巡回し、`IsXRef`プロパティを監視する。
2. `AcadLayout`の走査: `StyleSheet`プロパティから使用中のCTB/STBを特定する。
3. パスの正規化: 相対パスを絶対パスへ変換する際、`ThisDrawing.Path`を基準としたWin32 APIの活用が不可欠だ。

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

以下のコードは、単なるスクリプトではない。オブジェクトのライフサイクルを制御し、メモリリークを最小化する設計だ。

Option Explicit

‘ メモリ最適化のためのAPI定義(必要に応じて)
Private Declare PtrSafe Function GetFullPathName Lib “kernel32” Alias “GetFullPathNameA” _
(ByVal lpFileName As String, ByVal nBufferLength As Long, ByVal lpBuffer As String, ByVal lpFilePart As String) As Long

”’

”’ 外部参照を収集し、指定フォルダへコピーするエンジン
”’

Public Sub ExportDrawingDependencies(targetDir As String)
Dim fso As Object
Dim doc As AcadDocument
Dim block As AcadBlock
Dim fileList As Object

Set fso = CreateObject(“Scripting.FileSystemObject”)
Set fileList = CreateObject(“Scripting.Dictionary”)
Set doc = ThisDrawing

‘ 1. 外部参照の走査
For Each block In doc.Blocks
If block.IsXRef Then
‘ パスが空でない場合のみ収集
If Len(block.Path) > 0 Then
If Not fileList.Exists(block.Path) Then
fileList.Add block.Path, block.Path
End If
End If
End If
Next

‘ 2. コピー実行(エラーハンドリングを重視)
Dim key As Variant
For Each key In fileList.Keys
Dim destPath As String
destPath = fso.BuildPath(targetDir, fso.GetFileName(key))

‘ ファイル存在確認とコピー
If fso.FileExists(key) Then
fso.CopyFile key, destPath, True
End If
Next

‘ オブジェクトの明示的解放(メモリ管理の鉄則)
Set fileList = Nothing
Set fso = Nothing
End Sub

3. オブジェクトライフサイクルとパフォーマンスの極意

VBAにおいて、`AcadDocument`や`AcadDatabase`は巨大なオブジェクトだ。特に大規模図面では、不要なオブジェクトへの参照を保持し続けることが、AutoCAD自体のクラッシュを誘発する。

  • Dictionaryの活用: `Collection`オブジェクトではなく、検索効率の高い`Scripting.Dictionary`を使用せよ。パスの重複排除において、計算量は圧倒的にDictionaryが優位だ。
  • Late Binding vs Early Binding: 開発中はEarly Binding(参照設定)でデバッグし、配布時はLate Binding(`CreateObject`)へ切り替えることで、バージョン間の型ライブラリの齟齬による「コンパイルエラー」を回避する。これは企業内システム管理の基本中の基本である。
  • 圧縮処理: ZIP化はVBA標準では不可能だ。`Shell.Application`の`Namespace`メソッドを使用してWindowsエクスプローラーの圧縮機能を利用するか、`7-Zip`等のCLIツールを`WScript.Shell`経由で叩くのが最も堅牢である。

4. シニアエンジニアへの提言:なぜ「eTransmit」を使わないのか

標準のeTransmitは、図面を開いたまま実行されることが多く、フックが効かない。一方、この「擬似自動化」手法は、「バックグラウンドでObjectARX/Managed APIを読み込ませる前の、前処理」として機能させることが可能だ。

例えば、納品前に特定レイヤーの削除や、不要なブロックのパージを組み合わせるなど、「納品用図面のクレンジング」と「パッケージング」を不可分なワークフローにすること。これが、手戻りをゼロにする唯一の道だ。

結びに

AutoCAD VBAは、決して古びた言語ではない。APIが提供する低レイヤーなデータ構造を理解し、OSの機能と調和させる能力があれば、どんな複雑なワークフローも瞬時に自動化できる。

次に挑むべきは、この処理を`VB.NET`の`AcMgd.dll`へ移行し、`ObjectARX`層で直接データベースを叩く最適化だ。だが、まずはこのVBAによる「手綱の制御」から始めてほしい。

システムとは、設計思想そのものだ。コードの行数ではなく、背後にあるオブジェクトの鼓動を感じろ。それが、伝説への第一歩となる。

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