153 lines
5.9 KiB
Python
153 lines
5.9 KiB
Python
#!/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
|
||
|