MetaFusion/scripts/ui/menu.py
2025-02-10 01:11:14 +08:00

262 lines
9.0 KiB
Python

#!/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 scripts import config
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
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