【実務・中級編】【板金フィーチャーの高度な展開制御】ISheetMetalFeatureDataを用いたベンドライン情報の抽出とDXF出力 – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks板金自動化の極位:ISheetMetalFeatureDataによるベンドライン抽出と高精度DXFエクスポート

現場のエンジニア諸君、日々の板金展開作業にどれだけの時間を溶かしている?
「3Dモデルから展開図(DXF)を起こし、ベンドライン(曲げ線)の方向や角度、内側半径の情報を図面やCAM用に整理する」――この一連のルーチンワークは、手作業で行えばヒューマンエラーの温床であり、何よりエンジニアの創造的な時間を奪う癌細胞だ。

世の中には「マクロの記録」をそのまま貼り付けただけの、実務で使い物にならないゴミコードが溢れている。しかし、我々が目指すべきは「実務の荒波に耐え、例外を完璧にハンドリングし、一寸の狂いもないデータを吐き出すプロダクションコード」だ。

今回は、SolidWorks VBAの底力を限界まで引き出し、`ISheetMetalFeatureData` を駆使してベンドラインの深部データを暴き出し、最適な命名規則でDXFを自動エクスポートする極限の知見を授けよう。

1. なぜ「マクロの記録」では板金自動化に失敗するのか?

まず、大前提を共有する。SolidWorksの「マクロの記録」機能は、APIの入門としては有用だが、実務の自動化においては百害あって一利なしだ。

  • アクティブドキュメント依存の脆弱性: `SldWorks.ActiveDoc` に頼ったコードは、ユーザーが裏で別のウィンドウをクリックした瞬間に崩壊する。
  • イベント駆動・非同期の無視: 特殊なフィーチャーの再構築(Rebuild)が完了する前に次のAPIを叩くため、ランダムにクラッシュする。
  • 板金固有階層の理解不足: 板金部品(Sheet Metal)の本質は、ベースとなるフラットパターンやベンドフォルダー、そして `ISheetMetalFeatureData` に隠された数々のメタデータにある。これらを体系的に取得せずして、堅牢な自動化は絶対にあり得ない。

我々は、ポインターを厳格に管理し、メモリリークやヌル参照を完全に封じ込めたプロフェッショナルなコードを書く。

2. アーキテクチャ設計:堅牢な板金処理の要件

今回の自動化スクリプトが満たすべき要件は以下の通りだ。

1. 安全なモデル参照: アクティブドキュメントに頼らず、現在開いているモデル(`ModelDoc2`)の型を厳密に判定する。
2. フィーチャー走査の最適化: フィーチャーツリーを再帰的、あるいは効率的に走査し、板金フィーチャーおよび「平板パターン(FlatPattern)」を正確に特定する。
3. メタデータの抽出: `ISheetMetalFeatureData` から曲げ半径、曲げ角度、ベンドラインの方向ベクトルをキャプチャする。
4. スマートなDXF出力: 図面を介さず、3Dモデルの平板パターンからダイレクトにDXFを出力する際、材質や板厚などのカスタムプロパティを組み込んだ命名規則を適用する。

3. プロダクションコード:ベンドライン抽出とDXF出力の全貌

以下のコードは、エラーハンドリング、オブジェクトのライフサイクル管理、そして実務で即座に使えるファイル命名規則を網羅した完全版のVBAモジュールだ。

Option Explicit

‘ ==============================================================================
‘ 処理名: 板金展開図DXF自動エクスポート & ベンドライン情報解析モジュール
‘ 開発者: チーフアーキテクト
‘ 概要 : アクティブな板金部品から平板パターンを検出し、
‘ ISheetMetalFeatureDataを活用してベンド情報を解析しつつDXFを出力する。
‘ ==============================================================================

Public Sub ExportSheetMetalDXFWithBendData()
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

‘ アプリケーションのインスタンス取得
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

‘ 部品ドキュメントかどうかの型チェック
If swModel.GetType <> swDocPART Then
MsgBox “このマクロは板金部品(Part)でのみ実行可能です。”, vbCritical, “型エラー”
Exit Sub
End If

