选择操作:

不管在插件亦或是脚本,在maya场景中选择物体一直是很频繁的操作,相比command中的ls -sl,api中选择物体更加的多样化,当然可能也比较的不直观:

几种常见的选择途径:

(1):从场景选择结果进行获取操作:

一般的,这种情况在脚本或者command plugin中比较常见,直接获取到场景当前的选择。在command中我们可以直接使用ls -sl获取到选择对象的唯一名称(unique

name),但是使用string来标记操作对象在api中是低效且不通用的,所以我们需要直接获取当前选择对象的mobject或者mdagpath。

示例:

import maya.OpenMaya as om

#get mobject handle from active objects in maya scene

def listSelectionMObj(index = -1):

selLis =om.MSelectionList()

om.MGlobal.getActiveSelectionList(selLis)

If(index < 0):

result = [om.MObject()]*selLis.length()

for i,obj in enumerate(result):

selLis.getDependNode(i,obj)

return result

else:

result = [om.MObject()]*1

selLis.getDependNode(0,result[0])

return result

#get mdagpath

def listSelectionMPath(index = -1):

selLis =om.MSelectionList()

om.MGlobal.getActiveSelectionList(selLis)

If(index < 0):

result = [om.MDagPath()]*selLis.length()

for i,path in enumerate(result):

selLis.getDagPath(i,path )

return result

else:

result = [om.MDagPath()]*1

selLis.getDagPath(0,result[0])

return result

例子中可以直接获取整个选择列表,也可以获取指定index的对象(为了返回类 型一致,单个对象仍然返回列表)

(2):直接从场景获取对象:

这种情况一般出现在context plugin中,脚本或者command

plugin中相对少见。其 等价于鼠标框选操作,可以将其直接视为执行框选。

示例:

import maya.OpenMaya as om

#get mobject handle of object at screen position (xPos,yPos) in

maya scene.

def selectFromScreen(xPos,yPos):

#the enum value kReplaceList will replace list with given

items

om.MGlobal.selectFromScreen(xPos,yPos,om.MGlobal.kReplaceList)

selLis =om.MSelectionList()

om.MGlobal.getActiveSelectionList(selLis)

mobj = om.MObject()

selLis.getDependNode(0,mobj)

return mobj

示例中相当于在场景指定位置执行一次鼠标单击返回选择结果(MObject),需要注意的是,selectFromScreen会直接刷新视口的选择结果。

(3):使用对象名称获取对象:

很多时候我们只会知道对象的名称,比方说依赖于输入等等情况。这个时候api中就需要使用string获取对象句柄。虽然部分api方法提供根据string来判断对象的方式,不过还是建议在api中根据string先获取到对象再进行操作。

注意:名称必须为unique name,也就是说场景物体在整个场景中的最短唯一路径名称(也可提供全路径名称)。因为maya需要判断唯一的对象,就不应该在场景中存在一样名称的对象,但是在不同的group中可能会有这种同名情况。这种情况下带上group

path的对象名称才是unique name。

示例:

import maya.OpenMaya as om

#get mobject handle of object in maya scene with given unique

name.

def getObjectByName(uName):

selLis = om.MSelectionList()

selLis.add(uName)

mobj = om.MObject()

selLis.getDependNode(0,mobj)

return mobj

需要注意一点,示例中并未考虑namespace。