Alpha Sort Component: natural sorting order

Alpha Sort Component: natural sorting order

progettazionesviluppo
Contributor Contributor
61 Views
2 Replies
Message 1 of 3

Alpha Sort Component: natural sorting order

progettazionesviluppo
Contributor
Contributor

Hello,

I would appreciate if someone already had made the code that would sort the occurences within the browser in natural order (as on the immage bellow).

 

alpha_inventor.jpg

Thanks!

0 Likes
Accepted solutions (1)
62 Views
2 Replies
Replies (2)
Message 2 of 3

Andrii_Humeniuk
Advisor
Advisor
Accepted solution

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

 

Andrii Humeniuk - CAD Coordinator, Autodesk Certified Instructor

LinkedIn | My free Inventor Addin | My Repositories

Did you find this reply helpful ? If so please use the Accept as Solution/Like.

EESignature

0 Likes
Message 3 of 3

progettazionesviluppo
Contributor
Contributor

Slow, but worsk very well.

Thanks!

0 Likes