关于 Maya Python API 中的简单类型的一些问题

我们知道,Maya 的Python API主要是对于C++的API上的用SWIG来做的一层封装,那么,其API的本质和参数基本上都是和C++的一致的。

很多Maya的API方法中都还有一个指针或者应用参数,返回值也是如此,那么对应到Python API中,我们该怎么来处理呢?

我们知道在Python中,class 类型是通过应用来传值的,但是一些简单类型,比如 int, float 等是直接传值的。这样就使得一些C++方法中参数如果含有简单类型的指针或者引用就比较复杂。我也碰到过一些案例关于这个的误操作,让我们来看一下下面的一个示例:

问题:

有一个用户想调用如下方法对应的的Python方法,

MStatus MFnSkinCluster::getWeights ( const MDagPath & path, const MObject & components, MDoubleArray & weights, unsigned int & influenceCount )

其中一段调用的Python代码简单如下

mFnSkinCluster = OpenMayaAnim.MFnSkinCluster(mObj_cluster)

mDoubleArray_weights = OpenMaya.MDoubleArray()

influenceCount = 0

mItGeo_mesh = OpenMaya.MItGeometry(mObj_mesh)

while( not mItGeo_mesh.isDone()):

  mObj_vertex = mItGeo_mesh.currentItem()

  weightValue = mFnSkinCluster.getWeights(mDagPath_mesh,mObj_vertex,mDoubleArray_weights,influenceCount)

  mItGeo_mesh.next()

从C++的角度看起来似乎没有什么问题,但是他总是会得到一个错误,说找不到该函数对应的重载函数,参数数目或者类型错误。

解析:

其实,这个是因为在C++中,最后一个参数是个 unsigned int& ,是个对简单类型unsigned int的引用类型,是用来返回数据的。因为Python中默认对于简单类型会采取值传递,所以在生成对应的Python函数时,会把这个参数转换成一个对于unsigned int 类型的一个指针,这样当户用调用传入的是还是一个值类型的话,就会产生如上的错误。

解决方案:

如何解决这一类问题呢?Maya提供了工具类MScriptUtil 专门用于解决这一类问题,我们现在用如下的方法来生成一个对于unsigned int的指针,然后把这个参数传递进去,一切就OK了。

util = OpenMaya.MScriptUtil( 0 )

influenceCount = util.asUintPtr()

注意事项:

如果这个参数还会返回数据,那么我们在获取这个数据的时候,同样需要做如下类似的转换,把指针类型转成值类型。

countValue = util.getUint(influenceCount)

更多关于MScriptUtil 类型和对于简单类型的转换,可以参考帮助文档:http://docs.autodesk.com/MAYAUL/2014/ENU/Maya-API-Documentation/index.html?url=cpp_ref/class_m_script_util.html,topicNumber=cpp_ref_class_m_script_util_html