[Maya API] lesson23-Maya API中的接待你迭代器和函数类
MFnDependencyNode与MitDependencyNodes
api中最基本的一个节点的函数类和迭代器
MFnDependencyNode
函数类
功能:节点最基本的函数类,所有节点都能使用此类方法
特性:可以操作一切节点,包括commands无法操作的锁定节点
首先我们看一下最基本的节点函数类MFnDependencyNode,在Maya中所有的物体都是以节点的形式来存在的,他们最基础的模式是一个DependencyNode,那么带有层级的那些节点,都是从DependencyNode扩展而来,变成DagNode,那么通过不同的继承,就发展成为不同的节点,那么最基本的节点就是DependencyNode,也就是说Maya中所有的节点,我们都可以使用这个方法
1.创建一个MFnDependencyNode,首先第一个是没有任何参数的,那么这样创建出来的,我们也不能与任何节点进行连接,所以我们创建出来的实际上只是一个空的,没有任何意义。我们知道通过MObject可以追踪到任何一个节点,那么在这里我们就可以通过传入MObject来实例化一个MFnDenpencyNode
import pymel.core as pm
import maya.OpenMaya as OpenMaya
OpenMaya.MFnDependencyNode(pm.ls(sl=True)[0].__apimobject__())
# 创建DenpendencyNode,在创建时需要传入MObject物体,在这里使用pymel生成一个MObject来传入
2.生成了一个DenpendencyNode之后赋值给一个变量,我们就可以使用他的方法啦
create:该方法为创建一个空的,在创建节点时用到
typeName():返回当前节点的类型
name():返回当前节点的名字
setName():更改当前节点的名字 setName(‘ctl_1’)
attributeCount():返回当前节点属性的数量
attribute():返回它任何一个属性的值。通过他属性的索引值(通常为数字),来返回它属性针对的指针,我们也可以通过指定属性的名字来返回一个MObject
findPlug():也是通过这种方式来返回他的属性
setLocked():锁定节点
isLocked():判断节点是否锁定
MItDependencyNodes
迭代器类
在maya API中,以MIT开头的就是迭代器,然后根据它后面的方式,来判断它是如何使用的。那么MItdependencyNodes就是过滤场景中的所有的基本节点,我们可以通过这个迭代器,来达到我们命令中使用ls的这种效果。
实例化MItDependencyNodes的几种方式:
1.指定一个类型和一个MStatus
2.指定一个迭代器类型
maya中所有的节点类型,都是在MFnType里面指定的,我们可以直接使用MFnType()
iterator = OpenMaya.MItDependencyNodes(OpenMaya.MFn.kMesh)
我们生成的迭代器对于场景中的多边形进行过滤,这样就生成了
实际上,他只是一个迭代器的状态,还没有开始运行,那么现在我们不知道它里面有多少个数,所以我们只能使用while,我们使用iteratoris.Done(),在Maya中的迭代器中,都有isDone()这个方法,来判断这个迭代器是都运行完成,那么再循环里面,我们就要使用iterator.next()
iterator = OpenMaya.MItDependencyNodes(OpenMaya.MFn.kMesh)
while not iterator.isDone():
print iterator.thisNode()
print iterator.item()
iterator.next()
这样的话,根据输出的内容是不能看出来他到底哪个节点的,既然我们知道他是一个MObject,也是一个DependencyNode,那么就可以使用OpenMaya.MFnDependencyNode(iterator.item()).name()
iterator = OpenMaya.MItDependencyNodes(OpenMaya.MFn.kMesh)
while not iterator.isDone():
print OpenMaya.MFnDependencyNode(iterator.item()).name()
iterator.next()
那么在这个迭代器中,我们找到所有节点都是一个MObject,那么我们把这个MObject传给MFnDependencyNode,就生成了一个MFnDependencyNode的实例,我们就可以调用它的方法,比如说获取他的名字,我们就可以直接这么获取,就可以直接把场景中所有的mesh的名字打印出来
MItDependencyGraph
这个graph就是与节点联系相关的,我们可以通过这个迭代器来查询节点网络,它的上有节点,还有他的下游节点,
他的使用方法就是,比如说我们生成一个MItDependencyGraph,第一个选项我们要指定我们的起始节点,在指定我们要找到的节点类型,然后第三个选项,要指定我们查询这个节点的上游节点,还是下游节点,接着是广度优先,还是深度优先,level是说指定的是节点level还是属性level,那么通过指定这些属性就可以达到listConnection做不到的事情了。