MetaFusion/scripts/MetaFusion.py
2025-02-04 16:58:34 +08:00

263 lines
8.7 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
from PySide2 import QtCore, QtGui, QtWidgets
# 添加项目根目录到 Python 路径
ROOT_DIR = os.path.dirname(os.path.dirname(__file__))
if ROOT_DIR not in sys.path:
sys.path.insert(0, ROOT_DIR)
from config import data
from dna_utils import DNAManager
QtCore, QtGui, QtWidgets = data.Qt()
#===================================== 2. Global Variables =====================================
TOOL_NAME = data.TOOL_NAME
TOOL_VERSION = data.TOOL_VERSION
TOOL_AUTHOR = data.TOOL_AUTHOR
TOOL_LANG = data.TOOL_LANG
TOOL_WSCL_NAME = data.TOOL_WSCL_NAME
TOOL_HELP_URL = data.TOOL_HELP_URL
SCRIPTS_PATH = data.SCRIPTS_PATH
ICONS_PATH = data.ICONS_PATH
TOOL_MAIN_SCRIPT = data.TOOL_MAIN_SCRIPT
TOOL_MOD_FILENAME = data.TOOL_MOD_FILENAME
TOOL_ICON = data.TOOL_ICON
TOOL_COMMAND_ICON = data.TOOL_COMMAND_ICON
main_window = None
class MetaFusionWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MetaFusionWindow, self).__init__(parent)
self.setWindowTitle("MetaFusion")
self.resize(800, 600)
# 加载样式表
self.load_stylesheet()
# 创建UI
self.setup_ui()
def load_stylesheet(self):
"""加载QSS样式表"""
style_file = os.path.join(os.path.dirname(os.path.dirname(__file__)), "resources", "styles", "style.qss")
if os.path.exists(style_file):
with open(style_file, 'r', encoding='utf-8') as f:
self.setStyleSheet(f.read())
def setup_ui(self):
"""设置UI结构"""
# 创建中心部件
central_widget = QtWidgets.QWidget()
self.setCentralWidget(central_widget)
# 创建主布局
main_layout = QtWidgets.QVBoxLayout(central_widget)
# 创建菜单栏
self.create_menu_bar()
# 创建工具栏
self.create_tool_bar()
# 创建标签页
self.create_tabs()
def create_menu_bar(self):
"""创建菜单栏"""
menubar = self.menuBar()
# 文件菜单
file_menu = menubar.addMenu("文件")
file_menu.addAction("新建")
file_menu.addAction("打开")
file_menu.addAction("保存")
file_menu.addSeparator()
file_menu.addAction("退出")
# 编辑菜单
edit_menu = menubar.addMenu("编辑")
edit_menu.addAction("撤销")
edit_menu.addAction("重做")
# 帮助菜单
help_menu = menubar.addMenu("帮助")
help_menu.addAction("关于")
def create_tool_bar(self):
"""创建工具栏"""
toolbar = self.addToolBar("主工具栏")
toolbar.setMovable(False)
# 添加工具栏按钮
toolbar.addAction(QtGui.QIcon(":/icons/new.png"), "新建")
toolbar.addAction(QtGui.QIcon(":/icons/open.png"), "打开")
toolbar.addAction(QtGui.QIcon(":/icons/save.png"), "保存")
def create_tabs(self):
"""创建标签页"""
self.tab_widget = QtWidgets.QTabWidget()
self.centralWidget().layout().addWidget(self.tab_widget)
# 创建四个主要标签页
self.model_tab = QtWidgets.QWidget()
self.rig_tab = QtWidgets.QWidget()
self.adjust_tab = QtWidgets.QWidget()
self.define_tab = QtWidgets.QWidget()
# 添加标签页到标签页控件
self.tab_widget.addTab(self.model_tab, "模型")
self.tab_widget.addTab(self.rig_tab, "绑定")
self.tab_widget.addTab(self.adjust_tab, "调整")
self.tab_widget.addTab(self.define_tab, "定义")
# 设置各个标签页的内容
self.setup_model_tab()
self.setup_rig_tab()
self.setup_adjust_tab()
self.setup_define_tab()
def setup_model_tab(self):
"""设置模型标签页内容"""
layout = QtWidgets.QVBoxLayout(self.model_tab)
# 添加模型列表
model_list = QtWidgets.QListWidget()
layout.addWidget(model_list)
# 添加按钮组
button_layout = QtWidgets.QHBoxLayout()
import_btn = QtWidgets.QPushButton("导入模型")
export_btn = QtWidgets.QPushButton("导出模型")
button_layout.addWidget(import_btn)
button_layout.addWidget(export_btn)
layout.addLayout(button_layout)
def setup_rig_tab(self):
"""设置绑定标签页内容"""
layout = QtWidgets.QVBoxLayout(self.rig_tab)
# 添加骨骼列表
joint_tree = QtWidgets.QTreeWidget()
joint_tree.setHeaderLabels(["骨骼", "位置"])
layout.addWidget(joint_tree)
# 添加按钮组
button_layout = QtWidgets.QHBoxLayout()
calibrate_btn = QtWidgets.QPushButton("校准骨骼")
save_btn = QtWidgets.QPushButton("保存骨骼")
button_layout.addWidget(calibrate_btn)
button_layout.addWidget(save_btn)
layout.addLayout(button_layout)
def setup_adjust_tab(self):
"""设置调整标签页内容"""
layout = QtWidgets.QVBoxLayout(self.adjust_tab)
# 添加BlendShape列表
blend_list = QtWidgets.QListWidget()
layout.addWidget(blend_list)
# 添加滑块组
slider_layout = QtWidgets.QVBoxLayout()
for i in range(5):
slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
slider_layout.addWidget(slider)
layout.addLayout(slider_layout)
# 添加按钮组
button_layout = QtWidgets.QHBoxLayout()
edit_btn = QtWidgets.QPushButton("编辑BlendShape")
save_btn = QtWidgets.QPushButton("保存设置")
button_layout.addWidget(edit_btn)
button_layout.addWidget(save_btn)
layout.addLayout(button_layout)
def setup_define_tab(self):
"""设置定义标签页内容"""
layout = QtWidgets.QVBoxLayout(self.define_tab)
# 添加DNA编辑区域
self.dna_edit = QtWidgets.QTextEdit()
layout.addWidget(self.dna_edit)
# 添加按钮组
button_layout = QtWidgets.QHBoxLayout()
self.load_btn = QtWidgets.QPushButton("载入DNA")
self.save_btn = QtWidgets.QPushButton("保存DNA")
self.export_btn = QtWidgets.QPushButton("导出FBX")
# 连接信号槽
self.load_btn.clicked.connect(self.on_load_dna)
self.save_btn.clicked.connect(self.on_save_dna)
self.export_btn.clicked.connect(self.on_export_fbx)
button_layout.addWidget(self.load_btn)
button_layout.addWidget(self.save_btn)
button_layout.addWidget(self.export_btn)
layout.addLayout(button_layout)
# 创建DNA管理器
self.dna_manager = DNAManager()
def on_load_dna(self):
"""处理载入DNA事件"""
file_path, _ = QtWidgets.QFileDialog.getOpenFileName(
self, "选择DNA文件", "", "DNA Files (*.dna)")
if file_path:
if self.dna_manager.load_dna(file_path):
self.dna_edit.setText(f"已加载DNA文件: {file_path}")
else:
QtWidgets.QMessageBox.warning(
self, "错误", "DNA文件加载失败")
def on_save_dna(self):
"""处理保存DNA事件"""
file_path, _ = QtWidgets.QFileDialog.getSaveFileName(
self, "保存DNA文件", "", "DNA Files (*.dna)")
if file_path:
if self.dna_manager.save_dna(file_path):
QtWidgets.QMessageBox.information(
self, "成功", "DNA文件保存成功")
else:
QtWidgets.QMessageBox.warning(
self, "错误", "DNA文件保存失败")
def on_export_fbx(self):
"""处理导出FBX事件"""
file_path, _ = QtWidgets.QFileDialog.getSaveFileName(
self, "导出FBX", "", "FBX Files (*.fbx)")
if file_path:
if self.dna_manager.export_fbx(file_path):
QtWidgets.QMessageBox.information(
self, "成功", "FBX导出成功")
else:
QtWidgets.QMessageBox.warning(
self, "错误", "FBX导出失败")
def show():
"""显示主窗口"""
global main_window
try:
main_window.close()
except:
pass
main_window = MetaFusionWindow()
main_window.show()
return main_window
if __name__ == "__main__":
app = QtWidgets.QApplication([])
window = show()
app.exec_()