#!/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 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 #===================================== 2. Main Window Class ===================================== 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): """配置系统路径""" 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}") self.setMinimumSize(1200, 800) # 主窗口布局 main_widget = QtWidgets.QWidget() self.setCentralWidget(main_widget) main_layout = QtWidgets.QVBoxLayout(main_widget) # 创建菜单和工具栏 self.menu_manager = MenuManager(self) self.create_tab_widget() # 加载样式 self.load_styles() 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 create_tab_widget(self): """创建标签页""" self.tab_widget = QtWidgets.QTabWidget() self.centralWidget().layout().addWidget(self.tab_widget) # 初始化各标签页 self.model_tab = ModelTab() self.rig_tab = RigTab() 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, "定义") # ===================================== 显示主窗口 ===================================== 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], initialWidth=1400, minimumWidth=1000, minimumHeight=800 ) 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()