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