Files
MetaFusion/scripts/ui/definition.py
2025-05-02 00:14:28 +08:00

197 lines
8.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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