[Maya API] lesson24_Maya API 层级迭代器与物体函数类MFnDagNode MItDag

MFnDagNode

我们知道MFnDagNode就是大纲里的节点,也就是说带有层级的节点,那么MFnDagNode就是针对这些物体拓展出来的函数类,我们可以对于这些节点使用MFnDagNode来访问他们对应的方法。

MFnDagNode是继承MFnDependencyNode而来的,所有的MFnDagNode也都可以使用MFnDependencyNode的方法

MFnAssembly、MFnCamera、MFnField还有流体、晶格、灯光等,这些都可以使用MFnDagNode的方法

MFnDagNode的常用方法,跟我们平时操作差不多,可以获取它的parent、child、hasParent、hasChild,也就是说找到他的父物体、子物体、判断他是不是一个物体的子物资、是不是一个物体的父物体,还有他物体的名字,长名 还有其他的我们都可以使用

我们现在场景里有一个最简单的物体,也就是一个球,我们通过它来学习一下MFnDagNode:针对单个DagNode的处理方法

首先我们先导入pymel和OpenMaya,导入之后我们定义一个变量,要创建一个MFnDagNode可以先传入一个MObject,可以传入一个MDagPath,也就是说两种类型传入禁区都可以生成这一个function的DagNode,在这里我们需要注意的是,我们穿的MObject必须是大纲里的这种节点,那么如果我们传入的是普通节点的MObject,那么他是无法实例化的,

py.pyNode('pSphere1').__apiobject__()  # 返回的是MFnDagPath可以传入MFnDagNode

mfn = OpenMaya.MFnDagNode() 

现在这个实例就定义好了,现在我们就可以访问它的方法啦,

api和pymel都是直接绑定在节点上的,不是依据字符串来寻找的,当节点有变化时,依然可以追踪到它

mfn.partialPathName(): 返回大纲里的层级的名字

mfn.fullPathName(): 返回他的长名,可以根据自己的层级来实时更改自己的fullPathName

childCount(): 判断它有几个子物体

child(int) : 找出他索引为int的子物体返回一个MObject

import pymel.core as pm
import maya.OpenMaya as OpenMaya

node = pm.PyNode('pSphere1').__apiobject__()
mfn = OpenMaya.MFnDagNode()

mfn.fullPathName()

OpenMaya.MFnDagNode(mfn.child(1)).fullPathName() #将子物体传出的MObject传入MFnDagNode

mfn.removeChildAt(3)  # 将索引为3的子物体进行移除

MItDag

我们知道以MIt开头的都是迭代器,也就是说MItDag可以迭代我们场景中所有的层级的节点,我们可以使用它来模拟ls的操作,也就是说ls实际上是从这个地方发展而来的,我们可以使用它高效率的遍历场景中所有的层级节点,然后来寻找我们所需要的

初始化一个MItDag有两种方式,第一种就是先传入他的迭代的类型,然后是我们要迭代的节点的类型,那么他这个类型是他这一个类独有的,它有两种,比如说一个是深度优先,一个是广度优先。那么他们两个的意思是:深度优先他是把第一个层级下边一直迭代到最深处的,最下边的那个子节点,然后开始第二层,那么广度优先事把所有层都遍历完,再回到第二层,然后再继续向下遍历,然后再到第三层,也就是说如果你对他的顺序没有太多要求的话,实际上是选择哪个都无所谓的,如果说真的确切对顺序有特定要求的话,就要按需选择啦

我们来创建一个MItDag

iterator = OpenMaya.MItDag()  #定义一个空的,没有任何起始点的MItDag,可以遍历出场景里所有的层级节点
iterator.reset(pm.PyNode('group5').__apiobject__(), OpenMaya.MItDag.kBreadthFirst, OpenMaya.MFn.kMesh )  # 指定一个起始点,返回指定起始点的所有层级 ,指定迭代的类型kMesh

while not iterator.isDone():  # 判断iterato没有结束
    
    print(iterator.fullPathName())
    iterator.next()     # 迭代下一个

猜你喜欢

转载自blog.csdn.net/weixin_41363156/article/details/104486042
API