This commit is contained in:
2025-05-08 00:39:41 +08:00
parent 1bc836fafa
commit 24acc2a6f1
17 changed files with 1464 additions and 1388 deletions

View File

@@ -55,6 +55,7 @@ TOOL_HEIGHT = config.TOOL_HEIGHT
#========================================= LOCATION =======================================
from scripts.ui import localization
LANG = localization.LANG
get_text = localization.get_text
class RiggingUI(ui_utils.BaseUI):
"""
@@ -93,7 +94,7 @@ class RiggingUI(ui_utils.BaseUI):
包括按钮、标签、列表等
"""
# 标题标签 - 使用HTML格式化标题
title_text = f"<h4 style='margin:0;padding:5px;'>{LANG.get('rigging_title', '骨骼绑定')}</h4>"
title_text = f"<h4 style='margin:0;padding:5px;'>{get_text('rigging_title', '骨骼绑定')}</h4>"
self.controls["title_label"] = QtWidgets.QLabel(title_text)
self.controls["title_label"].setObjectName("riggingTitleLabel")
self.controls["title_label"].setAlignment(QtCore.Qt.AlignCenter)
@@ -108,7 +109,7 @@ class RiggingUI(ui_utils.BaseUI):
self.controls["presets_panel"].setObjectName("presetsPanel")
# Presets 组
self.controls["presets_group"] = QtWidgets.QGroupBox(LANG.get("presets", "Presets"))
self.controls["presets_group"] = QtWidgets.QGroupBox(get_text("presets", "Presets"))
self.controls["presets_group"].setObjectName("presetsGroup")
# 创建预设显示区域
@@ -189,14 +190,14 @@ class RiggingUI(ui_utils.BaseUI):
self.controls["presets_slider"].setValue(50)
# 导出预设按钮
self.buttons["export_presets"] = QtWidgets.QPushButton(LANG.get("export_presets", "导出预设"))
self.buttons["export_presets"] = QtWidgets.QPushButton(get_text("export_presets", "导出预设"))
self.buttons["export_presets"].setObjectName("exportPresetsButton")
self.buttons["export_presets"].setIcon(QtGui.QIcon(os.path.join(ICONS_PATH, "export.png")))
self.buttons["export_presets"].setIcon(ui_utils.load_icon("export"))
# 导入预设按钮
self.buttons["import_presets"] = QtWidgets.QPushButton(LANG.get("import_presets", "导入预设"))
self.buttons["import_presets"] = QtWidgets.QPushButton(get_text("import_presets", "导入预设"))
self.buttons["import_presets"].setObjectName("importPresetsButton")
self.buttons["import_presets"].setIcon(QtGui.QIcon(os.path.join(ICONS_PATH, "import.png")))
self.buttons["import_presets"].setIcon(ui_utils.load_icon("import"))
# 添加到滑块布局
self.controls["presets_slider_layout"].addWidget(self.controls["presets_count_label"])
@@ -209,11 +210,11 @@ class RiggingUI(ui_utils.BaseUI):
self.controls["assets_panel"].setObjectName("assetsPanel")
# Assets 组
self.controls["assets_group"] = QtWidgets.QGroupBox(LANG.get("assets", "Assets"))
self.controls["assets_group"] = QtWidgets.QGroupBox(get_text("assets", "Assets"))
self.controls["assets_group"].setObjectName("assetsGroup")
# 项目路径标签和输入框
self.controls["project_path_label"] = QtWidgets.QLabel(LANG.get("project_path", "项目路径:"))
self.controls["project_path_label"] = QtWidgets.QLabel(get_text("project_path", "项目路径:"))
self.controls["project_path_label"].setObjectName("projectPathLabel")
self.controls["project_path_input"] = QtWidgets.QLineEdit()
@@ -221,39 +222,43 @@ class RiggingUI(ui_utils.BaseUI):
self.controls["project_path_input"].setText("D:/Personal/Document/maya/SuperRiggingEditor/files/data/MetaHuman")
# 浏览按钮
self.buttons["browse_path"] = QtWidgets.QPushButton("...")
self.buttons["browse_path"] = QtWidgets.QPushButton(" . . . ")
self.buttons["browse_path"].setObjectName("browsePathButton")
self.buttons["browse_path"].setFixedWidth(30)
self.buttons["browse_path"].setIcon(ui_utils.load_icon("import"))
self.buttons["browse_path"].setMinimumWidth(0)
self.buttons["browse_path"].setFixedWidth(100)
# Presets DNA 标签和输入框
self.controls["presets_dna_label"] = QtWidgets.QLabel(LANG.get("presets_dna", "Presets DNA:"))
self.controls["presets_dna_label"] = QtWidgets.QLabel(get_text("Presets DNA:", "预设 DNA:"))
self.controls["presets_dna_label"].setObjectName("presetsDnaLabel")
self.controls["presets_dna_input"] = QtWidgets.QLineEdit()
self.controls["presets_dna_input"].setObjectName("presetsDnaInput")
# 浏览按钮
self.buttons["browse_dna"] = QtWidgets.QPushButton("...")
self.buttons["browse_dna"] = QtWidgets.QPushButton(" . . . ")
self.buttons["browse_dna"].setObjectName("browseDnaButton")
self.buttons["browse_dna"].setFixedWidth(30)
self.buttons["browse_dna"].setIcon(ui_utils.load_icon("import"))
self.buttons["browse_dna"].setMinimumWidth(0)
self.buttons["browse_dna"].setFixedWidth(100)
# 3. Descriptor 面板
self.controls["descriptor_panel"] = QtWidgets.QWidget()
self.controls["descriptor_panel"].setObjectName("descriptorPanel")
# Descriptor 组
self.controls["descriptor_group"] = QtWidgets.QGroupBox(LANG.get("descriptor", "Descriptor"))
self.controls["descriptor_group"] = QtWidgets.QGroupBox(get_text("descriptor", "Descriptor"))
self.controls["descriptor_group"].setObjectName("descriptorGroup")
# 名称标签和输入框
self.controls["name_label"] = QtWidgets.QLabel(LANG.get("name", "名称:"))
self.controls["name_label"] = QtWidgets.QLabel(get_text("name", "名称:"))
self.controls["name_label"].setObjectName("nameLabel")
self.controls["name_input"] = QtWidgets.QLineEdit()
self.controls["name_input"].setObjectName("nameInput")
# 原型标签和下拉框
self.controls["archetype_label"] = QtWidgets.QLabel(LANG.get("archetype", "原型:"))
self.controls["archetype_label"] = QtWidgets.QLabel(get_text("archetype", "原型:"))
self.controls["archetype_label"].setObjectName("archetypeLabel")
self.controls["archetype_combo"] = QtWidgets.QComboBox()
@@ -263,7 +268,7 @@ class RiggingUI(ui_utils.BaseUI):
self.controls["archetype_combo"].addItem("african")
# 性别标签和下拉框
self.controls["gender_label"] = QtWidgets.QLabel(LANG.get("gender", "性别:"))
self.controls["gender_label"] = QtWidgets.QLabel(get_text("gender", "性别:"))
self.controls["gender_label"].setObjectName("genderLabel")
self.controls["gender_combo"] = QtWidgets.QComboBox()
@@ -272,17 +277,17 @@ class RiggingUI(ui_utils.BaseUI):
self.controls["gender_combo"].addItem("male")
# 年龄标签和输入框
self.controls["age_label"] = QtWidgets.QLabel(LANG.get("age", "年龄:"))
self.controls["age_label"] = QtWidgets.QLabel(get_text("age", "年龄:"))
self.controls["age_label"].setObjectName("ageLabel")
self.controls["age_spinner"] = QtWidgets.QSpinBox()
self.controls["age_spinner"].setObjectName("ageSpinner")
self.controls["age_spinner"].setMinimum(1)
self.controls["age_spinner"].setMaximum(100)
self.controls["age_spinner"].setValue(18)
self.controls["age_spinner"].setValue(24)
# 平移单位标签和下拉框
self.controls["translation_unit_label"] = QtWidgets.QLabel(LANG.get("translation_unit", "平移单位:"))
self.controls["translation_unit_label"] = QtWidgets.QLabel(get_text("translation_unit", "平移单位:"))
self.controls["translation_unit_label"].setObjectName("translationUnitLabel")
self.controls["translation_unit_combo"] = QtWidgets.QComboBox()
@@ -292,7 +297,7 @@ class RiggingUI(ui_utils.BaseUI):
self.controls["translation_unit_combo"].addItem("m")
# 旋转单位标签和下拉框
self.controls["rotation_unit_label"] = QtWidgets.QLabel(LANG.get("rotation_unit", "旋转单位:"))
self.controls["rotation_unit_label"] = QtWidgets.QLabel(get_text("rotation_unit", "旋转单位:"))
self.controls["rotation_unit_label"].setObjectName("rotationUnitLabel")
self.controls["rotation_unit_combo"] = QtWidgets.QComboBox()
@@ -301,7 +306,7 @@ class RiggingUI(ui_utils.BaseUI):
self.controls["rotation_unit_combo"].addItem("radians")
# 坐标系统标签和下拉框
self.controls["coordinate_system_label"] = QtWidgets.QLabel(LANG.get("coordinate_system", "坐标系统:"))
self.controls["coordinate_system_label"] = QtWidgets.QLabel(get_text("coordinate_system", "坐标系统:"))
self.controls["coordinate_system_label"].setObjectName("coordinateSystemLabel")
self.controls["coordinate_system_combo"] = QtWidgets.QComboBox()
@@ -310,7 +315,7 @@ class RiggingUI(ui_utils.BaseUI):
self.controls["coordinate_system_combo"].addItem("ZAxisUp")
# LOD数量标签和输入框
self.controls["lod_count_label"] = QtWidgets.QLabel(LANG.get("lod_count", "LOD数量:"))
self.controls["lod_count_label"] = QtWidgets.QLabel(get_text("lod_count", "LOD数量:"))
self.controls["lod_count_label"].setObjectName("lodCountLabel")
self.controls["lod_count_spinner"] = QtWidgets.QSpinBox()
@@ -324,193 +329,19 @@ class RiggingUI(ui_utils.BaseUI):
self.controls["bottom_buttons_panel"].setObjectName("bottomButtonsPanel")
# 删除所有按钮
self.buttons["remove_all"] = QtWidgets.QPushButton(LANG.get("remove_all", "删除所有"))
self.buttons["remove_all"] = QtWidgets.QPushButton(get_text("remove_all", "删除所有"))
self.buttons["remove_all"].setObjectName("removeAllButton")
self.buttons["remove_all"].setIcon(QtGui.QIcon(os.path.join(ICONS_PATH, "delete.png")))
self.buttons["remove_all"].setIcon(ui_utils.load_icon("delete.png"))
# 导入骨骼按钮
self.buttons["import_skeleton"] = QtWidgets.QPushButton(LANG.get("import_skeleton", "导入骨骼"))
self.buttons["import_skeleton"] = QtWidgets.QPushButton(get_text("import_skeleton", "导入骨骼"))
self.buttons["import_skeleton"].setObjectName("importSkeletonButton")
self.buttons["import_skeleton"].setIcon(QtGui.QIcon(os.path.join(ICONS_PATH, "import_skeleton.png")))
self.buttons["import_skeleton"].setIcon(ui_utils.load_icon("HIKCharacterToolSkeleton.png"))
# 生成绑定按钮
self.buttons["build_rigging"] = QtWidgets.QPushButton(LANG.get("build_rigging", "生成绑定"))
self.buttons["build_rigging"] = QtWidgets.QPushButton(get_text("build_rigging", "生成绑定"))
self.buttons["build_rigging"].setObjectName("buildRiggingButton")
self.buttons["build_rigging"].setIcon(QtGui.QIcon(os.path.join(ICONS_PATH, "build_rigging.png")))
# 左侧面板控件 - 控制器列表
self.controls["controller_group"] = QtWidgets.QGroupBox("Controllers [000]")
self.controls["controller_group"].setObjectName("controllerGroup")
# 控制器列表
self.controls["controller_list"] = QtWidgets.QListWidget()
self.controls["controller_list"].setObjectName("controllerList")
# 添加测试项目
for i in range(3):
item = QtWidgets.QListWidgetItem(f"Controller_{i}")
self.controls["controller_list"].addItem(item)
# 控制器操作按钮
self.buttons["add_controller"] = QtWidgets.QPushButton(LANG.get("add_controller", "添加控制器"))
self.buttons["add_controller"].setObjectName("addControllerButton")
self.buttons["remove_controller"] = QtWidgets.QPushButton(LANG.get("remove_controller", "移除控制器"))
self.buttons["remove_controller"].setObjectName("removeControllerButton")
self.buttons["duplicate_controller"] = QtWidgets.QPushButton(LANG.get("duplicate_controller", "复制控制器"))
self.buttons["duplicate_controller"].setObjectName("duplicateControllerButton")
# 右侧面板控件 - 关节属性
self.controls["joint_properties_group"] = QtWidgets.QGroupBox(LANG.get("joint_properties", "关节属性"))
self.controls["joint_properties_group"].setObjectName("jointPropertiesGroup")
# 关节名称标签和输入框
self.controls["joint_name_label"] = QtWidgets.QLabel(LANG.get("name", "名称:"))
self.controls["joint_name_label"].setObjectName("jointNameLabel")
self.controls["joint_name_input"] = QtWidgets.QLineEdit()
self.controls["joint_name_input"].setObjectName("jointNameInput")
self.controls["joint_name_input"].setPlaceholderText(LANG.get("enter_joint_name", "输入关节名称"))
# 关节位置标签和输入框
self.controls["joint_position_label"] = QtWidgets.QLabel(LANG.get("position", "位置:"))
self.controls["joint_position_label"].setObjectName("jointPositionLabel")
# X坐标
self.controls["joint_x_label"] = QtWidgets.QLabel("X:")
self.controls["joint_x_label"].setObjectName("jointXLabel")
self.controls["joint_x_input"] = QtWidgets.QLineEdit("0.0")
self.controls["joint_x_input"].setObjectName("jointXInput")
# Y坐标
self.controls["joint_y_label"] = QtWidgets.QLabel("Y:")
self.controls["joint_y_label"].setObjectName("jointYLabel")
self.controls["joint_y_input"] = QtWidgets.QLineEdit("0.0")
self.controls["joint_y_input"].setObjectName("jointYInput")
# Z坐标
self.controls["joint_z_label"] = QtWidgets.QLabel("Z:")
self.controls["joint_z_label"].setObjectName("jointZLabel")
self.controls["joint_z_input"] = QtWidgets.QLineEdit("0.0")
self.controls["joint_z_input"].setObjectName("jointZInput")
# 关节旋转标签和输入框
self.controls["joint_rotation_label"] = QtWidgets.QLabel(LANG.get("rotation", "旋转:"))
self.controls["joint_rotation_label"].setObjectName("jointRotationLabel")
# X旋转
self.controls["joint_rx_label"] = QtWidgets.QLabel("X:")
self.controls["joint_rx_label"].setObjectName("jointRXLabel")
self.controls["joint_rx_input"] = QtWidgets.QLineEdit("0.0")
self.controls["joint_rx_input"].setObjectName("jointRXInput")
# Y旋转
self.controls["joint_ry_label"] = QtWidgets.QLabel("Y:")
self.controls["joint_ry_label"].setObjectName("jointRYLabel")
self.controls["joint_ry_input"] = QtWidgets.QLineEdit("0.0")
self.controls["joint_ry_input"].setObjectName("jointRYInput")
# Z旋转
self.controls["joint_rz_label"] = QtWidgets.QLabel("Z:")
self.controls["joint_rz_label"].setObjectName("jointRZLabel")
self.controls["joint_rz_input"] = QtWidgets.QLineEdit("0.0")
self.controls["joint_rz_input"].setObjectName("jointRZInput")
# 关节缩放标签和输入框
self.controls["joint_scale_label"] = QtWidgets.QLabel(LANG.get("scale", "缩放:"))
self.controls["joint_scale_label"].setObjectName("jointScaleLabel")
# X缩放
self.controls["joint_sx_label"] = QtWidgets.QLabel("X:")
self.controls["joint_sx_label"].setObjectName("jointSXLabel")
self.controls["joint_sx_input"] = QtWidgets.QLineEdit("1.0")
self.controls["joint_sx_input"].setObjectName("jointSXInput")
# Y缩放
self.controls["joint_sy_label"] = QtWidgets.QLabel("Y:")
self.controls["joint_sy_label"].setObjectName("jointSYLabel")
self.controls["joint_sy_input"] = QtWidgets.QLineEdit("1.0")
self.controls["joint_sy_input"].setObjectName("jointSYInput")
# Z缩放
self.controls["joint_sz_label"] = QtWidgets.QLabel("Z:")
self.controls["joint_sz_label"].setObjectName("jointSZLabel")
self.controls["joint_sz_input"] = QtWidgets.QLineEdit("1.0")
self.controls["joint_sz_input"].setObjectName("jointSZInput")
# 关节属性按钮
self.buttons["apply_joint_properties"] = QtWidgets.QPushButton(LANG.get("apply", "应用"))
self.buttons["apply_joint_properties"].setObjectName("applyJointPropertiesButton")
self.buttons["reset_joint_properties"] = QtWidgets.QPushButton(LANG.get("reset", "重置"))
self.buttons["reset_joint_properties"].setObjectName("resetJointPropertiesButton")
# 右侧面板控件 - 绑定工具
self.controls["binding_tools_group"] = QtWidgets.QGroupBox(LANG.get("binding_tools", "绑定工具"))
self.controls["binding_tools_group"].setObjectName("bindingToolsGroup")
# 绑定工具按钮
self.buttons["create_binding"] = QtWidgets.QPushButton(LANG.get("create_binding", "创建绑定"))
self.buttons["create_binding"].setObjectName("createBindingButton")
self.buttons["copy_skin"] = QtWidgets.QPushButton(LANG.get("copy_skin", "复制蒙皮"))
self.buttons["copy_skin"].setObjectName("copySkinButton")
self.buttons["mirror_skin"] = QtWidgets.QPushButton(LANG.get("mirror_skin", "镜像蒙皮"))
self.buttons["mirror_skin"].setObjectName("mirrorSkinButton")
self.buttons["paint_weights"] = QtWidgets.QPushButton(LANG.get("paint_weights", "绘制权重"))
self.buttons["paint_weights"].setObjectName("paintWeightsButton")
# 底部工具面板
# DNA部分
self.controls["dna_group"] = QtWidgets.QGroupBox(LANG.get("dna", "DNA"))
self.controls["dna_group"].setObjectName("dnaGroup")
self.buttons["import_dna"] = QtWidgets.QPushButton(LANG.get("import_dna", "导入DNA"))
self.buttons["import_dna"].setObjectName("importDnaButton")
self.buttons["export_dna"] = QtWidgets.QPushButton(LANG.get("export_dna", "导出DNA"))
self.buttons["export_dna"].setObjectName("exportDnaButton")
self.buttons["calibrate_dna"] = QtWidgets.QPushButton(LANG.get("calibrate_dna", "校准DNA"))
self.buttons["calibrate_dna"].setObjectName("calibrateDnaButton")
# 骨骼部分
self.controls["skeleton_tools_group"] = QtWidgets.QGroupBox(LANG.get("skeleton_tools", "骨骼工具"))
self.controls["skeleton_tools_group"].setObjectName("skeletonToolsGroup")
self.buttons["import_skeleton"] = QtWidgets.QPushButton(LANG.get("import_skeleton", "导入骨骼"))
self.buttons["import_skeleton"].setObjectName("importSkeletonButton")
self.buttons["export_skeleton"] = QtWidgets.QPushButton(LANG.get("export_skeleton", "导出骨骼"))
self.buttons["export_skeleton"].setObjectName("exportSkeletonButton")
self.buttons["calibrate_skeleton"] = QtWidgets.QPushButton(LANG.get("calibrate_skeleton", "校准骨骼"))
self.buttons["calibrate_skeleton"].setObjectName("calibrateSkeletonButton")
# 工具部分
self.controls["rigging_tools_group"] = QtWidgets.QGroupBox(LANG.get("rigging_tools", "绑定工具"))
self.controls["rigging_tools_group"].setObjectName("riggingToolsGroup")
self.buttons["generate_controllers"] = QtWidgets.QPushButton(LANG.get("generate_controllers", "生成控制器"))
self.buttons["generate_controllers"].setObjectName("generateControllersButton")
self.buttons["generate_body"] = QtWidgets.QPushButton(LANG.get("generate_body", "生成身体"))
self.buttons["generate_body"].setObjectName("generateBodyButton")
self.buttons["clean_rigging"] = QtWidgets.QPushButton(LANG.get("clean_rigging", "清理绑定"))
self.buttons["clean_rigging"].setObjectName("cleanRiggingButton")
self.buttons["build_rigging"].setIcon(ui_utils.load_icon("HIKcreateControlRig.png"))
#========================================= LAYOUT =======================================
def create_layouts(self):
@@ -576,42 +407,61 @@ class RiggingUI(ui_utils.BaseUI):
descriptor_layout.setContentsMargins(0, 0, 0, 0)
descriptor_layout.setSpacing(5)
# Descriptor 组布局
# Descriptor 组布局优化紧凑表单式参考主流DCC风格
descriptor_group_layout = QtWidgets.QGridLayout(self.controls["descriptor_group"])
descriptor_group_layout.setContentsMargins(5, 5, 5, 5)
descriptor_group_layout.setSpacing(5)
# 添加名称标签和输入框
descriptor_group_layout.setContentsMargins(16, 8, 16, 8) # 左右加大
descriptor_group_layout.setHorizontalSpacing(48) # 增大左右间距
descriptor_group_layout.setVerticalSpacing(10)
# 统一控件高度和字体
for key in [
"name_input", "archetype_combo", "gender_combo", "age_spinner", "lod_count_spinner",
"translation_unit_combo", "rotation_unit_combo", "coordinate_system_combo"
]:
self.controls[key].setFixedHeight(24)
self.controls[key].setStyleSheet("font-size: 13px;")
for key in [
"name_label", "archetype_label", "gender_label", "age_label", "lod_count_label",
"translation_unit_label", "rotation_unit_label", "coordinate_system_label"
]:
self.controls[key].setStyleSheet("font-size: 13px;")
self.controls[key].setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
# 设置每列最小宽度/拉伸,保证左右均衡
descriptor_group_layout.setColumnMinimumWidth(0, 80) # 左标签
descriptor_group_layout.setColumnMinimumWidth(1, 180) # 左输入
descriptor_group_layout.setColumnMinimumWidth(2, 80) # 右标签
descriptor_group_layout.setColumnMinimumWidth(3, 180) # 右输入
descriptor_group_layout.setColumnStretch(1, 2)
descriptor_group_layout.setColumnStretch(3, 2)
# 第一行:名称
descriptor_group_layout.addWidget(self.controls["name_label"], 0, 0)
descriptor_group_layout.addWidget(self.controls["name_input"], 0, 1, 1, 3)
# 添加原型标签和下拉框
# 第二行:原型、性别
descriptor_group_layout.addWidget(self.controls["archetype_label"], 1, 0)
descriptor_group_layout.addWidget(self.controls["archetype_combo"], 1, 1)
# 添加性别标签和下拉框
descriptor_group_layout.addWidget(self.controls["gender_label"], 1, 2)
descriptor_group_layout.addWidget(self.controls["gender_combo"], 1, 3)
# 添加年龄标签和输入框
# 第三行年龄、LOD数量
descriptor_group_layout.addWidget(self.controls["age_label"], 2, 0)
descriptor_group_layout.addWidget(self.controls["age_spinner"], 2, 1)
# 添加平移单位标签和下拉框
descriptor_group_layout.addWidget(self.controls["lod_count_label"], 2, 2)
descriptor_group_layout.addWidget(self.controls["lod_count_spinner"], 2, 3)
# 第四行:平移单位、旋转单位
descriptor_group_layout.addWidget(self.controls["translation_unit_label"], 3, 0)
descriptor_group_layout.addWidget(self.controls["translation_unit_combo"], 3, 1)
# 添加旋转单位标签和下拉框
descriptor_group_layout.addWidget(self.controls["rotation_unit_label"], 3, 2)
descriptor_group_layout.addWidget(self.controls["rotation_unit_combo"], 3, 3)
# 添加坐标系统标签和下拉框
# 第五行:坐标系统
descriptor_group_layout.addWidget(self.controls["coordinate_system_label"], 4, 0)
descriptor_group_layout.addWidget(self.controls["coordinate_system_combo"], 4, 1)
# 添加LOD数量标签和输入框
descriptor_group_layout.addWidget(self.controls["lod_count_label"], 4, 2)
descriptor_group_layout.addWidget(self.controls["lod_count_spinner"], 4, 3)
# 右侧空白占位,保持对齐美观
descriptor_group_layout.addItem(QtWidgets.QSpacerItem(0, 0, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum), 4, 2, 1, 2)
# 添加Descriptor组到Descriptor面板
descriptor_layout.addWidget(self.controls["descriptor_group"])
@@ -626,11 +476,12 @@ class RiggingUI(ui_utils.BaseUI):
bottom_buttons_layout.setContentsMargins(5, 5, 5, 5)
bottom_buttons_layout.setSpacing(10)
# 添加底部按钮
bottom_buttons_layout.addWidget(self.buttons["remove_all"])
bottom_buttons_layout.addStretch(1) # 添加弹性空间
bottom_buttons_layout.addWidget(self.buttons["import_skeleton"])
bottom_buttons_layout.addWidget(self.buttons["build_rigging"])
# 添加底部按钮(均等宽度)
for btn in [self.buttons["remove_all"], self.buttons["import_skeleton"], self.buttons["build_rigging"]]:
btn.setMinimumWidth(0)
btn.setMaximumWidth(16777215)
btn.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
bottom_buttons_layout.addWidget(btn)
# 添加底部按钮区域到主布局
main_layout.addWidget(self.controls["bottom_buttons_panel"])
@@ -645,35 +496,34 @@ class RiggingUI(ui_utils.BaseUI):
#======================================= FUNCTIONS ======================================
def create_connections(self):
"""
创建信号连接
创建信号连接设置UI控件的交互行为风格参考definition.py
"""
# 创建信号映射字典
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},
# 已创建的按钮
'browse_path': {'signal': 'clicked', 'handler': lambda: utils_rigging.browse_file(self, "项目路径", self.controls["project_path_input"])},
'browse_dna': {'signal': 'clicked', 'handler': lambda: utils_rigging.browse_file(self, "DNA文件", self.controls["presets_dna_input"], "dna")},
'export_presets': {'signal': 'clicked', 'handler': utils_rigging.export_presets},
'import_presets': {'signal': 'clicked', 'handler': utils_rigging.import_presets},
},
'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)
# 连接Maya选择变化事件
ui_utils.connect_maya_selection_changed(self, lambda: utils_rigging.on_selection_changed(self), self.main_widget)
# 主要功能按钮直接连接
if "add_joint_btn" in self.buttons:
self.buttons["add_joint_btn"].clicked.connect(utils_rigging.add_joint)
if "remove_joint_btn" in self.buttons:
self.buttons["remove_joint_btn"].clicked.connect(utils_rigging.remove_joint)
if "duplicate_joint_btn" in self.buttons:
self.buttons["duplicate_joint_btn"].clicked.connect(utils_rigging.duplicate_joint)
if "add_controller_btn" in self.buttons:
self.buttons["add_controller_btn"].clicked.connect(utils_rigging.add_controller)
if "remove_controller_btn" in self.buttons:
self.buttons["remove_controller_btn"].clicked.connect(utils_rigging.remove_controller)
if "duplicate_controller_btn" in self.buttons:
self.buttons["duplicate_controller_btn"].clicked.connect(utils_rigging.duplicate_controller)
if "import_dna_btn" in self.buttons:
self.buttons["import_dna_btn"].clicked.connect(utils_rigging.import_dna)
if "export_dna_btn" in self.buttons:
self.buttons["export_dna_btn"].clicked.connect(utils_rigging.export_dna)
if "calibrate_dna_btn" in self.buttons:
self.buttons["calibrate_dna_btn"].clicked.connect(utils_rigging.calibrate_dna)
# 其它已创建按钮
if "browse_path" in self.buttons:
self.buttons["browse_path"].clicked.connect(lambda: utils_rigging.browse_file(self, "项目路径", self.controls["project_path_input"]))
if "browse_dna" in self.buttons:
self.buttons["browse_dna"].clicked.connect(lambda: utils_rigging.browse_file(self, "DNA文件", self.controls["presets_dna_input"], "dna"))
if "export_presets" in self.buttons:
self.buttons["export_presets"].clicked.connect(utils_rigging.export_presets)
if "import_presets" in self.buttons:
self.buttons["import_presets"].clicked.connect(utils_rigging.import_presets)