Well ya, but in your code it wasn't sorting at all. What was it trying
to do actually?

>From a python interp you can do:
>>> help([].sort)
sort(...)
    L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;
    cmp(x, y) -> -1, 0, 1



On Fri, Aug 24, 2012 at 10:21 AM, Nicolas Combecave
<[email protected]> wrote:
> Actually, looking at the python doc for the list.sort() method, it doesn't
> mention optional arguments...
> http://docs.python.org/tutorial/datastructures.html
>
> I've had to search in here to find the info:
> http://docs.python.org/library/stdtypes.html#mutable-sequence-types
>
>
> 2012/8/24 Nicolas Combecave <[email protected]>
>>
>> Damn, your version is QUITE shorter!
>>
>> As my python is very weak, I tried to do a conversion of how I'd do it in
>> mel!
>> I sure do need to deepen my python seriously...
>> Although I don't fully understand the lambda usage, I sure will look into
>> it right now ^^
>>
>> So, about the (lame and lenghty) function I sent before, that was doing
>> nothing, it's because in the process of cleaning for pasting into gmail, I
>> forgot the sort command...
>>
>> It should have been like this...
>>
>> def sortByHierarchy(dagList):
>>     # we'll use '@' as it can't never be found in maya node names
>>
>>     sortedByHierarchy = []
>>
>>     for elem in dagList:
>>         depth = elem.count('|')
>>         sortedByHierarchy.append (str(depth) + "@" + elem)
>>
>>     sortedByHierarchy.sort()
>>
>>     for i in range(sortedByHierarchy.__len__()):
>>         sortedByHierarchy[i] = sortedByHierarchy[i].split('@')[1]
>>
>>     return sortedByHierarchy
>>
>>
>> The idea was to prefix each long name with it's depth info, sort that, and
>> strip back this depth info to return a proper list...
>>
>> Nicolas
>>
>>
>>
>> 2012/8/24 Justin Israel <[email protected]>
>>>
>>> Maybe I am missing something, but it doesn't seem like the
>>> sortByHierarchy() function is doing anything.
>>> It takes in a list, then loops over it, creating a new list with the
>>> depth count + @ + name. Then it just loops back over the new list, and
>>> replaces it with the name again. But no sorting is happening at all.
>>>
>>> If that function is supposed to simply sort by the depth value, couldn't
>>> you just do this?
>>>
>>>     dagList.sort(key=lambda x: x.count('|'))
>>>     # dagList.sort(key=lambda x: x.count('|'), reverse=True)
>>>
>>> What is the logic of concatenating the depth + @ + name?
>>>
>>>
>>> On Fri, Aug 24, 2012 at 5:54 AM, Nicolas Combecave
>>> <[email protected]> wrote:
>>>>
>>>> I've tested this and it seems to work as you need:
>>>>
>>>> import maya.cmds as cmds
>>>> import random
>>>>
>>>> # CREATING RANDOM LOCATORS AND JOINTS TO TEST SNAPPING HIERARCHIES
>>>> max = 10
>>>> prevLoc = None
>>>> prevJoint = None
>>>>
>>>> for i in range(max):
>>>>
>>>>     loc = cmds.spaceLocator(name = "Gizmo_"+str(i))
>>>>     cmds.xform(worldSpace = True, t = [random.random()*10,
>>>> random.random()*10, random.random()*10])
>>>>     cmds.select(cl = True)
>>>>     joint = cmds.joint(name = "joint_"+str(i), position =
>>>> [random.random()*10, random.random()*10, random.random()*10])
>>>>
>>>>     if prevLoc != None:
>>>>         cmds.parent (loc[0], prevLoc[0])
>>>>     if prevJoint != None:
>>>>         cmds.parent (joint, prevJoint)
>>>>
>>>>     prevLoc = loc
>>>>     prevJoint = joint
>>>>
>>>> # HERE YOU CAN REPARENT SOME LOCATORS AND JOINTS IN THE SAME WAY IN
>>>> ORDER TO TEST HIERARCHIES WITH BRANCHES
>>>>
>>>> # NOW SNAPPING JOINTS HIEARCHY TO LOCATORS HIERARCHY
>>>> # WE ASSUME YOU DON'T HAVE DUPLICATE SHORT NAMES IN JOINTS HIERARCHY
>>>> liste = cmds.ls('Gizmo_*', type = "transform", dag = True, l = True)
>>>>
>>>> for gizmo in liste:
>>>>     gizmo_id = gizmo.split('|')[-1].split('_')[-1]
>>>>     joint_id = "joint_" + gizmo_id
>>>>     gizmoPos = cmds.xform(gizmo, q = True, worldSpace = True, t = True)
>>>>     cmds.xform(joint_id, worldSpace= True, absolute = True, t =
>>>> (gizmoPos[0],gizmoPos[1],gizmoPos[2]))
>>>>
>>>>
>>>>
>>>> Anyway, it's always a good thing to have a little utility function to
>>>> order list by hierarchy
>>>> Here is one quickly hacked:
>>>>
>>>> def sortByHierarchy(dagList):
>>>>     # we'll use '@' as it can't never be found in maya node names
>>>>
>>>>     sortedByHierarchy = []
>>>>
>>>>     for elem in dagList:
>>>>         depth = elem.count('|')
>>>>         sortedByHierarchy.append (str(depth) + "@" + elem)
>>>>     for i in range(sortedByHierarchy.__len__()):
>>>>         sortedByHierarchy[i] = sortedByHierarchy[i].split('@')[1]
>>>>
>>>>     return sortedByHierarchy
>>>>
>>>> print sortByHierarchy(liste)
>>>>
>>>> Nicolas
>>>>
>>>> --
>>>> view archives: http://groups.google.com/group/python_inside_maya
>>>> change your subscription settings:
>>>> http://groups.google.com/group/python_inside_maya/subscribe
>>>
>>>
>>> --
>>> view archives: http://groups.google.com/group/python_inside_maya
>>> change your subscription settings:
>>> http://groups.google.com/group/python_inside_maya/subscribe
>>
>>
>
> --
> view archives: http://groups.google.com/group/python_inside_maya
> change your subscription settings:
> http://groups.google.com/group/python_inside_maya/subscribe

-- 
view archives: http://groups.google.com/group/python_inside_maya
change your subscription settings: 
http://groups.google.com/group/python_inside_maya/subscribe

Reply via email to