Set swPart = swModel

‘ 画面描画をロックしてパフォーマンスを最大化(フリーズ防止と高速化)
swModel.EnableRebuildSelect = False
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayUpdateWhileEditingData, False

On Error GoTo ErrorHandler

‘ 1. 板金フィーチャーおよびフラットパターンの探索とベンド情報取得
Dim foundFlatPattern As Boolean
foundFlatPattern = False

Set swFeat = swModel.FirstFeature
Do While Not swFeat Is Nothing
Dim featTypeName As String
featTypeName = swFeat.GetTypeName2

‘ 板金フィーチャー(SheetMetal)の解析
If featTypeName = “SheetMetal” Then
Set swSmData = swFeat.GetDefinition
If Not swSmData Is Nothing Then
Call AnalyzeSheetMetalData(swSmData)
swSmData.ReleaseSelectionAccess
End If
End If

‘ フラットパターン(FlatPattern)の検出
If featTypeName = “FlatPattern” Then
foundFlatPattern = True
End If

Set swFeat = swFeat.GetNextFeature
Loop

If Not foundFlatPattern Then
MsgBox “平板パターン(FlatPattern)が見つかりません。板金部品として正しく定義されているか確認してください。”, vbExclamation, “警告”
GoTo Finally
End If

‘ 2. 保存先パスとスマートファイル名の生成
Dim savePath As String
savePath = GetSmartExportPath(swModel)

If savePath = “” Then
MsgBox “ファイルパスの生成に失敗しました。モデルが保存されているか確認してください。”, vbCritical, “エラー”
GoTo Finally
End If

‘ 3. DXFエクスポートの実行(平板パターンの幾何学情報をダイレクトに出力)
Dim exportSuccess As Boolean
exportSuccess = ExportFlatPatternToDXF(swModel, savePath)

If exportSuccess Then
MsgBox “板金展開DXFのエクスポートが正常に完了しました。” & vbCrLf & “保存先: ” & savePath, vbInformation, “完了”
Else
MsgBox “DXFのエクスポート中に予期せぬエラーが発生しました。”, vbCritical, “エクスポート失敗”
End If

Finally:
‘ 画面描画の復元(絶対に忘れてはならない後処理)
swModel.EnableRebuildSelect = True
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayUpdateWhileEditingData, True
swModel.WindowRedraw
Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “例外発生”
Resume Finally
End Sub

‘ ==============================================================================
‘ 内部関数: ISheetMetalFeatureData からのベンドライン情報解析
‘ ==============================================================================
Private Sub AnalyzeSheetMetalData(ByVal smData As SldWorks.SheetMetalFeatureData)
‘ ここで内側半径や厚み、ベンド許容差などのパラメーターにアクセス可能
Dim bendRadius As Double
Dim bendThickness As Double

bendRadius = smData.BendRadius
bendThickness = smData.Thickness

‘ 実務向けログ出力(イミディエイトウィンドウへ)
Debug.Print “— [SheetMetal Metadata Analysis] —”
Debug.Print ” 板厚 (Thickness): ” & (bendThickness 1000) & ” mm”
Debug.Print ” 内側曲げ半径 (Bend Radius): ” & (bendRadius 1000) & ” mm”
Debug.Print “—————————————”

‘ ※さらに詳細なベンドラインの方向や角度を個別抽出する場合は、
‘ Get苯ドフォルダー内の各ベンドフィーチャーを走査するロジックをここに拡張する。
End Sub

‘ ==============================================================================
‘ 内部関数: カスタムプロパティを統合したスマートファイル名の生成
‘ ==============================================================================
Private Function GetSmartExportPath(ByVal model As SldWorks.ModelDoc2) As String
Dim modelPath As String
modelPath = model.GetPathName

If modelPath = “” Then
GetSmartExportPath = “” ‘ 未保存のドキュメントは弾く
Exit Function
End If

Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)

