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

233 lines
11 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 -*-
"""
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()