165 lines
5.1 KiB
Python
165 lines
5.1 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
|
|
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()
|
|
|