乐于分享
好东西不私藏

批量导出插件

批量导出插件

🚀 Maya 批量导出神器升级!支持 FBX/OBJ/MA/MB 一键导出,效率提升 200%!

各位三维设计师和 Maya 用户注意啦!今天给大家带来一款超实用的 Maya 批量导出插件 重磅升级!由 AGX 团队开发的这款工具现已支持 FBX、OBJ、MA、MB 四种格式 的批量导出,再也不用一个个手动导出了!

🔥 插件亮点

四大格式支持

  1. :FBX、OBJ、MA、MB 全搞定
  2. 智能命名
    :自动使用模型名称作为文件名
  3. 批量处理
    :一次性导出所有选中模型
  4. 中文友好
    :全中文界面,操作直观
  5. 错误提示
    :自动检测未选择模型等情况

🛠️ 使用教程(超简单!)

第一步:安装插件

  1. 复制全部代码
  2. 打开 Maya 脚本编辑器(Python 模式)
  3. 粘贴代码并全选
  4. 鼠标中键拖拽到工具架(防止中文乱码)

第二步:使用插件

  1. 选择要导出的模型(注意:不能有组层级关系)
  2. 点击工具架上的插件图标
  3. 选择导出格式(FBX/OBJ/MA/MB)
  4. 设置导出路径
  5. 点击"开始导出"按钮

第三步:坐等完成

插件会自动:

  • 按选择顺序逐个导出
  • 使用模型名称命名文件
  • 显示导出进度和结果

💡 更新内容(v1.2)

  1. 新增 MA/MB 格式支持
    :现在可以批量导出 Maya 原生格式了!
  2. UI 优化
    :界面更美观,操作更流畅
  3. 兼容性提升
    :修复了 Maya 2018 的兼容性问题
  4. 错误处理增强
    :导出失败会有明确提示

📝 使用注意事项

  1. 确保导出的模型没有组层级关系
  2. 导出前请先保存 Maya 文件
  3. 如果导出失败,会显示具体哪些模型有问题
  4. 建议先小批量测试,确认无误后再大批量操作
    ⚠️ 兼容性说明

    本插件已在 Maya 2018 版本上完成测试并稳定运行。对于更高版本的 Maya(如 2019-2025),由于 Python 环境和 API 可能存在差异,建议用户:

    1. 自行测试验证
       在高版本 Maya 中的兼容性
    2. 注意观察
       导出过程中是否出现异常
    3. 及时反馈
       遇到的任何兼容性问题
