233 lines
11 KiB
Python
233 lines
11 KiB
Python
#!/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() |