【SolidWorks板金自動化の極意】SheetMetalFeatureDataを完全掌握し、DXF切り出しプロセスを極限まで最適化する
板金設計の現場において、3Dモデルからレーザー加工用のDXFを展開・出力する作業は、どれほどルーチン化されていても「ヒューマンエラーの温床」であり、同時に「最も時間対効果の低いエンジニアリング工数」である。
「面が反転している」「コンフィギュレーション名がファイル名に反映されていない」「微小な隙間(ギャップ)の処理漏れでレーザーが止まった」――これらは全て、手動あるいは場当たり的なマクロによるオペレーションが招いた悲劇だ。
本稿では、SolidWorks APIの根幹をなす `SldWorks.Application` から `ModelDoc2`、そして板金特有の `SheetMetalFeatureData` オブジェクトを極限まで使い倒し、実務の荒波に耐えうる堅牢性と、ミリ秒単位のパフォーマンスを両立させたDXF自動切り出し・保存システムの全貌を解き明かす。
—
1. 架构設計:なぜ「素のVBA」では現場で破綻するのか
多くのプログラマは、ネットのサンプルコードを継ぎ接ぎしてマクロを組み上げる。しかし、何千点というアセンブリや複雑なマルチボディ板金モデルを相手にする時、以下の「三悪」に直面してシステムは必ずクラッシュする。
1. COMオブジェクトのメモリリーク(ゾンビプロセスの発生)
2. アクティブドキュメントへの過度な依存(コンテキスト汚染)
3. OSファイルシステムとの競合・非同期エラー
これらを克服するためには、APIオブジェクトのライフサイクルを完全に手動制御し、Windows APIとの協調動作による堅牢なパス解決を実装しなければならない。
—
2. コア・アーキテクチャ:SheetMetalFeatureData と DXF出力のメカニズム
板金部品の展開図(Flat Pattern)を取得するためには、単純に「図面にしてDXF保存」するアプローチ(ドローイング経由)をとってはならない。描画エンジンのオーバーヘッドが大きすぎ、処理速度が致命的に落ちるからだ。
正攻法は、3Dモデルのフィーチャーツリーから `SheetMetalFeatureData` を抽出し、直接フラットパターンビューを制御してダイレクトにDXF/DWGのエクスポートを実行することである。
実装コード:極限まで最適化された板金DXF抽出エンジン
以下のコードは、エラーハンドリング、オブジェクトの明示的解放、そして実務で必須となる出力先フォルダの動的生成を網羅した、プロダクション品質のVBAモジュールである。
Option Explicit
‘ =========================================================================
‘ ódulo名: ModSheetMetalDxfExporter
‘ 概要 : 板金モデルからSheetMetalFeatureDataを用いてDXFを極限効率で出力する
‘ 著者 : 伝説のチーフアーキテクト
‘ =========================================================================
‘ Windows API: フォルダ存在確認・作成用(VBA標準のMkDirの脆弱性を回避)
If VBA7 Then
Private Declare PtrSafe Function MakeSureDirectoryPathExists Lib “imagehlp.dll” (ByVal DirPath As String) As Long
Else
Private Declare Function MakeSureDirectoryPathExists Lib “imagehlp.dll” (ByVal DirPath As String) As Long
If
Public Sub ExportSheetMetalToDXF()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim swFeat As SldWorks.Feature
Dim swSmData As SldWorks.SheetMetalFeatureData
Dim docTitle As String
Dim saveDir As String
Dim dxfPath As String
Dim exportOptions As Long
Dim status As Boolean
‘ 1. SldWorks アプリケーションのセーフティ取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical, “致命的エラー”
Exit Sub
End If
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbExclamation, “警告”
Exit Sub
End If
‘ 2. 部品(Part)ドキュメントか、かつ板金部品であるかの厳密な型チェック
If swModel.GetType <> swDocPART Then
MsgBox “アクティブドキュメントは部品ではありません。”, vbCritical, “型不一致”
Exit Sub
End If
Set swPart = swModel
‘ 3. 出力先ディレクトリの決定と保証(デスクトップの “Exported_DXF” フォルダ)
saveDir = CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”) & “\Exported_DXF\”
If MakeSureDirectoryPathExists(saveDir) = 0 Then
MsgBox “出力ディレクトリの作成に失敗しました: ” & saveDir, vbCritical
GoTo CleanUp
End If
‘ 4. ファイル名規則の適用 (図番_コンフィギュレーション名.dxf)
docTitle = Left(swModel.GetTitle, InStrRev(swModel.GetTitle, “.”) – 1)
If docTitle = “” Then docTitle = swModel.GetTitle
dxfPath = saveDir & docTitle & “_” & swModel.ConfigurationManager.ActiveConfiguration.Name & “.dxf”
‘ 5. 板金フィーチャーの探索と展開データの取得
‘ ※最初のSheetMetalフィーチャーをキャプチャする
Set swFeat = swPart.FirstFeature
Do While Not swFeat Is Nothing
If swFeat.GetTypeName2 = “SheetMetal” Then
Set swSmData = swFeat.GetDefinition
Exit Do
End If
Set swFeat = swFeat.GetNextFeature
Loop
If swSmData Is Nothing Then
MsgBox “このモデルには有効な板金フィーチャーが存在しません。”, vbExclamation, “板金エラー”
GoTo CleanUp
End If
‘ 6. DXFエクスポートオプションの構築
‘ 板金展開図のエクスポートにおいて含めるべき要素をビットフラグで制御
‘ 1: ジオメトリ, 2: ベンドライン, 4: スケッチ… などのSolidWorks API仕様に準拠
‘ ここでは標準的なレーザー加工用(外形・内孔・曲げ線)を指定
‘ ※注意: ModelDoc2.ExportFlatPatternView は v2010以降の標準メソッド
‘ 第1引数: 保存パス, 第2引数: オプション (通常は 1 = ジオメトリとベンドライン)
‘ 念のためモデルを強制的に再構築(Rebuild)し、最新の展開状態を担保
swModel.ForceRebuild3 False
status = swModel.ExportFlatPatternView(dxfPath, 1)
If status Then
MsgBox “DXFの切り出しに成功しました。” & vbCrLf & dxfPath, vbInformation, “完了”
Else
MsgBox “DXFのエクスポートに失敗しました。APIステータスがFalseを返しました。”, vbCritical, “出力エラー”
End If
CleanUp:
‘ =========================================================================
‘ 7. メモリ最適化:COMオブジェクトの明示的解放(必須)
‘ =========================================================================
Set swSmData = Nothing
Set swFeat = Nothing
Set swPart = Nothing
Set swModel = Nothing
Set swApp = Nothing
End Sub
—
3. シニアエンジニアが知るべき「現場の罠」と回避策
① マルチボディ板金におけるコンテキスト汚渉
1つのPartファイル内に複数の板金ボディが存在する「マルチボディ板金」の場合、上記の単純な `FirstFeature` からの探索では、最初にヒットしたボディしか処理できない。
大量生産環境では、ボディごとにループを回し、個別のフラットパターンを制御する拡張ロジックが必要となる。
`IBody2` オブジェクトと `ISheetMetalFeatureData` の関連付けを動的に解決するアーキテクチャが、シニアの腕の見せ所となる。
② バックグラウンド処理(Headless Mode)への拡張
もしこのマクロを数千ファイルに一括適用(バッチ処理)する場合、画面描画(Graphics)を有効にしたままでは、処理速度が数分の一に落ちるだけでなく、意図しないフォーカス奪取によるエラーが起きる。
VB.NET等を用いた外だしアプリケーション、あるいはVBAから `SldWorks.Application.Visible = False` を制御する設計にする場合、「モデルのロード完了を待つイベントハンドリング(`DocumentLoadNotify2` など)」の同期処理を厳密に組む必要があることを忘れてはならない。
—
4. 結び:技術の本質を見極める者へ
自動化の本質は、「ボタン一つで楽をすること」ではない。
「人間にしかできない高度なエンジニアリング判断の時間を最大化するため、機械にできる雑務の不確実性をゼロに収束させること」である。
今回解説した `SheetMetalFeatureData` の制御と、徹底的なオブジェクト解放の思想は、板金領域だけでなく、全SolidWorks自動化アーキテクチャに通じる普遍的な真理である。レガシーなVBAの制約の中でも、最高峰の知見を注ぎ込めば、商用RPAツールをも凌駕する超高速な専用システムを構築できる。
あなたのデスクトップから、無駄なクリックと手戻りが一掃されることを期待する。
