Overview
One of the big limitations in VBScript is that there is no easy way to sort a list of items. To put a list in alphabetical order requires you to either use the pre-canned RhinoScript methods, such as SortNumbers
, SortPoints
or SortStrings
, or write a sorting function of your own, like the following bubble sort code:
For i = (UBound(arrNames) - 1) to 0 Step -1
For j= 0 to i
If UCase(arrNames(j)) >
UCase(arrNames(j+1)) Then
strHolder = arrNames(j+1)
arrNames(j+1) = arrNames(j)
arrNames(j) = strHolder
End If
Next
Next
Discussion
There is another option and that is to use the .NET Framework to help. The majority of .NET Framework classes are unusable in VBScript. However, there are a large number of .NET classes that have COM-callable wrappers. T his means these classes include a COM interface enabling them to be accessed from VBScript.
For example, consider the following script:
Set DataList = CreateObject("System.Collections.ArrayList")
DataList.Add "B"
DataList.Add "C"
DataList.Add "E"
DataList.Add "D"
DataList.Add "A"
DataList.Sort()
For Each strItem in DataList
Rhino.Print strItem
Next
Notice that we have created an instance of the .NET Framework class System.Collections.ArrayList
. We then use the Add
method to add five items to the list. To sort the list, all we need to do is call the ArrayList
’s Sort
method.
Now, what if you really wanted those values in descending order? In this case, just call ArrayList
’s Sort
method after calling the Sort
method.
Set DataList = CreateObject("System.Collections.ArrayList")
DataList.Add "B"
DataList.Add "C"
DataList.Add "E"
DataList.Add "D"
DataList.Add "A"
DataList.Sort()
DataList.Reverse()
For Each strItem in DataList
Rhino.Print strItem
Next
Also, have you ever tried to remove an item from a VBScript array? It is not easy. But, with the .NET Framework’s ArrayList
, you just need to call the Remove
method. The following script, an ArrayList
, sorts it, and then removes the entry for D
…
Set DataList = CreateObject("System.Collections.ArrayList")
DataList.Add "B"
DataList.Add "C"
DataList.Add "E"
DataList.Add "D"
DataList.Add "A"
DataList.Sort()
DataList.Remove("D")
For Each strItem in DataList
Rhino.Print strItem
Next
Copying items VBScript arrays and an ArrayList
is just as easy. In the following script, an ArrayList
is used to sort a list of layer names…
LayerNames = Rhino.LayerNames
Set DataList = CreateObject("System.Collections.ArrayList")
For i = 0 To UBound(LayerNames)
DataList.Add LayerNames(i)
Next
DataList.Sort()
For i = 0 To UBound(LayerNames)
LayerNames(i) = DataList(i)
Next
Layer = Rhino.ListBox(LayerNames, "Layer to set current")