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
|
|||
|
|