【テクニカル・上級編】【板金フィーチャーの高度な展開制御】ISheetMetalFeatureDataを用いたベンドライン(曲げ線)情報の抽出と展開図DXFのエクスポート – SolidWorks VBA解析バイブル

スポンサーリンク

板金自動化の深淵:ISheetMetalFeatureDataを完全制御し、DXF生成を極める

SolidWorks APIを扱う多くのエンジニアが、`ExportToDWG`メソッドの安易な呼び出しで満足している。しかし、現場で求められるのは単なるファイル出力ではない。板金設計の意図を汲み取り、レーザー加工機のベンダーが求める「正解」を、無駄なメモリ消費なしに吐き出すことだ。

今日は、`ISheetMetalFeatureData`を用いたベンド情報の抽出と、メモリリークを許さない堅牢なDXFエクスポートの極意を伝授する。

1. オブジェクトモデルの「歪み」を見極める

板金フィーチャーを扱う際、多くの初心者は`IFeature`から無理やり情報を引き出そうとして迷走する。核心は、`ISheetMetalFeatureData`への正当なアクセスにある。

板金部品のフラットパターン(展開図)は、`IFlatPatternFolder`を経由してアクセスするのがセオリーだ。だが、大規模アセンブリや複雑な履歴を持つパーツにおいて、このオブジェクトのライフサイクル管理を怠れば、SolidWorksはメモリリークを起こし、やがてCOM例外を吐いて沈黙する。

2. 【極意】ISheetMetalFeatureDataを用いたベンドパラメータ抽出

まずは、ベンドラインの半径や角度を抽出するための定石コードだ。

‘ メモリ最適化を意識した設計
Public Sub ExtractBendData(swModel As SldWorks.ModelDoc2)
Dim swPart As SldWorks.PartDoc
Set swPart = swModel

‘ フィーチャーマネージャからSheetMetalのルートを探る
Dim swFeat As SldWorks.Feature
Set swFeat = swPart.FirstFeature

Do While Not swFeat Is Nothing
If swFeat.GetTypeName2 = “SheetMetal” Then
Dim swSMData As SldWorks.SheetMetalFeatureData
Set swSMData = swFeat.GetDefinition

‘ ここでベンド情報の検証を行う
Debug.Print “Bend Radius: ” & swSMData.BendRadius

‘ 明示的解放:COMオブジェクトはVBAでは自動解放を信用してはならない
Set swSMData = Nothing
End If
Set swFeat = swFeat.GetNextFeature
Loop
Set swPart = Nothing
End Sub

3. DXFエクスポートにおける「落とし穴」と対策

`ExportToDWG2`メソッドを使用する際、多くのエンジニアが犯す過ちは「アクティブドキュメントの状態に依存した処理」を記述することだ。SolidWorksのAPIは、実行時のコンテキストに強く依存する。

以下のコードは、バックグラウンドでの安定性を確保し、レーザー加工機向けのDXFを命名規則に従って吐き出すテンプレートである。

Public Sub ExportToDXF_Robust(swModel As SldWorks.ModelDoc2, targetPath As String)
Dim swExportData As SldWorks.ExportFlatPatternViewData
Set swExportData = swModel.GetExportFlatPatternViewData()

‘ レーザー加工用にベンド線を除去し、外形のみを出力する場合の設定
swExportData.ExcludeBendLines = True
swExportData.IncludeHiddenEdges = False

‘ メモリリークを防止するための明示的終了処理
‘ ExportToDWG2は成功時にTrueを返す。戻り値の評価は必須。
Dim status As Boolean
status = swModel.ExportToDWG2(targetPath, swModel.GetPathName, _
swExportToDWG_e.swExportToDWG_eFlatPattern, _
False, Nothing, False, False, 0, Nothing)

If Not status Then
Err.Raise vbObjectError + 1000, “DXFExport”, “エクスポートに失敗しました。”
End If

‘ オブジェクトの完全破棄
Set swExportData = Nothing
End Sub

4. シニアエンジニアへの提言:堅牢性の確保

ここから先は、API仕様書の向こう側にある「システム運用の哲学」だ。

1. COMオブジェクトの解放: VBAは参照カウント方式だが、循環参照や複雑なオブジェクトグラフではGCが機能しないことがある。`Set = Nothing`をループの最後に行うのは、単なる儀式ではなく「メモリの断片化」を防ぐ防波堤だ。
2. Windows APIによるプロセス監視: 大規模なDXFバッチ処理を行う場合、SolidWorksのプロセスが応答なしになることが稀にある。`FindWindow`や`PostMessage`等のWindows APIを活用し、一定時間応答がないプロセスを強制再起動する「ウォッチドッグ」を別スレッド(あるいは別プロセス)で実装することを推奨する。
3. レガシー環境の保守: 過去のコードが`Late Binding`(CreateObject)で書かれている場合、可能な限り`Early Binding`(参照設定)へ切り替えろ。コンパイル時の型チェックを放棄することは、将来の自分への借金である。

結び

板金自動化において、最も重要なのは「ツールを動かすこと」ではない。「設計者の意図した通りの加工用データを、誰の手を介さずに送り届けるか」というパイプラインの構築だ。

`ISheetMetalFeatureData`は、その入り口に過ぎない。このオブジェクトを起点に、モデルの属性(CustomProperty)と連携させ、ERPやPDMから情報を引き出し、展開図のファイル名に自動付与する。これこそが、我々エンジニアが目指すべき「自動化」の地平である。

コードが複雑になることを恐れるな。真の技術は、複雑さを隠蔽するのではなく、制御下に置くことで生まれるのだ。

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