From 4b24277b842716f9750172f4f9e65614b25d4869 Mon Sep 17 00:00:00 2001 From: Jeffreytsai1004 Date: Mon, 10 Feb 2025 04:16:11 +0800 Subject: [PATCH] Update definition.py --- scripts/ui/definition.py | 369 +++++++++++++++------------------------ 1 file changed, 139 insertions(+), 230 deletions(-) diff --git a/scripts/ui/definition.py b/scripts/ui/definition.py index 544bd60..02638d2 100644 --- a/scripts/ui/definition.py +++ b/scripts/ui/definition.py @@ -35,258 +35,167 @@ class DefinitionTab(QtWidgets.QWidget): def __init__(self, parent=None): super(DefinitionTab, self).__init__(parent) self._setup_ui() - self._create_connections() def _setup_ui(self): """设置UI布局""" # === Main Layout === - self.main_layout = QtWidgets.QHBoxLayout(self) - self.main_layout.setContentsMargins(2, 2, 2, 2) - self.main_layout.setSpacing(2) + self.main_layout = QtWidgets.QVBoxLayout(self) + self.main_layout.setContentsMargins(4, 4, 4, 4) + self.main_layout.setSpacing(4) - # 创建左侧和右侧面板 - self.left_panel = self._create_left_panel() - self.right_panel = self._create_right_panel() + # === 创建水平分割布局 === + self.splitter = QtWidgets.QSplitter(QtCore.Qt.Horizontal) - self.main_layout.addWidget(self.left_panel, 1) # 1:3比例 - self.main_layout.addWidget(self.right_panel, 3) + # === 左侧区域 === + left_widget = QtWidgets.QWidget() + left_layout = QtWidgets.QVBoxLayout(left_widget) + left_layout.setContentsMargins(4, 8, 4, 4) + left_layout.setSpacing(4) - def _create_left_panel(self): - """创建左侧面板""" - # === Widget === - widget = QtWidgets.QWidget() + # LODs标题 + lod_title = QtWidgets.QLabel("LODs") + lod_title.setStyleSheet("color: #00A5FF;") - # === Layout === - layout = QtWidgets.QVBoxLayout(widget) - layout.setContentsMargins(5, 5, 5, 5) - layout.setSpacing(5) - - # LODs列表 - lod_group = QtWidgets.QGroupBox("LODs") - lod_layout = QtWidgets.QVBoxLayout() + # LOD列表 self.lod_list = QtWidgets.QListWidget() + self.lod_list.setStyleSheet(""" + QListWidget { + background: #232323; + border: 1px solid #555555; + } + QListWidget::item { + height: 24px; + padding: 0px 4px; + border-bottom: 1px solid #383838; + } + QListWidget::item:selected { + background: #4D4D4D; + } + """) + + # 添加LOD项 for i in range(8): - self.lod_list.addItem(f"LOD {i}") - lod_layout.addWidget(self.lod_list) - - # Define Joint按钮 - self.define_joint_btn = QtWidgets.QPushButton("Define Joint For LOD") - lod_layout.addWidget(self.define_joint_btn) - - lod_group.setLayout(lod_layout) - layout.addWidget(lod_group) - - return widget - - def _create_right_panel(self): - """创建右侧面板""" - # === Widget === - widget = QtWidgets.QWidget() - - # === Layout === - layout = QtWidgets.QVBoxLayout(widget) - layout.setContentsMargins(5, 5, 5, 5) - layout.setSpacing(5) - - # 创建各个部分 - self.meshes_widget = self._create_meshes_section() - self.joints_widget = self._create_joints_section() - self.blend_shapes_widget = self._create_blend_shapes_section() - self.animated_map_widget = self._create_animated_map_section() - - # 添加到布局 - layout.addWidget(self.meshes_widget) - layout.addWidget(self.joints_widget) - layout.addWidget(self.blend_shapes_widget) - layout.addWidget(self.animated_map_widget) - - # 添加操作按钮区域 - self.operation_widget = self._create_operation_section() - layout.addWidget(self.operation_widget) - - return widget - - def _create_meshes_section(self): - """创建Meshes部分""" - # === Widget === - group = QtWidgets.QGroupBox("Meshes [010/54]") - - # === Layout === - layout = QtWidgets.QVBoxLayout(group) - - # 列表 - self.meshes_list = QtWidgets.QListWidget() - meshes = [ - "head_lod0_mesh (000)", - "teeth_lod0_mesh (001)", - "saliva_lod0_mesh (002)", - "eyeLeft_lod0_mesh (003)", - "eyeRight_lod0_mesh (004)", - "eyeshell_lod0_mesh (005)", - "eyelashes_lod0_mesh (006)", - "eyeEdge_lod0_mesh (007)" - ] - for mesh in meshes: - self.meshes_list.addItem(mesh) + item = QtWidgets.QListWidgetItem(f"LOD {i}") + item.setIcon(QtGui.QIcon(":mesh.png")) + self.lod_list.addItem(item) - layout.addWidget(self.meshes_list) + # 定义LOD关节按钮 + define_lod_btn = QtWidgets.QPushButton("定义LOD关节") + define_lod_btn.setIcon(QtGui.QIcon(":kinJoint.png")) - # Create Geometry按钮 - self.create_geo_btn = QtWidgets.QPushButton("Create Geometry") - layout.addWidget(self.create_geo_btn) + # Meshes标题 + mesh_title = QtWidgets.QLabel("Meshes [010/54]") + mesh_title.setStyleSheet("color: #00A5FF;") - return group + # Mesh列表 + self.mesh_list = QtWidgets.QListWidget() + self.mesh_list.setStyleSheet(self.lod_list.styleSheet()) - def _create_joints_section(self): - """创建Joints部分""" - # === Widget === - group = QtWidgets.QGroupBox("Joints [840/870]") + # 添加Mesh项 + mesh_items = [ + ("head_lod0_mesh", "000"), + ("teeth_lod0_mesh", "001"), + ("saliva_lod0_mesh", "002"), + ("eyeLeft_lod0_mesh", "003"), + ("eyeRight_lod0_mesh", "004") + ] - # === Layout === - layout = QtWidgets.QVBoxLayout(group) + for name, index in mesh_items: + item = QtWidgets.QListWidgetItem(f"{name} {index}") + item.setIcon(QtGui.QIcon(":mesh.png")) + self.mesh_list.addItem(item) + + # 添加到左侧布局 + left_layout.addWidget(lod_title) + left_layout.addWidget(self.lod_list) + left_layout.addWidget(define_lod_btn) + left_layout.addWidget(mesh_title) + left_layout.addWidget(self.mesh_list) + + # === 右侧区域 === + right_widget = QtWidgets.QWidget() + right_layout = QtWidgets.QVBoxLayout(right_widget) + right_layout.setContentsMargins(4, 8, 4, 4) + right_layout.setSpacing(4) + + # Joints标题和列表 + joints_title = QtWidgets.QLabel("Joints [840/870]") + joints_title.setStyleSheet("color: #00A5FF;") - # 列表 self.joints_list = QtWidgets.QListWidget() - joints = [ - "FACIAL_C_NeckB Group: 001", - "FACIAL_L_NeckB1 Group: 002", - "FACIAL_R_NeckB1 Group: 003", - "FACIAL_L_NeckB2 Group: 002", - "FACIAL_R_NeckB2 Group: 003", - "FACIAL_C12PV_NeckB1 Group: 001" - ] - for joint in joints: - self.joints_list.addItem(joint) + self.joints_list.setStyleSheet(self.lod_list.styleSheet()) + + # BlendShapes标题和列表 + blendshapes_title = QtWidgets.QLabel("Blend Shapes [782/782]") + blendshapes_title.setStyleSheet("color: #00A5FF;") + + self.blendshapes_list = QtWidgets.QListWidget() + self.blendshapes_list.setStyleSheet(self.lod_list.styleSheet()) + + # AnimatedMap标题和列表 + animatedmap_title = QtWidgets.QLabel("AnimatedMap [082/82]") + animatedmap_title.setStyleSheet("color: #00A5FF;") + + self.animatedmap_list = QtWidgets.QListWidget() + self.animatedmap_list.setStyleSheet(self.lod_list.styleSheet()) + + # 添加到右侧布局 + right_layout.addWidget(joints_title) + right_layout.addWidget(self.joints_list) + right_layout.addWidget(blendshapes_title) + right_layout.addWidget(self.blendshapes_list) + right_layout.addWidget(animatedmap_title) + right_layout.addWidget(self.animatedmap_list) + + # === 底部功能区域 === + bottom_widget = QtWidgets.QWidget() + bottom_layout = QtWidgets.QHBoxLayout(bottom_widget) + bottom_layout.setContentsMargins(4, 4, 4, 4) + bottom_layout.setSpacing(4) + + # 创建三个功能区 + for title, buttons in [ + ("导入", [ + ("导入关节和表情", ":kinJoint.png"), + ("导入几何体", ":mesh.png"), + ("导入蒙皮数据", ":skinWeight.png"), + ("导入混合变形目标", ":blendShape.png") + ]), + ("创建", [ + ("创建混合形状", ":blendShape.png"), + ("蒙皮到皮", ":skinWeight.png"), + ("取消蒙皮", ":skinWeight.png") + ]), + ("工具", [ + ("重新定位关节位置", ":kinJoint.png"), + ("快速创建蒙皮设置", ":skinWeight.png") + ]) + ]: + group = QtWidgets.QGroupBox(title) + group_layout = QtWidgets.QVBoxLayout(group) + group_layout.setContentsMargins(4, 4, 4, 8) + group_layout.setSpacing(4) - layout.addWidget(self.joints_list) - return group - - def _create_blend_shapes_section(self): - """创建Blend Shapes部分""" - # === Widget === - group = QtWidgets.QGroupBox("Blend Shapes [782/782]") - - # === Layout === - layout = QtWidgets.QVBoxLayout(group) - - # 列表 - self.blend_shapes_list = QtWidgets.QListWidget() - shapes = [ - "brow_down_L 000", - "brow_down_R 001", - "brow_lateral_L 002", - "brow_lateral_R 003", - "brow_raiseIn_L 004", - "brow_raiseIn_R 005" - ] - for shape in shapes: - self.blend_shapes_list.addItem(shape) + # 添加按钮 + for text, icon in buttons: + btn = QtWidgets.QPushButton(text) + btn.setIcon(QtGui.QIcon(icon)) + btn.setFixedHeight(24) + group_layout.addWidget(btn) - layout.addWidget(self.blend_shapes_list) - return group + # 添加弹性空间到底部 + group_layout.addStretch() + bottom_layout.addWidget(group) - def _create_animated_map_section(self): - """创建AnimatedMap部分""" - # === Widget === - group = QtWidgets.QGroupBox("AnimatedMap [082/82]") + # 添加到分割器和主布局 + self.splitter.addWidget(left_widget) + self.splitter.addWidget(right_widget) - # === Layout === - layout = QtWidgets.QVBoxLayout(group) + self.main_layout.addWidget(self.splitter) + self.main_layout.addWidget(bottom_widget) - # 列表 - self.animated_map_list = QtWidgets.QListWidget() - maps = [ - "head_cm2_color.head_wm2.browsDown 000", - "head_cm2_color.head_wm2.browsDown 001", - "head_cm2_color.head_wm2.browsLate 002", - "head_cm2_color.head_wm2.browsLate 003", - "head_cm1_color.head_wm1.browsRais 004", - "head_cm1_color.head_wm1.browsRais 005" - ] - for map_item in maps: - self.animated_map_list.addItem(map_item) - - layout.addWidget(self.animated_map_list) - return group - - def _create_operation_section(self): - """创建操作区域""" - # === Widget === - widget = QtWidgets.QWidget() - - # === Layout === - layout = QtWidgets.QVBoxLayout(widget) - - # Write部分 - write_group = QtWidgets.QGroupBox("Write") - write_layout = QtWidgets.QVBoxLayout() - write_buttons = [ - "Write Neutral Pose Joint Position", - "Write Geometry", - "Write Skin Weights", - "Write Blend Shapes Targets" - ] - for text in write_buttons: - btn = QtWidgets.QPushButton(text) - write_layout.addWidget(btn) - write_group.setLayout(write_layout) - layout.addWidget(write_group) - - # Create部分 - create_group = QtWidgets.QGroupBox("Create") - create_layout = QtWidgets.QVBoxLayout() - create_buttons = [ - "Create Blend Shapes For Mesh", - "Bind Skin For Mesh", - "Unbind Skin For Mesh" - ] - for text in create_buttons: - btn = QtWidgets.QPushButton(text) - create_layout.addWidget(btn) - create_group.setLayout(create_layout) - layout.addWidget(create_group) - - # Tools部分 - tools_group = QtWidgets.QGroupBox("Tools") - tools_layout = QtWidgets.QVBoxLayout() - tools_buttons = [ - "New Neutral Joint Transform", - "Quickly Create Presets" - ] - for text in tools_buttons: - btn = QtWidgets.QPushButton(text) - tools_layout.addWidget(btn) - tools_group.setLayout(tools_layout) - layout.addWidget(tools_group) - - return widget - - def _create_connections(self): - """创建信号连接""" - # LOD列表选择 - self.lod_list.currentItemChanged.connect(self._on_lod_changed) - - # Define Joint按钮 - self.define_joint_btn.clicked.connect(self._on_define_joint) - - # Create Geometry按钮 - self.create_geo_btn.clicked.connect(self._on_create_geometry) - - # ================================ 事件函数 ================================ - def _on_lod_changed(self, current, previous): - """LOD选择改变""" - # TODO: 实现LOD切换逻辑 - pass - - def _on_define_joint(self): - """Define Joint按钮点击""" - # TODO: 实现Define Joint逻辑 - pass - - def _on_create_geometry(self): - """Create Geometry按钮点击""" - # TODO: 实现Create Geometry逻辑 - pass + # 设置分割器初始比例为均等 + self.splitter.setSizes([int(self.width() * 0.5), int(self.width() * 0.5)]) if __name__ == "__main__": pass \ No newline at end of file