Extrait de code Maya API

Get active selection list

import maya.OpenMaya as om

sel = om.MSelectionList()

om.MGlobal.getActiveSelectionList(sel)

Get MObject from node name

import maya.OpenMaya as om

sel = om.MSelectionList()

sel.add("pCube*|pCubeShape*")

m_obj = om.MObject()

for i in xrange(sel.length()):

    sel.getDependNode(i, m_obj)

    # do things with m_obj...

As you can guess, MSelectionList.add() can use the same expression than MEL commands.

The sel.add(...) could have been replaced by MGlobal.getSelectionListByName("pCube*|pCubeShape*", sel) and do the exact same thing.

You can use MSelectionList.getDagPath() instead of MSelectionList.getDependNode() to get a MDagPath.

Iterate over geometry vertex

import maya.OpenMaya as om

# mesh node to iterte vertices
node = 'BodyShape'

# get MObject from node name
sel = om.MSelectionList()
sel.add(node)

dag_path = om.MDagPath()

sel.getDagPath(0, dag_path)  # 0 is index

# create vertex iterator
mesh_iter = om.MItGeometry(dag_path)

while not mesh_iter.isDone():

    # get MPoint position in world space
    pt = mesh_iter.position(om.MSpace.kWorld)

    print pt.x, pt.y, pt.z

    mesh_iter.next()

Convert MFloatMatrix to MMatrix

Using Maya API, you often have to convert a MFloatMatrix type to MMatrix type. The simpler way to do it in Python is this way:

import maya.OpenMaya as om

my_float_mtx = om.MFloatMatrix()
my_mtx = om.MMatrix(my_float_mtx.matrix)

This rely on the MFloatMatrix.matrix property which is of type float [4][4] using the MMatrix(const float m[4][4]) constructor.

Iterate over Maya ui as PySide objects

import maya.OpenMayaUI as omui
from PySide import QtCore, QtGui
import shiboken

mayaMainWindow = shiboken.wrapInstance(long(omui.MQtUtil.mainWindow()), QtGui.QWidget)

def print_children(widget, depth = 0):
    for child in widget.children():
        print '    '*depth, type(child), child.objectName()
        print_children(child, depth + 1)

print_children(mayaMainWindow)

More infos about MQtUtil here

Dernière mise à jour : mar. 02 juin 2020