【SolidWorks VBA極限活用】板金フランジ自動最適化:SheetMetalFeatureData2の真髄と一括制御
筐体設計の現場において、板金部品のモデリングは定型作業の連続だ。しかし、量産前の設計変更や、強度・組立性を考慮した微調整(折り曲げ角度、フランジ長さ、リリーフタイプの変更)を何十箇所ものエッジフランジに対して手動で行うのは、エンジニアの貴重な時間をドブに捨てるようなものである。
「展開図の整合性を保ったまま、一瞬で全フランジのパラメータを最適化したい」
この現場の切実な要求に応えるため、今回はSolidWorks APIの深部、`SheetMetalFeatureData2` と `GetEdgeFlangeData` を駆使した板金パラメータの一括最適化マクロの設計思想と実装コードを伝授する。
単なるAPIのリファレンス引き写しではない。メモリ管理、オブジェクトのライフサイクル、そして実務で絶対に踏み抜く「地雷」を回避するための堅牢なアーキテクチャを解説しよう。
—
1. 現場のエンジニアが陥る「非効率な罠」と解決アプローチ
素人が書いた板金自動化マクロは、大抵こうなる。
- Featureを闇雲にSelectし、UIを介してパラメータを叩く(画面がチラつき、処理が致命的に遅い)。
- `ModifyDefinition` の前後でドキュメントの再構築(Rebuild)を適切に行わず、ジオメトリが崩壊する。
- 取得したフィーチャーデータオブジェクト(Data Object)の解放を怠り、メモリリークやSolidWorks自体のフリーズを引き起こす。
プロフェッショナルな設計方針
1. 画面描画の完全抑制 (`Visible = False` または `UserControl = False` 相当の操作)
API内部でフィーチャーデータを操作し、最後に一度だけ `Extension.Rebuild` をかける。
2. フィーチャーデータの適切なライフサイクル管理
`GetDefinition` で取得したデータオブジェクトは、ポインタの参照を確実に解放する。
3. 安全な型キャストとエラーハンドリング
対象が本当に「エッジフランジ」であるかを事前に判定し、意図しないフィーチャーへのアクセスでマクロがクラッシュするのを防ぐ。
—
2. コアAPIの理解:`SheetMetalFeatureData2` と `EdgeFlangeFeatureData`
板金部品のルートには、ベースとなる板金フィーチャーが存在する。そこから派生するエッジフランジなどのサブフィーチャーのデータを取得・変更するには、以下のステップを踏む必要がある。
1. パートドキュメント (`ModelDoc2`) からフィーチャー走査 (`Feature` オブジェクト) を行う。
2. フィーチャーのタイプが板金関連(`IsSheetMetal` 等)であることを確認する。
3. `Feature.GetDefinition` を呼び出し、専用のデータオブジェクト(例: `EdgeFlangeFeatureData`)を取得する。
4. データのプロパティ(角度、長さ、リリーフタイプなど)を書き換える。
5. `Feature.ModifyDefinition` でモデルに変更をコミットする。
—
3. 実務仕様プロダクションコード
以下のコードは、アクティブな板金パーツ内のすべてのアエッジフランジを走査し、「角度を90.0度」「長さを25.0mm」「リリーフタイプをカスタム(または指定値)」に一括で強制最適化するVBAモジュールである。
エラーハンドリングと、実務で必須となるリビルド処理を網羅している。
Option Explicit
‘ =================================================================================
‘ 模块名: ModSheetMetalOptimizer
‘ テーマ: エッジフランジパラメータの一括最適化
‘ 備考: SolidWorks 2022以降推奨
‘ =================================================================================
Sub OptimizeEdgeFlanges_Click()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim swFeat As SldWorks.Feature
Dim swSubFeat As SldWorks.Feature
‘ 初期化
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ ドキュメントの存在・タイプチェック
If swModel Is Nothing Then
MsgBox “ドキュメントが開かれていません。”, vbCritical, “エラー”
Exit Sub
End If
If swModel.GetType <> swDocPART Then
MsgBox “アクティブなドキュメントはパーツではありません。”, vbCritical, “エラー”
Exit Sub
End If
‘ パフォーマンス向上のための画面描画停止(必要に応じて)
swModel.FeatureManager.EnableUpdate = False
On Error GoTo ErrorHandler
Set swPart = swModel
Set swFeat = swModel.FirstFeature
Dim processedCount As Long
processedCount = 0
‘ フィーチャーツリーの走査
Do While Not swFeat Is Nothing
‘ フィーチャー種別が “EdgeFlange” であるかを判定
If swFeat.GetTypeName2 = “EdgeFlange” Then
If ProcessEdgeFlange(swFeat) Then
processedCount = processedCount + 1
End If
End If
‘ サブフィーチャー(コンテキスト内など)の走査も考慮する場合の処理
‘ (今回はメインツリーの走査をベースに記述)
Set swFeat = swFeat.GetNextFeature
Loop
‘ 変更を反映するための強制リビルド
swModel.Extension.Rebuild swRebuildAll
‘ 描画再開
swModel.FeatureManager.EnableUpdate = True
MsgBox “最適化完了: ” & processedCount & ” 件のエッジフランジを更新しました。”, vbInformation, “板金自動化”
Exit Sub
ErrorHandler:
swModel.FeatureManager.EnableUpdate = True
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”
End Sub
‘ ——————————————————————————–
‘ 個別エッジフランジのパラメータ書換え関数
‘ ——————————————————————————–
Private Function ProcessEdgeFlange(ByRef swFeat As SldWorks.Feature) As Boolean
Dim swEdgeFlangeData As SldWorks.EdgeFlangeFeatureData
Dim bRet As Boolean
ProcessEdgeFlange = False
‘ フィーチャー定義の取得
Set swEdgeFlangeData = swFeat.GetDefinition
If swEdgeFlangeData Is Nothing Then Exit Function
‘ 編集モードのロック解除(アクセス権の獲得)
bRet = swEdgeFlangeData.AccessSelections(swModel, Nothing)
If Not bRet Then
‘ アクセス失敗時は解放して終了
Exit Function
End If
‘ — 【最適化パラメータの設定】 —
‘ 1. フランジ角度を 90度 (Radiansに注意: 90.0 3.14159265358979 / 180 でも良いがAPIは度数を受け付ける場合が多い。要件に応じて確認)
‘ ※SolidWorks APIの角度指定はラジアンが基本となるプロパティが多いので注意
swEdgeFlangeData.Angle = 90.0 (Atn(1) 4) / 180#
‘ 2. フランジ長さの設定 (例: 25mm = 0.025m) ※APIは内部単位系(メートル)
swEdgeFlangeData.Length = 0.025
‘ 3. リリーフタイプの変更 (例: 独自リリーフや標準リリーフの設定)
‘ swSheetMetalReliefTypes_e の列挙体を使用
‘ 例: swSheetMetalReliefType_Rectangular (長方形) など
‘ swEdgeFlangeData.ReliefType = swSheetMetalReliefType_Rectangular
‘ swEdgeFlangeData.ReliefDepth = 0.001 ‘ 1mm
‘ swEdgeFlangeData.ReliefWidth = 0.001 ‘ 1mm
‘ ———————————-
‘ 定義の修正をコミット
bRet = swFeat.ModifyDefinition(swEdgeFlangeData, swModel, Nothing)
If bRet Then
ProcessEdgeFlange = True
Else
‘ 失敗時は変更を破棄
swEdgeFlangeData.ReleaseSelectionAccess
End If
Set swEdgeFlangeData = Nothing
End Function
—
4. チーフアーキテクトが教える実装上の急所(落とし穴)
実務でこのコードを適用する際、以下の2点に直面して頭を抱える開発者が後を絶たない。事前にこの知見を押さえておいてほしい。
① 単位系(SI単位系:メートル法)の罠
SolidWorks APIの数値入力は、画面上の単位(mmやinch)に関わらず、すべて内部単位(メートル・ラジアン)で行われる。
- `25mm` を指定したいなら `0.025` と記述しなければならない。
- 角度指定も度数法ではなくラジアン (`Degrees PI / 180`) で渡す必要がある。ここを忘れると、フランジが地球一周するような巨大な値になったり、逆に目に見えないほど小さくなったりしてフィーチャーが破綻する。
② `AccessSelections` と `ModifyDefinition` の不可分な関係
APIでフィーチャーデータをイジる際、`GetDefinition` の後に必ず `AccessSelections` を挟む必要がある。これは「データベースのトランザクションロック」のようなものであり、これを忘れると `ModifyDefinition` が容赦なく失敗(Falseを返却)する。
さらに、処理が途中でコケた場合でもメモリ上にロックが残らないよう、エラーハンドリング内や処理の終端で確実にオブジェクトの参照を解放(`Set … = Nothing`)する規律が求められる。
—
5. データベース・外部連携への発展(生産性の極限へ)
このマクロを単なる「固定値の一括変更」で終わらせてはもったいない。
実務の現場では、Excelの部品表(BOM)やERP/PDMシステムからのJSON/CSVデータを読み込み、品番ごとにフランジの長さや角度を動的にアサインする「完全自動化パイプライン」へと昇華させるべきだ。
- `FileSystemObject` を用いて、ネットワークドライブ上のCSVを非同期読み込み。
- パーツのコンフィギュレーション(Configuration)ごとに異なる板金パラメータをテーブル駆動で流し込む。
ここまで作り込めば、数千品種を抱える筐体メーカーにおいて、設計変更のリードタイムを従来の「1/100」に短縮することが可能となる。
属人化しがちな板金モデリングの定型作業をコードでねじ伏せろ。あなたの開発現場の自動化成功を祈る。
