From 02bc3822af9dad98527c30e6a7c60113155fe9b0 Mon Sep 17 00:00:00 2001 From: Jeffreytsai1004 Date: Sun, 9 Feb 2025 22:11:50 +0800 Subject: [PATCH] Update --- .cursor/rules/ProjectRule.mdc | 164 ++++++++++++++++++++++++++-------- .gitignore | 3 +- README.md | 60 +++++++++---- scripts/MetaFusion.py | 87 ++++++++++++++++++ scripts/config.py | 41 +++++++++ scripts/ui/behaviour.py | 38 ++++++++ scripts/ui/definition.py | 38 ++++++++ scripts/ui/menu.py | 39 ++++++++ scripts/ui/meshes.py | 39 ++++++++ scripts/ui/rigging.py | 39 ++++++++ scripts/ui/style.qss | 98 +++++++++++++++++++- scripts/ui/widgets.py | 9 ++ 12 files changed, 601 insertions(+), 54 deletions(-) create mode 100644 scripts/ui/behaviour.py create mode 100644 scripts/ui/definition.py create mode 100644 scripts/ui/menu.py create mode 100644 scripts/ui/meshes.py create mode 100644 scripts/ui/rigging.py diff --git a/.cursor/rules/ProjectRule.mdc b/.cursor/rules/ProjectRule.mdc index 33cb7ea..4c7f112 100644 --- a/.cursor/rules/ProjectRule.mdc +++ b/.cursor/rules/ProjectRule.mdc @@ -1,47 +1,42 @@ --- description: ProjectRule -globs: json +globs: md --- +Always respond in 中文, 先阅读知识库,并按照 Readme.md 来查看文件路径以及参考品文档和参考代码来协助用户完成项目 -# 代码规则 - -- 代码必须考虑兼容 Maya2018, Maya2018, Maya2020,Maya2022, Maya2023, Maya2024, Maya2025 -- 代码必须考虑兼容 Python3.10, Python3.11, Python3.10.8 等其他不同的版本 -- 所有模块引用关系自动更新修正 -- 所有UI必须使用Qt来实现 -- 所有Pyside代码必须使用 widget, layout, connection 的结构来实现 -- 使用scripts\config.py文件来统一实现配置文件 -- 使用scripts\ui\style.qss文件来实现UI样式 -- 功能函数放在scripts\utils文件夹中 -- 文件夹结构尽量以目前的代码结构来触发实现,各个模块各功能给要条理清晰 - # MetaFusion 开发文档 ## 一 本地知识库导航 ### 1 文档 -- [Metahuman解析](mdc:docs/Metahuman解析.md) -- [SuperRigging解析](mdc:Reference/docs/SuperRigging解析.pdf) -- [DNA_Calibration 文档](mdc:Reference/docs/DNA_Calibration.pdf) -- [DNA_Calibration在线文档](mdc:https:/epicgames.github.io/MetaHuman-DNA-Calibration) -- [Metahuman解析](mdc:Reference/docs/Metahuman解析.pdf) -- [SuperRiggingEditor使用文档](mdc:Reference/docs/SuperRiggingEditor使用文档.pdf) - +Reference\docs\Metahuman解析.pdf +Reference\docs\SuperRiggingEditor使用文档.pdf +Reference\DNA_Calibration\docs\dna_api.md +Reference\DNA_Calibration\docs\dna_viewer_api_build_meshes.md +Reference\DNA_Calibration\docs\dna_viewer_api_build_rig.md +Reference\DNA_Calibration\docs\dna_viewer_API.md +Reference\DNA_Calibration\docs\dna_viewer_maya.md +Reference\DNA_Calibration\docs\dna_viewer.md +Reference\DNA_Calibration\docs\dna.md +Reference\DNA_Calibration\docs\dnacalib_api.md +Reference\DNA_Calibration\docs\dnacalib.md +Reference\DNA_Calibration\docs\faq.md +Reference\DNA_Calibration\docs\repository_organization.md +DNA_Calibration在线文档: https://epicgames.github.io/MetaHuman-DNA-Calibration ### 2 代码参考 -- [Metahuman](mdc:Reference/Metahuman) -- [SuperRigging](mdc:Reference/SuperRigging) -- [MSLiveLink](mdc:Reference/MSLiveLink) -- [DNA_Calibration](mdc:Reference/DNA_Calibration) -- [功能实现参考](mdc:Reference/Utils) +Reference\DNA_Calibration +Reference\MSLiveLink +Reference\SuperRiggingEditor +Reference\Utils -### 3 UI参考 +### 3 UI参考图片 -- [UI参考图片](mdc:Reference/UI) +Reference\UI ## 二 项目描述 @@ -91,8 +86,7 @@ globs: json │ ├── dna\ DNA文件路径 │ ├── img\ DNA图标路径 │ ├── maya\ Maya资源文件路径 -│ ├── MH.2\ MetaHuman 2.0文件路径 -│ ├── MH.4\ MetaHuman 4.0文件路径 +│ ├── MH.2\ MetaHuman 2.\ MetaHuman 4.0文件路径 ├── icons\ 插件图标路径 ├── plugins\ │ └── Linux\ @@ -150,7 +144,12 @@ globs: json │ ├── ui\ │ │ ├── __init__.py │ │ ├── style.qss UI样式文件 -│ │ ├── main.ui UI主界面UI文件 +│ │ ├── menu.py UI菜单UI文件 +│ │ ├── toolshelf.py UI工具架UI文件 +│ │ ├── meshes.py UI模型UI文件 +│ │ ├── rigging.py UI绑定UI文件 +│ │ ├── behaviour.py UI行为UI文件 +│ │ ├── definition.py UI定义UI文件 │ ├── utils\ 功能模块路径 │ │ ├── __init__.py │ │ ├── ... @@ -176,9 +175,23 @@ globs: json - 输入框要统一 - 标签要统一 -### 7 UI界面 - -- 参考[MetaFusion UI 结构](mdc:#metafusion-ui-结构) +### 7 UI界面ce\UI\01_Menu_File.jpg +Reference\UI\02_Menu_Edit.jpg +Reference\UI\03_Menu_Tools.jpg +Reference\UI\04_Language.jpg +Reference\UI\05_Menu_Help.jpg +Reference\UI\06_Tool_Shelf.jpg +Reference\UI\07_Meshes_LOD0.jpg +Reference\UI\08_Meshes_LOD1.jpg +Reference\UI\09_Meshes_LOD2.jpg +Reference\UI\10_Meshes_LOD3.jpg +Reference\UI\11_Meshes_LOD4.jpg +Reference\UI\12_Meshes_LOD5.jpg +Reference\UI\13_Meshes_LOD6.jpg +Reference\UI\14_Meshes_LOD7.jpg +Reference\UI\15_Rigging.jpg +Reference\UI\16_Behaviour.jpg +Reference\UI\17_Definitions.jpg #### MetaFusion UI 结构 @@ -236,11 +249,27 @@ globs: json - 帮助文档 | icons\help.png - 关于 | icons\about.png -##### 二、主界面功能区 +##### 二、工具架 横向排列 + +- 保存 DNA | icons\save.png +- 加载当前项目 DNA | icons\open.png +- 分隔符 separator +- 创建RL4节点 | icons\connect.png +- 删除RL4节点 | icons\disconnect.png +- 分隔符 separator +- 导出 蒙皮 | icons\export_skin.png +- 导入 蒙皮 | icons\import_skin.png +- 复制 蒙皮 | icons\copy_skin.png +- 分隔符 separator +- 帮助文档 | icons\help.png +- 关于 | icons\about.png + +##### 三、主界面功能区 ###### 1. 模型视图 (Meshes) ####### LOD选项卡 (LOD0-LOD7) + 每个LOD包含以下模型项: - LOD0: ["*头部", "*牙齿", "*牙龈", "*左眼", "*右眼", "*虹膜", "*睫毛", "*眼睑", "*软骨", "*身体"] @@ -252,6 +281,71 @@ globs: json - LOD6: ["头部", "牙齿", "左眼", "右眼"] - LOD7: ["头部", "牙齿", "左眼", "右眼"] +####### 功能按钮 + +1. 自动选择模型 +- 功能:根据当前LOD级别自动选择对应的模型组件 +- 使用场景:快速选择特定LOD级别下的所有相关模型 + +2. 标准化命名 +- 功能:将选中模型重命名为标准命名格式 +- 使用场景:确保模型命名符合项目规范 + +3. 自动分组 +- 功能:根据模型类型自动创建和整理分组 +- 使用场景:快速组织和管理模型层级结构 + +####### 工具栏功能 + +1. 模型显示控制 +- 切换模型显示/隐藏 +- 透明度调节 +- 线框模式切换 + +2. LOD选择工具 +- LOD级别快速切换 +- 多级别对比视图 +- 模型细节程度预览 + +3. 辅助功能 +- 模型分离与合并 +- 顶点/面数统计 +- 模型检查与修复 + +####### 右侧工具面板 + +1. 添加功能 +- 为每个模型类别提供快速添加功能 +- 支持拖拽导入 +- 批量导入支持 + +2. 模型属性编辑 +- 材质分配 +- UV设置 +- 变形器设置 + +3. 高级功能 +- 模型优化建议 +- LOD自动生成 +- 网格简化工具 + +####### 注意事项 + +1. 模型命名规则 +- 所有模型必须遵循标准命名规范 +- LOD0级别模型名称前需添加"*"标记 +- 确保命名无特殊字符 + +2. 模型层级要求 +- 保持正确的层级关系 +- 避免深层嵌套 +- 确保正确的父子关系 + +3. 性能优化建议 +- 根据实际需求选择合适的LOD级别 +- 注意模型面数控制 +- 合理使用材质和贴图 + ###### 2. 绑定视图 (Rigging) ####### DNA预设浏览器 @@ -368,4 +462,4 @@ globs: json - Unbind Skin For Mesh - Tools: - New Neutral Joint Transform - - Quickly Create Presets``` + - Quickly Create Presets diff --git a/.gitignore b/.gitignore index acad99b..881b346 100644 --- a/.gitignore +++ b/.gitignore @@ -38,5 +38,4 @@ /.idea /output -/Reference -/Notes \ No newline at end of file +/Reference \ No newline at end of file diff --git a/README.md b/README.md index 3e978c5..5ac6c6d 100644 --- a/README.md +++ b/README.md @@ -8,25 +8,31 @@ ### 1 文档 -- [Metahuman解析](./docs/Metahuman解析.md) -- [SuperRigging解析](./Reference/docs/SuperRigging解析.pdf) -- [DNA_Calibration 文档](./Reference/docs/DNA_Calibration.pdf) -- [DNA_Calibration在线文档](https://epicgames.github.io/MetaHuman-DNA-Calibration/) -- [Metahuman解析](./Reference/docs/Metahuman解析.pdf) -- [SuperRiggingEditor使用文档](./Reference/docs/SuperRiggingEditor使用文档.pdf) - +Reference\docs\Metahuman解析.pdf +Reference\docs\SuperRiggingEditor使用文档.pdf +Reference\DNA_Calibration\docs\dna_api.md +Reference\DNA_Calibration\docs\dna_viewer_api_build_meshes.md +Reference\DNA_Calibration\docs\dna_viewer_api_build_rig.md +Reference\DNA_Calibration\docs\dna_viewer_API.md +Reference\DNA_Calibration\docs\dna_viewer_maya.md +Reference\DNA_Calibration\docs\dna_viewer.md +Reference\DNA_Calibration\docs\dna.md +Reference\DNA_Calibration\docs\dnacalib_api.md +Reference\DNA_Calibration\docs\dnacalib.md +Reference\DNA_Calibration\docs\faq.md +Reference\DNA_Calibration\docs\repository_organization.md +DNA_Calibration在线文档: https://epicgames.github.io/MetaHuman-DNA-Calibration ### 2 代码参考 -- [Metahuman](./Reference/Metahuman) -- [SuperRigging](./Reference/SuperRigging) -- [MSLiveLink](./Reference/MSLiveLink) -- [DNA_Calibration](./Reference/DNA_Calibration) -- [功能实现参考](./Reference/Utils) +Reference\DNA_Calibration +Reference\MSLiveLink +Reference\SuperRiggingEditor +Reference\Utils -### 3 UI参考 +### 3 UI参考图片 -- [UI参考图片](./Reference/UI) +Reference\UI ## 二 项目描述 @@ -135,7 +141,12 @@ │ ├── ui\ │ │ ├── __init__.py │ │ ├── style.qss UI样式文件 -│ │ ├── main.ui UI主界面UI文件 +│ │ ├── menu.py UI菜单UI文件 +│ │ ├── toolshelf.py UI工具架UI文件 +│ │ ├── meshes.py UI模型UI文件 +│ │ ├── rigging.py UI绑定UI文件 +│ │ ├── behaviour.py UI行为UI文件 +│ │ ├── definition.py UI定义UI文件 │ ├── utils\ 功能模块路径 │ │ ├── __init__.py │ │ ├── ... @@ -163,7 +174,24 @@ ### 7 UI界面 -- 参考[MetaFusion UI 结构](#metafusion-ui-结构) +UI参考图片: +Reference\UI\01_Menu_File.jpg +Reference\UI\02_Menu_Edit.jpg +Reference\UI\03_Menu_Tools.jpg +Reference\UI\04_Language.jpg +Reference\UI\05_Menu_Help.jpg +Reference\UI\06_Tool_Shelf.jpg +Reference\UI\07_Meshes_LOD0.jpg +Reference\UI\08_Meshes_LOD1.jpg +Reference\UI\09_Meshes_LOD2.jpg +Reference\UI\10_Meshes_LOD3.jpg +Reference\UI\11_Meshes_LOD4.jpg +Reference\UI\12_Meshes_LOD5.jpg +Reference\UI\13_Meshes_LOD6.jpg +Reference\UI\14_Meshes_LOD7.jpg +Reference\UI\15_Rigging.jpg +Reference\UI\16_Behaviour.jpg +Reference\UI\17_Definitions.jpg #### MetaFusion UI 结构 diff --git a/scripts/MetaFusion.py b/scripts/MetaFusion.py index e911046..a60fae0 100644 --- a/scripts/MetaFusion.py +++ b/scripts/MetaFusion.py @@ -1,2 +1,89 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- + +import os +import sys +from maya import cmds +import maya.OpenMayaUI as omui +from PySide2 import QtWidgets, QtCore +from shiboken2 import wrapInstance + +from . import config +from .ui import menu, toolshelf +from .utils import maya_utils + +class MetaFusion(QtWidgets.QMainWindow): + def __init__(self, parent=None): + super(MetaFusion, self).__init__(parent) + + # 设置窗口标题和基本属性 + self.setWindowTitle("MetaFusion") + self.setMinimumSize(1200, 800) + + # 加载样式表 + style_file = os.path.join(os.path.dirname(__file__), "ui", "style.qss") + with open(style_file, "r", encoding="utf-8") as f: + self.setStyleSheet(f.read()) + + # 创建主窗口部件 + self.main_widget = QtWidgets.QWidget() + self.setCentralWidget(self.main_widget) + + # 创建主布局 + self.main_layout = QtWidgets.QVBoxLayout(self.main_widget) + + # 初始化UI组件 + self._init_ui() + + def _init_ui(self): + """初始化UI组件""" + # 创建工具架 + self.tool_shelf = toolshelf.ToolShelf(self) + self.main_layout.addWidget(self.tool_shelf) + + # 创建标签页 + self.tab_widget = QtWidgets.QTabWidget() + self.main_layout.addWidget(self.tab_widget) + + # 添加各个功能页面 + self._add_meshes_tab() + self._add_rigging_tab() + self._add_behaviour_tab() + self._add_definition_tab() + + def _add_meshes_tab(self): + """添加模型页面""" + from .ui.meshes import MeshesTab + meshes_widget = MeshesTab() + self.tab_widget.addTab(meshes_widget, "模型") + + def _add_rigging_tab(self): + """添加绑定页面""" + from .ui.rigging import RiggingTab + rigging_widget = RiggingTab() + self.tab_widget.addTab(rigging_widget, "绑定") + + + def _add_behaviour_tab(self): + """添加行为页面""" + from .ui.behaviour import BehaviourTab + behaviour_widget = BehaviourTab() + self.tab_widget.addTab(behaviour_widget, "行为") + + + def _add_definition_tab(self): + """添加定义页面""" + from .ui.definition import DefinitionTab + definition_widget = DefinitionTab() + self.tab_widget.addTab(definition_widget, "定义") + + +def show(): + """显示主窗口""" + # 获取Maya主窗口 + maya_main_window = wrapInstance(int(omui.MQtUtil.mainWindow()), QtWidgets.QWidget) + + # 创建并显示插件窗口 + global meta_fusion_window + meta_fusion_window = MetaFusion(parent=maya_main_window) + meta_fusion_window.show() diff --git a/scripts/config.py b/scripts/config.py index 14d49a9..b417655 100644 --- a/scripts/config.py +++ b/scripts/config.py @@ -71,6 +71,47 @@ TOOL_ICON = str(os.path.join(ICONS_PATH, f"{TOOL_NAME}Logo.png").replace("\\", " TOOL_COMMAND_ICON = str(os.path.join(ICONS_PATH, "Command.png").replace("\\", "/")) TOOL_MOD_FILENAME = str(f"{TOOL_NAME}.mod") +# 基础路径配置 +ROOT_PATH = os.path.dirname(os.path.dirname(__file__)) +ASSETS_PATH = os.path.join(ROOT_PATH, "assets") +ICONS_PATH = os.path.join(ROOT_PATH, "icons") +PLUGINS_PATH = os.path.join(ROOT_PATH, "plugins") + +# DNA相关路径 +DNA_PATH = os.path.join(ASSETS_PATH, "dna") +MH2_PATH = os.path.join(ASSETS_PATH, "MH.2") +MH4_PATH = os.path.join(ASSETS_PATH, "MH.4") + +# UI配置 +UI_FONT_FAMILY = "Microsoft YaHei UI" +UI_FONT_SIZE = 9 +UI_BUTTON_HEIGHT = 24 +UI_LINE_EDIT_HEIGHT = 24 + +# 颜色配置 +UI_COLORS = { + "primary": "#2D2D30", + "secondary": "#3E3E42", + "accent": "#007ACC", + "text": "#FFFFFF", + "text_disabled": "#656565", + "border": "#434346", + "button_hover": "#404045", + "button_pressed": "#007ACC" +} + +# LOD配置 +LOD_MESHES = { + "LOD0": ["*头部", "*牙齿", "*牙龈", "*左眼", "*右眼", "*虹膜", "*睫毛", "*眼睑", "*软骨", "*身体"], + "LOD1": ["头部", "牙齿", "牙龈", "左眼", "右眼", "虹膜", "睫毛", "眼睑", "软骨", "身体"], + "LOD2": ["头部", "牙齿", "牙龈", "左眼", "右眼", "虹膜", "睫毛", "眼睑", "身体"], + "LOD3": ["头部", "牙齿", "左眼", "右眼", "虹膜", "睫毛", "眼睑", "身体"], + "LOD4": ["头部", "牙齿", "左眼", "右眼", "虹膜"], + "LOD5": ["头部", "牙齿", "左眼", "右眼"], + "LOD6": ["头部", "牙齿", "左眼", "右眼"], + "LOD7": ["头部", "牙齿", "左眼", "右眼"] +} + if __name__ == "__main__": variables_path = [ TOOL_PATH, diff --git a/scripts/ui/behaviour.py b/scripts/ui/behaviour.py new file mode 100644 index 0000000..ee8e04a --- /dev/null +++ b/scripts/ui/behaviour.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +#===================================== 1. Module Imports ===================================== +import maya.OpenMayaUI as omui +from scripts import config +import maya.cmds as cmds +import maya.mel as mel +import webbrowser +import sys +import os + +from scripts import config + +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 + +class BehaviourTab(QtWidgets.QWidget): + pass + +if __name__ == "__main__": + pass diff --git a/scripts/ui/definition.py b/scripts/ui/definition.py new file mode 100644 index 0000000..574422f --- /dev/null +++ b/scripts/ui/definition.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +#===================================== 1. Module Imports ===================================== +import maya.OpenMayaUI as omui +from scripts import config +import maya.cmds as cmds +import maya.mel as mel +import webbrowser +import sys +import os + +from scripts import config + +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 + +class DefinitionTab(QtWidgets.QWidget): + pass + +if __name__ == "__main__": + pass \ No newline at end of file diff --git a/scripts/ui/menu.py b/scripts/ui/menu.py new file mode 100644 index 0000000..e64cd53 --- /dev/null +++ b/scripts/ui/menu.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +#===================================== 1. Module Imports ===================================== +import maya.OpenMayaUI as omui +from scripts import config +import maya.cmds as cmds +import maya.mel as mel +import webbrowser +import sys +import os + +from scripts import config + +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 + +class Menu(QtWidgets.QWidget): + pass + + +if __name__ == "__main__": + pass \ No newline at end of file diff --git a/scripts/ui/meshes.py b/scripts/ui/meshes.py new file mode 100644 index 0000000..3b1cc41 --- /dev/null +++ b/scripts/ui/meshes.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +#===================================== 1. Module Imports ===================================== +import maya.OpenMayaUI as omui +from scripts import config +import maya.cmds as cmds +import maya.mel as mel +import webbrowser +import sys +import os + +from scripts import config + +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 + +class MeshesTab(QtWidgets.QWidget): + pass + + +if __name__ == "__main__": + pass \ No newline at end of file diff --git a/scripts/ui/rigging.py b/scripts/ui/rigging.py new file mode 100644 index 0000000..55251d5 --- /dev/null +++ b/scripts/ui/rigging.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +#===================================== 1. Module Imports ===================================== +import maya.OpenMayaUI as omui +from scripts import config +import maya.cmds as cmds +import maya.mel as mel +import webbrowser +import sys +import os + +from scripts import config + +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 + +class RiggingTab(QtWidgets.QWidget): + pass + + +if __name__ == "__main__": + pass \ No newline at end of file diff --git a/scripts/ui/style.qss b/scripts/ui/style.qss index 5f28270..2088367 100644 --- a/scripts/ui/style.qss +++ b/scripts/ui/style.qss @@ -1 +1,97 @@ - \ No newline at end of file +/* 全局样式 */ +QWidget { + background-color: #2D2D30; + color: #FFFFFF; + font-family: "Microsoft YaHei UI"; + font-size: 9pt; +} + +/* 按钮样式 */ +QPushButton { + background-color: #3E3E42; + border: 1px solid #434346; + border-radius: 3px; + padding: 5px 15px; + min-height: 24px; +} + +QPushButton:hover { + background-color: #404045; +} + +QPushButton:pressed { + background-color: #007ACC; +} + +/* 输入框样式 */ +QLineEdit { + background-color: #3E3E42; + border: 1px solid #434346; + border-radius: 3px; + padding: 2px 5px; + min-height: 24px; +} + +/* 下拉框样式 */ +QComboBox { + background-color: #3E3E42; + border: 1px solid #434346; + border-radius: 3px; + padding: 2px 5px; + min-height: 24px; +} + +/* 标签页样式 */ +QTabWidget::pane { + border: 1px solid #434346; +} + +QTabBar::tab { + background-color: #2D2D30; + border: 1px solid #434346; + padding: 5px 10px; +} + +QTabBar::tab:selected { + background-color: #007ACC; +} + +/* 滚动条样式 */ +QScrollBar:vertical { + background-color: #2D2D30; + width: 12px; + border-radius: 6px; +} + +QScrollBar::handle:vertical { + background-color: #3E3E42; + border-radius: 6px; +} + +/* 菜单样式 */ +QMenuBar { + background-color: #2D2D30; + border-bottom: 1px solid #434346; +} + +QMenu { + background-color: #2D2D30; + border: 1px solid #434346; +} + +QMenu::item:selected { + background-color: #007ACC; +} + +/* 工具栏样式 */ +QToolBar { + background-color: #2D2D30; + border-bottom: 1px solid #434346; + spacing: 3px; +} + +/* 状态栏样式 */ +QStatusBar { + background-color: #2D2D30; + border-top: 1px solid #434346; +} diff --git a/scripts/ui/widgets.py b/scripts/ui/widgets.py index e911046..f77961b 100644 --- a/scripts/ui/widgets.py +++ b/scripts/ui/widgets.py @@ -1,2 +1,11 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- + +#===================================== 1. Module Imports ===================================== +import maya.OpenMayaUI as omui +from scripts import config +import maya.cmds as cmds +import maya.mel as mel +import webbrowser +import sys +import os