MetaFusion/scripts/MetaFusion.py

176 lines
5.4 KiB
Python
Raw Normal View History

2025-02-03 22:58:41 +08:00
#!/usr/bin/env python
2025-02-04 00:13:31 +08:00
# -*- coding: utf-8 -*-
2025-02-06 04:46:41 +08:00
#===================================== 1. Module Imports =====================================
2025-02-05 01:52:29 +08:00
import maya.OpenMayaUI as omui
2025-02-06 04:46:41 +08:00
import maya.cmds as cmds
import maya.mel as mel
import webbrowser
2025-02-05 01:52:29 +08:00
import traceback
2025-02-06 04:00:17 +08:00
import sys
2025-02-06 04:46:41 +08:00
import os
from scripts.config import data
2025-02-05 22:39:45 +08:00
try:
2025-02-06 04:00:17 +08:00
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
# 导入UI模块
from scripts.ui.menu import MenuManager
2025-02-06 19:49:53 +08:00
from scripts.ui.mesh import MeshTab
from scripts.ui.rigging import RiggingTab
2025-02-06 04:00:17 +08:00
from scripts.ui.adjust import AdjustTab
from scripts.ui.define import DefineTab
2025-02-06 19:49:53 +08:00
from scripts.ui.widgets import ModernTabWidget
2025-02-05 02:10:47 +08:00
2025-02-06 04:46:41 +08:00
#===================================== 2. Main Window Class =====================================
2025-02-05 02:10:47 +08:00
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
2025-02-06 19:49:53 +08:00
# 设置基础字体大小
font = self.font()
font.setPointSize(9) # 设置基础字号
self.setFont(font)
# 设置窗口大小
self.resize(700, 600) # 调整为更合适的尺寸
self.setMinimumSize(700, 500)
2025-02-05 02:10:47 +08:00
self.setup_core_components()
def setup_core_components(self):
"""初始化核心组件"""
self.setup_paths()
self.init_ui()
def setup_paths(self):
"""配置系统路径"""
2025-02-06 04:46:41 +08:00
if data.PLUGIN_PATH not in sys.path:
sys.path.insert(0, data.PLUGIN_PATH)
2025-02-05 02:10:47 +08:00
2025-02-06 04:00:17 +08:00
# 添加PyDNA路径
2025-02-06 04:46:41 +08:00
pydna_bin = os.path.join(data.PYDNA_PATH, "bin")
2025-02-05 02:10:47 +08:00
os.environ["PATH"] = f"{pydna_bin}{os.pathsep}{os.environ['PATH']}"
def init_ui(self):
"""初始化UI框架"""
2025-02-06 04:46:41 +08:00
self.setWindowTitle(f"{data.TOOL_NAME} {data.TOOL_VERSION}")
2025-02-04 00:13:31 +08:00
2025-02-05 02:10:47 +08:00
# 主窗口布局
main_widget = QtWidgets.QWidget()
self.setCentralWidget(main_widget)
main_layout = QtWidgets.QVBoxLayout(main_widget)
2025-02-06 19:49:53 +08:00
main_layout.setContentsMargins(0, 0, 0, 0)
main_layout.setSpacing(0)
2025-02-04 00:13:31 +08:00
2025-02-06 04:00:17 +08:00
# 创建菜单和工具栏
self.menu_manager = MenuManager(self)
2025-02-04 00:13:31 +08:00
2025-02-06 19:49:53 +08:00
# 创建标签页
self.tab_widget = ModernTabWidget()
main_layout.addWidget(self.tab_widget)
2025-02-05 02:10:47 +08:00
# 初始化各标签页
2025-02-06 19:49:53 +08:00
self.model_tab = MeshTab()
self.rig_tab = RiggingTab()
2025-02-05 02:10:47 +08:00
self.adjust_tab = AdjustTab()
self.define_tab = DefineTab()
2025-02-06 19:49:53 +08:00
2025-02-05 02:10:47 +08:00
# 添加标签页
2025-02-04 00:13:31 +08:00
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, "定义")
2025-02-06 19:49:53 +08:00
# 添加状态栏
self.statusBar().showMessage("就绪")
self.statusBar().setStyleSheet("""
QStatusBar {
background: #252525;
color: #e0e0e0;
}
""")
def load_styles(self):
"""加载样式表"""
if os.path.exists(data.TOOL_STYLE_FILE):
with open(data.TOOL_STYLE_FILE, "r", encoding="utf-8") as f:
self.setStyleSheet(f.read())
2025-02-05 01:52:29 +08:00
# ===================================== 显示主窗口 =====================================
def get_maya_window():
2025-02-06 04:00:17 +08:00
"""获取Maya主窗口"""
2025-02-05 01:52:29 +08:00
maya_main_window_ptr = omui.MQtUtil.mainWindow()
2025-02-06 04:00:17 +08:00
if maya_main_window_ptr is not None:
# 确保指针转换为整数
ptr = int(maya_main_window_ptr)
return wrapInstance(ptr, QtWidgets.QWidget)
return None
2025-02-05 01:52:29 +08:00
def dock_to_maya():
2025-02-06 04:00:17 +08:00
"""嵌入Maya Dock面板"""
global main_window
2025-02-05 01:52:29 +08:00
try:
2025-02-06 04:46:41 +08:00
if cmds.workspaceControl(data.TOOL_WSCL_NAME, exists=True):
cmds.deleteUI(data.TOOL_WSCL_NAME)
2025-02-04 16:58:34 +08:00
2025-02-05 01:52:29 +08:00
dock_control = cmds.workspaceControl(
2025-02-06 04:46:41 +08:00
data.TOOL_WSCL_NAME,
label=data.TOOL_NAME,
2025-02-05 01:52:29 +08:00
tabToControl=["AttributeEditor", -1],
initialWidth=1400,
minimumWidth=1000,
2025-02-06 04:00:17 +08:00
minimumHeight=800
2025-02-05 01:52:29 +08:00
)
maya_dock_ptr = omui.MQtUtil.findControl(dock_control)
if not maya_dock_ptr:
raise RuntimeError("无法获取Dock控件指针")
maya_main_window = get_maya_window()
2025-02-05 02:10:47 +08:00
main_window = MainWindow(parent=maya_main_window)
2025-02-05 01:52:29 +08:00
2025-02-06 04:00:17 +08:00
# 确保指针转换为整数
2025-02-05 01:52:29 +08:00
maya_dock_widget = wrapInstance(int(maya_dock_ptr), QtWidgets.QWidget)
maya_dock_widget.layout().addWidget(main_window)
return main_window
except Exception as e:
2025-02-06 04:00:17 +08:00
cmds.warning(f"Dock嵌入失败: {str(e)}")
2025-02-05 01:52:29 +08:00
return None
2025-02-04 00:13:31 +08:00
def show():
"""显示主窗口"""
global main_window
try:
2025-02-05 01:52:29 +08:00
if main_window:
main_window.close()
2025-02-06 04:46:41 +08:00
cmds.deleteUI(data.TOOL_WSCL_NAME)
2025-02-04 00:13:31 +08:00
except:
pass
2025-02-05 01:52:29 +08:00
main_window = dock_to_maya()
if not main_window:
2025-02-06 04:00:17 +08:00
cmds.warning("使用独立窗口模式")
2025-02-05 02:10:47 +08:00
main_window = MainWindow()
2025-02-05 01:52:29 +08:00
main_window.show()
2025-02-04 00:13:31 +08:00
return main_window
if __name__ == "__main__":
2025-02-06 04:00:17 +08:00
show()
2025-02-04 00:13:31 +08:00