Also:

int numVertices (MStatus *ReturnStatus=NULL) const

This function says the MStatus argument is a "*" pointer. I believe
there is not a single case in the Maya API where Python can pass a
object to a argument declared as a pointer. All MStatus and MString
arugments are declared as pointers so you can not use them with
Python. You can pass a regular Python string in the place of a MString
though. So that kind of contradicts what I said, but the point is you
cant use that they say you can use. Also if you attempt to pass
generic bool, double, floats and other types to a argument and it
fails it is probably a documentation error. I have found that
sometimes using MScriptUtil to declare a pointer of that type will
allow me to use the function. Even if that function does not declare
that the argument is a reference.

RyanT
Technical Artist
www.rtrowbridge.com/blog
Naughty Dog Inc

On Feb 15, 6:27 pm, Jason Osipa <[email protected]> wrote:
> "Why do my eyes hurt?"
>
> "Because you've never used them before"
>
> I'm feeling a little THAT right now.  Thank you a 1000 times over.
>
> On Sun, Feb 15, 2009 at 6:19 PM, Dean Edmonds <[email protected]>wrote:
>
>
>
>
>
> > On Sun, Feb 15, 2009 at 14:16, jasonosipa <[email protected]> wrote:
>
> > > What do const, &, and * each mean?
>
> > > When you look at documentation for an object, each argument can have a
> > > lot of different markup, and I'm not confident with guesses at what
> > > those mean, so I'll just ask:
>
> > > What do const, &, and * each mean?  What does "blank" mean, where
> > > there is no const at the head of the line, and no * or & ?  How about
> > > the stuff after the = in the argument?  Is that just a "recommended
> > > default"?  Does const only show up for things that are MObjects?
>
> > As Tim explained, '&' and '*' are slightly different ways of passing
> > the value itself. If neither of those is present than what gets passed
> > is a copy of the value.
>
> > In terms of translating all that markup into Pythonic terms, you first
> > have to differentiate between simple types, like integers and floats,
> > and object types.
>
> > In Python, if I pass an object to a function the function can directly
> > manipulate it and the caller will be able to see the results of that
> > manipulation. For example:
>
> >    class myObj:
> >        someValue = 12
>
> >    def changeObj(theObj):
> >        theObj.someValue = 15
>
> >    testObj = myObj()
>
> >    print testObj.someValue
> >    12
>
> >    changeObj(testObj)
> >    print testObj.someValue
> >    15
>
> > The same is *not* true when passing a simple value to a function:
>
> >    def changeValue(theValue):
> >        theValue = 15
>
> >    someValue = 12
> >    print someValue
> >    12
>
> >    changeValue(someValue)
> >    print someValue
> >    12
>
> > In C++ there is no such differentiation between objects and simple
> > values. If a parameter is passed by pointer ('*') or reference ('&')
> > then the function can modify it such that the caller will see the
> > changes. If neither of those markers is present then the function is
> > passed a copy of the value and any changes that the function makes to
> > that copy will not be visible to the caller.
>
> > In addition, if a parameter is tagged as 'const' that means that the
> > method is promising not modify it, even it has been passed by pointer
> > or reference.
>
> > So, if you are calling an API method from Python and one of its
> > parameters takes an object type, such as MDagPath, the following
> > markups mean that the caller's copy of the object will not be changed
> > by the method:
>
> >    MDagPath
> >    const MDagPath*
> >    const MDagPath&
>
> > while the following mean that the caller's copy of the object can be
> > changed by the method:
>
> >    MDagPath*
> >    MDagPath&
>
> > In terms of the syntax you use in Python, you always just pass the
> > object without doing anything special. E.g:
>
> >    somePath = om.MDagPath()
> >    om.MDagPath.getAPathTo(someNode, somePath)
>
> > If the markup indicates that the method can change the object that you
> > pass to it and you don't want it to change your copy of the object,
> > then you would need to pass the method a separate copy of the object:.
> > In the example below 'tempPath' will be modified by the call to
> > getAPathTo() but 'pathToKeep' will remain unchanged:
>
> >    tempPath = om.MDagPath(pathToKeep)
> >    om.MDagPath.getAPathTo(someNode, tempPath)
>
> > For simple types we run into a bit of a problem because Python does
> > not provide any way for a function to modify a simple type which is
> > passed to it such that the caller sees the change. For example,
> > MFnMesh has a getUV() method which is declared as follows:
>
> >    MStatus getUV (int uvId, float &u, float &v, const MString
> > *uvSet=NULL) const;
>
> > The intent is that you pass the id of the UV you want in the 'uvId'
> > parameter and get back its U and V coordinates in the 'u' and 'v'
> > parameters. Unfortunately there is no direct way to do that in Python,
> > so the Maya API provides the MScriptUtil class to get around that.
> > E.g:
>
> >    uptr = om.MScriptUtil().asFloatPtr()
> >    vptr = om.MScriptUtil().asFloatPtr()
>
> >    meshFn.getUV(13, uptr, vptr)
>
> >    u = om.MScriptUtil.getFloat(uptr)
> >    v = om.MScriptUtil.getFloat(vptr)
>
> > Finally, if 'const' appears at the end of the method declaration that
> > means that the method promises not to change any of the object's
> > member variables. For example, MFnMesh's numVertices() method is
> > declared as follows:
>
> >    int numVertices (MStatus *ReturnStatus=NULL) const
>
> > This means that if you call numVertices() you can be assured that the
> > MFnMesh object will not be changed by call.
>
> > --
> > -deane
>
> --
> Jason Osipa, Manager
> Osipa Entertainment, LLCwww.osipaentertainment.com
> 415.374.9651
--~--~---------~--~----~------------~-------~--~----~
Yours,
Maya-Python Club Team.
-~----------~----~----~----~------~----~------~--~---

Reply via email to