MetaFusion/scripts/ui/mesh.py
2025-02-06 19:49:53 +08:00

153 lines
5.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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