This commit is contained in:
2025-05-05 18:15:02 +08:00
parent 01c0ec760f
commit 46d93efb3c
11 changed files with 1728 additions and 1943 deletions

View File

@@ -13,135 +13,201 @@ Rigging UI Module for Plugin
- 创建绑定
- 复制蒙皮
"""
#===================================== IMPORT MODULES =====================================
#========================================= IMPORT =========================================
from Qt import QtWidgets, QtCore, QtGui
from Qt.QtCompat import wrapInstance
from maya import OpenMayaUI as omui
import maya.cmds as cmds
import maya.mel as mel
import maya.utils as utils
import webbrowser
import subprocess
import importlib
import traceback
import locale
import sys
import os
#===================================== IMPORT FUNCTIONS ===================================
from scripts.utils import utils_rigging as utils_rigging
from scripts.ui import ui_utils
from scripts.utils import utils_rigging
#========================================== CONFIG ========================================
import config
TOOL_NAME = config.TOOL_NAME
TOOL_VERSION = config.TOOL_VERSION
TOOL_AUTHOR = config.TOOL_AUTHOR
TOOL_YEAR = config.TOOL_YEAR
TOOL_MOD_FILENAME = config.TOOL_MOD_FILENAME
TOOL_LANG = config.TOOL_LANG
TOOL_WSCL_NAME = config.TOOL_WSCL_NAME
TOOL_HELP_URL = config.TOOL_HELP_URL
TOOL_PATH = config.TOOL_PATH
SCRIPTS_PATH = config.SCRIPTS_PATH
TOOL_MAIN_SCRIPT = config.TOOL_MAIN_SCRIPT
UI_PATH = config.UI_PATH
STYLE_FILE = config.STYLE_FILE
ICONS_PATH = config.ICONS_PATH
TOOL_ICON = config.TOOL_ICON
ASSETS_PATH = config.ASSETS_PATH
DNA_FILE_PATH = config.DNA_FILE_PATH
DNA_IMG_PATH = config.DNA_IMG_PATH
TOOL_COMMAND_ICON = config.TOOL_COMMAND_ICON
#========================================= LOCATION =======================================
from scripts.ui import localization
LANG = localization.LANG
#========================================== WIDGETS ==========================================
# 全局变量存储UI控件
dna_browser_tree = None
joint_list = None
dna_info_panel = None
rig_buttons = {}
class RiggingUI(ui_utils.BaseUI):
"""
绑定系统UI类 - 负责显示骨骼绑定编辑界面和基础操作
继承自BaseUI类实现绑定系统相关的UI功能
"""
#========================================== INIT ========================================
def __init__(self):
"""
初始化绑定系统UI
创建主控件和布局,并连接信号和槽
"""
super(RiggingUI, self).__init__()
# 创建主控件
self.main_widget = QtWidgets.QWidget()
self.main_widget.setObjectName("riggingMainWidget")
# 初始化UI
self.create_widgets()
self.create_layouts()
self.create_connections()
def widgets():
"""
创建绑定系统UI控件
"""
global dna_browser_tree, joint_list, dna_info_panel, rig_buttons
# DNA浏览器树形视图
dna_browser_tree = QtWidgets.QTreeWidget()
dna_browser_tree.setHeaderLabels(["DNA文件", "版本", "修改日期"])
dna_browser_tree.setMinimumHeight(200)
# 关节列表
joint_list = QtWidgets.QListWidget()
joint_list.setMinimumHeight(150)
# DNA信息面板
dna_info_panel = QtWidgets.QTextEdit()
dna_info_panel.setReadOnly(True)
dna_info_panel.setMinimumHeight(100)
# 功能按钮
rig_buttons["load_dna"] = QtWidgets.QPushButton("加载DNA")
rig_buttons["import_joints"] = QtWidgets.QPushButton("导入骨骼")
rig_buttons["generate_body"] = QtWidgets.QPushButton("生成身体")
rig_buttons["calibrate_dna"] = QtWidgets.QPushButton("DNA校准")
rig_buttons["calibrate_joints"] = QtWidgets.QPushButton("骨骼位置校准")
rig_buttons["create_binding"] = QtWidgets.QPushButton("创建绑定")
rig_buttons["copy_skinning"] = QtWidgets.QPushButton("复制蒙皮")
rig_buttons["save_dna"] = QtWidgets.QPushButton("保存DNA")
#========================================= WIDGET =======================================
def create_widgets(self):
"""
创建绑定系统UI控件
包括按钮、标签、列表等
"""
# 标题标签
self.controls["title_label"] = QtWidgets.QLabel(LANG.get("rigging_title", "骨骼绑定"))
self.controls["title_label"].setObjectName("riggingTitleLabel")
self.controls["title_label"].setAlignment(QtCore.Qt.AlignCenter)
# 创建主分割器
self.splitters["main_splitter"] = QtWidgets.QSplitter(QtCore.Qt.Horizontal)
self.splitters["main_splitter"].setObjectName("riggingMainSplitter")
# 左侧面板
self.controls["left_panel"] = QtWidgets.QWidget()
self.controls["left_panel"].setObjectName("riggingLeftPanel")
# 右侧面板
self.controls["right_panel"] = QtWidgets.QWidget()
self.controls["right_panel"].setObjectName("riggingRightPanel")
# 左侧面板控件
# DNA浏览器组
self.controls["dna_browser_group"] = QtWidgets.QGroupBox(LANG.get("dna_browser", "DNA浏览器"))
self.controls["dna_browser_group"].setObjectName("dnaBrowserGroup")
# DNA浏览器列表
self.controls["dna_list"] = QtWidgets.QListWidget()
self.controls["dna_list"].setObjectName("dnaList")
# DNA浏览器刷新按钮
self.buttons["refresh_dna"] = QtWidgets.QPushButton(LANG.get("refresh", "刷新"))
self.buttons["refresh_dna"].setObjectName("refreshDnaButton")
# 右侧面板控件
# DNA操作组
self.controls["dna_ops_group"] = QtWidgets.QGroupBox(LANG.get("dna_operations", "DNA操作"))
self.controls["dna_ops_group"].setObjectName("dnaOpsGroup")
# DNA操作按钮
self.buttons["import_skeleton"] = QtWidgets.QPushButton(LANG.get("import_skeleton", "导入骨骼"))
self.buttons["generate_body"] = QtWidgets.QPushButton(LANG.get("generate_body", "生成身体"))
self.buttons["calibrate_dna"] = QtWidgets.QPushButton(LANG.get("calibrate_dna", "DNA校准"))
# 骨骼操作组
self.controls["skeleton_ops_group"] = QtWidgets.QGroupBox(LANG.get("skeleton_operations", "骨骼操作"))
self.controls["skeleton_ops_group"].setObjectName("skeletonOpsGroup")
# 骨骼操作按钮
self.buttons["calibrate_skeleton"] = QtWidgets.QPushButton(LANG.get("calibrate_skeleton", "骨骼位置校准"))
self.buttons["create_binding"] = QtWidgets.QPushButton(LANG.get("create_binding", "创建绑定"))
self.buttons["copy_skin"] = QtWidgets.QPushButton(LANG.get("copy_skin", "复制蒙皮"))
#========================================== LAYOUTS ==========================================
def layouts(parent_tab=None):
"""
创建绑定系统UI布局
Args:
parent_tab: 父容器控件由Main.py传入
"""
# 获取父容器在Main.py中创建的rigging_tab
if not parent_tab:
parent_tab = ui_utils.get_parent_widget("rigging_tab")
if not parent_tab:
print("无法获取父容器,布局创建失败")
return
# 创建主布局
main_layout = parent_tab.layout()
if not main_layout:
print("父容器没有布局,布局创建失败")
return
# 创建分割控件
splitter = QtWidgets.QSplitter(QtCore.Qt.Vertical)
# 上部区域 - DNA浏览器
dna_browser_group = QtWidgets.QGroupBox("DNA浏览器")
dna_browser_layout = QtWidgets.QVBoxLayout(dna_browser_group)
dna_browser_layout.addWidget(dna_browser_tree)
# 中部区域 - 关节列表
joint_list_group = QtWidgets.QGroupBox("骨骼列表")
joint_list_layout = QtWidgets.QVBoxLayout(joint_list_group)
joint_list_layout.addWidget(joint_list)
# 下部区域 - DNA信息
dna_info_group = QtWidgets.QGroupBox("DNA信息")
dna_info_layout = QtWidgets.QVBoxLayout(dna_info_group)
dna_info_layout.addWidget(dna_info_panel)
# 添加到分割控件
splitter.addWidget(dna_browser_group)
splitter.addWidget(joint_list_group)
splitter.addWidget(dna_info_group)
# 按钮区域
button_layout = QtWidgets.QGridLayout()
button_layout.addWidget(rig_buttons["load_dna"], 0, 0)
button_layout.addWidget(rig_buttons["import_joints"], 0, 1)
button_layout.addWidget(rig_buttons["generate_body"], 1, 0)
button_layout.addWidget(rig_buttons["calibrate_dna"], 1, 1)
button_layout.addWidget(rig_buttons["calibrate_joints"], 2, 0)
button_layout.addWidget(rig_buttons["create_binding"], 2, 1)
button_layout.addWidget(rig_buttons["copy_skinning"], 3, 0)
button_layout.addWidget(rig_buttons["save_dna"], 3, 1)
# 添加到主布局
main_layout.addWidget(splitter)
main_layout.addLayout(button_layout)
#========================================= LAYOUT =======================================
def create_layouts(self):
"""
创建绑定系统UI布局
组织控件的排列和层次结构
"""
# 主布局
self.layouts["main_layout"] = QtWidgets.QVBoxLayout(self.main_widget)
self.layouts["main_layout"].setContentsMargins(5, 5, 5, 5)
self.layouts["main_layout"].setSpacing(5)
# 添加标题标签
self.layouts["main_layout"].addWidget(self.controls["title_label"])
# 添加主分割器
self.layouts["main_layout"].addWidget(self.splitters["main_splitter"])
# 将左右面板添加到主分割器
self.splitters["main_splitter"].addWidget(self.controls["left_panel"])
self.splitters["main_splitter"].addWidget(self.controls["right_panel"])
# 左侧面板布局
self.layouts["left_layout"] = QtWidgets.QVBoxLayout(self.controls["left_panel"])
self.layouts["left_layout"].setContentsMargins(5, 5, 5, 5)
self.layouts["left_layout"].setSpacing(5)
# DNA浏览器组布局
self.layouts["dna_browser_layout"] = QtWidgets.QVBoxLayout(self.controls["dna_browser_group"])
self.layouts["dna_browser_layout"].addWidget(self.controls["dna_list"])
self.layouts["dna_browser_layout"].addWidget(self.buttons["refresh_dna"])
# 添加组到左侧面板布局
self.layouts["left_layout"].addWidget(self.controls["dna_browser_group"])
self.layouts["left_layout"].addStretch()
# 右侧面板布局
self.layouts["right_layout"] = QtWidgets.QVBoxLayout(self.controls["right_panel"])
self.layouts["right_layout"].setContentsMargins(5, 5, 5, 5)
self.layouts["right_layout"].setSpacing(5)
# DNA操作组布局
self.layouts["dna_ops_layout"] = QtWidgets.QVBoxLayout(self.controls["dna_ops_group"])
self.layouts["dna_ops_layout"].addWidget(self.buttons["import_skeleton"])
self.layouts["dna_ops_layout"].addWidget(self.buttons["generate_body"])
self.layouts["dna_ops_layout"].addWidget(self.buttons["calibrate_dna"])
# 骨骼操作组布局
self.layouts["skeleton_ops_layout"] = QtWidgets.QVBoxLayout(self.controls["skeleton_ops_group"])
self.layouts["skeleton_ops_layout"].addWidget(self.buttons["calibrate_skeleton"])
self.layouts["skeleton_ops_layout"].addWidget(self.buttons["create_binding"])
self.layouts["skeleton_ops_layout"].addWidget(self.buttons["copy_skin"])
# 添加组到右侧面板布局
self.layouts["right_layout"].addWidget(self.controls["dna_ops_group"])
self.layouts["right_layout"].addWidget(self.controls["skeleton_ops_group"])
self.layouts["right_layout"].addStretch()
# 创建分割器大小处理器
self.resize_handlers["main_splitter"] = ui_utils.SplitterResizeHandler(
self.main_widget, self.splitters["main_splitter"], is_horizontal=True
)
#========================================== CONNECTIONS ==========================================
def connections():
"""
连接绑定系统UI信号和槽
"""
# 连接按钮点击事件到占位函数
rig_buttons["load_dna"].clicked.connect(lambda: print("加载DNA功能待实现"))
rig_buttons["import_joints"].clicked.connect(lambda: print("导入骨骼功能待实现"))
rig_buttons["generate_body"].clicked.connect(lambda: print("生成身体功能待实现"))
rig_buttons["calibrate_dna"].clicked.connect(lambda: print("DNA校准功能待实现"))
rig_buttons["calibrate_joints"].clicked.connect(lambda: print("骨骼位置校准功能待实现"))
rig_buttons["create_binding"].clicked.connect(lambda: print("创建绑定功能待实现"))
rig_buttons["copy_skinning"].clicked.connect(lambda: print("复制蒙皮功能待实现"))
rig_buttons["save_dna"].clicked.connect(lambda: print("保存DNA功能待实现"))
# 连接树形视图选择事件
dna_browser_tree.itemSelectionChanged.connect(lambda: print("DNA文件选择已更改"))
# 连接关节列表选择事件
joint_list.itemSelectionChanged.connect(lambda: print("骨骼选择已更改"))
#===================================== PLACEHOLDER FUNCTION ===================================
def rigging_temp_function():
return utils_rigging.rigging_temp_utils_function()
#======================================= CONNECTION =====================================
def create_connections(self):
"""
连接信号和槽
设置UI控件的交互行为
"""
# DNA浏览器按钮连接
self.buttons["refresh_dna"].clicked.connect(utils_rigging.rigging_temp_utils_function)
# DNA操作按钮连接
self.buttons["import_skeleton"].clicked.connect(utils_rigging.rigging_temp_utils_function)
self.buttons["generate_body"].clicked.connect(utils_rigging.rigging_temp_utils_function)
self.buttons["calibrate_dna"].clicked.connect(utils_rigging.rigging_temp_utils_function)
# 骨骼操作按钮连接
self.buttons["calibrate_skeleton"].clicked.connect(utils_rigging.rigging_temp_utils_function)
self.buttons["create_binding"].clicked.connect(utils_rigging.rigging_temp_utils_function)
self.buttons["copy_skin"].clicked.connect(utils_rigging.rigging_temp_utils_function)