#!/usr/bin/env python # -*- coding: utf-8 -*- """ Definition UI Module for Plugin 定义系统UI模块 - 负责显示DNA定义编辑界面和基础操作 基本功能: - LOD, Meshes, Joints, Blendshape, AnimatedMap 加载和刷新 - 写入: 写入关节默认位置,写入几何体,写入蒙皮,写入混合变形目标 - 创建:创建混合变形,绑定蒙皮,取消蒙皮 - 工具:重新定位头部关节,重新定位身体关节,重新定位全身关节,快速创建预设 """ #===================================== IMPORT MODULES ===================================== from Qt import QtWidgets, QtCore, QtGui from Qt.QtCompat import wrapInstance from maya import OpenMayaUI as omui import sys import os #===================================== IMPORT FUNCTIONS =================================== from scripts.utils import utils_definition as utils_definition from scripts.ui import ui_utils #========================================== WIDGETS ========================================== # 全局变量存储UI控件 definition_tabs = None dna_elements = {} definition_buttons = {} def widgets(): """ 创建定义系统UI控件 """ global definition_tabs, dna_elements, definition_buttons # 创建子标签页 definition_tabs = QtWidgets.QTabWidget() # 创建各类元素列表 dna_elements["lod_list"] = QtWidgets.QListWidget() dna_elements["mesh_list"] = QtWidgets.QListWidget() dna_elements["joint_list"] = QtWidgets.QListWidget() dna_elements["blendshape_list"] = QtWidgets.QListWidget() dna_elements["animmap_list"] = QtWidgets.QListWidget() # 创建元素信息面板 dna_elements["element_info"] = QtWidgets.QTextEdit() dna_elements["element_info"].setReadOnly(True) # 功能按钮 definition_buttons["write_joint_defaults"] = QtWidgets.QPushButton("写入关节默认位置") definition_buttons["write_geometry"] = QtWidgets.QPushButton("写入几何体") definition_buttons["write_skinning"] = QtWidgets.QPushButton("写入蒙皮") definition_buttons["write_blendshapes"] = QtWidgets.QPushButton("写入混合变形目标") definition_buttons["create_blendshapes"] = QtWidgets.QPushButton("创建混合变形") definition_buttons["bind_skin"] = QtWidgets.QPushButton("绑定蒙皮") definition_buttons["unbind_skin"] = QtWidgets.QPushButton("取消蒙皮") definition_buttons["reposition_head"] = QtWidgets.QPushButton("重新定位头部关节") definition_buttons["reposition_body"] = QtWidgets.QPushButton("重新定位身体关节") definition_buttons["reposition_all"] = QtWidgets.QPushButton("重新定位全身关节") definition_buttons["quick_preset"] = QtWidgets.QPushButton("快速创建预设") #========================================== LAYOUTS ========================================== def layouts(parent_tab=None): """ 创建定义系统UI布局 Args: parent_tab: 父容器控件,由Main.py传入 """ # 获取父容器(在Main.py中创建的definition_tab) if not parent_tab: parent_tab = ui_utils.get_parent_widget("definition_tab") if not parent_tab: print("无法获取父容器,布局创建失败") return # 创建主布局 main_layout = parent_tab.layout() if not main_layout: print("父容器没有布局,布局创建失败") return # 创建元素标签页 elements_tab = QtWidgets.QWidget() elements_layout = QtWidgets.QVBoxLayout(elements_tab) # 创建分割控件 elements_splitter = QtWidgets.QSplitter(QtCore.Qt.Vertical) # 创建元素列表标签页 lists_tabs = QtWidgets.QTabWidget() # 创建各类元素列表标签页 lod_tab = QtWidgets.QWidget() lod_layout = QtWidgets.QVBoxLayout(lod_tab) lod_layout.addWidget(dna_elements["lod_list"]) lists_tabs.addTab(lod_tab, "LOD") mesh_tab = QtWidgets.QWidget() mesh_layout = QtWidgets.QVBoxLayout(mesh_tab) mesh_layout.addWidget(dna_elements["mesh_list"]) lists_tabs.addTab(mesh_tab, "Meshes") joint_tab = QtWidgets.QWidget() joint_layout = QtWidgets.QVBoxLayout(joint_tab) joint_layout.addWidget(dna_elements["joint_list"]) lists_tabs.addTab(joint_tab, "Joints") blendshape_tab = QtWidgets.QWidget() blendshape_layout = QtWidgets.QVBoxLayout(blendshape_tab) blendshape_layout.addWidget(dna_elements["blendshape_list"]) lists_tabs.addTab(blendshape_tab, "Blendshapes") animmap_tab = QtWidgets.QWidget() animmap_layout = QtWidgets.QVBoxLayout(animmap_tab) animmap_layout.addWidget(dna_elements["animmap_list"]) lists_tabs.addTab(animmap_tab, "AnimatedMaps") # 信息面板 info_group = QtWidgets.QGroupBox("元素信息") info_layout = QtWidgets.QVBoxLayout(info_group) info_layout.addWidget(dna_elements["element_info"]) # 添加到分割控件 elements_splitter.addWidget(lists_tabs) elements_splitter.addWidget(info_group) elements_layout.addWidget(elements_splitter) # 创建工具标签页 tools_tab = QtWidgets.QWidget() tools_layout = QtWidgets.QVBoxLayout(tools_tab) # 创建工具分组 write_group = QtWidgets.QGroupBox("写入") write_layout = QtWidgets.QVBoxLayout(write_group) write_layout.addWidget(definition_buttons["write_joint_defaults"]) write_layout.addWidget(definition_buttons["write_geometry"]) write_layout.addWidget(definition_buttons["write_skinning"]) write_layout.addWidget(definition_buttons["write_blendshapes"]) create_group = QtWidgets.QGroupBox("创建") create_layout = QtWidgets.QVBoxLayout(create_group) create_layout.addWidget(definition_buttons["create_blendshapes"]) create_layout.addWidget(definition_buttons["bind_skin"]) create_layout.addWidget(definition_buttons["unbind_skin"]) tools_group = QtWidgets.QGroupBox("工具") tools_layout2 = QtWidgets.QVBoxLayout(tools_group) tools_layout2.addWidget(definition_buttons["reposition_head"]) tools_layout2.addWidget(definition_buttons["reposition_body"]) tools_layout2.addWidget(definition_buttons["reposition_all"]) tools_layout2.addWidget(definition_buttons["quick_preset"]) # 添加到工具标签页 tools_layout.addWidget(write_group) tools_layout.addWidget(create_group) tools_layout.addWidget(tools_group) tools_layout.addStretch() # 添加标签页到主标签控件 definition_tabs.addTab(elements_tab, "元素") definition_tabs.addTab(tools_tab, "工具") # 添加到主布局 main_layout.addWidget(definition_tabs) #========================================== CONNECTIONS ========================================== def connections(): """ 连接定义系统UI信号和槽 """ # 连接按钮点击事件到占位函数 definition_buttons["write_joint_defaults"].clicked.connect(lambda: print("写入关节默认位置功能待实现")) definition_buttons["write_geometry"].clicked.connect(lambda: print("写入几何体功能待实现")) definition_buttons["write_skinning"].clicked.connect(lambda: print("写入蒙皮功能待实现")) definition_buttons["write_blendshapes"].clicked.connect(lambda: print("写入混合变形目标功能待实现")) definition_buttons["create_blendshapes"].clicked.connect(lambda: print("创建混合变形功能待实现")) definition_buttons["bind_skin"].clicked.connect(lambda: print("绑定蒙皮功能待实现")) definition_buttons["unbind_skin"].clicked.connect(lambda: print("取消蒙皮功能待实现")) definition_buttons["reposition_head"].clicked.connect(lambda: print("重新定位头部关节功能待实现")) definition_buttons["reposition_body"].clicked.connect(lambda: print("重新定位身体关节功能待实现")) definition_buttons["reposition_all"].clicked.connect(lambda: print("重新定位全身关节功能待实现")) definition_buttons["quick_preset"].clicked.connect(lambda: print("快速创建预设功能待实现")) # 连接列表选择事件 for key, widget in dna_elements.items(): if isinstance(widget, QtWidgets.QListWidget): widget.itemSelectionChanged.connect(lambda k=key: print(f"{k} 选择已更改")) # 连接标签页切换事件 definition_tabs.currentChanged.connect(lambda index: print(f"切换到标签页: {definition_tabs.tabText(index)}")) #===================================== PLACEHOLDER FUNCTION =================================== def definition_temp_function(): utils_definition.definition_temp_utils_function