Update
This commit is contained in:
@@ -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)
|
Reference in New Issue
Block a user