Hi @progettazionesviluppo .
Inventor has a built-in Alpha Sort Components function, but I personally don't know of a separate method for this function in the API. Therefore, I recommend you to use the following iLogic rule on this topic:
Public Class ThisRule
Sub Main()
Dim doc As AssemblyDocument = ThisDoc.Document
Dim topNode As BrowserNode = doc.BrowserPanes.Item("Model").TopNode
Dim nodesList As List(Of BrowserNode) = New List(Of BrowserNode)()
Dim orginNode As BrowserNode = Nothing
For Each node As BrowserNode In topNode.BrowserNodes
If (node.BrowserNodeDefinition.Label.Equals("Origin")) Then
orginNode = node
End If
If (node.NativeObject IsNot Nothing) Then
If (node.NativeObject.Type = ObjectTypeEnum.kComponentOccurrenceObject) Then
nodesList.Add(node)
End If
End If
Next
Dim nodeArray() = nodesList.ToArray()
Array.Sort(nodeArray, New AlphanumReverseComparator())
Dim transAction As Transaction = ThisApplication.TransactionManager.StartTransaction(ThisDoc.Document, "Alphanum sort")
For Each node As BrowserNode In nodeArray
doc.BrowserPanes.Item("Model").Reorder(orginNode, False, node)
Next
transAction.End()
End Sub
End Class
Public Class AlphanumReverseComparator
Implements IComparer
' Taken from:
' https://www.dotnetperls.com/alphanumeric-sorting-vbnet
Public Function Compare(ByVal x As Object,
ByVal y As Object) As Integer Implements IComparer.Compare
' [1] Validate the arguments.
Dim s1 As String = y.BrowserNodeDefinition.Label
If s1 = Nothing Then
Return 0
End If
Dim s2 As String = x.BrowserNodeDefinition.Label
If s2 = Nothing Then
Return 0
End If
Dim len1 As Integer = s1.Length
Dim len2 As Integer = s2.Length
Dim marker1 As Integer = 0
Dim marker2 As Integer = 0
' [2] Loop over both Strings.
While marker1 < len1 And marker2 < len2
' [3] Get Chars.
Dim ch1 As Char = s1(marker1)
Dim ch2 As Char = s2(marker2)
Dim space1(len1) As Char
Dim loc1 As Integer = 0
Dim space2(len2) As Char
Dim loc2 As Integer = 0
' [4] Collect digits for String one.
Do
space1(loc1) = ch1
loc1 += 1
marker1 += 1
If marker1 < len1 Then
ch1 = s1(marker1)
Else
Exit Do
End If
Loop While Char.IsDigit(ch1) = Char.IsDigit(space1(0))
' [5] Collect digits for String two.
Do
space2(loc2) = ch2
loc2 += 1
marker2 += 1
If marker2 < len2 Then
ch2 = s2(marker2)
Else
Exit Do
End If
Loop While Char.IsDigit(ch2) = Char.IsDigit(space2(0))
' [6] Convert to Strings.
Dim str1 = New String(space1)
Dim str2 = New String(space2)
' [7] Parse Strings into Integers.
Dim result As Integer
If Char.IsDigit(space1(0)) And Char.IsDigit(space2(0)) Then
Dim thisNumericChunk = Integer.Parse(str1)
Dim thatNumericChunk = Integer.Parse(str2)
result = thisNumericChunk.CompareTo(thatNumericChunk)
Else
result = str1.CompareTo(str2)
End If
' [8] Return result if not equal.
If Not result = 0 Then
Return result
End If
End While
' [9] Compare lengths.
Return len1 - len2
End Function
End Class