Base
This commit is contained in:
169
scripts/ui/geometry.py
Normal file
169
scripts/ui/geometry.py
Normal file
@@ -0,0 +1,169 @@
|
||||
#!/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()
|
Reference in New Issue
Block a user