Files
MetaFusion/scripts/ui/geometry.py
2025-05-02 00:14:28 +08:00

169 lines
6.8 KiB
Python
Raw 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 -*-
"""
Geometry UI Module for Plugin
几何模型UI模块 - 负责显示几何模型编辑界面和基础操作
基本功能:
- 模型拾取以及加载
- LOD模型分级过滤
- LOD模型创建
- 自动加载模型
- 标准化命名
- 自动分组
- 生成面部配件(睫毛,舌头,泪腺 等)
- 修复接缝(修复法线)
- 修复点序
"""
#===================================== IMPORT MODULES =====================================
from Qt import QtWidgets, QtCore, QtGui
from Qt.QtCompat import wrapInstance
from maya import OpenMayaUI as omui
import sys
import os
#===================================== IMPORT FUNCTIONS ===================================
from scripts.utils import utils_geometry as utils_geometry
from scripts.ui import ui_utils
#========================================== WIDGETS ==========================================
# 全局变量存储UI控件
model_tree = None
lod_combo = None
model_buttons = {}
model_info_panel = None
def widgets():
"""
创建几何模型UI控件
"""
global model_tree, lod_combo, model_buttons, model_info_panel
# LOD选择下拉菜单
lod_combo = QtWidgets.QComboBox()
lod_combo.addItems(["LOD0", "LOD1", "LOD2", "LOD3", "LOD4"])
lod_combo.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
lod_combo.setMinimumWidth(100)
# 模型树形视图
model_tree = QtWidgets.QTreeWidget()
model_tree.setHeaderLabels(["模型名称", "顶点数", "面数"])
model_tree.setMinimumHeight(250)
model_tree.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
model_tree.header().setSectionResizeMode(QtWidgets.QHeaderView.Stretch) # 列自动拉伸
# 模型信息面板
model_info_panel = QtWidgets.QTextEdit()
model_info_panel.setReadOnly(True)
model_info_panel.setMinimumHeight(100)
model_info_panel.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
# 功能按钮 - 设置统一的大小策略
for button_name in ["load_model", "create_lod", "auto_load", "standardize_name",
"auto_group", "generate_accessories", "fix_seams", "fix_vertex_order"]:
model_buttons[button_name] = QtWidgets.QPushButton({
"load_model": "加载模型",
"create_lod": "创建LOD",
"auto_load": "自动加载",
"standardize_name": "标准化命名",
"auto_group": "自动分组",
"generate_accessories": "生成面部配件",
"fix_seams": "修复接缝",
"fix_vertex_order": "修复点序"
}[button_name])
model_buttons[button_name].setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
model_buttons[button_name].setMinimumWidth(120)
#========================================== LAYOUTS ==========================================
def layouts(parent_tab=None):
"""
创建几何模型UI布局
Args:
parent_tab: 父容器控件由Main.py传入
"""
# 获取父容器在Main.py中创建的geometry_tab
if not parent_tab:
parent_tab = ui_utils.get_parent_widget("geometry_tab")
if not parent_tab:
print("无法获取父容器,布局创建失败")
return
# 创建主布局
main_layout = parent_tab.layout()
if not main_layout:
main_layout = QtWidgets.QVBoxLayout(parent_tab)
main_layout.setContentsMargins(4, 4, 4, 4)
main_layout.setSpacing(4)
main_layout.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint) # 设置布局约束为默认,允许自适应
# 创建分割控件
splitter = QtWidgets.QSplitter(QtCore.Qt.Vertical)
# 上部区域 - LOD选择和模型树
top_widget = QtWidgets.QWidget()
top_layout = QtWidgets.QVBoxLayout(top_widget)
top_layout.setContentsMargins(0, 0, 0, 0)
# LOD选择区域
lod_layout = QtWidgets.QHBoxLayout()
lod_layout.addWidget(QtWidgets.QLabel("LOD级别:"))
lod_layout.addWidget(lod_combo)
lod_layout.addStretch()
top_layout.addLayout(lod_layout)
# 模型树区域
model_group = QtWidgets.QGroupBox("模型列表")
model_layout = QtWidgets.QVBoxLayout(model_group)
model_layout.addWidget(model_tree)
top_layout.addWidget(model_group)
# 下部区域 - 模型信息
model_info_group = QtWidgets.QGroupBox("模型信息")
model_info_layout = QtWidgets.QVBoxLayout(model_info_group)
model_info_layout.addWidget(model_info_panel)
# 添加到分割控件
splitter.addWidget(top_widget)
splitter.addWidget(model_info_group)
# 按钮区域
button_layout = QtWidgets.QGridLayout()
button_layout.addWidget(model_buttons["load_model"], 0, 0)
button_layout.addWidget(model_buttons["create_lod"], 0, 1)
button_layout.addWidget(model_buttons["auto_load"], 1, 0)
button_layout.addWidget(model_buttons["standardize_name"], 1, 1)
button_layout.addWidget(model_buttons["auto_group"], 2, 0)
button_layout.addWidget(model_buttons["generate_accessories"], 2, 1)
button_layout.addWidget(model_buttons["fix_seams"], 3, 0)
button_layout.addWidget(model_buttons["fix_vertex_order"], 3, 1)
# 添加到主布局
main_layout.addWidget(splitter)
main_layout.addLayout(button_layout)
#========================================== CONNECTIONS ==========================================
def connections():
"""
连接几何模型UI信号和槽
"""
# 连接按钮点击事件到占位函数
model_buttons["load_model"].clicked.connect(lambda: print("加载模型功能待实现"))
model_buttons["create_lod"].clicked.connect(lambda: print("创建LOD功能待实现"))
model_buttons["auto_load"].clicked.connect(lambda: print("自动加载功能待实现"))
model_buttons["standardize_name"].clicked.connect(lambda: print("标准化命名功能待实现"))
model_buttons["auto_group"].clicked.connect(lambda: print("自动分组功能待实现"))
model_buttons["generate_accessories"].clicked.connect(lambda: print("生成面部配件功能待实现"))
model_buttons["fix_seams"].clicked.connect(lambda: print("修复接缝功能待实现"))
model_buttons["fix_vertex_order"].clicked.connect(lambda: print("修复点序功能待实现"))
# 连接LOD选择事件
lod_combo.currentIndexChanged.connect(lambda index: print(f"选择的LOD级别: {lod_combo.currentText()}"))
# 连接模型树选择事件
model_tree.itemSelectionChanged.connect(lambda: print("模型选择已更改"))
#===================================== PLACEHOLDER FUNCTION ===================================
def geometry_temp_function():
return utils_geometry.geometry_temp_utils_function()