使用Python编写Maya脚本插件批量导入Obj文件

最近开发中遇到需要使用Python语言编写Maya脚本。要求使用脚本选择某一磁盘路径,脚本根据路径自动导入路径与子目录下的所有OBJ文件,并重命名它们。

在Maya中,有自带的脚本编辑器供我们使用,这使得我们编写代码非常轻松。

使用Python编写Maya脚本插件批量导入Obj文件_第1张图片

打开脚本编辑器,我们开始第一步,编写Maya脚本插件的UI:

import maya.cmds as mc

#绘制窗体
mc.window(title =('磁盘路径').decode('gbk'), height=600)

#列式布局
mc.columnLayout()

#添加目录下拉菜单
op = mc.optionMenu( label=('目录').decode('gbk'), cc = "change_desk()")

#添加显示当前选择路径的标签
pathText = mc.text( label = 'CurrentPath: C:/')

#初始化获取C盘所有文件及文件夹,将它们写入列表,并为绑定双击事件函数
dirList = mc.textScrollList(numberOfRows = 35, append = os.listdir("C:/"), dcc = 'add_path()')

#定义流式布局
mc.flowLayout( columnSpacing=10 ,width=200)

#添加点击按钮
mc.button( label = ('导入所有OBJ').decode('gbk') , c = 'import_obj_re()')
mc.button( label = ('导入当前路径OBJ').decode('gbk') , c = 'import_obj_single()')

#搜索本地磁盘并初始化菜单
get_location_desk_list()

#显示窗口
mc.showWindow()

有了UI,我们希望初始化本地的磁盘列表,所以编写咱们的get_location_desk_list()函数:

#获取本地磁盘
def get_location_desk_list():
    disk_list = []
    for d in string.ascii_uppercase:
        disk = d + ':'
        if os.path.isdir(disk):
            disk_list.append(disk + "/")
            mc.menuItem(label = disk + "/") #将磁盘根目录路径写入下拉菜单
    return disk_list

写完此步骤后,脚本运行的效果:

使用Python编写Maya脚本插件批量导入Obj文件_第2张图片

然后,我们需要能够点击下拉菜单切换磁盘,并且能够双击子目录名进入下级目录,所以我们编写change_desk()函数用于绑定下拉菜单的点击事件;编写add_path()函数用于拼接每一步点击下级菜单后获得的当前路径:

#全局变量,当前路径,初始化为"C:/"
CurrentDir = 'c:/'

#下拉菜单被点击的切换事件
def change_disk():
    global CurrentDir
    local_desk = mc.optionMenu(op, v=True, q=True) #获取下拉菜单标签内容
    desk_list = os.listdir(local_desk) #查询磁盘下所有的文件与文件夹
    CurrentDir = local_desk #将当前磁盘路径赋予变量
    mc.text(pathText, e=True, label= "CurrentPath: " + CurrentDir) #将当前路径标签修改为此时路径
    mc.textScrollList(dirList, e=True, removeAll=True) #移除旧文件列表
    mc.textScrollList(dirList, e=True, append=desk_list) #将当前文件列表写入


#组合路径
def add_path():
    global CurrentDir #获取全局变量
    value = mc.textScrollList(dirList, q=True, selectItem=True) #拿到被双击子目录名称
    tempRootDir = CurrentDir + value[0] + "/" #组合路径
    deskArray = [] #定义目录列表,用于过滤文件,只留下文件夹
    try:
        mls = os.listdir(tempRootDir)
        for dir in mls:
            tempDir = tempRootDir + dir
            if os.path.isdir(tempDir): #过滤文件
                if dir == "桌面":
                    deskArray.append("Desktop")
                else:
                    deskArray.append(dir)
    except:
        print "Error:this path do not open!"
    else:
        CurrentDir = tempRootDir #将当前路径赋予变量
        mc.text(pathText, e=True, label="CurrentPath: " + CurrentDir) #修改当前路径UI标签
        mc.textScrollList(dirList, e=True, removeAll=True) #移除旧目录列表
        mc.textScrollList(dirList, e=True, append=mls) #将当前目录文件夹列表填入

此步骤做完,我们已经可以点击下拉菜单切换磁盘,双击子目录进入下级目录:

使用Python编写Maya脚本插件批量导入Obj文件_第3张图片

下一步,我们要点击"导入当前路径OBJ"按钮,导入当前目录下的OBJ文件,所以我们编写import_obj_single()函数用于导入当前路径文件夹内的OBJ文件:

#导入当前路径文件夹内所有OBJ对象
def import_obj_single():
    global CurrentDir
    for f in getFiles(CurrentDir, '.obj'): #过滤出.obj格式文件
        try:
            obj_name = "SM_" + f[f.rfind('/')+1:len(f)-5].replace('+','') #编辑重命名
            obj_file = glob.glob(f)
            imported_objects  = mc.file(obj_file[0], ns="ns", i=True, rnn=True) #导入文件
            transforms = mc.ls(imported_objects, type='transform')
            for i, object in enumerate(transforms):
                mc.rename(object, obj_name) #重命名
        except: #异常处理
            print "Error:" + f +" is not import!"
    mc.select(all=True) #选中所有导入对象
    mc.rotate(-90,0,0)  #整体旋转90°

此步做完,我们选中文件路径,点击导入当前路径OBJ,得到效果:

使用Python编写Maya脚本插件批量导入Obj文件_第4张图片

到这里,咱们的功能即实现完成,对目录下所有OBJ(包含子目录)进行导入,只需要在当前实现下,对目录进行层级递归即可。

本文属于原创文章,如果转载,请附上本文链接~~~

你可能感兴趣的:(脚本插件,Maya,脚本,Python,Maya批量导入Obj并重命名)