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

2023-11-13

最近开发中遇到需要使用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(包含子目录)进行导入,只需要在当前实现下,对目录进行层级递归即可。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • mysql一行逗号分割的数据分解为多行

    在 MySQL 中 你可以使用函数 REPLACE 和 SUBSTRING INDEX 来将一行逗号分隔的数据分解为多行 例如 假设你有一个表 其中包含一列 items 该列包含逗号分隔的字符串 如下所示 id items 1 item1
  • 机器学习笔记 - 【机器学习案例】在表格数据上应用高斯混合模型GMM和网格搜索GridSearchCV提高分类精度

    1 需求及数据集说明 这是一项二分类任务 评估的是分类准确性 正确预测的标签百分比 训练集有1000个样本 测试集有9000个样本 你的预测应该是一个9000 x 1的向量 您还需要一个Id列 1到9000 并且应该包括一个标题 格式如下所
  • 【学习笔记】数据存储的顺序与对齐_计算机原理

    学习笔记 数据存储的顺序与对齐 计算机原理 开了个新坑 做一个计算机原理的读书笔记 自用 仅做分享 数据存储的顺序 介绍了机器端模式 数据存储的对齐 这里介绍的是 数据结构的存储方式是根据给定的字节和自己本身的字节做对齐的 比如 4 4 4
  • 浅谈SSM框架下实现简单登录界面

    SSM框架搭建结果 Login jsp
  • C:\Python27\python.exe: can't open file '2.py': [Errno 2] No such file or directory

    最近开始学习了 笨方法学python 在练习的第一个程序就出现了如下错误 C Python27 python exe can t open file 2 py Errno 2 No such file or directory 刚开始自己找
  • 学习日记——DAC实验(2020.2.6)

    区分ADC和DAC ADC 输入 模拟量转到数字量输入 DAC 输出 数字量转到模拟量输出 概念 数模转换器 又称D A转换器 简称DAC 它是把数字量转变成模拟的器件 D A转换器基本上由4个部分组成 即权电阻网络 运算放大器 基准电源和
  • Centos MySql安装,保姆级安装教程

    Centos MySql安装 保姆级安装教程 1 删除原有的mariadb 不然mysql装不进去 查询MAriaDB命令 rpm qa grep mariadb 删除 rpm e nodeps mariadb libs 5 5 60 1
  • pip与conda有什么区别,常用命令有哪些?

    文章目录 pip与conda有什么区别 常用命令有哪些 1 pip与conda 2 pip常用命令 3 conda常用命令 pip与conda有什么区别 常用命令有哪些 1 pip与conda pip是Python 包管理工具 该工具提供了
  • 关于Linux/Ubuntu重置用户名密码

    Step1 重启 往死里按Esc或等启动后嗯Enter Step2 成功后会进入如下界面 这一步后如果你已经知道root密码 请直接跳到Step8 Step3 在菜单Ubuntu这摁 e 进入编辑模式 对标出行 做出如下修改 Step4 根
  • 零信任架构简介

    2021 年被誉为网络安全元年 种种因素极大的驱动了零信任成为安全新风口 零信任也无疑成为了整个安全圈包括网络安全领域最热门的词汇之一 什么是零信任 零信任既不是单一的产品 也不是单一的技术 它是一种安全理念以及安全架构 核心原则是持续验证
  • SV中program & module

    相同之处 1 和module相同 program也可以定义0个或多个输入 输出 双向端口 2 一个program块内部可以包含0个或多个initial块 generate块 specparam语句 连续赋值语句 并发断言 timeunit声
  • GPS 的PPS

    校准RTC时间的方法 首先需要一个准确的外部信号 比如GPS来的秒信号 或者其它很准确的信号 然后通过定时器来测量RTC的晶振误差 然后再对该误差进行校准 面接收机GPS的秒脉冲精度 也就是相邻两个秒脉冲上升沿的间隔精度能到100ns 授时
  • HTML+CSS+JS制作【飞机大战】小游戏(键盘版和鼠标版)

    文章目录 一 效果演示 设计思路 二 鼠标版飞机大战代码展示 1 HTML结构代码 2 CSS样式代码 3 JavaScript代码 js js文件 plane js文件 三 键盘版飞机大战代码展示 1 HTML结构代码 2 CSS样式代码
  • eclipse下maven打包失败(Please ensure you are using JDK 1.4 or above and not ......

    在eclipse下用maven编译时 可能会失败 报出以下提示 ERROR Unable to locate the Javac Compiler in ERROR C Program Files Java jre1 8 0 72 lib
  • 【ABviewer从零开始教学查看器篇①】3D查看器和3D剖面板

    ABViewer是一款高质量 高效率 低成本的多功能设计及工程文档管理工具 能为您提供全面的专业的浏览及编辑功能 同时支持30多种光栅和矢量图形格式 在小编看来 ABViewer是一款非常简单且实用的CAD文档查看与编辑器 对于使用小白可能
  • 华为云计算相关知识点

    云计算离不开网络基础设施 云计算中的网络分为不同的平面 管理平面 负责整个系统的监控 操作维护 系统配置 系统加载 告警上报 和虚拟机管理 创建 删除虚拟机 虚拟机调度 等 存储平面 主要为存储系统提供通信平面 并未虚拟机提供存储资源 用于
  • 你的数据隐私值多少钱?也许已有答案了

    全文共6032字 预计学习时长12分钟 图片来源 Timo Lenzen 对于一些大型科技公司来说 这一年侵犯用户隐私付出的代价变高了 未来还会更高吗 今年7月 脸书在受到有关泄露数亿用户数据隐私的指控后 同意缴纳50亿美元的罚金 同一周内
  • 【TOOLS】Python 3利用SMTP进行邮件Email自主发送

    作者 Che Hongshu 来源 AI蜗牛车 ID AI For Car 一 前言 利用Python进行邮件的发送 这个功能自我感觉主要应用于检测或者报告之类 我两次运用这个功能 第一次用在主要发送实时的数据给一个邮箱 第二次用是检测挂在
  • VS调试:函数断点与数据断点

    断点 是Debug过程中最常用的功能 关于断点VS还有很多高级功能 本文使用的是VS2017 介绍函数断点与数据断点的使用场景以及使用方法 1 普通断点 普通断点是最常接触的断点 VS中 在代码行左边栏灰色区域点击 或者把光标放在某代码行按
  • 使用Python编写Maya脚本插件批量导入Obj文件

    最近开发中遇到需要使用Python语言编写Maya脚本 要求使用脚本选择某一磁盘路径 脚本根据路径自动导入路径与子目录下的所有OBJ文件 并重命名它们 在Maya中 有自带的脚本编辑器供我们使用 这使得我们编写代码非常轻松 打开脚本编辑器