This commit is contained in:
Jeffreytsai1004 2025-02-05 02:38:32 +08:00
parent 8d9898dfb7
commit 382d32c92b
2 changed files with 83 additions and 68 deletions

View File

@ -1,6 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
#===================================== IMPORT =====================================
import os import os
import sys import sys
import maya.cmds as cmds import maya.cmds as cmds
@ -29,7 +30,7 @@ def Qt():
QtCore, QtGui, QtWidgets = Qt() QtCore, QtGui, QtWidgets = Qt()
#===================================== 2. Global Variables ===================================== #===================================== BASE VARIBLES =====================================
try: try:
ROOT_PATH = os.path.dirname(INSTALL_PATH).replace("\\", "/") ROOT_PATH = os.path.dirname(INSTALL_PATH).replace("\\", "/")
except NameError: except NameError:
@ -42,7 +43,7 @@ TOOL_LANG = 'en_US'
TOOL_WSCL_NAME = f"{TOOL_NAME}WorkSpaceControl" TOOL_WSCL_NAME = f"{TOOL_NAME}WorkSpaceControl"
TOOL_HELP_URL = f"https://gitea.cgnico.com/CGNICO/{TOOL_NAME}/wiki" TOOL_HELP_URL = f"https://gitea.cgnico.com/CGNICO/{TOOL_NAME}/wiki"
#===================================== 3. Paths ===================================== #===================================== PATHS =====================================
# PATHS # PATHS
SCRIPTS_PATH = os.path.join(ROOT_PATH, "scripts").replace("\\", "/") SCRIPTS_PATH = os.path.join(ROOT_PATH, "scripts").replace("\\", "/")
ICONS_PATH = os.path.join(ROOT_PATH, "resources", "icons").replace("\\", "/") ICONS_PATH = os.path.join(ROOT_PATH, "resources", "icons").replace("\\", "/")
@ -51,12 +52,11 @@ STYLES_PATH = os.path.join(ROOT_PATH, "resources", "styles").replace("\\", "/")
DNA_PATH = os.path.join(ROOT_PATH, "resources", "dna").replace("\\", "/") DNA_PATH = os.path.join(ROOT_PATH, "resources", "dna").replace("\\", "/")
DNA_IMG_PATH = os.path.join(ROOT_PATH, "resources", "img").replace("\\", "/") DNA_IMG_PATH = os.path.join(ROOT_PATH, "resources", "img").replace("\\", "/")
# 统一系统信息获取 #===================================== 4. PYTON_VERSION_PATH =====================================
SYSTEM_OS = "Windows" if cmds.about(os=True).lower().startswith("win") else "Linux" SYSTEM_OS = "Windows" if cmds.about(os=True).lower().startswith("win") else "Linux"
MAYA_VERSION = str(int(cmds.about(version=True).split(".")[0])) # 直接获取最新版本 MAYA_VERSION = str(int(cmds.about(version=True).split(".")[0])) # 直接获取最新版本
#===================================== 获取Python版本路径 =====================================
# 必须先定义PYTHON_VERSION # 必须先定义PYTHON_VERSION
PYTHON_VERSION = sys.version PYTHON_VERSION = sys.version
# 去掉小数点比如3.10.8 → 3108 # 去掉小数点比如3.10.8 → 3108
@ -79,7 +79,7 @@ PYTHON_VERSION_MAP = {
# 按照映射表获取PYTHON_VERSION_DIR # 按照映射表获取PYTHON_VERSION_DIR
PYTHON_VERSION_DIR = PYTHON_VERSION_MAP.get(version_tuple, "python3") # 如果找不到对应版本,默认使用 python3 PYTHON_VERSION_DIR = PYTHON_VERSION_MAP.get(version_tuple, "python3") # 如果找不到对应版本,默认使用 python3
#===================================== 3. Files ===================================== #===================================== FILES =====================================
# FILES # FILES
TOOL_MAIN_SCRIPT = os.path.join(SCRIPTS_PATH, f"{TOOL_NAME}.py").replace("\\", "/") TOOL_MAIN_SCRIPT = os.path.join(SCRIPTS_PATH, f"{TOOL_NAME}.py").replace("\\", "/")
TOOL_STYLE_FILE = os.path.join(STYLES_PATH, "style.qss").replace("\\", "/") TOOL_STYLE_FILE = os.path.join(STYLES_PATH, "style.qss").replace("\\", "/")
@ -91,7 +91,7 @@ TOOL_MOD_FILENAME = f"{TOOL_NAME}.mod"
PLUGIN_PATH = os.path.join(ROOT_PATH, "plugins", SYSTEM_OS, MAYA_VERSION).replace("\\", "/") PLUGIN_PATH = os.path.join(ROOT_PATH, "plugins", SYSTEM_OS, MAYA_VERSION).replace("\\", "/")
PYDNA_PATH = os.path.join(ROOT_PATH, "plugins", SYSTEM_OS, "pydna", PYTHON_VERSION_DIR).replace("\\", "/") PYDNA_PATH = os.path.join(ROOT_PATH, "plugins", SYSTEM_OS, "pydna", PYTHON_VERSION_DIR).replace("\\", "/")
#===================================== 4. 新增工具路径 ===================================== #===================================== TOOLS =====================================
# 新增工具路径 # 新增工具路径
BUILDER_PATH = os.path.join(SCRIPTS_PATH, "builder").replace("\\", "/") BUILDER_PATH = os.path.join(SCRIPTS_PATH, "builder").replace("\\", "/")
DNALIB_PATH = os.path.join(SCRIPTS_PATH, "dnalib").replace("\\", "/") DNALIB_PATH = os.path.join(SCRIPTS_PATH, "dnalib").replace("\\", "/")

View File

@ -161,10 +161,8 @@ class MainWindow(QtWidgets.QMainWindow):
# 文件菜单 # 文件菜单
file_menu = menubar.addMenu("文件") file_menu = menubar.addMenu("文件")
self.add_menu_action(file_menu, "打开DNA", self.add_menu_action(file_menu, "打开DNA", "open.png", lambda: self.load_dna())
lambda: self.load_dna(), "open.png") self.add_menu_action(file_menu, "保存DNA", "save.png", lambda: self.save_dna())
self.add_menu_action(file_menu, "保存DNA",
lambda: self.save_dna(), "save.png")
self.add_menu_action(file_menu, "加载当前项目的DNA", "open.png", self.on_load_project_dna) self.add_menu_action(file_menu, "加载当前项目的DNA", "open.png", self.on_load_project_dna)
self.add_menu_action(file_menu, "修改混合目标名称", "rename.png", self.on_rename_blend_target) self.add_menu_action(file_menu, "修改混合目标名称", "rename.png", self.on_rename_blend_target)
self.add_menu_action(file_menu, "重置混合目标名称", "resetname.png", self.on_reset_blend_target) self.add_menu_action(file_menu, "重置混合目标名称", "resetname.png", self.on_reset_blend_target)
@ -213,14 +211,36 @@ class MainWindow(QtWidgets.QMainWindow):
self.add_menu_action(help_menu, "帮助文档", "help.png", self.show_help_document) self.add_menu_action(help_menu, "帮助文档", "help.png", self.show_help_document)
self.add_menu_action(help_menu, "关于", "warning.png", self.show_about_dialog) self.add_menu_action(help_menu, "关于", "warning.png", self.show_about_dialog)
def add_menu_action(self, menu, text, callback, icon=None): def add_menu_action(self, menu, text, icon, callback):
"""通用菜单项添加方法""" """通用菜单项添加方法"""
action = QtWidgets.QAction(text, self) action = QtWidgets.QAction(text, self)
if icon: if icon:
action.setIcon(QtGui.QIcon(os.path.join(data.ICONS_PATH, icon))) # 优先使用Maya内置图标
maya_icon = self.get_maya_icon(icon)
if maya_icon:
action.setIcon(maya_icon)
else:
# 使用自定义图标
icon_path = os.path.join(data.ICONS_PATH, icon)
if os.path.exists(icon_path):
action.setIcon(QtGui.QIcon(icon_path))
else:
cmds.warning(f"图标文件不存在: {icon_path}")
action.triggered.connect(callback) action.triggered.connect(callback)
menu.addAction(action) menu.addAction(action)
def get_maya_icon(self, icon_name):
"""获取Maya内置图标"""
maya_icons = {
"bakeAnimation.png": "BakeSimulation.png",
"centerCurrentTime.png": "timeCurrentFrame.png",
"export_skin.png": "kinReroot.png",
# 添加更多图标映射...
}
if icon_name in maya_icons:
return QtGui.QIcon(f":/{maya_icons[icon_name]}")
return None
def create_toolbar(self): def create_toolbar(self):
"""创建工具栏""" """创建工具栏"""
toolbar = self.addToolBar("主工具栏") toolbar = self.addToolBar("主工具栏")
@ -414,66 +434,61 @@ class MainWindow(QtWidgets.QMainWindow):
# 创建DNA管理器 # 创建DNA管理器
self.dna_manager = DNAManager() self.dna_manager = DNAManager()
def on_load_dna(self): def on_load_dna(self): pass
pass def on_save_dna(self): pass
def on_export_fbx(self): pass
def on_save_dna(self): def on_open_dna(self): pass
pass def on_load_project_dna(self): pass
def on_rename_blend_target(self): pass
def on_export_fbx(self): def on_reset_blend_target(self): pass
pass def create_rl4_node(self): pass
def delete_rl4_node(self): pass
def mirror_left_to_right(self): pass
def mirror_right_to_left(self): pass
def pose_A_to_T(self): pass
def pose_T_to_A(self): pass
def transfer_lod_texture(self): pass
def set_joint_color(self): pass
def unmark_all(self): pass
def rebuild_targets(self): pass
def bake_all_animations(self): pass
def bake_all_keyframes(self): pass
def safe_shutdown(self): pass
def export_skin(self): pass
def import_skin(self): pass
def copy_skin(self): pass
def create_blend_shape(self): pass
def quick_bind_clothing(self): pass
def clone_blend_shape(self): pass
def repair_vertex_order(self): pass
def create_face_controller(self): pass
def extract_52BS(self): pass
def repair_joint_axis(self): pass
def create_body_controller(self): pass
def import_face_animation(self): pass
def import_body_animation(self): pass
def on_open_dna(self): # 添加语言支持方法
pass def set_chinese(self):
"""设置中文界面"""
print("切换中文界面(待实现)")
# TODO: 实现国际化切换
def on_load_project_dna(self): def set_english(self):
pass """设置英文界面"""
print("切换英文界面(待实现)")
# TODO: 实现国际化切换
def on_rename_blend_target(self): # 添加帮助相关方法
pass def show_help_document(self):
"""显示帮助文档"""
def on_reset_blend_target(self): print("打开帮助文档(待实现)")
pass # TODO: 实现帮助文档打开逻辑
def create_rl4_node(self):
pass
def delete_rl4_node(self):
pass
def mirror_left_to_right(self):
pass
def mirror_right_to_left(self):
pass
def pose_A_to_T(self):
pass
def pose_T_to_A(self):
pass
def transfer_lod_texture(self):
pass
def set_joint_color(self):
pass
def unmark_all(self):
pass
def rebuild_targets(self):
pass
def bake_all_animations(self):
pass
def bake_all_keyframes(self):
pass
def safe_shutdown(self):
pass
def show_about_dialog(self):
"""显示关于对话框"""
print("显示关于信息(待实现)")
# TODO: 实现关于对话框
# ===================================== 显示主窗口 ===================================== # ===================================== 显示主窗口 =====================================
def get_maya_window(): def get_maya_window():