MAYA API编写类型分组工具

先展示一下工具效果

image.png

这是打开工具后默认的使用方式,即对大纲中所有的物体进行类型分组。
2020-03-20-2330-35.gif

在name fiter中输入GEO进行对象名称过滤。
2020-03-20-2330-35_1.gif

对创建一个新分组的物体,勾选Selection Create Mode,仅对选择的物体进行操作类型分组。
2020-03-20-2330-35_2.gif

勾选Only Create Group,仅对大纲中存在的类型进行创建组,若勾选了Selection Create Mode,则只对选择的物体进行创建组。
2020-03-20-2330-35_3.gif

在Add Prefix和Add Suffix中输入文字,对操作的物体添加前后缀,这里我们输入了pre_和suf,因为我们之前使用命令创建了类型组,并且我们这次又勾选了Only Create Group,所以我们的操作只对组进行操作,不会对类型组下子物体产生影响,可以看到我们的类型组名称都加上了pre和_suf。
2020-03-20-2330-35_4.gif

可以看到我们取消勾选Only Create Group,并且我们将where to add中的选项切换成Only Object Add,也就是只对物体进行加前后缀,不会对类型组产生影响。
2020-03-20-2330-35_5.gif

我们将where to add中的选项切换成All Add,即对类型组以及类型组下所有子物体进行加前后缀。
2020-03-20-2330-35_6.gif

目前我暂时在创建类型组工具中没有其他的idea,以后会慢慢的改进和增加吧。
最后贴上我的核心代码,我都在关键位置写上了注释,便于理解。

def get_group_obj(obj_path=None, names=None):
    '''
    :param obj_path: Bool As selection object
    :param names: String As name fiter
    :return: Dict
    '''
    iterator = om.MItDag(om.MItDag.kBreadthFirst)
    # reset to obj_path
    if obj_path:
        iterator.reset(obj_path)

    obj_dict = {}

    while not iterator.isDone():
        # Remove kworld type objects
        if iterator.item().apiTypeStr() != 'kWorld':
            # Remove default camera
            if iterator.partialPathName() not in ['front', 'top', 'persp', 'side']:
                mdag_path = om.MDagPath()
                iterator.getPath(mdag_path)
                current_item = om.MFnDagNode(mdag_path)
                # Determine the number of sub objects
                if current_item.childCount() > 0:
                    # Get first child obj
                    child = om.MFnDagNode(mdag_path.child(0))
                    # Determine is a shape node
                    if "Shape" in child.partialPathName():
                        if names != None:
                            if names in mdag_path.partialPathName():
                                obj_dict[mdag_path] = child.object().apiTypeStr()
                        else:
                            obj_dict[mdag_path] = child.object().apiTypeStr()

                    else:
                        # Determines whether the parent object is of the same type as the object
                        if current_item.parent(0).apiTypeStr() != current_item.object().apiTypeStr():
                            if names != None:
                                if names in iterator.partialPathName():
                                    obj_dict[mdag_path] = mdag_path.node().apiTypeStr()
                            else:
                                obj_dict[mdag_path] = mdag_path.node().apiTypeStr()

                elif mdag_path.childCount() == 0:
                    # Remove shape object
                    if "Shape" not in iterator.partialPathName():
                        # Determines whether the parent object is of the same type as the object
                        if current_item.parent(0).apiTypeStr() != current_item.object().apiTypeStr():
                            if names != None:
                                if names in iterator.partialPathName():
                                    obj_dict[mdag_path] = mdag_path.node().apiTypeStr()
                            else:
                                obj_dict[mdag_path] = mdag_path.node().apiTypeStr()

        iterator.next()

    return obj_dict

尚未解决的问题:
大概有6%的几率会发生,在对maya操作时会出现黑边,且只能重启maya才能去除黑边。(重启大法好!!)


image.png

你可能感兴趣的:(MAYA API编写类型分组工具)