This commit is contained in:
2025-05-02 00:14:28 +08:00
commit 6f27dc11e3
132 changed files with 28609 additions and 0 deletions

233
scripts/ui/behaviour.py Normal file
View File

@@ -0,0 +1,233 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Behaviour UI Module for Plugin
行为系统UI模块 - 负责显示角色行为编辑界面和基础操作
基本功能:
- Blendshape自动加载刷新筛选
- 次级Blendshape自动加载刷新筛选
- Blendshape批量导出和导入
- Blendshape范围编辑
- Blendshape镜像
- Blendshape查找翻转目标
- Blendshape重建
- 表情控制器还原默认表情
- 查找选择表情
- 控制面板查找
- 选择关联关节
- 写入当前表情
- 写入镜像表情
"""
#===================================== 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_behaviour as utils_behaviour
from scripts.ui import ui_utils
#========================================== WIDGETS ==========================================
# 全局变量存储UI控件
blendshape_tree = None
sub_blendshape_tree = None
blendshape_slider = None
blendshape_preview = None
behaviour_buttons = {}
def widgets():
"""
创建行为系统UI控件
"""
global blendshape_tree, sub_blendshape_tree, blendshape_slider, blendshape_preview, behaviour_buttons
# 混合变形树形视图
blendshape_tree = QtWidgets.QTreeWidget()
blendshape_tree.setHeaderLabels(["混合变形名称", "权重", "类型"])
blendshape_tree.setMinimumHeight(200)
blendshape_tree.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
blendshape_tree.header().setSectionResizeMode(QtWidgets.QHeaderView.Stretch) # 列自动拉伸
# 次级混合变形树形视图
sub_blendshape_tree = QtWidgets.QTreeWidget()
sub_blendshape_tree.setHeaderLabels(["次级混合变形", "权重", "目标"])
sub_blendshape_tree.setMinimumHeight(150)
sub_blendshape_tree.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sub_blendshape_tree.header().setSectionResizeMode(QtWidgets.QHeaderView.Stretch) # 列自动拉伸
# 混合变形滑块
blendshape_slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
blendshape_slider.setMinimum(0)
blendshape_slider.setMaximum(100)
blendshape_slider.setValue(0)
blendshape_slider.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
# 预览区域
blendshape_preview = QtWidgets.QLabel("预览区域")
blendshape_preview.setAlignment(QtCore.Qt.AlignCenter)
blendshape_preview.setStyleSheet("background-color: #333333; color: white;")
blendshape_preview.setMinimumHeight(150)
blendshape_preview.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
# 功能按钮 - 设置统一的大小策略
button_names = [
"refresh_blendshapes", "refresh_sub_blendshapes", "export_blendshapes", "import_blendshapes",
"edit_range", "mirror_blendshape", "find_flip_target", "rebuild_blendshape",
"reset_controller", "find_expression", "find_control_panel", "select_related_joints",
"write_current_expression", "write_mirror_expression"
]
button_texts = {
"refresh_blendshapes": "刷新混合变形",
"refresh_sub_blendshapes": "刷新次级混合变形",
"export_blendshapes": "导出混合变形",
"import_blendshapes": "导入混合变形",
"edit_range": "范围编辑",
"mirror_blendshape": "混合变形镜像",
"find_flip_target": "查找翻转目标",
"rebuild_blendshape": "重建混合变形",
"reset_controller": "还原默认表情",
"find_expression": "查找选择表情",
"find_control_panel": "控制面板查找",
"select_related_joints": "选择关联关节",
"write_current_expression": "写入当前表情",
"write_mirror_expression": "写入镜像表情"
}
for button_name in button_names:
behaviour_buttons[button_name] = QtWidgets.QPushButton(button_texts[button_name])
behaviour_buttons[button_name].setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
behaviour_buttons[button_name].setMinimumWidth(120)
#========================================== LAYOUTS ==========================================
def layouts(parent_tab=None):
"""
创建行为系统UI布局
Args:
parent_tab: 父容器控件由Main.py传入
"""
# 获取父容器在Main.py中创建的behaviour_tab
if not parent_tab:
parent_tab = ui_utils.get_parent_widget("behaviour_tab")
if not parent_tab:
print("无法获取父容器,布局创建失败")
return
# 创建主布局
main_layout = parent_tab.layout()
if not main_layout:
main_layout = QtWidgets.QVBoxLayout(parent_tab)
main_layout.setContentsMargins(4, 4, 4, 4)
main_layout.setSpacing(4)
main_layout.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint) # 设置布局约束为默认,允许自适应
# 创建主分割控件
main_splitter = QtWidgets.QSplitter(QtCore.Qt.Horizontal)
# 左侧区域 - 混合变形列表
left_widget = QtWidgets.QWidget()
left_layout = QtWidgets.QVBoxLayout(left_widget)
left_layout.setContentsMargins(2, 2, 2, 2)
# 混合变形列表区域
blendshape_group = QtWidgets.QGroupBox("混合变形列表")
blendshape_layout = QtWidgets.QVBoxLayout(blendshape_group)
# 添加刷新按钮
refresh_layout = QtWidgets.QHBoxLayout()
refresh_layout.addWidget(behaviour_buttons["refresh_blendshapes"])
refresh_layout.addWidget(behaviour_buttons["refresh_sub_blendshapes"])
blendshape_layout.addLayout(refresh_layout)
# 创建列表分割控件
list_splitter = QtWidgets.QSplitter(QtCore.Qt.Vertical)
list_splitter.addWidget(blendshape_tree)
list_splitter.addWidget(sub_blendshape_tree)
blendshape_layout.addWidget(list_splitter)
# 添加滑块
slider_layout = QtWidgets.QHBoxLayout()
slider_layout.addWidget(QtWidgets.QLabel("权重:"))
slider_layout.addWidget(blendshape_slider)
slider_layout.addWidget(QtWidgets.QLabel("0"))
blendshape_layout.addLayout(slider_layout)
left_layout.addWidget(blendshape_group)
# 左侧按钮组
left_buttons_layout = QtWidgets.QGridLayout()
left_buttons_layout.addWidget(behaviour_buttons["export_blendshapes"], 0, 0)
left_buttons_layout.addWidget(behaviour_buttons["import_blendshapes"], 0, 1)
left_buttons_layout.addWidget(behaviour_buttons["edit_range"], 1, 0)
left_buttons_layout.addWidget(behaviour_buttons["mirror_blendshape"], 1, 1)
left_buttons_layout.addWidget(behaviour_buttons["find_flip_target"], 2, 0)
left_buttons_layout.addWidget(behaviour_buttons["rebuild_blendshape"], 2, 1)
left_layout.addLayout(left_buttons_layout)
# 右侧区域 - 预览和工具
right_widget = QtWidgets.QWidget()
right_layout = QtWidgets.QVBoxLayout(right_widget)
right_layout.setContentsMargins(2, 2, 2, 2)
# 预览区域
preview_group = QtWidgets.QGroupBox("预览")
preview_layout = QtWidgets.QVBoxLayout(preview_group)
preview_layout.addWidget(blendshape_preview)
right_layout.addWidget(preview_group)
# 右侧按钮组
right_buttons_layout = QtWidgets.QGridLayout()
right_buttons_layout.addWidget(behaviour_buttons["reset_controller"], 0, 0)
right_buttons_layout.addWidget(behaviour_buttons["find_expression"], 0, 1)
right_buttons_layout.addWidget(behaviour_buttons["find_control_panel"], 1, 0)
right_buttons_layout.addWidget(behaviour_buttons["select_related_joints"], 1, 1)
right_buttons_layout.addWidget(behaviour_buttons["write_current_expression"], 2, 0)
right_buttons_layout.addWidget(behaviour_buttons["write_mirror_expression"], 2, 1)
right_layout.addLayout(right_buttons_layout)
# 添加到主分割控件
main_splitter.addWidget(left_widget)
main_splitter.addWidget(right_widget)
# 设置分割比例
main_splitter.setSizes([int(parent_tab.width() * 0.6), int(parent_tab.width() * 0.4)])
# 添加到主布局
main_layout.addWidget(main_splitter)
#========================================== CONNECTIONS ==========================================
def connections():
"""
连接行为系统UI信号和槽
"""
# 连接按钮点击事件到占位函数
behaviour_buttons["refresh_blendshapes"].clicked.connect(lambda: print("刷新混合变形功能待实现"))
behaviour_buttons["refresh_sub_blendshapes"].clicked.connect(lambda: print("刷新次级混合变形功能待实现"))
behaviour_buttons["export_blendshapes"].clicked.connect(lambda: print("导出混合变形功能待实现"))
behaviour_buttons["import_blendshapes"].clicked.connect(lambda: print("导入混合变形功能待实现"))
behaviour_buttons["edit_range"].clicked.connect(lambda: print("范围编辑功能待实现"))
behaviour_buttons["mirror_blendshape"].clicked.connect(lambda: print("混合变形镜像功能待实现"))
behaviour_buttons["find_flip_target"].clicked.connect(lambda: print("查找翻转目标功能待实现"))
behaviour_buttons["rebuild_blendshape"].clicked.connect(lambda: print("重建混合变形功能待实现"))
behaviour_buttons["reset_controller"].clicked.connect(lambda: print("还原默认表情功能待实现"))
behaviour_buttons["find_expression"].clicked.connect(lambda: print("查找选择表情功能待实现"))
behaviour_buttons["find_control_panel"].clicked.connect(lambda: print("控制面板查找功能待实现"))
behaviour_buttons["select_related_joints"].clicked.connect(lambda: print("选择关联关节功能待实现"))
behaviour_buttons["write_current_expression"].clicked.connect(lambda: print("写入当前表情功能待实现"))
behaviour_buttons["write_mirror_expression"].clicked.connect(lambda: print("写入镜像表情功能待实现"))
# 连接树形视图选择事件
blendshape_tree.itemSelectionChanged.connect(lambda: print("混合变形选择已更改"))
sub_blendshape_tree.itemSelectionChanged.connect(lambda: print("次级混合变形选择已更改"))
# 连接滑块值变化事件
blendshape_slider.valueChanged.connect(lambda value: print(f"混合变形权重已更改为: {value/100.0}"))
#===================================== PLACEHOLDER FUNCTION ===================================
def behaviour_temp_function():
return utils_behaviour.behaviour_temp_utils_function()