This commit is contained in:
2025-05-05 19:57:27 +08:00
parent 46d93efb3c
commit f4f0c8196c
10 changed files with 2459 additions and 411 deletions

View File

@@ -87,10 +87,6 @@ class RiggingUI(ui_utils.BaseUI):
self.controls["title_label"].setObjectName("riggingTitleLabel")
self.controls["title_label"].setAlignment(QtCore.Qt.AlignCenter)
# 创建主分割器
self.splitters["main_splitter"] = QtWidgets.QSplitter(QtCore.Qt.Horizontal)
self.splitters["main_splitter"].setObjectName("riggingMainSplitter")
# 左侧面板
self.controls["left_panel"] = QtWidgets.QWidget()
self.controls["left_panel"].setObjectName("riggingLeftPanel")
@@ -99,37 +95,202 @@ class RiggingUI(ui_utils.BaseUI):
self.controls["right_panel"] = QtWidgets.QWidget()
self.controls["right_panel"].setObjectName("riggingRightPanel")
# 左侧面板控件
# DNA浏览器组
self.controls["dna_browser_group"] = QtWidgets.QGroupBox(LANG.get("dna_browser", "DNA浏览器"))
self.controls["dna_browser_group"].setObjectName("dnaBrowserGroup")
# 左侧面板控件 - 骨骼列表
self.controls["skeleton_group"] = QtWidgets.QGroupBox("Skeleton [000]")
self.controls["skeleton_group"].setObjectName("skeletonGroup")
# DNA浏览器列表
self.controls["dna_list"] = QtWidgets.QListWidget()
self.controls["dna_list"].setObjectName("dnaList")
# 骨骼列表
self.controls["skeleton_list"] = QtWidgets.QListWidget()
self.controls["skeleton_list"].setObjectName("skeletonList")
# DNA浏览器刷新按钮
self.buttons["refresh_dna"] = QtWidgets.QPushButton(LANG.get("refresh", "刷新"))
self.buttons["refresh_dna"].setObjectName("refreshDnaButton")
# 右侧面板控件
# DNA操作组
self.controls["dna_ops_group"] = QtWidgets.QGroupBox(LANG.get("dna_operations", "DNA操作"))
self.controls["dna_ops_group"].setObjectName("dnaOpsGroup")
# DNA操作按钮
self.buttons["import_skeleton"] = QtWidgets.QPushButton(LANG.get("import_skeleton", "导入骨骼"))
self.buttons["generate_body"] = QtWidgets.QPushButton(LANG.get("generate_body", "生成身体"))
self.buttons["calibrate_dna"] = QtWidgets.QPushButton(LANG.get("calibrate_dna", "DNA校准"))
# 骨骼操作组
self.controls["skeleton_ops_group"] = QtWidgets.QGroupBox(LANG.get("skeleton_operations", "骨骼操作"))
self.controls["skeleton_ops_group"].setObjectName("skeletonOpsGroup")
# 添加测试项目
for i in range(5):
item = QtWidgets.QListWidgetItem(f"Joint_{i}")
self.controls["skeleton_list"].addItem(item)
# 骨骼操作按钮
self.buttons["calibrate_skeleton"] = QtWidgets.QPushButton(LANG.get("calibrate_skeleton", "骨骼位置校准"))
self.buttons["add_joint"] = QtWidgets.QPushButton(LANG.get("add_joint", "添加关节"))
self.buttons["add_joint"].setObjectName("addJointButton")
self.buttons["remove_joint"] = QtWidgets.QPushButton(LANG.get("remove_joint", "移除关节"))
self.buttons["remove_joint"].setObjectName("removeJointButton")
self.buttons["duplicate_joint"] = QtWidgets.QPushButton(LANG.get("duplicate_joint", "复制关节"))
self.buttons["duplicate_joint"].setObjectName("duplicateJointButton")
# 左侧面板控件 - 控制器列表
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")
#========================================= LAYOUT =======================================
def create_layouts(self):
@@ -138,60 +299,232 @@ class RiggingUI(ui_utils.BaseUI):
组织控件的排列和层次结构
"""
# 主布局
self.layouts["main_layout"] = QtWidgets.QVBoxLayout(self.main_widget)
self.layouts["main_layout"].setContentsMargins(5, 5, 5, 5)
self.layouts["main_layout"].setSpacing(5)
self.layouts["main_layout"] = QtWidgets.QVBoxLayout(self)
self.layouts["main_layout"].setContentsMargins(2, 2, 2, 2)
self.layouts["main_layout"].setSpacing(2)
# 添加标题标签
self.layouts["main_layout"].addWidget(self.controls["title_label"])
# 添加主分割器
# 创建主分割器
self.splitters["main_splitter"] = QtWidgets.QSplitter(QtCore.Qt.Horizontal)
self.splitters["main_splitter"].setObjectName("riggingMainSplitter")
self.layouts["main_layout"].addWidget(self.splitters["main_splitter"])
# 将左右面板添加到主分割器
self.splitters["main_splitter"].addWidget(self.controls["left_panel"])
self.splitters["main_splitter"].addWidget(self.controls["right_panel"])
# 左侧面板布局
self.layouts["left_layout"] = QtWidgets.QVBoxLayout(self.controls["left_panel"])
self.layouts["left_layout"].setContentsMargins(5, 5, 5, 5)
self.layouts["left_layout"].setSpacing(5)
# DNA浏览器组布局
self.layouts["dna_browser_layout"] = QtWidgets.QVBoxLayout(self.controls["dna_browser_group"])
self.layouts["dna_browser_layout"].addWidget(self.controls["dna_list"])
self.layouts["dna_browser_layout"].addWidget(self.buttons["refresh_dna"])
# 骨骼组布局
self.layouts["skeleton_group_layout"] = QtWidgets.QVBoxLayout(self.controls["skeleton_group"])
self.layouts["skeleton_group_layout"].setContentsMargins(5, 10, 5, 5)
self.layouts["skeleton_group_layout"].setSpacing(5)
# 添加组到左侧面板布局
self.layouts["left_layout"].addWidget(self.controls["dna_browser_group"])
self.layouts["left_layout"].addStretch()
# 骨骼列表
self.layouts["skeleton_group_layout"].addWidget(self.controls["skeleton_list"])
# 骨骼操作按钮行
self.layouts["skeleton_buttons_layout"] = QtWidgets.QHBoxLayout()
self.layouts["skeleton_buttons_layout"].setContentsMargins(0, 0, 0, 0)
self.layouts["skeleton_buttons_layout"].setSpacing(2)
self.layouts["skeleton_buttons_layout"].addWidget(self.buttons["add_joint"])
self.layouts["skeleton_buttons_layout"].addWidget(self.buttons["remove_joint"])
self.layouts["skeleton_buttons_layout"].addWidget(self.buttons["duplicate_joint"])
self.layouts["skeleton_group_layout"].addLayout(self.layouts["skeleton_buttons_layout"])
# 控制器组布局
self.layouts["controller_group_layout"] = QtWidgets.QVBoxLayout(self.controls["controller_group"])
self.layouts["controller_group_layout"].setContentsMargins(5, 10, 5, 5)
self.layouts["controller_group_layout"].setSpacing(5)
# 控制器列表
self.layouts["controller_group_layout"].addWidget(self.controls["controller_list"])
# 控制器操作按钮行
self.layouts["controller_buttons_layout"] = QtWidgets.QHBoxLayout()
self.layouts["controller_buttons_layout"].setContentsMargins(0, 0, 0, 0)
self.layouts["controller_buttons_layout"].setSpacing(2)
self.layouts["controller_buttons_layout"].addWidget(self.buttons["add_controller"])
self.layouts["controller_buttons_layout"].addWidget(self.buttons["remove_controller"])
self.layouts["controller_buttons_layout"].addWidget(self.buttons["duplicate_controller"])
self.layouts["controller_group_layout"].addLayout(self.layouts["controller_buttons_layout"])
# 添加组到左侧面板
self.layouts["left_layout"].addWidget(self.controls["skeleton_group"])
self.layouts["left_layout"].addWidget(self.controls["controller_group"])
# 右侧面板布局
self.layouts["right_layout"] = QtWidgets.QVBoxLayout(self.controls["right_panel"])
self.layouts["right_layout"].setContentsMargins(5, 5, 5, 5)
self.layouts["right_layout"].setSpacing(5)
# DNA操作组布局
self.layouts["dna_ops_layout"] = QtWidgets.QVBoxLayout(self.controls["dna_ops_group"])
self.layouts["dna_ops_layout"].addWidget(self.buttons["import_skeleton"])
self.layouts["dna_ops_layout"].addWidget(self.buttons["generate_body"])
self.layouts["dna_ops_layout"].addWidget(self.buttons["calibrate_dna"])
# 关节属性组布局
self.layouts["joint_properties_layout"] = QtWidgets.QVBoxLayout(self.controls["joint_properties_group"])
self.layouts["joint_properties_layout"].setContentsMargins(5, 10, 5, 5)
self.layouts["joint_properties_layout"].setSpacing(5)
# 骨骼操作组布局
self.layouts["skeleton_ops_layout"] = QtWidgets.QVBoxLayout(self.controls["skeleton_ops_group"])
self.layouts["skeleton_ops_layout"].addWidget(self.buttons["calibrate_skeleton"])
self.layouts["skeleton_ops_layout"].addWidget(self.buttons["create_binding"])
self.layouts["skeleton_ops_layout"].addWidget(self.buttons["copy_skin"])
# 关节名称行
self.layouts["joint_name_layout"] = QtWidgets.QHBoxLayout()
self.layouts["joint_name_layout"].setContentsMargins(0, 0, 0, 0)
self.layouts["joint_name_layout"].setSpacing(5)
# 添加组到右侧面板布局
self.layouts["right_layout"].addWidget(self.controls["dna_ops_group"])
self.layouts["right_layout"].addWidget(self.controls["skeleton_ops_group"])
self.layouts["right_layout"].addStretch()
self.layouts["joint_name_layout"].addWidget(self.controls["joint_name_label"])
self.layouts["joint_name_layout"].addWidget(self.controls["joint_name_input"])
# 创建分割器大小处理器
self.resize_handlers["main_splitter"] = ui_utils.SplitterResizeHandler(
self.main_widget, self.splitters["main_splitter"], is_horizontal=True
)
self.layouts["joint_properties_layout"].addLayout(self.layouts["joint_name_layout"])
# 关节位置行
self.layouts["joint_position_layout"] = QtWidgets.QVBoxLayout()
self.layouts["joint_position_layout"].setContentsMargins(0, 0, 0, 0)
self.layouts["joint_position_layout"].setSpacing(2)
self.layouts["joint_position_layout"].addWidget(self.controls["joint_position_label"])
# 位置坐标行
self.layouts["position_coords_layout"] = QtWidgets.QGridLayout()
self.layouts["position_coords_layout"].setContentsMargins(0, 0, 0, 0)
self.layouts["position_coords_layout"].setSpacing(5)
self.layouts["position_coords_layout"].addWidget(self.controls["joint_x_label"], 0, 0)
self.layouts["position_coords_layout"].addWidget(self.controls["joint_x_input"], 0, 1)
self.layouts["position_coords_layout"].addWidget(self.controls["joint_y_label"], 1, 0)
self.layouts["position_coords_layout"].addWidget(self.controls["joint_y_input"], 1, 1)
self.layouts["position_coords_layout"].addWidget(self.controls["joint_z_label"], 2, 0)
self.layouts["position_coords_layout"].addWidget(self.controls["joint_z_input"], 2, 1)
self.layouts["joint_position_layout"].addLayout(self.layouts["position_coords_layout"])
self.layouts["joint_properties_layout"].addLayout(self.layouts["joint_position_layout"])
# 关节旋转行
self.layouts["joint_rotation_layout"] = QtWidgets.QVBoxLayout()
self.layouts["joint_rotation_layout"].setContentsMargins(0, 0, 0, 0)
self.layouts["joint_rotation_layout"].setSpacing(2)
self.layouts["joint_rotation_layout"].addWidget(self.controls["joint_rotation_label"])
# 旋转坐标行
self.layouts["rotation_coords_layout"] = QtWidgets.QGridLayout()
self.layouts["rotation_coords_layout"].setContentsMargins(0, 0, 0, 0)
self.layouts["rotation_coords_layout"].setSpacing(5)
self.layouts["rotation_coords_layout"].addWidget(self.controls["joint_rx_label"], 0, 0)
self.layouts["rotation_coords_layout"].addWidget(self.controls["joint_rx_input"], 0, 1)
self.layouts["rotation_coords_layout"].addWidget(self.controls["joint_ry_label"], 1, 0)
self.layouts["rotation_coords_layout"].addWidget(self.controls["joint_ry_input"], 1, 1)
self.layouts["rotation_coords_layout"].addWidget(self.controls["joint_rz_label"], 2, 0)
self.layouts["rotation_coords_layout"].addWidget(self.controls["joint_rz_input"], 2, 1)
self.layouts["joint_rotation_layout"].addLayout(self.layouts["rotation_coords_layout"])
self.layouts["joint_properties_layout"].addLayout(self.layouts["joint_rotation_layout"])
# 关节缩放行
self.layouts["joint_scale_layout"] = QtWidgets.QVBoxLayout()
self.layouts["joint_scale_layout"].setContentsMargins(0, 0, 0, 0)
self.layouts["joint_scale_layout"].setSpacing(2)
self.layouts["joint_scale_layout"].addWidget(self.controls["joint_scale_label"])
# 缩放坐标行
self.layouts["scale_coords_layout"] = QtWidgets.QGridLayout()
self.layouts["scale_coords_layout"].setContentsMargins(0, 0, 0, 0)
self.layouts["scale_coords_layout"].setSpacing(5)
self.layouts["scale_coords_layout"].addWidget(self.controls["joint_sx_label"], 0, 0)
self.layouts["scale_coords_layout"].addWidget(self.controls["joint_sx_input"], 0, 1)
self.layouts["scale_coords_layout"].addWidget(self.controls["joint_sy_label"], 1, 0)
self.layouts["scale_coords_layout"].addWidget(self.controls["joint_sy_input"], 1, 1)
self.layouts["scale_coords_layout"].addWidget(self.controls["joint_sz_label"], 2, 0)
self.layouts["scale_coords_layout"].addWidget(self.controls["joint_sz_input"], 2, 1)
self.layouts["joint_scale_layout"].addLayout(self.layouts["scale_coords_layout"])
self.layouts["joint_properties_layout"].addLayout(self.layouts["joint_scale_layout"])
# 属性按钮行
self.layouts["properties_buttons_layout"] = QtWidgets.QHBoxLayout()
self.layouts["properties_buttons_layout"].setContentsMargins(0, 0, 0, 0)
self.layouts["properties_buttons_layout"].setSpacing(5)
self.layouts["properties_buttons_layout"].addWidget(self.buttons["apply_joint_properties"])
self.layouts["properties_buttons_layout"].addWidget(self.buttons["reset_joint_properties"])
self.layouts["joint_properties_layout"].addLayout(self.layouts["properties_buttons_layout"])
# 绑定工具组布局
self.layouts["binding_tools_layout"] = QtWidgets.QVBoxLayout(self.controls["binding_tools_group"])
self.layouts["binding_tools_layout"].setContentsMargins(5, 10, 5, 5)
self.layouts["binding_tools_layout"].setSpacing(5)
# 绑定工具按钮网格
self.layouts["binding_tools_grid"] = QtWidgets.QGridLayout()
self.layouts["binding_tools_grid"].setContentsMargins(0, 0, 0, 0)
self.layouts["binding_tools_grid"].setSpacing(5)
self.layouts["binding_tools_grid"].addWidget(self.buttons["create_binding"], 0, 0)
self.layouts["binding_tools_grid"].addWidget(self.buttons["copy_skin"], 0, 1)
self.layouts["binding_tools_grid"].addWidget(self.buttons["mirror_skin"], 1, 0)
self.layouts["binding_tools_grid"].addWidget(self.buttons["paint_weights"], 1, 1)
self.layouts["binding_tools_layout"].addLayout(self.layouts["binding_tools_grid"])
# 添加组到右侧面板
self.layouts["right_layout"].addWidget(self.controls["joint_properties_group"])
self.layouts["right_layout"].addWidget(self.controls["binding_tools_group"])
# 底部工具面板
self.layouts["bottom_panel"] = QtWidgets.QHBoxLayout()
self.layouts["bottom_panel"].setContentsMargins(2, 2, 2, 2)
self.layouts["bottom_panel"].setSpacing(5)
# DNA组布局
self.layouts["dna_layout"] = QtWidgets.QVBoxLayout(self.controls["dna_group"])
self.layouts["dna_layout"].setContentsMargins(5, 10, 5, 5)
self.layouts["dna_layout"].setSpacing(5)
self.layouts["dna_layout"].addWidget(self.buttons["import_dna"])
self.layouts["dna_layout"].addWidget(self.buttons["export_dna"])
self.layouts["dna_layout"].addWidget(self.buttons["calibrate_dna"])
# 骨骼工具组布局
self.layouts["skeleton_tools_layout"] = QtWidgets.QVBoxLayout(self.controls["skeleton_tools_group"])
self.layouts["skeleton_tools_layout"].setContentsMargins(5, 10, 5, 5)
self.layouts["skeleton_tools_layout"].setSpacing(5)
self.layouts["skeleton_tools_layout"].addWidget(self.buttons["import_skeleton"])
self.layouts["skeleton_tools_layout"].addWidget(self.buttons["export_skeleton"])
self.layouts["skeleton_tools_layout"].addWidget(self.buttons["calibrate_skeleton"])
# 绑定工具组布局
self.layouts["rigging_tools_layout"] = QtWidgets.QVBoxLayout(self.controls["rigging_tools_group"])
self.layouts["rigging_tools_layout"].setContentsMargins(5, 10, 5, 5)
self.layouts["rigging_tools_layout"].setSpacing(5)
self.layouts["rigging_tools_layout"].addWidget(self.buttons["generate_controllers"])
self.layouts["rigging_tools_layout"].addWidget(self.buttons["generate_body"])
self.layouts["rigging_tools_layout"].addWidget(self.buttons["clean_rigging"])
# 添加组到底部面板
self.layouts["bottom_panel"].addWidget(self.controls["dna_group"])
self.layouts["bottom_panel"].addWidget(self.controls["skeleton_tools_group"])
self.layouts["bottom_panel"].addWidget(self.controls["rigging_tools_group"])
# 添加底部面板到主布局
self.layouts["main_layout"].addLayout(self.layouts["bottom_panel"])
# 将左右面板添加到主分割器
self.splitters["main_splitter"].addWidget(self.controls["left_panel"])
self.splitters["main_splitter"].addWidget(self.controls["right_panel"])
# 设置分割器初始大小和伸缩因子
self.splitters["main_splitter"].setSizes([500, 500])
# 设置分割器的伸缩因子,确保左右栏能够自动调整宽度
for i in range(self.splitters["main_splitter"].count()):
self.splitters["main_splitter"].setStretchFactor(i, 1)
#======================================= CONNECTION =====================================
def create_connections(self):