183 lines
5.5 KiB
Python
183 lines
5.5 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
|
|
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)
|
|
|
|
# 设置窗口属性
|
|
self.setWindowFlags(QtCore.Qt.Window)
|
|
self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
|
|
|
|
# 设置基础字体大小
|
|
font = self.font()
|
|
font.setPointSize(9)
|
|
self.setFont(font)
|
|
self.resize(550, 700)
|
|
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],
|
|
floating=True,
|
|
retain=False
|
|
)
|
|
|
|
# 确保窗口显示在合适的位置
|
|
cmds.workspaceControl(
|
|
data.TOOL_WSCL_NAME,
|
|
e=False,
|
|
restore=True
|
|
)
|
|
|
|
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()
|
|
|