最近开发中遇到需要使用Python语言编写Maya脚本。要求使用脚本选择某一磁盘路径,脚本根据路径自动导入路径与子目录下的所有OBJ文件,并重命名它们。
在Maya中,有自带的脚本编辑器供我们使用,这使得我们编写代码非常轻松。
打开脚本编辑器,我们开始第一步,编写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
写完此步骤后,脚本运行的效果:
然后,我们需要能够点击下拉菜单切换磁盘,并且能够双击子目录名进入下级目录,所以我们编写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) #将当前目录文件夹列表填入
此步骤做完,我们已经可以点击下拉菜单切换磁盘,双击子目录进入下级目录:
下一步,我们要点击"导入当前路径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,得到效果:
到这里,咱们的功能即实现完成,对目录下所有OBJ(包含子目录)进行导入,只需要在当前实现下,对目录进行层级递归即可。
本文属于原创文章,如果转载,请附上本文链接~~~