板金設計の「聖域」を自動化する:SheetMetalFeatureData2の深淵とDXF出力の最適解
SolidWorks APIを操る多くのエンジニアは、`ISheetMetalFeatureData2`というインターフェースを単なる「プロパティの入れ物」だと勘違いしている。だが、板金設計の自動化を極めるのであれば、このインターフェースは「モデルの物理的な制約を定義する極めて機密性の高いゲートウェイ」であると認識しなければならない。
今日は、板金パラメータを動的に操作し、メモリリークを許さない堅牢なコードでDXFを吐き出す、実戦レベルのアーキテクチャを伝授する。
—
1. 物理制約をコードで支配する:SheetMetalFeatureData2の正体
板金フィーチャは、フィーチャツリー上の単なるノードではない。それはモデルの「曲げ」という物理挙動を統括するオブジェクトだ。
多くの者が陥る罠は、`GetDefinition`と`ModifyDefinition`の間に生じる「コンテキストの不整合」である。この間、SolidWorksの内部処理はサスペンドされ、メモリ領域がロックされる。ここでの最適化は、単にコードを短くすることではなく、いかに最短距離でこの領域を解放し、再構築をトリガーするかにかかっている。
実践:板厚・Kファクターの動的適用
‘ 伝説的なエンジニアは、常にオブジェクトの生存期間を意識する
Public Sub ApplySheetMetalParams(swModel As SldWorks.ModelDoc2, thickness As Double, kFactor As Double)
Dim swFeat As SldWorks.Feature
Dim swSheetMetal As SldWorks.SheetMetalFeatureData2
‘ 板金フィーチャを探索(深さ優先探索の最適化)
Set swFeat = FindSheetMetalFeature(swModel)
If swFeat Is Nothing Then Exit Sub
‘ Definitionの取得
Set swSheetMetal = swFeat.GetDefinition
‘ パラメータの注入
swSheetMetal.Thickness = thickness
swSheetMetal.BendAllowanceType = swBendAllowance_KFactor
swSheetMetal.KFactor = kFactor
‘ 最重要:変更のコミット(ModifyDefinitionこそが最大のボトルネック)
If Not swFeat.ModifyDefinition(swSheetMetal, swModel, Nothing) Then
Err.Raise 999, “SheetMetal”, “フィーチャの更新に失敗しました。ジオメトリの矛盾を確認してください。”
End If
‘ オブジェクトの明示的解放(VBAのガベージコレクタに頼らない)
Set swSheetMetal = Nothing
Set swFeat = Nothing
End Sub
—
2. フラットパターン出力の「見えないコスト」
DXF出力において最も見落とされがちなのは、`ExportToDWG2`メソッドが実行される際の「暗黙的な再構築」だ。モデルが複雑であればあるほど、出力の瞬間にメモリ使用量がスパイクする。
これを防ぐ唯一の手段は、「出力対象のフラットパターンフィーチャを明示的にアクティブ化し、不要な計算を抑制すること」である。
DXF自動エクスポートの極意
Public Sub ExportFlatPatternDXF(swModel As SldWorks.ModelDoc2, filePath As String)
Dim swPart As SldWorks.PartDoc
Set swPart = swModel
‘ フラットパターンの強制更新。これを行わずにエクスポートするのは自殺行為だ。
swPart.ForceRebuild3 False
‘ DXF出力オプション:レガシーシステムとの連携では常に特定のバージョンを強制する
‘ swExportToDWG_ExportSheetMetalOutputOnly を指定し、不要なスケッチデータを含めないことが軽量化の鍵
Dim status As Boolean
status = swModel.ExportToDWG2(filePath, swModel.GetPathName, _
swExportToDWG_e.swExportToDWG_ExportSheetMetalOutputOnly, _
True, Nothing, False, False, 0, Nothing)
If Not status Then
Debug.Print “DXF生成に失敗。ファイルパスの権限またはモデルの破損を確認せよ。”
End If
End Sub
—
3. シニアエンジニアが守るべき「3つの鉄則」
大規模システムでこの自動化を実装する際、以下の3点は「コードの品質」ではなく「システムの存続」に関わる。
1. Windows APIによるプロセス監視: SolidWorksがバックグラウンドで「死んでいないか」を判断するため、`GetWindowThreadProcessId`等を用いて、ハングアップしたプロセスを強制終了するウォッチドッグ・タイマーを別スレッド(または別プロセス)で走らせろ。
2. メモリの明示的解放: `Set obj = Nothing` を疎かにするな。特に大量のパーツをバッチ処理する場合、VBAの解放の遅延は物理メモリの枯渇を招く。
3. エラーハンドリングの抽象化: 失敗した原因が「ジオメトリの計算不能(板金曲げ半径の干渉)」なのか「ファイルシステムの問題」なのかを明確に分け、ログに書き出せ。`On Error Resume Next`で隠蔽するのは、エンジニアの恥だ。
—
結びに代えて
自動化とは、単に工数を削減する作業ではない。それは、人間が手作業で行っていた「曖昧な判断」を、数学的な「厳格なロジック」へと昇華させるプロセスだ。
板金設計の現場は、コンマ数ミリの精度が全てを決める。君たちが書くコードもまた、その精度を担保するものでなければならない。このスクリプトが、君たちの開発環境において、安定した「設計のエンジン」となることを期待する。
何か疑問があれば、APIのドキュメントの行間を読め。それでも解決しなければ、またここへ戻ってくるといい。
