MetaFusion/scripts/ui/mesh.py

153 lines
5.9 KiB
Python
Raw Normal View History

2025-02-06 19:49:53 +08:00
#!/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