#!/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) # 设置基础字体大小 font = self.font() font.setPointSize(9) # 设置基础字号 self.setFont(font) # 设置窗口大小 self.resize(700, 600) # 调整为更合适的尺寸 self.setMinimumSize(700, 500) 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], 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()