#!/usr/bin/env python # -*- coding: utf-8 -*- import os import sys import maya.cmds as cmds import maya.OpenMayaUI as omui import traceback import os import sys import webbrowser import maya.mel as mel import maya.cmds as cmds import maya.OpenMayaUI as omui 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 from scripts.config.data import ( TOOL_NAME, TOOL_VERSION, TOOL_AUTHOR, TOOL_LANG, TOOL_WSCL_NAME, TOOL_HELP_URL, ROOT_PATH, SCRIPTS_PATH, ICONS_PATH, STYLES_PATH, DNA_FILE_PATH, DNA_IMG_PATH, PLUGIN_PATH, PYDNA_PATH, DNACALIB_PATH, BUILDER_PATH, DNALIB_PATH, UI_PATH, UTILS_PATH, TOOL_MAIN_SCRIPT, TOOL_STYLE_FILE, TOOL_ICON, TOOL_COMMAND_ICON, TOOL_MOD_FILENAME ) # 导入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 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 PLUGIN_PATH not in sys.path: sys.path.insert(0, PLUGIN_PATH) # 添加PyDNA路径 pydna_bin = os.path.join(PYDNA_PATH, "bin") os.environ["PATH"] = f"{pydna_bin}{os.pathsep}{os.environ['PATH']}" def init_ui(self): """初始化UI框架""" self.setWindowTitle(f"{TOOL_NAME} {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(TOOL_STYLE_FILE): with open(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(TOOL_WSCL_NAME, exists=True): cmds.deleteUI(TOOL_WSCL_NAME) dock_control = cmds.workspaceControl( TOOL_WSCL_NAME, label=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(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()