All we are saying is give API 2.0 a chance
Posted on Fri 12 December 2014 in blog
Doing all this math-related posting has reminded me of something I’ve been meaning to write up:
Maya’s python API 2.0, first introduced in the 2013 version, got off to a rocky start. People complained about missing functions and missing modules. It uses (mostly) the same function and class names as the original OpenMaya Python, which is a recipe for confusion. The documentation is pretty confusing too, since it points at the original C++ docs and leaves it up to you to do much of the translation in your head. However….
One thing that API 2 definitely does right is to eliminate the dreaded MScriptUtil
, with its ugly and confusing interface and all of the opportunities for failures that it includes. I’ve been busy porting over a bunch of geometry utilities to the new API and I’m routinely finding that stuff like this:
def APIVector( iterable, normal=False ):
'''
return an iterable as an OpenMaya MVector
if iterable is an openMaya MVector, returns untouched
'''
if isinstance( iterable, OpenMaya.MVector ):
o_vector = iterable
else:
assert len( iterable ) == 3, "argument to APIVector must have 3 entries"
v_util = OpenMaya.MScriptUtil()
it = list( copy( iterable ) )
v_util.createFromDouble( iterable[0], iterable[1], iterable[2] )
o_vector = OpenMaya.MVector( v_util.asDoublePtr() )
if normal:
o_vector = o_vector.normal ()
return o_vector
Turns into to this:
def APIVector(*iterable, **kwargs):
result = None
try:
result = api2.MVector(iterable)
except ValueError:
result = api2.MVector(iterable[0])
finally:
if kwargs.pop('normal', False):
result.normalize()
return result
In other words, one reasonable line for 4 icky ones.
Plus, the new versions are generally more pythonic - the API 2 version of MVector
, for example supports both dot-access, bracket access, and iteration over the vector components (though, annoyingly, not slicing).
It’s certainly not all perfect. You do have to be very careful about mixing API 1 and API 2 code in the same functions - even though they are both wrapping the same C++ underpinnings they are are mutually incompatible. Some things are still cumbersome — converting strings to MSelectionList items to MObjects to MFNs is still a waste of good brain cells — but it’s a step in the right direction. I’ll post more as I know more.
By the way, I spent several minutes surfing around for a funny image to wrap up on, I even did a meme-generator.com thing with The Most Interesting Man In The World saying something dismissive about MScriptUtil. And then I thought… “What’s the point.”
See? Progress is possible. Or maybe I’m just getting old. In Internet Years I’m already like 7,303.