#!/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 mesh_utils as mesh_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. Model Tab Class ===================================== class MeshTab(widgets.BaseWidget): """模型标签页""" def __init__(self, parent=None): # 在调用父类的__init__之前初始化数据 self.lod_tabs = None self.lod_buttons = [] self.source_combo = None self.target_combo = None # LOD模型类型定义 self.lod_models = { 0: ["*头部", "*牙齿", "*牙龈", "*左眼", "*右眼", "*虹膜", "*睫毛", "*眼睑", "*软骨", "*身体"], 1: ["头部", "牙齿", "牙龈", "左眼", "右眼", "虹膜", "睫毛", "眼睑", "软骨", "身体"], 2: ["头部", "牙齿", "牙龈", "左眼", "右眼", "虹膜", "睫毛", "眼睑", "身体"], 3: ["头部", "牙齿", "左眼", "右眼", "虹膜", "睫毛", "眼睑", "身体"], 4: ["头部", "牙齿", "左眼", "右眼", "虹膜"], 5: ["头部", "牙齿", "左眼", "右眼"], 6: ["头部", "牙齿", "左眼", "右眼"], 7: ["头部", "牙齿", "左眼", "右眼"] } # 调用父类的__init__,这会触发setup_ui super(MeshTab, 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) # 创建LOD标签页 self.lod_tabs = QtWidgets.QTabWidget() layout.addWidget(self.lod_tabs) # 添加LOD0-7标签页 for i in range(8): tab = self._create_lod_tab(i) self.lod_tabs.addTab(tab, f"LOD{i}") # 添加底部工具区 bottom_layout = QtWidgets.QVBoxLayout() # 添加三个主要按钮 button_layout = QtWidgets.QHBoxLayout() btn = widgets.IconButton("auto_load.png", "自动加载模型") btn.clicked.connect(lambda checked=False, cb=mesh_utils.auto_load_models: cb()) button_layout.addWidget(btn) button_layout.addWidget(widgets.IconButton("standardize.png", "标准化命名", mesh_utils.standardize_naming)) button_layout.addWidget(widgets.IconButton("auto_group.png", "自动分组", mesh_utils.auto_group)) bottom_layout.addLayout(button_layout) # 添加模型工具区 tools_group = QtWidgets.QGroupBox("模型工具") tools_layout = QtWidgets.QGridLayout() # 左侧选择区 model_layout = QtWidgets.QHBoxLayout() model_layout.addWidget(QtWidgets.QLabel("预设模型:")) self.source_combo = QtWidgets.QComboBox() self.source_combo.addItem("Meta-Human") model_layout.addWidget(self.source_combo) # 右侧LOD选择 lod_layout = QtWidgets.QHBoxLayout() lod_layout.addWidget(QtWidgets.QLabel("运行LOD:")) self.target_combo = QtWidgets.QComboBox() self.target_combo.addItem("全部") lod_layout.addWidget(self.target_combo) lod_layout.addWidget(widgets.IconButton("create.png", "创建LOD", mesh_utils.create_lod)) tools_layout.addLayout(model_layout, 0, 0) tools_layout.addLayout(lod_layout, 0, 1) # 添加修复工具按钮 repair_tools = [ ("修复分离", mesh_utils.fix_split), ("生成面部配件", mesh_utils.generate_facial_accessories), ("修复法线", mesh_utils.fix_normals), ("修复点序", mesh_utils.fix_vertex_order), ("修复接缝", mesh_utils.fix_seams) ] for i, (text, callback) in enumerate(repair_tools): btn = QtWidgets.QPushButton(text) btn.clicked.connect(lambda checked=False, cb=callback: cb()) row = (i + 2) // 2 col = (i + 2) % 2 tools_layout.addWidget(btn, row, col) tools_group.setLayout(tools_layout) bottom_layout.addWidget(tools_group) layout.addLayout(bottom_layout) def _create_lod_tab(self, lod_index): """创建LOD标签页""" widget = QtWidgets.QWidget() layout = QtWidgets.QVBoxLayout(widget) layout.setSpacing(5) # 获取当前LOD级别的模型列表 models = self.lod_models.get(lod_index, []) for model_name in models: model_layout = QtWidgets.QHBoxLayout() # 标签 label = QtWidgets.QLabel(f"{model_name}:") model_layout.addWidget(label) # 路径输入框 path_input = widgets.ModernLineEdit(read_only=True) model_layout.addWidget(path_input, 1) # 加载按钮 load_btn = widgets.IconButton("target.png", "加载...") load_btn.clicked.connect(lambda x, m=model_name: self._load_model(lod_index, m)) model_layout.addWidget(load_btn) layout.addLayout(model_layout) layout.addStretch() return widget