Macro to select all features in SOLIDWORKS model by type using SOLIDWORKS API
More 'Goodies'
This VBA macro selects all features in the active model (part, assembly or drawing) using SOLIDWORKS API. For drawings and assemblies features in the children components are also selected.
Use this macro in conjunction with Get Features Type Name to get the required feature type name for filtering.
Configuration
Modify the constants in the beginning of the macro
Const APPEND_SELECTION As Boolean = False 'True to append selection False to clear existing selection Const TYPE_NAME As String = "" 'Refer 'Get Features Type Name' macro to get the type name from the feature
This macro can be useful with other macros which require features to be preselected. It can be also used with SOLIDWORKS batch operations (such as delete or suppress).
Const APPEND_SELECTION As Boolean = False Const TYPE_NAME As String = "3DProfileFeature" '3DSketch Dim swApp As SldWorks.SldWorks Sub main() Set swApp = Application.SldWorks Dim swModel As SldWorks.ModelDoc2 Set swModel = swApp.ActiveDoc If Not swModel Is Nothing Then Dim vFeats As Variant vFeats = GetAllFeaturesByType(swModel, TYPE_NAME) swModel.Extension.MultiSelect2 vFeats, False, Nothing 'If swModel.Extension.MultiSelect2(vFeats, False, Nothing) = UBound(vFeats) + 1 Then 'Err.Raise vbError, "", "Failed to select features" 'End If Else MsgBox "Please open model" End If End Sub Function GetAllFeaturesByType(model As SldWorks.ModelDoc2, typeName As String) As Variant Dim swFeatMgr As SldWorks.FeatureManager Set swFeatMgr = model.FeatureManager Dim swRootFeatNode As SldWorks.TreeControlItem Set swRootFeatNode = swFeatMgr.GetFeatureTreeRootItem2(swFeatMgrPane_e.swFeatMgrPaneBottom) If Not swRootFeatNode Is Nothing Then Dim swFeatsColl As Collection Set swFeatsColl = New Collection TraverseFeatureNode swRootFeatNode, typeName, swFeatsColl Else Err.Raise vbError, "", "Failed to get the root node" End If If swFeatsColl.Count() > 0 Then Dim swFeats() As SldWorks.Feature ReDim swFeats(swFeatsColl.Count() - 1) Dim i As Integer For i = 0 To UBound(swFeats) Set swFeats(i) = swFeatsColl.item(i + 1) Next GetAllFeaturesByType = swFeats Else GetAllFeaturesByType = Empty End If End Function Sub TraverseFeatureNode(featNode As SldWorks.TreeControlItem, typeName As String, feats As Collection) If featNode.ObjectType = swTreeControlItemType_e.swFeatureManagerItem_Feature Then Dim swFeat As SldWorks.Feature Set swFeat = featNode.Object If swFeat.GetTypeName2() = "HistoryFolder" Then Exit Sub End If If LCase(swFeat.GetTypeName2) = LCase(typeName) Then If Not Contains(feats, swFeat) Then 'swFeat.Select2 True, -1 feats.Add swFeat End If End If End If Dim swChildFeatNode As SldWorks.TreeControlItem Set swChildFeatNode = featNode.GetFirstChild() While Not swChildFeatNode Is Nothing TraverseFeatureNode swChildFeatNode, typeName, feats Set swChildFeatNode = swChildFeatNode.GetNext Wend End Sub Function Contains(coll As Collection, item As Object) As Boolean Dim i As Integer For i = 1 To coll.Count If coll.item(i) Is item Then Contains = True Exit Function End If Next Contains = False End Function