Notifications
Clear all

[Closed] help with array orders

Hi all, wondering if anyone could lend a hand?

I need to sort the items within an array based upon there name…ex: box01, box02, box03

Right now I have 300 or so items, they were not created in sequence but they were selected in sequence and renamed so that their names would follow the order they were selected. Now when I either do (selection as array) or $box* as array for instance it still lists them within the array based on the order they were created and not the order in which they’re named or selected. I’ve been looking around for reference on how to rearrange this data into the order I need it but I’m comming up dry.

Any help would be much appreciated. Thanks.
-mad

5 Replies
 eek

sort <array>

Sorts the elements of the array into ascending order. All the elements must be comparable.

eek

Thanks for the quick reply eek,

I’ve tried using sort but it dosn’t sort the items by their name, it still lists them in the order in which they were created.

Say I have 5 items I’m trying to sort and they’re all named sequentially temp_1-5 my code looks something like this


   myarray = ($temp_* as array)
   print myarray
   

Now they were named in order from 1 to 5, but they were created in the order of 1,3,5,2,4
so when I print the array it gives me:

$Box:temp_1 @…
$Box:temp_3 @…
$Box:temp_5 @…
$Box:temp_2 @…
$Box:temp_4 @…
OK

when I append the code so that it reads


  myarray = ($temp_* as array)
  sort myarray
    print myarray
  

it prints the same result as before.

I’m a complete novice at this, this is only my second day playing around with maxscript at all, so I’m sure there is either something I’m not doing right or some simple solution that I don’t yet know about. Thanks again for your help.

1 Reply
(@bobo)
Joined: 11 months ago

Posts: 0

Sort will only work on values that can be compared (numbers, strings).

One quick way to sort an array of nodes (as long as all of them have UNIQUE names!) would be

  theNames = for o in $temp_* collect o.name
   sort theNames
   theSortedArray = for n in theNames collect getNodeByName n
   

or in a single line,

  theSortedArray = for n in ( sort (for o in $temp_* collect o.name)) collect getNodeByName n

If there are nodes with identical names, you would have to use the QSORT method with indexed sort. Since this method is more advanced, I will not go into details – you can check out the MXS Reference if you want.

Hey, here is an alternative version using qsort like Bobo suggested:

allobjs = $ as array --array of selected objects
fn Namesort obj1 obj2 = stricmp obj1.name obj2.name --function to sort names
qsort allobjs Namesort --sort array using above function
print allobjs --print result

cheers,
CML

Thanks a bunch Bobo, you da’ man. I’ll give this a try when I get home from work.