板金自動化の深淵:SheetMetalFeatureData2を制し、DXF出力を「一瞬」に変える技術
板金設計の自動化において、多くのエンジニアが陥る罠がある。「とりあえず動くコード」でフィーチャを操作し、結局は手動修正を余儀なくされる……そんな現場を私は数多く見てきた。
SolidWorks API、特に`SheetMetalFeatureData2`オブジェクトを扱う際、単に値を書き込むだけのコードは脆弱だ。本稿では、板厚・Kファクターの制御から、展開DXFのクリーンな出力に至るまで、「なぜそのコードが必要なのか」という設計思想と共に、現場で即戦力となるアーキテクチャを伝授する。
—
1. なぜ「力任せ」のフィーチャ操作は失敗するのか
板金のパラメータを操作する際、多くの初心者は`ISheetMetalFeatureData2`の各プロパティを直接叩きに行く。しかし、SolidWorksのドキュメント構造において、フィーチャは「再構築(Rebuild)」のタイミングと密接に結びついている。
- 更新の同期: `UpdateFeature`を呼ばないまま次の操作を強行すれば、メモリ上の値とジオメトリが乖離する。
- コンテキストの喪失: フィーチャが編集モードにあるのか、選択可能状態なのかを常に監視しなければならない。
我々が目指すべきは、「確実な再構築」と「エラーハンドリングの抽象化」だ。
—
2. 実践:SheetMetal設定と展開DXF出力の極意
このコードは、既存の板金パーツに対し、板厚とKファクターを強制的に適用し、その上でフラットパターンをDXF出力するプロトタイプだ。
‘ 必要なライブラリ参照: SolidWorks 20xx Type Library
Option Explicit
Sub ExportSheetMetalDXF()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim swFeat As SldWorks.Feature
Dim swSheetMetal As SldWorks.SheetMetalFeatureData2
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel.GetType <> swDocPART Then Exit Sub
‘ 板金フィーチャの特定とアクセス
Set swFeat = FindSheetMetalFeature(swModel)
If swFeat Is Nothing Then MsgBox “板金フィーチャが見つかりません”: Exit Sub
Set swSheetMetal = swFeat.GetDefinition
‘ プロパティの変更 (バリデーションを挟むのがプロの流儀)
swSheetMetal.Thickness = 0.002 ‘ 2mmに設定
swSheetMetal.BendAllowanceType = swBendAllowanceKFactor
swSheetMetal.KFactor = 0.45
‘ フィーチャの更新を確実に行う
If Not swFeat.ModifyDefinition(swSheetMetal, swModel, Nothing) Then
MsgBox “フィーチャの更新に失敗しました”
Exit Sub
End If
‘ 展開図出力 (ファイルパスは適宜調整)
Dim exportPath As String
exportPath = “C:\Temp\ExportedPart.dxf”
swModel.ExportFlatPatternView exportPath, 1 ‘ 1: DXF, 0: DWG
Debug.Print “出力成功: ” & exportPath
End Sub
‘ 板金フィーチャを再帰的に探す安全な関数
Private Function FindSheetMetalFeature(model As SldWorks.ModelDoc2) As SldWorks.Feature
Dim swFeat As SldWorks.Feature
Set swFeat = model.FirstFeature
Do While Not swFeat Is Nothing
If swFeat.GetTypeName2 = “SheetMetal” Then
Set FindSheetMetalFeature = swFeat
Exit Function
End If
Set swFeat = swFeat.GetNextFeature
Loop
End Function
—
3. 堅牢な自動化のための3つの鉄則
① 「Feature.ModifyDefinition」の不可逆性を理解せよ
`ModifyDefinition`は強力だが、失敗時のフォールバックが難しい。必ず`swModel.EditRebuild3`を呼び出し、モデルが正常に再構築されたことを確認してから次の処理へ進むこと。再構築エラーを無視した自動化は、ゴミデータ量産機になる。
② ファイルパスのバリデーションは「OSレベル」で行う
VBA内でパスを結合する際、`Dir()`関数を使ってフォルダの存在確認を行うのは基本中の基本だ。ネットワークドライブ上のパスを扱う場合、UNCパスの解決や、権限による書き込み失敗をトラップするエラーハンドラを必ず実装すること。
③ データベース連携時の「整合性」
もしSQL ServerやExcelと連携させる場合、「SolidWorks上のパラメータ」を正(Single Source of Truth)とせよ。DBの値を優先して設計変更を強行すると、意図せぬフィーチャの崩壊(フィーチャの再構築失敗)を招く。
「DBの値を読み込み、SolidWorksに適用し、成功したらDBにステータスを書き戻す」というトランザクション処理を意識してほしい。
—
最後に:エンジニアとしての心得
私がこの仕事を請け負うとき、最も重視するのは「コードの美しさ」ではなく、「壊れた時に誰が直せるか」という保守性だ。今回紹介したコードは、あくまで土台に過ぎない。
あなたの現場の要件に合わせて、フィーチャの有無を確認するだけでなく、板厚テーブル(Gauge Table)を使用している場合にどう挙動するかなど、エッジケースを積み上げていってほしい。
自動化とは、単なる作業の肩代わりではない。「設計の意思決定を、プログラムのロジックとして固定化する行為」なのだ。君たちの書くコードが、明日の設計品質を支える礎になることを期待している。
