MetaFusion/scripts/MetaFusion.py

183 lines
5.5 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#===================================== 1. Module Imports =====================================
import maya.OpenMayaUI as omui
import maya.cmds as cmds
import maya.mel as mel
import webbrowser
import traceback
import sys
import os
from scripts.config import data
try:
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
from scripts.ui.mesh import MeshTab
from scripts.ui.rigging import RiggingTab
from scripts.ui.adjust import AdjustTab
from scripts.ui.define import DefineTab
from scripts.ui.widgets import ModernTabWidget
#===================================== 2. Main Window Class =====================================
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
# 设置窗口属性
self.setWindowFlags(QtCore.Qt.Window)
self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
# 设置基础字体大小
font = self.font()
font.setPointSize(9)
self.setFont(font)
self.resize(550, 700)
self.setup_core_components()
def setup_core_components(self):
"""初始化核心组件"""
self.setup_paths()
self.init_ui()
def setup_paths(self):
"""配置系统路径"""
if data.PLUGIN_PATH not in sys.path:
sys.path.insert(0, data.PLUGIN_PATH)
# 添加PyDNA路径
pydna_bin = os.path.join(data.PYDNA_PATH, "bin")
os.environ["PATH"] = f"{pydna_bin}{os.pathsep}{os.environ['PATH']}"
def init_ui(self):
"""初始化UI框架"""
self.setWindowTitle(f"{data.TOOL_NAME} {data.TOOL_VERSION}")
# 主窗口布局
main_widget = QtWidgets.QWidget()
self.setCentralWidget(main_widget)
main_layout = QtWidgets.QVBoxLayout(main_widget)
main_layout.setContentsMargins(0, 0, 0, 0)
main_layout.setSpacing(0)
# 创建菜单和工具栏
self.menu_manager = MenuManager(self)
# 创建标签页
self.tab_widget = ModernTabWidget()
main_layout.addWidget(self.tab_widget)
# 初始化各标签页
self.model_tab = MeshTab()
self.rig_tab = RiggingTab()
self.adjust_tab = AdjustTab()
self.define_tab = DefineTab()
# 添加标签页
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.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())
# ===================================== 显示主窗口 =====================================
def get_maya_window():
"""获取Maya主窗口"""
maya_main_window_ptr = omui.MQtUtil.mainWindow()
if maya_main_window_ptr is not None:
# 确保指针转换为整数
ptr = int(maya_main_window_ptr)
return wrapInstance(ptr, QtWidgets.QWidget)
return None
def dock_to_maya():
"""嵌入Maya Dock面板"""
global main_window
try:
if cmds.workspaceControl(data.TOOL_WSCL_NAME, exists=True):
cmds.deleteUI(data.TOOL_WSCL_NAME)
dock_control = cmds.workspaceControl(
data.TOOL_WSCL_NAME,
label=data.TOOL_NAME,
tabToControl=["AttributeEditor", -1],
floating=True,
retain=False
)
# 确保窗口显示在合适的位置
cmds.workspaceControl(
data.TOOL_WSCL_NAME,
e=False,
restore=True
)
maya_dock_ptr = omui.MQtUtil.findControl(dock_control)
if not maya_dock_ptr:
raise RuntimeError("无法获取Dock控件指针")
maya_main_window = get_maya_window()
main_window = MainWindow(parent=maya_main_window)
# 确保指针转换为整数
maya_dock_widget = wrapInstance(int(maya_dock_ptr), QtWidgets.QWidget)
maya_dock_widget.layout().addWidget(main_window)
return main_window
except Exception as e:
cmds.warning(f"Dock嵌入失败: {str(e)}")
return None
def show():
"""显示主窗口"""
global main_window
try:
if main_window:
main_window.close()
cmds.deleteUI(data.TOOL_WSCL_NAME)
except:
pass
main_window = dock_to_maya()
if not main_window:
cmds.warning("使用独立窗口模式")
main_window = MainWindow()
main_window.show()
return main_window
if __name__ == "__main__":
show()