Skip to main content

Select component in feature tree using its name via SOLIDWORKS API

Multi-level tree of components{ width=200 }

This example demonstrates the most performance efficient way to select a component on any level of the assembly by its full name using SOLIDWORKS API.

Name of the component is defined as a path where each level is separated by / symbol. Component instance id is specified with a - symbol (e.g. FirstLevelComp-1/SecondLevelComp-2/TargetComp-1)

Component name can be found in the following dialog:

Component name in properties dialog{ width=250 }

Refer Get Component By Name example for macro to retrieve the pointer to the component without the selection.

Dim swApp As SldWorks.SldWorks

Sub main()

Set swApp = Application.SldWorks

Dim swAssy As SldWorks.AssemblyDoc

Set swAssy = swApp.ActiveDoc

Debug.Print SelectComponentByName(swAssy, "E-1/F^E-1/I-1")

End Sub

Function SelectComponentByName(assy As SldWorks.AssemblyDoc, name As String) As Boolean

Dim rootName As String
rootName = assy.GetTitle()

Dim extPos As Long
extPos = InStr(rootName, ".")
If extPos <> -1 Then
rootName = Left(rootName, extPos - 1)
End If

Dim selByIdStr As String
selByIdStr = ConvertToSelectByIDString(rootName, name)

SelectComponentByName = assy.Extension.SelectByID2(selByIdStr, "COMPONENT", 0, 0, 0, False, -1, Nothing, swSelectOption_e.swSelectOptionDefault)

End Function

Function ConvertToSelectByIDString(rootName As String, name As String) As String

Dim vNameParts As Variant
vNameParts = Split(name, "/")

Dim prevParentName As String
prevParentName = rootName

Dim selByIdStr As String

Dim i As Integer

For i = 0 To UBound(vNameParts)

Dim curPartName As String
curPartName = vNameParts(i)

If selByIdStr <> "" Then
selByIdStr = selByIdStr & "/"
End If

selByIdStr = selByIdStr & curPartName & "@" & prevParentName

prevParentName = Left(curPartName, InStrRev(curPartName, "-") - 1)

Next

ConvertToSelectByIDString = selByIdStr

End Function