Files
MetaFusion/scripts/utils/utils_behaviour.py
2025-05-09 11:11:17 +08:00

397 lines
10 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 function module
行为系统功能模块 - 提供行为系统相关的功能函数
"""
#===================================== IMPORT MODULES =====================================
import maya.cmds as cmds
import pymel.core as pm
import maya.mel as mel
from maya import OpenMayaUI as omui
from ui.Qt import QtWidgets, QtCore, QtGui
from ui.Qt.QtCompat import wrapInstance
import webbrowser
import subprocess
import importlib
import traceback
import sys
import os
# 导入配置
import config
TOOL_NAME = config.TOOL_NAME
TOOL_VERSION = config.TOOL_VERSION
TOOL_AUTHOR = config.TOOL_AUTHOR
TOOL_YEAR = config.TOOL_YEAR
TOOL_MOD_FILENAME = config.TOOL_MOD_FILENAME
TOOL_LANG = config.TOOL_LANG
TOOL_WSCL_NAME = config.TOOL_WSCL_NAME
TOOL_HELP_URL = config.TOOL_HELP_URL
TOOL_PATH = config.TOOL_PATH
SCRIPTS_PATH = config.SCRIPTS_PATH
TOOL_MAIN_SCRIPT = config.TOOL_MAIN_SCRIPT
UI_PATH = config.UI_PATH
STYLE_FILE = config.STYLE_FILE
ICONS_PATH = config.ICONS_PATH
TOOL_ICON = config.TOOL_ICON
ASSETS_PATH = config.ASSETS_PATH
DNA_FILE_PATH = config.DNA_FILE_PATH
DNA_IMG_PATH = config.DNA_IMG_PATH
TOOL_COMMAND_ICON = config.TOOL_COMMAND_ICON
TOOL_WIDTH = config.TOOL_WIDTH
TOOL_HEIGHT = config.TOOL_HEIGHT
# Localization
from scripts.ui import localization
TEXT = localization.TEXT
#========================================== FUNCTIONS ========================================
# 左侧面板功能
# 搜索相关功能
# def filter_controls(text):
# """
# 过滤控制列表
# """
# print(f"过滤控制列表: {text}")
# # 这里实现过滤控制列表的功能
# return True
# 控制列表相关功能
# def control_selected(item):
# """
# 控制项目被选中
# """
# print(f"控制项目被选中: {item.text()}")
# # 这里实现控制项目选中的功能
# return True
# def update_control_selection():
# """更新控制器选择"""
# try:
# print("更新控制器选择")
# except Exception as e:
# print(f"更新控制器选择时出错: {str(e)}")
# def update_control_value(value):
# """更新控制器值"""
# try:
# print(f"更新控制器值: {value}")
# except Exception as e:
# print(f"更新控制器值时出错: {str(e)}")
# def switch_page(page):
# """切换页面"""
# try:
# print(f"切换到页面: {page}")
# except Exception as e:
# print(f"切换页面时出错: {str(e)}")
# 页码相关功能
# def decrease_range():
# """
# 减小范围
# """
# print("减小范围")
# # 这里实现减小范围的功能
# return True
# def increase_range():
# """
# 增加范围
# """
# print("增加范围")
# # 这里实现增加范围的功能
# return True
# 右侧面板功能
# BlendShapes相关功能
# def blendshape_selected(item):
# """
# 混合形状项目被选中
# """
# print(f"混合形状项目被选中: {item.text()}")
# # 这里实现混合形状项目选中的功能
# return True
def flip_target():
"""翻转目标"""
try:
print("翻转目标")
except Exception as e:
print(f"翻转目标时出错: {str(e)}")
def mirror_target():
"""镜像目标"""
try:
print("镜像目标")
except Exception as e:
print(f"镜像目标时出错: {str(e)}")
def find_flip_target():
"""查找翻转目标"""
try:
print("查找翻转目标")
except Exception as e:
print(f"查找翻转目标时出错: {str(e)}")
def add_blendshape():
"""添加BlendShape"""
try:
print("添加BlendShape")
except Exception as e:
print(f"添加BlendShape时出错: {str(e)}")
def delete_blendshape():
"""删除BlendShape"""
try:
print("删除BlendShape")
except Exception as e:
print(f"删除BlendShape时出错: {str(e)}")
def batch_blendshape():
"""批量处理BlendShape"""
try:
print("批量处理BlendShape")
except Exception as e:
print(f"批量处理BlendShape时出错: {str(e)}")
def rebuild_select():
"""重建选择"""
try:
print("重建选择")
except Exception as e:
print(f"重建选择时出错: {str(e)}")
def reposition():
"""重新定位"""
try:
print("重新定位")
except Exception as e:
print(f"重新定位时出错: {str(e)}")
def blend_select():
"""混合选择"""
try:
print("混合选择")
except Exception as e:
print(f"混合选择时出错: {str(e)}")
def reset_default_expression():
"""重置默认表情"""
try:
print("重置默认表情")
except Exception as e:
print(f"重置默认表情时出错: {str(e)}")
def find_select_expression():
"""查找选择表情"""
try:
print("查找选择表情")
except Exception as e:
print(f"查找选择表情时出错: {str(e)}")
def write_current_expressions():
"""写入当前表情"""
try:
print("写入当前表情")
except Exception as e:
print(f"写入当前表情时出错: {str(e)}")
def controller_find():
"""控制器查找"""
try:
print("控制器查找")
except Exception as e:
print(f"控制器查找时出错: {str(e)}")
def select_associated_joint():
"""选择关联关节"""
try:
print("选择关联关节")
except Exception as e:
print(f"选择关联关节时出错: {str(e)}")
def write_find_mirror():
"""写入查找镜像"""
try:
print("写入查找镜像")
except Exception as e:
print(f"写入查找镜像时出错: {str(e)}")
# UI事件处理相关的功能函数
def on_selection_changed(ui_instance):
"""
处理Maya选择变化事件
Args:
ui_instance: UI实例对象
"""
print("选择变化事件触发")
# 这里将来会实现选择变化的处理逻辑
# 目前仅作为占位函数
def switch_tab(ui_instance, index):
"""
切换标签页
Args:
ui_instance: UI实例对象
index (int): 标签页索引
"""
if hasattr(ui_instance, 'controls') and 'bottom_tab_widget' in ui_instance.controls:
ui_instance.controls["bottom_tab_widget"].setCurrentIndex(index)
print(f"切换到标签页: {index}")
def adjust_range(delta):
"""
调整滑块范围
Args:
delta (float): 范围调整值
"""
if delta > 0:
"""
增加范围
"""
print("增加范围")
# 这里实现增加范围的功能
return True
else:
"""
减小范围
"""
print("减小范围")
# 这里实现减小范围的功能
return True
def on_raw_slider_changed(value):
"""
更新左侧滑块数值显示
Args:
value (int): 滑块值
Returns:
float: 标准化后的值(0-1范围)
"""
# 将滑块值转换为0-1范围的浮点数并显示3位小数
normalized_value = value / 100.0
# 获取UI实例并更新显示
from scripts.ui import behaviour
behaviour_ui = behaviour.BehaviourUI.get_instance()
if behaviour_ui and hasattr(behaviour_ui, 'controls'):
behaviour_ui.controls["raw_slider_value"].setText(f"{normalized_value:.3f}")
# 更新控制值
try:
print(f"更新控制器值: {value}")
except Exception as e:
print(f"更新控制器值时出错: {str(e)}")
return normalized_value
def on_bs_slider_changed(value):
"""
更新右侧BS滑块数值显示
Args:
value (int): 滑块值
Returns:
float: 标准化后的值(0-1范围)
"""
# 将滑块值转换为0-1范围的浮点数并显示3位小数
normalized_value = value / 100.0
# 获取UI实例并更新显示
from scripts.ui import behaviour
behaviour_ui = behaviour.BehaviourUI.get_instance()
if behaviour_ui and hasattr(behaviour_ui, 'controls'):
behaviour_ui.controls["bs_slider_value"].setText(f"{normalized_value:.3f}")
# 更新BlendShape值
try:
print(f"更新BlendShape值: {value}")
except Exception as e:
print(f"更新BlendShape值时出错: {str(e)}")
return normalized_value
def on_bottom_slider_changed(value):
"""
更新底部主滑块数值显示
Args:
value (int): 滑块值
Returns:
float: 标准化后的值(0-1范围)
"""
# 将滑块值转换为0-1范围的浮点数并显示3位小数
normalized_value = value / 100.0
# 获取UI实例并更新显示
from scripts.ui import behaviour
behaviour_ui = behaviour.BehaviourUI.get_instance()
if behaviour_ui and hasattr(behaviour_ui, 'controls'):
behaviour_ui.controls["bottom_slider_value"].setText(f"{normalized_value:.3f}")
# 更新主值
update_main_value(value)
try:
print(f"更新BlendShape值: {value}")
except Exception as e:
print(f"更新BlendShape值时出错: {str(e)}")
return normalized_value
def on_control_selection_changed():
"""更新控制器选择"""
try:
print("更新控制器选择")
except Exception as e:
print(f"更新控制器选择时出错: {str(e)}")
def on_blendshape_selection_changed():
"""处理BlendShape列表选择变化"""
print("BlendShape列表选择变化")
try:
print("更新BlendShape选择")
except Exception as e:
print(f"更新BlendShape选择时出错: {str(e)}")
def adjust_bs_range(delta):
"""
调整BlendShape滑块范围
Args:
delta (float): 范围调整值
"""
print(f"调整BlendShape滑块范围: {delta}")
if delta > 0:
"""
增加范围
"""
print("增加范围")
# 这里实现增加范围的功能
return True
else:
"""
减小范围
"""
print("减小范围")
# 这里实现减小范围的功能
return True
def reposition_joints():
"""
重新定位关节
根据当前选择的模型重新定位关节位置
"""
print("重新定位关节...")
# 这里将来会实现关节重新定位的功能
# 目前仅作为占位函数
cmds.warning("关节重新定位功能尚未实现")