2025-02-09 22:11:50 +08:00
|
|
|
|
#!/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
|
|
|
|
|
|
2025-02-09 23:22:48 +08:00
|
|
|
|
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)
|
2025-02-09 22:11:50 +08:00
|
|
|
|
|
2025-02-09 23:22:48 +08:00
|
|
|
|
# ================================ 事件函数 ================================
|
|
|
|
|
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
|
2025-02-09 22:11:50 +08:00
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
pass
|