Update rigging.py

This commit is contained in:
2025-05-06 08:41:36 +08:00
parent 32c4ee33d6
commit d27ef50341

View File

@@ -59,77 +59,6 @@ class RiggingUI(ui_utils.BaseUI):
绑定系统UI类 - 负责显示骨骼绑定编辑界面和基础操作
继承自BaseUI类实现绑定系统相关的UI功能
"""
#======================================= FUNCTIONS ======================================
def connect_ui_signals(self):
"""
连接UI信号和槽
设置UI控件的事件处理函数
"""
# 创建信号映射字典
signal_mapping = {
'buttons': {
'add_joint_btn': {'signal': 'clicked', 'handler': utils_rigging.add_joint},
'remove_joint_btn': {'signal': 'clicked', 'handler': utils_rigging.remove_joint},
'duplicate_joint_btn': {'signal': 'clicked', 'handler': utils_rigging.duplicate_joint},
'add_controller_btn': {'signal': 'clicked', 'handler': utils_rigging.add_controller},
'remove_controller_btn': {'signal': 'clicked', 'handler': utils_rigging.remove_controller},
'duplicate_controller_btn': {'signal': 'clicked', 'handler': utils_rigging.duplicate_controller},
'import_dna_btn': {'signal': 'clicked', 'handler': utils_rigging.import_dna},
'export_dna_btn': {'signal': 'clicked', 'handler': utils_rigging.export_dna},
'calibrate_dna_btn': {'signal': 'clicked', 'handler': utils_rigging.calibrate_dna},
},
'splitters': {
'main_splitter': {'signal': 'splitterMoved', 'handler': lambda pos, index: ui_utils.on_splitter_moved(self, pos, index)},
}
}
# 使用ui_utils中的通用函数连接信号
ui_utils.connect_ui_signals(self, signal_mapping)
# 连接关节属性编辑控件
if hasattr(self, 'joint_name_edit'):
self.joint_name_edit.editingFinished.connect(lambda: utils_rigging.handle_joint_name_changed(self.joint_name_edit))
# 关节位置编辑
if hasattr(self, 'joint_pos_x_spin'):
self.joint_pos_x_spin.valueChanged.connect(lambda val: utils_rigging.handle_joint_position_changed(0, [self.joint_pos_x_spin, self.joint_pos_y_spin, self.joint_pos_z_spin]))
if hasattr(self, 'joint_pos_y_spin'):
self.joint_pos_y_spin.valueChanged.connect(lambda val: utils_rigging.handle_joint_position_changed(1, [self.joint_pos_x_spin, self.joint_pos_y_spin, self.joint_pos_z_spin]))
if hasattr(self, 'joint_pos_z_spin'):
self.joint_pos_z_spin.valueChanged.connect(lambda val: utils_rigging.handle_joint_position_changed(2, [self.joint_pos_x_spin, self.joint_pos_y_spin, self.joint_pos_z_spin]))
# 关节旋转编辑
if hasattr(self, 'joint_rot_x_spin'):
self.joint_rot_x_spin.valueChanged.connect(lambda val: utils_rigging.handle_joint_rotation_changed(0, [self.joint_rot_x_spin, self.joint_rot_y_spin, self.joint_rot_z_spin]))
if hasattr(self, 'joint_rot_y_spin'):
self.joint_rot_y_spin.valueChanged.connect(lambda val: utils_rigging.handle_joint_rotation_changed(1, [self.joint_rot_x_spin, self.joint_rot_y_spin, self.joint_rot_z_spin]))
if hasattr(self, 'joint_rot_z_spin'):
self.joint_rot_z_spin.valueChanged.connect(lambda val: utils_rigging.handle_joint_rotation_changed(2, [self.joint_rot_x_spin, self.joint_rot_y_spin, self.joint_rot_z_spin]))
# 关节缩放编辑
if hasattr(self, 'joint_scale_x_spin'):
self.joint_scale_x_spin.valueChanged.connect(lambda val: utils_rigging.handle_joint_scale_changed(0, [self.joint_scale_x_spin, self.joint_scale_y_spin, self.joint_scale_z_spin]))
if hasattr(self, 'joint_scale_y_spin'):
self.joint_scale_y_spin.valueChanged.connect(lambda val: utils_rigging.handle_joint_scale_changed(1, [self.joint_scale_x_spin, self.joint_scale_y_spin, self.joint_scale_z_spin]))
if hasattr(self, 'joint_scale_z_spin'):
self.joint_scale_z_spin.valueChanged.connect(lambda val: utils_rigging.handle_joint_scale_changed(2, [self.joint_scale_x_spin, self.joint_scale_y_spin, self.joint_scale_z_spin]))
# 关节属性应用和重置按钮
if "apply_joint_props_btn" in self.buttons:
pos_widgets = [self.joint_pos_x_spin, self.joint_pos_y_spin, self.joint_pos_z_spin] if all(hasattr(self, attr) for attr in ['joint_pos_x_spin', 'joint_pos_y_spin', 'joint_pos_z_spin']) else None
rot_widgets = [self.joint_rot_x_spin, self.joint_rot_y_spin, self.joint_rot_z_spin] if all(hasattr(self, attr) for attr in ['joint_rot_x_spin', 'joint_rot_y_spin', 'joint_rot_z_spin']) else None
scale_widgets = [self.joint_scale_x_spin, self.joint_scale_y_spin, self.joint_scale_z_spin] if all(hasattr(self, attr) for attr in ['joint_scale_x_spin', 'joint_scale_y_spin', 'joint_scale_z_spin']) else None
self.buttons["apply_joint_props_btn"].clicked.connect(lambda: utils_rigging.apply_joint_properties_from_ui(pos_widgets, rot_widgets, scale_widgets))
if "reset_joint_props_btn" in self.buttons:
pos_widgets = [self.joint_pos_x_spin, self.joint_pos_y_spin, self.joint_pos_z_spin] if all(hasattr(self, attr) for attr in ['joint_pos_x_spin', 'joint_pos_y_spin', 'joint_pos_z_spin']) else None
rot_widgets = [self.joint_rot_x_spin, self.joint_rot_y_spin, self.joint_rot_z_spin] if all(hasattr(self, attr) for attr in ['joint_rot_x_spin', 'joint_rot_y_spin', 'joint_rot_z_spin']) else None
scale_widgets = [self.joint_scale_x_spin, self.joint_scale_y_spin, self.joint_scale_z_spin] if all(hasattr(self, attr) for attr in ['joint_scale_x_spin', 'joint_scale_y_spin', 'joint_scale_z_spin']) else None
self.buttons["reset_joint_props_btn"].clicked.connect(lambda: utils_rigging.reset_joint_properties_ui(pos_widgets, rot_widgets, scale_widgets))
# 使用Maya的脚本任务来监听选择变化
ui_utils.connect_maya_selection_changed(self, utils_rigging.on_selection_changed)
#========================================== INIT ========================================
def __init__(self):
"""
@@ -153,7 +82,7 @@ class RiggingUI(ui_utils.BaseUI):
# 初始化UI
self.create_widgets()
self.create_layouts()
self.connect_ui_signals()
self.create_connections()
#========================================= WIDGET =======================================
def create_widgets(self):
@@ -709,4 +638,75 @@ class RiggingUI(ui_utils.BaseUI):
# 设置分割器的伸缩因子
for i in range(self.splitters["main_splitter"].count()):
self.splitters["main_splitter"].setStretchFactor(i, 1)
self.splitters["main_splitter"].setStretchFactor(i, 1)
#======================================= FUNCTIONS ======================================
def create_connections(self):
"""
连接UI信号和槽
设置UI控件的事件处理函数
"""
# 创建信号映射字典
signal_mapping = {
'buttons': {
'add_joint_btn': {'signal': 'clicked', 'handler': utils_rigging.add_joint},
'remove_joint_btn': {'signal': 'clicked', 'handler': utils_rigging.remove_joint},
'duplicate_joint_btn': {'signal': 'clicked', 'handler': utils_rigging.duplicate_joint},
'add_controller_btn': {'signal': 'clicked', 'handler': utils_rigging.add_controller},
'remove_controller_btn': {'signal': 'clicked', 'handler': utils_rigging.remove_controller},
'duplicate_controller_btn': {'signal': 'clicked', 'handler': utils_rigging.duplicate_controller},
'import_dna_btn': {'signal': 'clicked', 'handler': utils_rigging.import_dna},
'export_dna_btn': {'signal': 'clicked', 'handler': utils_rigging.export_dna},
'calibrate_dna_btn': {'signal': 'clicked', 'handler': utils_rigging.calibrate_dna},
},
'splitters': {
'main_splitter': {'signal': 'splitterMoved', 'handler': lambda pos, index: ui_utils.on_splitter_moved(self, pos, index)},
}
}
# 使用ui_utils中的通用函数连接信号
ui_utils.connect_ui_signals(self, signal_mapping)
# 连接关节属性编辑控件
if hasattr(self, 'joint_name_edit'):
self.joint_name_edit.editingFinished.connect(lambda: utils_rigging.handle_joint_name_changed(self.joint_name_edit))
# 关节位置编辑
if hasattr(self, 'joint_pos_x_spin'):
self.joint_pos_x_spin.valueChanged.connect(lambda val: utils_rigging.handle_joint_position_changed(0, [self.joint_pos_x_spin, self.joint_pos_y_spin, self.joint_pos_z_spin]))
if hasattr(self, 'joint_pos_y_spin'):
self.joint_pos_y_spin.valueChanged.connect(lambda val: utils_rigging.handle_joint_position_changed(1, [self.joint_pos_x_spin, self.joint_pos_y_spin, self.joint_pos_z_spin]))
if hasattr(self, 'joint_pos_z_spin'):
self.joint_pos_z_spin.valueChanged.connect(lambda val: utils_rigging.handle_joint_position_changed(2, [self.joint_pos_x_spin, self.joint_pos_y_spin, self.joint_pos_z_spin]))
# 关节旋转编辑
if hasattr(self, 'joint_rot_x_spin'):
self.joint_rot_x_spin.valueChanged.connect(lambda val: utils_rigging.handle_joint_rotation_changed(0, [self.joint_rot_x_spin, self.joint_rot_y_spin, self.joint_rot_z_spin]))
if hasattr(self, 'joint_rot_y_spin'):
self.joint_rot_y_spin.valueChanged.connect(lambda val: utils_rigging.handle_joint_rotation_changed(1, [self.joint_rot_x_spin, self.joint_rot_y_spin, self.joint_rot_z_spin]))
if hasattr(self, 'joint_rot_z_spin'):
self.joint_rot_z_spin.valueChanged.connect(lambda val: utils_rigging.handle_joint_rotation_changed(2, [self.joint_rot_x_spin, self.joint_rot_y_spin, self.joint_rot_z_spin]))
# 关节缩放编辑
if hasattr(self, 'joint_scale_x_spin'):
self.joint_scale_x_spin.valueChanged.connect(lambda val: utils_rigging.handle_joint_scale_changed(0, [self.joint_scale_x_spin, self.joint_scale_y_spin, self.joint_scale_z_spin]))
if hasattr(self, 'joint_scale_y_spin'):
self.joint_scale_y_spin.valueChanged.connect(lambda val: utils_rigging.handle_joint_scale_changed(1, [self.joint_scale_x_spin, self.joint_scale_y_spin, self.joint_scale_z_spin]))
if hasattr(self, 'joint_scale_z_spin'):
self.joint_scale_z_spin.valueChanged.connect(lambda val: utils_rigging.handle_joint_scale_changed(2, [self.joint_scale_x_spin, self.joint_scale_y_spin, self.joint_scale_z_spin]))
# 关节属性应用和重置按钮
if "apply_joint_props_btn" in self.buttons:
pos_widgets = [self.joint_pos_x_spin, self.joint_pos_y_spin, self.joint_pos_z_spin] if all(hasattr(self, attr) for attr in ['joint_pos_x_spin', 'joint_pos_y_spin', 'joint_pos_z_spin']) else None
rot_widgets = [self.joint_rot_x_spin, self.joint_rot_y_spin, self.joint_rot_z_spin] if all(hasattr(self, attr) for attr in ['joint_rot_x_spin', 'joint_rot_y_spin', 'joint_rot_z_spin']) else None
scale_widgets = [self.joint_scale_x_spin, self.joint_scale_y_spin, self.joint_scale_z_spin] if all(hasattr(self, attr) for attr in ['joint_scale_x_spin', 'joint_scale_y_spin', 'joint_scale_z_spin']) else None
self.buttons["apply_joint_props_btn"].clicked.connect(lambda: utils_rigging.apply_joint_properties_from_ui(pos_widgets, rot_widgets, scale_widgets))
if "reset_joint_props_btn" in self.buttons:
pos_widgets = [self.joint_pos_x_spin, self.joint_pos_y_spin, self.joint_pos_z_spin] if all(hasattr(self, attr) for attr in ['joint_pos_x_spin', 'joint_pos_y_spin', 'joint_pos_z_spin']) else None
rot_widgets = [self.joint_rot_x_spin, self.joint_rot_y_spin, self.joint_rot_z_spin] if all(hasattr(self, attr) for attr in ['joint_rot_x_spin', 'joint_rot_y_spin', 'joint_rot_z_spin']) else None
scale_widgets = [self.joint_scale_x_spin, self.joint_scale_y_spin, self.joint_scale_z_spin] if all(hasattr(self, attr) for attr in ['joint_scale_x_spin', 'joint_scale_y_spin', 'joint_scale_z_spin']) else None
self.buttons["reset_joint_props_btn"].clicked.connect(lambda: utils_rigging.reset_joint_properties_ui(pos_widgets, rot_widgets, scale_widgets))
# 使用Maya的脚本任务来监听选择变化
ui_utils.connect_maya_selection_changed(self, utils_rigging.on_selection_changed)