#!/usr/bin/env python # -*- coding: utf-8 -*- #===================================== 1. Module Imports ===================================== import maya.cmds as cmds import maya.mel as mel import sys import os from scripts.config import data from scripts.ui import define_utils as define_utils from scripts.ui import widgets as widgets try: from PySide2 import QtCore, QtGui, QtWidgets from shiboken2 import wrapInstance except ImportError: try: from PySide6 import QtCore, QtGui, QtWidgets from shiboken6 import wrapInstance except ImportError: try: from PySide import QtCore, QtGui, QtWidgets from shiboken import wrapInstance except ImportError as e: QtCore = QtGui = QtWidgets = None wrapInstance = None #===================================== 2. Define Tab Class ===================================== class DefineTab(widgets.BaseWidget): """定义标签页""" def __init__(self, parent=None): self.lod_tree = None self.mesh_tree = None self.joint_tree = None self.blend_tree = None self.anim_tree = None super(DefineTab, self).__init__(parent) def setup_ui(self): """初始化UI""" layout = QtWidgets.QVBoxLayout(self) layout.setSpacing(self.SPACING) layout.setContentsMargins(self.MARGINS, self.MARGINS, self.MARGINS, self.MARGINS) # 创建左右分栏布局 splitter = QtWidgets.QSplitter(QtCore.Qt.Horizontal) layout.addWidget(splitter) # 左侧树形结构 left_widget = QtWidgets.QWidget() left_layout = QtWidgets.QVBoxLayout(left_widget) # LODs树 lod_group = QtWidgets.QGroupBox("LODs") lod_layout = QtWidgets.QVBoxLayout() self.lod_tree = QtWidgets.QTreeWidget() self.lod_tree.setHeaderHidden(True) # 添加LOD项 for i in range(8): lod_item = QtWidgets.QTreeWidgetItem([f"LOD {i}"]) self.lod_tree.addTopLevelItem(lod_item) lod_layout.addWidget(self.lod_tree) lod_group.setLayout(lod_layout) left_layout.addWidget(lod_group) # Meshes树 mesh_group = QtWidgets.QGroupBox("Meshes [010/54]") mesh_layout = QtWidgets.QVBoxLayout() self.mesh_tree = QtWidgets.QTreeWidget() self.mesh_tree.setHeaderHidden(True) # 添加示例网格 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") ] for name, index in meshes: mesh_item = QtWidgets.QTreeWidgetItem([name]) mesh_item.setData(0, QtCore.Qt.UserRole, index) self.mesh_tree.addTopLevelItem(mesh_item) mesh_layout.addWidget(self.mesh_tree) mesh_group.setLayout(mesh_layout) left_layout.addWidget(mesh_group) splitter.addWidget(left_widget) # 右侧内容 right_widget = QtWidgets.QWidget() right_layout = QtWidgets.QVBoxLayout(right_widget) # Joints树 joint_group = QtWidgets.QGroupBox("Joints [840/870]") joint_layout = QtWidgets.QVBoxLayout() self.joint_tree = QtWidgets.QTreeWidget() self.joint_tree.setHeaderHidden(True) # 添加示例关节 joints = [ ("FACIAL_C_NeckB", "001"), ("FACIAL_L_NeckB1", "002"), ("FACIAL_R_NeckB1", "003"), ("FACIAL_L_NeckB2", "002") ] for name, group in joints: joint_item = QtWidgets.QTreeWidgetItem([f"{name} Group: {group}"]) self.joint_tree.addTopLevelItem(joint_item) joint_layout.addWidget(self.joint_tree) joint_group.setLayout(joint_layout) right_layout.addWidget(joint_group) # Blend Shapes树 blend_group = QtWidgets.QGroupBox("Blend Shapes [782/782]") blend_layout = QtWidgets.QVBoxLayout() self.blend_tree = QtWidgets.QTreeWidget() self.blend_tree.setHeaderHidden(True) # 添加示例混合形状 blends = [ "brow_down_L", "brow_down_R", "brow_lateral_L", "brow_lateral_R" ] for name in blends: blend_item = QtWidgets.QTreeWidgetItem([name]) self.blend_tree.addTopLevelItem(blend_item) blend_layout.addWidget(self.blend_tree) blend_group.setLayout(blend_layout) right_layout.addWidget(blend_group) # AnimatedMap树 anim_group = QtWidgets.QGroupBox("AnimatedMap [082/82]") anim_layout = QtWidgets.QVBoxLayout() self.anim_tree = QtWidgets.QTreeWidget() self.anim_tree.setHeaderHidden(True) # 添加示例动画贴图 anims = [ "head_cm2_color.head_wm2_browsDown_L", "head_cm2_color.head_wm2_browsDown_R", "head_cm2_color.head_wm2_browsLateral_L", "head_cm2_color.head_wm2_browsLateral_R" ] for name in anims: anim_item = QtWidgets.QTreeWidgetItem([name]) self.anim_tree.addTopLevelItem(anim_item) anim_layout.addWidget(self.anim_tree) anim_group.setLayout(anim_layout) right_layout.addWidget(anim_group) splitter.addWidget(right_widget) # 底部按钮组 bottom_layout = QtWidgets.QHBoxLayout() # 导入组 write_group = QtWidgets.QGroupBox("导入") write_layout = QtWidgets.QVBoxLayout() write_btns = [ ("导入关节和权重", define_utils.write_joints_weights), ("导入几何体", define_utils.write_geometry), ("导入蒙皮权重", define_utils.write_skin_weights), ("导入混合变形目标", define_utils.write_blend_targets) ] for text, callback in write_btns: btn = QtWidgets.QPushButton(text) btn.clicked.connect(lambda checked=False, cb=callback: cb()) write_layout.addWidget(btn) write_group.setLayout(write_layout) bottom_layout.addWidget(write_group) # 创建组 create_group = QtWidgets.QGroupBox("创建") create_layout = QtWidgets.QVBoxLayout() create_btns = [ ("创建新的LOD", define_utils.create_new_lod), ("绑定蒙皮", define_utils.bind_skin), ("取消蒙皮", define_utils.unbind_skin) ] for text, callback in create_btns: btn = QtWidgets.QPushButton(text) btn.clicked.connect(lambda checked=False, cb=callback: cb()) create_layout.addWidget(btn) create_group.setLayout(create_layout) bottom_layout.addWidget(create_group) # 工具组 tools_group = QtWidgets.QGroupBox("工具") tools_layout = QtWidgets.QVBoxLayout() tools_btns = [ ("更新运行时LOD", define_utils.update_runtime_lod), ("快速创建绑定", define_utils.quick_create_binding), ("创建蒙皮", define_utils.create_skin) ] for text, callback in tools_btns: btn = QtWidgets.QPushButton(text) btn.clicked.connect(lambda checked=False, cb=callback: cb()) tools_layout.addWidget(btn) tools_group.setLayout(tools_layout) bottom_layout.addWidget(tools_group) layout.addLayout(bottom_layout)