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