#!/usr/bin/env python # -*- coding: utf-8 -*- #===================================== 1. Module Imports ===================================== import os from scripts.config import data from scripts.utils import menu_utils try: from PySide2 import QtCore, QtGui, QtWidgets from shiboken2 import wrapInstance print("从PySide2加载Qt和shiboken2") except ImportError: try: from PySide6 import QtCore, QtGui, QtWidgets from shiboken6 import wrapInstance print("从PySide6加载Qt和shiboken6") except ImportError: try: from PySide import QtCore, QtGui, QtWidgets from shiboken import wrapInstance print("从PySide加载Qt和shiboken") except ImportError as e: print(f"Qt加载失败: {str(e)}") QtCore = QtGui = QtWidgets = None wrapInstance = None #===================================== 2. Menu Manager Class ===================================== class MenuManager: """菜单管理器""" def __init__(self, parent): self.parent = parent self.menu_bar = parent.menuBar() self.create_menus() self.create_toolbar() def create_menus(self): """创建菜单""" # 文件菜单 file_menu = self.menu_bar.addMenu("文件") self.add_menu_item(file_menu, "打开DNA", "open.png", menu_utils.load_dna) self.add_menu_item(file_menu, "保存DNA", "save.png", menu_utils.save_dna) self.add_menu_item(file_menu, "加载当前项目的DNA", "open.png", menu_utils.load_project_dna) file_menu.addSeparator() self.add_menu_item(file_menu, "修改混合目标名称", "rename.png", menu_utils.rename_blend_target) self.add_menu_item(file_menu, "重置混合目标名称", "resetname.png", menu_utils.reset_blend_target) file_menu.addSeparator() self.add_menu_item(file_menu, "导出FBX", "export.png", menu_utils.export_fbx) file_menu.addSeparator() self.add_menu_item(file_menu, "退出", "exit.png", menu_utils.safe_shutdown) # 编辑菜单 edit_menu = self.menu_bar.addMenu("编辑") self.add_menu_item(edit_menu, "创建RL4节点", "connect.png", menu_utils.create_rl4_node) self.add_menu_item(edit_menu, "删除RL4节点", "disconnect.png", menu_utils.delete_rl4_node) edit_menu.addSeparator() self.add_menu_item(edit_menu, "镜像左至右", "mirrorL.png", menu_utils.mirror_left_to_right) self.add_menu_item(edit_menu, "镜像右至左", "mirrorR.png", menu_utils.mirror_right_to_left) edit_menu.addSeparator() self.add_menu_item(edit_menu, "姿势由A型转T型", "pose_A_To_T.png", menu_utils.pose_a_to_t) self.add_menu_item(edit_menu, "姿势由T型转A型", "pose_T_To_A.png", menu_utils.pose_t_to_a) edit_menu.addSeparator() self.add_menu_item(edit_menu, "传输LOD贴图", "locator.png", menu_utils.transfer_lod_texture) self.add_menu_item(edit_menu, "设置关节颜色", "color.png", menu_utils.set_joint_color) edit_menu.addSeparator() self.add_menu_item(edit_menu, "取消全部标记", "unmark_all.png", menu_utils.unmark_all) self.add_menu_item(edit_menu, "重建所有目标", "rebuildTargets.png", menu_utils.rebuild_all_targets) edit_menu.addSeparator() self.add_menu_item(edit_menu, "为所有表情设置关键帧", "bakeAnimation.png", menu_utils.bake_all_animations) self.add_menu_item(edit_menu, "烘焙所有表情的关键帧", "centerCurrentTime.png", menu_utils.bake_all_keyframes) # 工具菜单 tools_menu = self.menu_bar.addMenu("工具") self.add_menu_item(tools_menu, "导出蒙皮", "export_skin.png", menu_utils.export_skin) self.add_menu_item(tools_menu, "导入蒙皮", "import_skin.png", menu_utils.import_skin) self.add_menu_item(tools_menu, "拷贝蒙皮", "copy_skin.png", menu_utils.copy_skin) tools_menu.addSeparator() self.add_menu_item(tools_menu, "RBF变形器", "blendShape.png", menu_utils.create_rbf_deformer) self.add_menu_item(tools_menu, "快速绑定服装", "clothing_weight.png", menu_utils.quick_bind_clothing) self.add_menu_item(tools_menu, "克隆混合变形", "blendShape.png", menu_utils.clone_blendshape) tools_menu.addSeparator() self.add_menu_item(tools_menu, "UV传递点序", "repair_vertex_order.png", menu_utils.transfer_uv_order) self.add_menu_item(tools_menu, "面部生成控制器", "controller.png", menu_utils.create_face_controller) self.add_menu_item(tools_menu, "提取52BS", "ARKit52.png", menu_utils.extract_52bs) tools_menu.addSeparator() self.add_menu_item(tools_menu, "关节轴向修复", "joint.png", menu_utils.fix_joint_orientation) self.add_menu_item(tools_menu, "生成身体控制器", "create_body_ctrl.png", menu_utils.create_body_controller) tools_menu.addSeparator() self.add_menu_item(tools_menu, "导入面部动画", "import_face_anim.png", menu_utils.import_face_animation) self.add_menu_item(tools_menu, "导入身体动画", "import_body_anim.png", menu_utils.import_body_animation) # 语言菜单 lang_menu = self.menu_bar.addMenu("语言") self.add_menu_item(lang_menu, "中文", "chinese.png", menu_utils.set_chinese) self.add_menu_item(lang_menu, "English", "english.png", menu_utils.set_english) # 帮助菜单 help_menu = self.menu_bar.addMenu("帮助") self.add_menu_item(help_menu, "帮助文档", "help.png", menu_utils.show_help) self.add_menu_item(help_menu, "关于", "warning.png", menu_utils.show_about) def create_toolbar(self): """创建工具栏""" toolbar = self.parent.addToolBar("主工具栏") toolbar.setMovable(False) # 添加工具栏按钮 self.add_toolbar_item(toolbar, "保存DNA", "save.png", menu_utils.save_dna) self.add_toolbar_item(toolbar, "加载当前项目DNA", "open.png", menu_utils.load_project_dna) def add_menu_item(self, menu, text, icon, callback): """添加菜单项""" action = QtWidgets.QAction(text, self.parent) if icon: icon_path = os.path.join(data.ICONS_PATH, icon) if os.path.exists(icon_path): action.setIcon(QtGui.QIcon(icon_path)) action.triggered.connect(callback) menu.addAction(action) return action def add_toolbar_item(self, toolbar, text, icon, callback): """添加工具栏项""" action = QtWidgets.QAction(text, self.parent) if icon: icon_path = os.path.join(data.ICONS_PATH, icon) if os.path.exists(icon_path): action.setIcon(QtGui.QIcon(icon_path)) action.triggered.connect(callback) toolbar.addAction(action) return action