# -*- coding: utf-8 -*-'''开发者:AGX时间:2025.3.27版本:1.2    更新说明:优化UI界面,修复Maya 2018兼容性问题,增加多导出格式选择(FBX, OBJ, MA, MB)使用说明: 先运行此插件。需要用户手动将此文件打开,将代码全部复制粘贴到MAYA的脚本编辑器python类里面。然后全选代码,然后鼠标中间拖拽到工具架上。        (手动拖拽原因是因为,代码里面有中文字符,如果直接放进MAYA三维窗口,虽然能运行,但中文部分将会乱码显示)。        然后需要将用户需要选中的模型(模型不能有组或者其他的层级关系)。        然后选择好自己要导出的模型格式以及导出的模型的位置。        然后点击导出按钮。插件将会按照前面选择的模型的先后顺序进行逐个导出。并且导出的每个文件名和当前文件的模型名字一致。        如果用户未选择模型,将会弹出警告提示窗口。无需再手动操作逐个导出模型,并且重新根据模型名字进行文件命名。'''import osimport maya.cmds as cmdsclass BatchExportWindow(object):    WINDOW_NAME = "BatchExportWindow"    def __init__(self):        if cmds.window(self.WINDOW_NAME, exists=True):            cmds.deleteUI(self.WINDOW_NAME, window=True)        self.failed_exports = []        # 创建主窗口        self.window = cmds.window(            self.WINDOW_NAME,             title=u"AGX_批量导出工具",            widthHeight=(500250),            sizeable=False        )        # 创建主布局        self.main_form = cmds.formLayout()        # 创建说明文本        self.header_text = cmds.text(            label=u"请选择需要导出的模型",            align="center",            font="boldLabelFont"        )        # 创建框架布局        self.frame = cmds.frameLayout(            label=u"导出设置",            marginHeight=5,            marginWidth=5        )        # 创建列布局        self.column = cmds.columnLayout(            adjustableColumn=True,            rowSpacing=5,            columnAttach=('both'5)        )        # 添加分隔线        cmds.separator(height=10, style='none')        # 创建导出格式选择(用labelArray4支持4个标签)        self.radio_button_group = cmds.radioButtonGrp(            label=u'导出格式',            labelArray4=['FBX''OBJ''MA''MB'],  # 4个标签            numberOfRadioButtons=4,            columnWidth=[160],            columnAttach=[(1'left'5), (2'left'5), (3'left'5), (4'left'5)],            select=1        )        # 添加间隔        cmds.separator(height=10, style='none')        # 创建路径选择区域        self.directory_text_field = cmds.textFieldButtonGrp(            label=u'导出路径',            buttonLabel=u'浏览...',            columnWidth=[160],            adjustableColumn=2,            columnAttach=[(1'left'5), (2'left'5), (3'left'5)],            buttonCommand=self.select_directory        )        # 添加分隔线        cmds.separator(height=15)        # 创建导出状态文本        self.status_text = cmds.text(            label=u'准备就绪',            align='center'        )        # 添加间隔        cmds.separator(height=10, style='none')        # 创建“开始导出”按钮        self.export_button = cmds.button(            label=u"开始导出",            command=self.export,            height=35        )        # 设置布局        cmds.formLayout(            self.main_form,            edit=True,            attachForm=[                (self.header_text, 'top'5),                (self.header_text, 'left'5),                (self.header_text, 'right'5),                (self.frame, 'left'5),                (self.frame, 'right'5),                (self.frame, 'bottom'5)            ],            attachControl=[                (self.frame, 'top'5, self.header_text)            ]        )        # 显示窗口        cmds.showWindow(self.window)    def select_directory(self, *args):        result = cmds.fileDialog2(            fileMode=3,            dialogStyle=2,            caption=u"选择导出目录"        )        if result:            cmds.textFieldButtonGrp(                self.directory_text_field,                edit=True,                text=result[0]            )    def export(self, *args):        selected_objects = cmds.ls(selection=True, long=True)        if not selected_objects:            cmds.confirmDialog(                title=u'警告',                message=u'请先选择要导出的模型!',                button=[u'确定'],                defaultButton=u'确定'            )            return        directory = cmds.textFieldButtonGrp(self.directory_text_field, query=True, text=True)        if not directory:            cmds.confirmDialog(                title=u'警告',                message=u'请选择导出路径!',                button=[u'确定'],                defaultButton=u'确定'            )            return        # 获取用户选择的导出格式索引(1-4)        format_index = cmds.radioButtonGrp(self.radio_button_group, query=True, select=True)        total = len(selected_objects)        self.failed_exports = []  # 重置失败列表        for i, obj in enumerate(selected_objects):            try:                # 更新状态文本                cmds.text(                    self.status_text,                    edit=True,                    label=u'正在导出: {} ({}/{})'.format(obj.split("|")[-1], i+1, total)                )                cmds.select(obj, replace=True)                filename_base = obj.split("|")[-1]                if format_index == 1:                    filename = '{}/{}.fbx'.format(directory, filename_base)                    cmds.file(                        filename,                        force=True,                        options="v=0;",                        typ="FBX export",                        pr=True,                        es=True                    )                elif format_index == 2:                    filename = '{}/{}.obj'.format(directory, filename_base)                    cmds.file(                        filename,                        force=True,                        options="groups=0;ptgroups=0;materials=0;smoothing=1;normals=1",                        typ="OBJexport",                        pr=True,                        es=True                    )                elif format_index == 3:                    filename = '{}/{}.ma'.format(directory, filename_base)                    cmds.file(                        filename,                        force=True,                        options="mo=1",                        typ="mayaAscii",                        pr=True,                        es=True                    )                elif format_index == 4:                    filename = '{}/{}.mb'.format(directory, filename_base)                    cmds.file(                        filename,                        force=True,                        options="",                        typ="mayaBinary",                        pr=True,                        es=True                    )            except Exception as e:                self.failed_exports.append(obj)        # 导出完成提示        if self.failed_exports:            cmds.text(                self.status_text,                edit=True,                label=u'导出完成,但有{}个模型导出失败'.format(len(self.failed_exports))            )            cmds.confirmDialog(                title=u'导出完成',                message=u'以下模型导出失败:\n' + '\n'.join([obj.split("|")[-1for obj in self.failed_exports]),                button=[u'确定']            )        else:            cmds.text(                self.status_text,                edit=True,                label=u'导出完成!共导出{}个模型'.format(total)            )            cmds.confirmDialog(                title=u'完成',                message=u'所有模型导出成功!',                button=[u'确定']            )# 运行插件BatchExportWindow()