选择操作:
不管在插件亦或是脚本,在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。