MetaFusion/scripts/MetaFusion.py

165 lines
5.1 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
print("从PySide2加载Qt和shiboken2")
except ImportError:
try:
from PySide6 import QtCore, QtGui, QtWidgets
from shiboken6 import wrapInstance
print("从PySide6加载Qt和shiboken6")
except ImportError:
try:
from PySide import QtCore, QtGui, QtWidgets
from shiboken import wrapInstance
print("从PySide加载Qt和shiboken")
except ImportError as e:
print(f"Qt加载失败: {str(e)}")
QtCore = QtGui = QtWidgets = None
wrapInstance = None
# 导入UI模块
from scripts.ui.menu import MenuManager
from scripts.ui.models import ModelTab
from scripts.ui.rigging import RigTab
from scripts.ui.adjust import AdjustTab
from scripts.ui.define import DefineTab
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)
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-05 02:10:47 +08:00
self.setMinimumSize(1200, 800)
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-04 00:13:31 +08:00
2025-02-06 04:00:17 +08:00
# 创建菜单和工具栏
self.menu_manager = MenuManager(self)
2025-02-05 02:10:47 +08:00
self.create_tab_widget()
2025-02-04 00:13:31 +08:00
2025-02-05 02:10:47 +08:00
# 加载样式
self.load_styles()
def load_styles(self):
"""加载样式表"""
2025-02-06 04:46:41 +08:00
if os.path.exists(data.TOOL_STYLE_FILE):
with open(data.TOOL_STYLE_FILE, "r", encoding="utf-8") as f:
2025-02-05 02:10:47 +08:00
self.setStyleSheet(f.read())
def create_tab_widget(self):
2025-02-06 04:00:17 +08:00
"""创建标签页"""
2025-02-04 00:13:31 +08:00
self.tab_widget = QtWidgets.QTabWidget()
self.centralWidget().layout().addWidget(self.tab_widget)
2025-02-05 02:10:47 +08:00
# 初始化各标签页
self.model_tab = ModelTab()
self.rig_tab = RigTab()
self.adjust_tab = AdjustTab()
self.define_tab = DefineTab()
# 添加标签页
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-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