A lot of the Maya API classes are not iterable, whereas there is no
reason they shouldn't.

It's easy to fix by adding them __len__ and __iter__ methods when
necessary. That's what the datatypes module in pymel does for MVector,
MMatrix and related :

import pymel.api as _api
# patch some Maya api classes that miss __iter__ to make them iterable /
convertible to list
def _patchMVector() :
    def __len__(self):
        """ Number of components in the Maya api Vector, ie 3 """
        return 3
    type.__setattr__(_api.MVector, '__len__', __len__)
    def __iter__(self):
        """ Iterates on all components of a Maya api Vector """
        for i in xrange(len(self)) :
            yield _api.MVector.__getitem__(self, i)
    type.__setattr__(_api.MVector, '__iter__', __iter__)
   
def _patchMMatrix() :
    def __len__(self):
        """ Number of rows in the Maya api Matrix, ie 4.
            Not to be confused with the number of components (16) given
by the size method """
        return 4
    type.__setattr__(_api.MMatrix, '__len__', __len__)      
    def __iter__(self):
        """ Iterates on all 4 rows of a Maya api Matrix """
        for r in xrange(4) :
            yield
Array([_api.MScriptUtil.getDoubleArrayItem(_api.MMatrix.__getitem__(self,
r), c) for c in xrange(4)])
    type.__setattr__(_api.MMatrix, '__iter__', __iter__)

When I last checked, seemed about all Maya API array types need that
checking and possibly patching (has the added advantage of being able to
hide MScriptUtil calls too)

Olivier


chadrik wrote:
> iterating through iterables is crazy talk!
>
> (pass it on: http://code.google.com/p/pymel/wiki/PythonAPI)
>
> -chad
>
>
> On Oct 1, 2009, at 4:26 PM, Paul Molodowitch wrote:
>
>   
>> Some array types are iterable - MDoubleArray, for instance.  And,
>> really, since they've implemented __getitem__, all they really need is
>> __len__ - which would just be a straight wrap of length() - and it
>> would work beautifully...
>>
>> I guess I should just resign myself to always writing c-code in python
>> when it comes to the API... but every so often, I try to do something
>> pythonic, and it works, and I get all excited, and start trying other
>> crazy things!
>>
>> - Paul
>>
>> On Thu, Oct 1, 2009 at 3:41 PM, Chad Vernon <chadver...@gmail.com>  
>> wrote:
>>     
>>> You can't iterate API array types like normal Python iterables.
>>> You have to do:
>>>
>>> for dag in range(dagArray.length()):
>>>     # blah
>>>
>>> On Thu, Oct 1, 2009 at 3:38 PM, barnabas79 <elron...@gmail.com>  
>>> wrote:
>>>       
>>>> The subject says it all...
>>>>
>>>> import maya.OpenMaya as om
>>>> sel = om.MSelectionList()
>>>> sel.append('persp')
>>>> sel.add('persp')
>>>> dag = om.MDagPath()
>>>> comp = om.MObject()
>>>> sel.getDagPath(0, dag, comp)
>>>> dagArray = om.MDagPathArray()
>>>> dagArray.append(dag)
>>>> dagArray.append(dag)
>>>>
>>>> numElements = 0
>>>> for dag in dagArray:
>>>>        numElements += 1
>>>>        if numElements > 10:
>>>>                print "Oh noes!"
>>>>                break
>>>>
>>>>         
>>>       
>
>
> >
>
>   


-- 
Olivier Renouard


--~--~---------~--~----~------------~-------~--~----~
http://groups.google.com/group/python_inside_maya
-~----------~----~----~----~------~----~------~--~---

Reply via email to