#!/usr/bin/env python # -*- coding: utf-8 -*- #===================================== 1. Module Imports ===================================== import maya.OpenMayaUI as omui from scripts import config import maya.cmds as cmds import maya.mel as mel import webbrowser import sys import os from .. import config QtCore, QtGui, QtWidgets, wrapInstance = config.Qt() if QtCore is None or QtGui is None or QtWidgets is None or wrapInstance is None: print(f"Qt加载失败: {QtCore}, {QtGui}, {QtWidgets}, {wrapInstance}") class MenuBar(QtWidgets.QMenuBar): def __init__(self, parent=None): super(MenuBar, self).__init__(parent) self._setup_ui() self._create_connections() def _setup_ui(self): """设置UI布局""" # 创建主菜单 self.file_menu = self._create_file_menu() self.edit_menu = self._create_edit_menu() self.tools_menu = self._create_tools_menu() self.language_menu = self._create_language_menu() self.help_menu = self._create_help_menu() # 添加到菜单栏 self.addMenu(self.file_menu) self.addMenu(self.edit_menu) self.addMenu(self.tools_menu) self.addMenu(self.language_menu) self.addMenu(self.help_menu) def _create_file_menu(self): """创建文件菜单""" # === Widget === menu = QtWidgets.QMenu("文件") # === Actions === self.file_actions = {} actions = [ ("open_dna", "打开 DNA", "open.png", "Ctrl+O"), ("save_dna", "保存 DNA", "save.png", "Ctrl+S"), ("load_current", "加载当前项目 DNA", "open.png", ""), None, # 分隔符 ("rename_blend", "修改混合目标名称", "rename.png", ""), ("reset_blend", "重置混合目标名称", "resetname.png", ""), None, ("export_fbx", "导出 FBX", "export.png", ""), None, ("exit", "退出", "exit.png", "Alt+F4") ] self._add_menu_actions(menu, actions, self.file_actions) return menu def _create_edit_menu(self): """创建编辑菜单""" # === Widget === menu = QtWidgets.QMenu("编辑") # === Actions === self.edit_actions = {} actions = [ ("create_rl4", "创建 RL4 节点", "connect.png", ""), ("delete_rl4", "删除 RL4 节点", "disconnect.png", ""), None, ("mirror_l2r", "镜像左至右", "mirrorL.png", ""), ("mirror_r2l", "镜像右至左", "mirrorR.png", ""), None, ("pose_a2t", "姿势由 A 型转 T 型", "pose_A_To_T.png", ""), ("pose_t2a", "姿势由 T 型转 A 型", "pose_T_To_A.png", ""), None, ("transfer_lod", "传输 LOD 贴图", "locator.png", ""), ("set_joint_color", "设置关节颜色", "color.png", ""), None, ("unmark_all", "取消全部标记", "unmark_all.png", ""), ("rebuild_targets", "重建所有目标", "rebuildTargets.png", ""), None, ("set_expression_keys", "为所有表情设置关键帧", "bakeAnimation.png", ""), ("bake_expression_keys", "烘焙所有表情的关键帧", "centerCurrentTime.png", "") ] self._add_menu_actions(menu, actions, self.edit_actions) return menu def _create_tools_menu(self): """创建工具菜单""" # === Widget === menu = QtWidgets.QMenu("工具") # === Actions === self.tools_actions = {} actions = [ ("export_skin", "导出蒙皮", "export_skin.png", ""), ("import_skin", "导入蒙皮", "import_skin.png", ""), ("copy_skin", "拷贝装皮", "copy_skin.png", ""), None, ("rbf_deformer", "RBF变形器", "blendShape.png", ""), ("quick_bind", "快速绑定服装", "clothing_weight.png", ""), ("clone_blend", "克隆混合变形", "blendShape.png", ""), None, ("transfer_uv", "UV传递点序", "repair_vertex_order.png", ""), ("create_face_ctrl", "面部生成控制器", "controller.png", ""), ("extract_52bs", "提取52BS", "ARKit52.png", ""), None, ("fix_joint_axis", "关节轴向修复", "joint.png", ""), ("create_body_ctrl", "生成身体控制器", "create_body_ctrl.png", ""), None, ("import_face_anim", "导入面部动画", "import_face_anim.png", ""), ("import_body_anim", "导入身体动画", "import_body_anim.png", "") ] self._add_menu_actions(menu, actions, self.tools_actions) return menu def _create_language_menu(self): """创建语言菜单""" # === Widget === menu = QtWidgets.QMenu("语言") # === Actions === self.language_actions = {} actions = [ ("chinese", "中文", "chinese.png", ""), ("english", "English", "english.png", "") ] self._add_menu_actions(menu, actions, self.language_actions) return menu def _create_help_menu(self): """创建帮助菜单""" # === Widget === menu = QtWidgets.QMenu("帮助") # === Actions === self.help_actions = {} actions = [ ("help", "帮助文档", "help.png", "F1"), ("about", "关于", "about.png", "") ] self._add_menu_actions(menu, actions, self.help_actions) return menu def _add_menu_actions(self, menu, actions, action_dict): """添加菜单项""" for action in actions: if action is None: menu.addSeparator() else: action_id, name, icon, shortcut = action act = QtWidgets.QAction(name, self) if icon: act.setIcon(QtGui.QIcon(f"{config.ICONS_PATH}/{icon}")) if shortcut: act.setShortcut(shortcut) menu.addAction(act) action_dict[action_id] = act def _create_connections(self): """创建信号连接""" # 文件菜单 self.file_actions["open_dna"].triggered.connect(self._on_open_dna) self.file_actions["save_dna"].triggered.connect(self._on_save_dna) self.file_actions["exit"].triggered.connect(self._on_exit) # 编辑菜单 self.edit_actions["create_rl4"].triggered.connect(self._on_create_rl4) self.edit_actions["delete_rl4"].triggered.connect(self._on_delete_rl4) # 工具菜单 self.tools_actions["export_skin"].triggered.connect(self._on_export_skin) self.tools_actions["import_skin"].triggered.connect(self._on_import_skin) # 语言菜单 self.language_actions["chinese"].triggered.connect(lambda: self._on_language_change("zh")) self.language_actions["english"].triggered.connect(lambda: self._on_language_change("en")) # 帮助菜单 self.help_actions["help"].triggered.connect(self._on_help) self.help_actions["about"].triggered.connect(self._on_about) # ================================ 事件函数 ================================ def _on_open_dna(self): """打开DNA""" # TODO: 实现打开DNA逻辑 pass def _on_save_dna(self): """保存DNA""" # TODO: 实现保存DNA逻辑 pass def _on_exit(self): """退出程序""" # TODO: 实现退出逻辑 pass def _on_create_rl4(self): """创建RL4节点""" # TODO: 实现创建RL4节点逻辑 pass def _on_delete_rl4(self): """删除RL4节点""" # TODO: 实现删除RL4节点逻辑 pass def _on_export_skin(self): """导出蒙皮""" # TODO: 实现导出蒙皮逻辑 pass def _on_import_skin(self): """导入蒙皮""" # TODO: 实现导入蒙皮逻辑 pass def _on_language_change(self, lang): """切换语言""" # TODO: 实现语言切换逻辑 pass def _on_help(self): """显示帮助文档""" # TODO: 实现显示帮助逻辑 pass def _on_about(self): """显示关于对话框""" # TODO: 实现显示关于对话框逻辑 pass if __name__ == "__main__": pass