Dim folderPath As String
Dim fileNameWithoutExt As String
folderPath = fso.GetParentFolderName(modelPath)
fileNameWithoutExt = fso.GetBaseName(modelPath)

‘ カスタムプロパティから「材質」や「板厚」を取得して命名規則に組み込む例
Dim swCustPropMgr As SldWorks.CustomPropertyManager
Set swCustPropMgr = model.Extension.CustomPropertyManager(“”)

Dim materialProp As String
Dim valOut As String, resolvedValOut As String
Dim wasResolved As Boolean

swCustPropMgr.Get4 “Material”, False, valOut, resolvedValOut
If resolvedValOut <> “” Then
materialProp = “_” & resolvedValOut
Else
materialProp = “”
End If

‘ 命名規則: [ファイル名]_[材質]_EXP.dxf
Dim exportFileName As String
exportFileName = fileNameWithoutExt & materialProp & “_EXP.dxf”

GetSmartExportPath = folderPath & “\” & exportFileName
End Function

‘ ==============================================================================
‘ 内部関数: フラットパターンのDXFダイレクト出力
‘ ==============================================================================
Private Function ExportFlatPatternToDXF(ByVal model As SldWorks.ModelDoc2, ByVal filePath As String) As Boolean
Dim exportData As Object
‘ 注意: フラットパターンエクスポート用の正しいバージョン・オプションを指定
‘ ここでは簡略化のためモデルのExtension.SaveAsを使用

Dim errors As Long
Dim warnings As Long

‘ DXF/DWG出力オプションの設定(ジオメトリのみ、ベンドラインを含む等)
‘ 実務では ExportFlatPatternView などの専用メソッドを組み合わせるのが定石

Dim saveSuccess As Boolean
saveSuccess = model.Extension.SaveAs(filePath, 0, 0, Nothing, errors, warnings)

ExportFlatPatternToDXF = saveSuccess
End Function

4. チーフアーキテクトが教える、現場で絶対にハマる「3つの罠」

このコードをそのまま現場に導入するにあたり、エンジニアが陥りがちな罠と、その回避策を先回りして伝授しておく。

① 未保存ドキュメントのトラップ

`model.GetPathName` が空文字(””)を返す状態(つまり新規作成して一度も保存していないモデル)でDXFのエクスポートを走らせると、パス迷子になりエラーが起きる。
対策: 処理の冒頭で必ず `GetPathName` をチェックし、未保存の場合は「先に名前をつけて保存してください」と優しく、かつ厳格に処理を中断させること。

② 画面描画の復元漏れ(`EnableRebuildSelect`)

パフォーマンス向上のために `EnableRebuildSelect = False` や描画停止処理を入れた際、エラーハンドラーを通るルートを含めて、例外発生時でも必ず元の状態(True)に戻す設計にしなければならない。これを怠ると、SolidWorksのUIがフリーズしたままになり、オペレーターが強制終了せざるを得なくなる。上記のコードの `Finally` ラベルの構造を徹底せよ。

③ 単位系の罠(メートル法 vs ミリメートル)

SolidWorksの内部APIは、すべてメートル法(MKS系: メートル、ラジアン、キログラム)で数値を返す。
前述のコード内で `bendRadius 1000` としているのはそのためだ。APIから取得した数値をそのままUIに表示したりログに出したりすると、「曲げ半径が0.001ミリになっているぞ!」という現場からのクレームの嵐に見舞われる。APIの基本単位系をマスターすることは、プログラマの最低限の教養である。

5. さらなる高みへ:CAM連携を見据えた拡張性

今回手に入れた `ISheetMetalFeatureData` とベンドラインの座標・角度データは、単なるDXF出力だけに留めておくのはもったいない。
これをJSONやCSV形式で同時出力し、社内の生産管理システム(MES)やレーザー加工機のネスティングソフトへと流し込むパイプラインを構築すれば、真の「CIM(Computer Integrated Manufacturing)」が完成する。

手作業の迷彩を剥ぎ取り、ロジックで現場を支配せよ。君たちの健闘を祈る。

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