This commit is contained in:
Jeffreytsai1004 2025-02-06 04:46:41 +08:00
parent 3bb8f026c0
commit 5f7c424a35
14 changed files with 340 additions and 341 deletions

View File

@ -2,13 +2,14 @@
# -*- coding: utf-8 -*-
#===================================== 1. Module Imports =====================================
# Standard library imports
import os
import sys
import webbrowser
import maya.mel as mel
import maya.cmds as cmds
import maya.OpenMayaUI as omui
import maya.cmds as cmds
import maya.mel as mel
import webbrowser
import sys
import os
from scripts.config import data
try:
from PySide2 import QtCore, QtGui, QtWidgets
@ -29,36 +30,24 @@ except ImportError:
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, TOOL_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
)
# def get_script_path():
# try:
# maya_script = mel.eval('getenv("MAYA_SCRIPT_PATH")')
# if maya_script:
# paths = maya_script.split(os.pathsep)
# for path in paths:
# install_path = os.path.join(path, "Install.py")
# if os.path.exists(install_path):
# return os.path.dirname(install_path)
# except:
# pass
def get_script_path():
try:
maya_script = mel.eval('getenv("MAYA_SCRIPT_PATH")')
if maya_script:
paths = maya_script.split(os.pathsep)
for path in paths:
install_path = os.path.join(path, "Install.py")
if os.path.exists(install_path):
return os.path.dirname(install_path)
except:
pass
# try:
# return os.path.dirname(os.path.abspath(__file__))
# except:
# return os.getcwd()
try:
return os.path.dirname(os.path.abspath(__file__))
except:
return os.getcwd()
TOOL_PATH = get_script_path()
if TOOL_PATH not in sys.path:
sys.path.insert(0, TOOL_PATH)
TOOL_PATH = data.TOOL_PATH
#===================================== 3. Utility Functions =====================================
@ -98,14 +87,14 @@ class InstallDialog(QtWidgets.QDialog):
self.setup_ui()
def load_stylesheet(self):
with open(TOOL_STYLE_FILE, 'r', encoding='utf-8') as f:
with open(data.TOOL_STYLE_FILE, 'r', encoding='utf-8') as f:
style = f.read()
self.setStyleSheet(style)
print(f"已加载样式文件: {TOOL_STYLE_FILE}")
print(f"已加载样式文件: {data.TOOL_STYLE_FILE}")
def setup_ui(self):
"""Initialize and setup UI components"""
self.setWindowTitle(f"{TOOL_NAME} Installation")
self.setWindowTitle(f"{data.TOOL_NAME} Installation")
self.setFixedSize(220, 120)
self.setup_window_icon()
self.create_widgets()
@ -114,16 +103,16 @@ class InstallDialog(QtWidgets.QDialog):
def setup_window_icon(self):
"""Setup window icon if available"""
if os.path.exists(TOOL_ICON):
self.setWindowIcon(QtGui.QIcon(TOOL_ICON))
if os.path.exists(data.TOOL_ICON):
self.setWindowIcon(QtGui.QIcon(data.TOOL_ICON))
else:
print(f"Warning: Icon file not found: {TOOL_ICON}")
print(f"Warning: Icon file not found: {data.TOOL_ICON}")
#----------------- 5.1 UI Methods -----------------
def create_widgets(self):
self.new_shelf_toggle = QtWidgets.QCheckBox(f"{TOOL_NAME} Installation")
self.install_button = SetButton("Install " + TOOL_NAME)
self.uninstall_button = SetButton("Uninstall " + TOOL_NAME)
self.new_shelf_toggle = QtWidgets.QCheckBox(f"{data.TOOL_NAME} Installation")
self.install_button = SetButton("Install " + data.TOOL_NAME)
self.uninstall_button = SetButton("Uninstall " + data.TOOL_NAME)
def create_layouts(self):
main_layout = QtWidgets.QVBoxLayout(self)
@ -133,7 +122,7 @@ class InstallDialog(QtWidgets.QDialog):
header_layout = QtWidgets.QHBoxLayout()
header_layout.setSpacing(5)
welcome_label = QtWidgets.QLabel("Welcome to " + TOOL_NAME + "!")
welcome_label = QtWidgets.QLabel("Welcome to " + data.TOOL_NAME + "!")
welcome_label.setStyleSheet("font-size: 11px; padding: 0px; margin: 0px;")
header_layout.addWidget(welcome_label)
header_layout.addStretch()
@ -179,7 +168,7 @@ class InstallDialog(QtWidgets.QDialog):
#----------------- 5.3 Utility Methods -----------------
def open_help_url(self):
webbrowser.open(TOOL_HELP_URL)
webbrowser.open(data.TOOL_HELP_URL)
QtWidgets.QApplication.restoreOverrideCursor()
def get_script_path():
@ -202,7 +191,7 @@ class InstallDialog(QtWidgets.QDialog):
msg_box = self.create_styled_message_box(
"Confirm Installation",
f"Are you sure you want to install {TOOL_NAME}?"
f"Are you sure you want to install {data.TOOL_NAME}?"
)
if msg_box.exec_() == QtWidgets.QMessageBox.Yes:
try:
@ -217,7 +206,7 @@ class InstallDialog(QtWidgets.QDialog):
"""Handle uninstall request"""
msg_box = self.create_styled_message_box(
"Confirm Uninstallation",
f"Are you sure you want to uninstall {TOOL_NAME}?"
f"Are you sure you want to uninstall {data.TOOL_NAME}?"
)
if msg_box.exec_() == QtWidgets.QMessageBox.Yes:
@ -234,10 +223,10 @@ class InstallDialog(QtWidgets.QDialog):
def create_mod_file(self):
"""Create or update the .mod file for Maya"""
modules_dir = get_maya_modules_dir()
mod_content = f"""+ {TOOL_NAME} {TOOL_VERSION} {TOOL_PATH}
scripts: {SCRIPTS_PATH}
mod_content = f"""+ {data.TOOL_NAME} {data.TOOL_VERSION} {data.TOOL_PATH}
scripts: {data.SCRIPTS_PATH}
"""
mod_file_path = os.path.join(modules_dir, TOOL_MOD_FILENAME)
mod_file_path = os.path.join(modules_dir, data.TOOL_MOD_FILENAME)
self._write_mod_file(mod_file_path, mod_content)
def _write_mod_file(self, file_path, content):
@ -253,37 +242,37 @@ class InstallDialog(QtWidgets.QDialog):
def uninstall_mod_file(self):
modules_dir = get_maya_modules_dir()
mod_file_path = os.path.join(modules_dir, TOOL_MOD_FILENAME)
mod_file_path = os.path.join(modules_dir, data.TOOL_MOD_FILENAME)
if os.path.exists(mod_file_path):
try:
os.remove(mod_file_path)
print(f"{TOOL_NAME}.mod file deleted")
print(f"{data.TOOL_NAME}.mod file deleted")
except Exception as e:
print(f"Error deleting {TOOL_NAME}.mod file: {e}")
print(f"Error deleting {data.TOOL_NAME}.mod file: {e}")
def clean_existing_buttons(self):
if cmds.shelfLayout(TOOL_NAME, exists=True):
buttons = cmds.shelfLayout(TOOL_NAME, query=True, childArray=True) or []
if cmds.shelfLayout(data.TOOL_NAME, exists=True):
buttons = cmds.shelfLayout(data.TOOL_NAME, query=True, childArray=True) or []
for btn in buttons:
if cmds.shelfButton(btn, query=True, exists=True):
label = cmds.shelfButton(btn, query=True, label=True)
if label == TOOL_NAME:
if label == data.TOOL_NAME:
cmds.deleteUI(btn)
print(f"Deleted existing {TOOL_NAME} button: {btn}")
print(f"Deleted existing {data.TOOL_NAME} button: {btn}")
def install_tool(self):
"""Install the tool to Maya"""
if not os.path.exists(SCRIPTS_PATH):
print(f"Error: Scripts path does not exist: {SCRIPTS_PATH}")
if not os.path.exists(data.SCRIPTS_PATH):
print(f"Error: Scripts path does not exist: {data.SCRIPTS_PATH}")
return
if not os.path.exists(TOOL_MAIN_SCRIPT):
print(f"Error: Main script file not found: {TOOL_MAIN_SCRIPT}")
if not os.path.exists(data.TOOL_MAIN_SCRIPT):
print(f"Error: Main script file not found: {data.TOOL_MAIN_SCRIPT}")
return
# Add scripts path to Python path
if SCRIPTS_PATH not in sys.path:
sys.path.insert(0, SCRIPTS_PATH)
if data.SCRIPTS_PATH not in sys.path:
sys.path.insert(0, data.SCRIPTS_PATH)
# Create shelf and button
self._create_shelf_button()
@ -291,10 +280,10 @@ class InstallDialog(QtWidgets.QDialog):
# Switch to the newly created shelf
try:
cmds.shelfTabLayout("ShelfLayout", edit=True, selectTab=TOOL_NAME)
print(f"Switched to {TOOL_NAME} shelf")
cmds.shelfTabLayout("ShelfLayout", edit=True, selectTab=data.TOOL_NAME)
print(f"Switched to {data.TOOL_NAME} shelf")
except Exception as e:
print(f"Error switching to {TOOL_NAME} shelf: {e}")
print(f"Error switching to {data.TOOL_NAME} shelf: {e}")
self._show_install_success_message()
@ -303,24 +292,24 @@ class InstallDialog(QtWidgets.QDialog):
shelf_layout = mel.eval('$tmpVar=$gShelfTopLevel')
# Create shelf if not exists
if not cmds.shelfLayout(TOOL_NAME, exists=True):
cmds.shelfLayout(TOOL_NAME, parent=shelf_layout)
if not cmds.shelfLayout(data.TOOL_NAME, exists=True):
cmds.shelfLayout(data.TOOL_NAME, parent=shelf_layout)
# Clean existing buttons
self.clean_existing_buttons()
# Create new button
icon_path = TOOL_ICON if os.path.exists(TOOL_ICON) else TOOL_COMMAND_ICON
icon_path = data.TOOL_ICON if os.path.exists(data.TOOL_ICON) else data.TOOL_COMMAND_ICON
command = self._get_shelf_button_command()
cmds.shelfButton(
parent=TOOL_NAME,
parent=data.TOOL_NAME,
image1=icon_path,
label=TOOL_NAME,
label=data.TOOL_NAME,
command=command,
sourceType="python",
annotation=f"{TOOL_NAME} {TOOL_VERSION}",
annotation=f"{data.TOOL_NAME} {data.TOOL_VERSION}",
noDefaultPopup=True,
style="iconOnly"
)
@ -330,40 +319,40 @@ class InstallDialog(QtWidgets.QDialog):
return f"""
import sys
import os
TOOL_PATH = r'{TOOL_PATH}'
TOOL_PATH = r'{data.TOOL_PATH}'
if TOOL_PATH not in sys.path:
sys.path.insert(0, TOOL_PATH)
SCRIPTS_PATH = r'{SCRIPTS_PATH}'
SCRIPTS_PATH = r'{data.SCRIPTS_PATH}'
if SCRIPTS_PATH not in sys.path:
sys.path.insert(0, SCRIPTS_PATH)
os.chdir(SCRIPTS_PATH)
try:
import {TOOL_NAME}
{TOOL_NAME}.show()
import MetaFusion
MetaFusion.show()
except ImportError as e:
print("Error importing {TOOL_NAME}:", str(e))
print("Scripts path:", {SCRIPTS_PATH})
print("Error importing MetaFusion:", str(e))
print(f"Scripts path: {data.SCRIPTS_PATH}")
print("sys.path:", sys.path)
print("Contents of Scripts folder:", os.listdir({SCRIPTS_PATH}))
print(f"Contents of Scripts folder: {os.listdir(data.SCRIPTS_PATH)}")
"""
def uninstall_tool(self):
"""Uninstall the tool from Maya"""
window_name = f"{TOOL_NAME}Window"
dock_name = f"{TOOL_NAME}WindowDock"
shelf_file = f"shelf_{TOOL_NAME}.mel"
window_name = f"{data.TOOL_NAME}Window"
dock_name = f"{data.TOOL_NAME}WindowDock"
shelf_file = f"shelf_{data.TOOL_NAME}.mel"
if cmds.window(window_name, exists=True):
try:
cmds.deleteUI(window_name)
except Exception as e:
print(f"Error closing {TOOL_NAME} window: {e}")
print(f"Error closing {data.TOOL_NAME} window: {e}")
if cmds.dockControl(dock_name, exists=True):
try:
cmds.deleteUI(dock_name)
except Exception as e:
print(f"Error closing docked {TOOL_NAME} window: {e}")
print(f"Error closing docked {data.TOOL_NAME} window: {e}")
self.uninstall_mod_file()
@ -371,17 +360,17 @@ except ImportError as e:
current_shelf = cmds.shelfTabLayout("ShelfLayout", query=True, selectTab=True)
# Delete Shelves and Buttons
if cmds.shelfLayout(TOOL_NAME, exists=True):
if cmds.shelfLayout(data.TOOL_NAME, exists=True):
try:
cmds.deleteUI(TOOL_NAME, layout=True)
cmds.deleteUI(data.TOOL_NAME, layout=True)
except Exception as e:
print(f"Error deleting {TOOL_NAME} shelf: {e}")
print(f"Error deleting {data.TOOL_NAME} shelf: {e}")
self._clean_all_shelf_buttons()
# Remove from Python path
if SCRIPTS_PATH in sys.path:
sys.path.remove(SCRIPTS_PATH)
if data.SCRIPTS_PATH in sys.path:
sys.path.remove(data.SCRIPTS_PATH)
# Deleting Shelf Files
shelf_path = os.path.join(
@ -389,7 +378,7 @@ except ImportError as e:
cmds.about(version=True),
"prefs",
"shelves",
f"shelf_{TOOL_NAME}.mel"
f"shelf_{data.TOOL_NAME}.mel"
)
if os.path.exists(shelf_path):
@ -399,7 +388,7 @@ except ImportError as e:
print(f"Error deleting shelf file: {e}")
# If the current tool shelf is a deleted tool shelf, switch to another tool shelf
if current_shelf == TOOL_NAME:
if current_shelf == data.TOOL_NAME:
shelves = cmds.shelfTabLayout("ShelfLayout", query=True, childArray=True)
if shelves and len(shelves) > 0:
cmds.shelfTabLayout("ShelfLayout", edit=True, selectTab=shelves[0])
@ -413,34 +402,34 @@ except ImportError as e:
shelf_buttons = cmds.shelfLayout(shelf, query=True, childArray=True) or []
for btn in shelf_buttons:
if cmds.shelfButton(btn, query=True, exists=True):
if cmds.shelfButton(btn, query=True, label=True) == TOOL_NAME:
if cmds.shelfButton(btn, query=True, label=True) == data.TOOL_NAME:
cmds.deleteUI(btn)
def _show_uninstall_success_message(self):
"""Show uninstallation success message"""
msg_box = QtWidgets.QMessageBox()
msg_box.setWindowTitle("Uninstallation Successful")
msg_box.setText(f"{TOOL_NAME} has been successfully uninstalled!")
msg_box.setText(f"{data.TOOL_NAME} has been successfully uninstalled!")
msg_box.setStandardButtons(QtWidgets.QMessageBox.Ok)
msg_box.setWindowIcon(QtGui.QIcon(TOOL_ICON))
msg_box.setWindowIcon(QtGui.QIcon(data.TOOL_ICON))
msg_box.setStyleSheet(self.styleSheet())
msg_box.exec_()
def _show_install_success_message(self):
msg_box = QtWidgets.QMessageBox()
msg_box.setWindowTitle("Installation Successful")
msg_box.setText(f"{TOOL_NAME} has been successfully installed!")
msg_box.setText(f"{data.TOOL_NAME} has been successfully installed!")
msg_box.setStandardButtons(QtWidgets.QMessageBox.Ok)
msg_box.setWindowIcon(QtGui.QIcon(TOOL_ICON))
msg_box.setWindowIcon(QtGui.QIcon(data.TOOL_ICON))
msg_box.setStyleSheet(self.styleSheet())
msg_box.exec_()
def _validate_paths(self):
"""Validate all required paths exist"""
paths = {
"Root": TOOL_PATH,
"Scripts": SCRIPTS_PATH,
"Icons": ICONS_PATH
"Root": data.TOOL_PATH,
"Scripts": data.SCRIPTS_PATH,
"Icons": data.ICONS_PATH
}
for name, path in paths.items():
@ -463,7 +452,7 @@ except ImportError as e:
def _load_mel_shelf(self):
"""Load mel shelf file with error handling"""
try:
mel.eval(f'loadNewShelf "shelf_{TOOL_NAME}.mel"')
mel.eval(f'loadNewShelf "shelf_{data.TOOL_NAME}.mel"')
except Exception as e:
self._log(f"Error loading shelf file: {e}", error=True)

View File

@ -1,18 +1,17 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
import maya.cmds as cmds
#===================================== 1. Module Imports =====================================
import maya.OpenMayaUI as omui
import traceback
import os
import sys
import webbrowser
import maya.cmds as cmds
import maya.mel as mel
import maya.cmds as cmds
import maya.OpenMayaUI as omui
import webbrowser
import traceback
import sys
import os
from scripts.config import data
try:
from PySide2 import QtCore, QtGui, QtWidgets
from shiboken2 import wrapInstance
@ -32,16 +31,6 @@ except ImportError:
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, TOOL_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
@ -49,6 +38,7 @@ 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)
@ -61,16 +51,16 @@ class MainWindow(QtWidgets.QMainWindow):
def setup_paths(self):
"""配置系统路径"""
if PLUGIN_PATH not in sys.path:
sys.path.insert(0, PLUGIN_PATH)
if data.PLUGIN_PATH not in sys.path:
sys.path.insert(0, data.PLUGIN_PATH)
# 添加PyDNA路径
pydna_bin = os.path.join(PYDNA_PATH, "bin")
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"{TOOL_NAME} {TOOL_VERSION}")
self.setWindowTitle(f"{data.TOOL_NAME} {data.TOOL_VERSION}")
self.setMinimumSize(1200, 800)
# 主窗口布局
@ -87,8 +77,8 @@ class MainWindow(QtWidgets.QMainWindow):
def load_styles(self):
"""加载样式表"""
if os.path.exists(TOOL_STYLE_FILE):
with open(TOOL_STYLE_FILE, "r", encoding="utf-8") as f:
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):
@ -122,12 +112,12 @@ def dock_to_maya():
"""嵌入Maya Dock面板"""
global main_window
try:
if cmds.workspaceControl(TOOL_WSCL_NAME, exists=True):
cmds.deleteUI(TOOL_WSCL_NAME)
if cmds.workspaceControl(data.TOOL_WSCL_NAME, exists=True):
cmds.deleteUI(data.TOOL_WSCL_NAME)
dock_control = cmds.workspaceControl(
TOOL_WSCL_NAME,
label=TOOL_NAME,
data.TOOL_WSCL_NAME,
label=data.TOOL_NAME,
tabToControl=["AttributeEditor", -1],
initialWidth=1400,
minimumWidth=1000,
@ -157,7 +147,7 @@ def show():
try:
if main_window:
main_window.close()
cmds.deleteUI(TOOL_WSCL_NAME)
cmds.deleteUI(data.TOOL_WSCL_NAME)
except:
pass

View File

@ -1,11 +1,34 @@
import os
from scripts.config import data
from scripts.ui.widgets import (
BaseWidget, BlendShapeList, BlendShapeControls,
BlendShapeTools, IconButton, SliderWithValue
)
QtCore, QtGui, QtWidgets = data.Qt()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#===================================== 1. Module Imports =====================================
import maya.cmds as cmds
import maya.mel as mel
import sys
import os
from scripts.ui.widgets import (BaseWidget, BlendShapeList, BlendShapeControls, BlendShapeTools, IconButton, SliderWithValue)
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
#===================================== 2. Adjust Tab Class =====================================
class AdjustTab(BaseWidget):
"""调整标签页"""
def __init__(self, parent=None):

View File

@ -1,10 +1,34 @@
import os
from scripts.config import data
from scripts.ui.widgets import (
BaseWidget, IconButton, SearchLineEdit
)
QtCore, QtGui, QtWidgets = data.Qt()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#===================================== 1. Module Imports =====================================
import maya.cmds as cmds
import maya.mel as mel
import sys
import os
from scripts.ui.widgets import ( BaseWidget, IconButton, SearchLineEdit)
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
#===================================== 2. Define Tab Class =====================================
class DefineTab(BaseWidget):
"""定义标签页"""
def __init__(self, parent=None):

View File

@ -1,8 +1,31 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#===================================== 1. Module Imports =====================================
import os
from scripts.config import data
from scripts.utils import menu_utils
QtCore, QtGui, QtWidgets = data.Qt()
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
#===================================== 2. Menu Manager Class =====================================
class MenuManager:
"""菜单管理器"""
def __init__(self, parent):

View File

@ -1,10 +1,34 @@
import os
from scripts.config import data
from scripts.ui.widgets import (
BaseWidget, LODGroup, IconButton, SearchLineEdit
)
QtCore, QtGui, QtWidgets = data.Qt()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#===================================== 1. Module Imports =====================================
import maya.cmds as cmds
import maya.mel as mel
import sys
import os
from scripts.ui.widgets import (BaseWidget, LODGroup, IconButton, SearchLineEdit)
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
#===================================== 2. Model Tab Class =====================================
class ModelTab(BaseWidget):
"""模型标签页"""
def __init__(self, parent=None):

View File

@ -1,39 +1,34 @@
import os
import sys
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#===================================== 1. Module Imports =====================================
import maya.cmds as cmds
from scripts.ui.widgets import (
BaseWidget, DNABrowser, DescriptionWidget, IconButton, SearchLineEdit
)
import maya.mel as mel
import sys
import os
from scripts.ui.widgets import (BaseWidget, DNABrowser, DescriptionWidget, IconButton, SearchLineEdit)
try:
from PySide import QtCore, QtGui, QtWidgets
print(f"从PySide加载Qt")
except ImportError as e:
try:
from PySide2 import QtCore, QtGui, QtWidgets
print(f"从PySide2加载Qt")
except ImportError as e:
from shiboken2 import wrapInstance
print("从PySide2加载Qt和shiboken2")
except ImportError:
try:
from PySide6 import QtCore, QtGui, QtWidgets
print(f"从PySide6加载Qt")
except ImportError as e:
print(f"PySide6加载失败: {str(e)}")
try:
from shiboken import wrapInstance
print(f"从shiboken加载wrapInstance")
except ImportError as e:
cmds.warning(f"shiboken加载失败: {str(e)}")
try:
from shiboken2 import wrapInstance
print(f"从shiboken2加载wrapInstance")
except ImportError as e:
cmds.warning(f"shiboken2加载失败: {str(e)}")
try:
from shiboken6 import wrapInstance
print(f"从shiboken6加载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:
cmds.warning(f"shiboken6加载失败: {str(e)}")
print(f"Qt加载失败: {str(e)}")
QtCore = QtGui = QtWidgets = None
wrapInstance = None
#===================================== 2. Rigging Tab Class =====================================
class RigTab(BaseWidget):
"""绑定标签页"""
def __init__(self, parent=None):

View File

@ -1,97 +1,34 @@
import os
import sys
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#===================================== 1. Module Imports =====================================
import maya.cmds as cmds
import maya.mel as mel
import sys
import os
from scripts.config import data
try:
from PySide import QtCore, QtGui, QtWidgets
print(f"从PySide加载Qt")
except ImportError as e:
try:
from PySide2 import QtCore, QtGui, QtWidgets
print(f"从PySide2加载Qt")
except ImportError as e:
from shiboken2 import wrapInstance
print("从PySide2加载Qt和shiboken2")
except ImportError:
try:
from PySide6 import QtCore, QtGui, QtWidgets
print(f"从PySide6加载Qt")
except ImportError as e:
print(f"PySide6加载失败: {str(e)}")
try:
from shiboken import wrapInstance
print(f"从shiboken加载wrapInstance")
except ImportError as e:
cmds.warning(f"shiboken加载失败: {str(e)}")
try:
from shiboken2 import wrapInstance
print(f"从shiboken2加载wrapInstance")
except ImportError as e:
cmds.warning(f"shiboken2加载失败: {str(e)}")
try:
from shiboken6 import wrapInstance
print(f"从shiboken6加载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:
cmds.warning(f"shiboken6加载失败: {str(e)}")
from scripts.config.data import (
ROOT_PATH,
TOOL_NAME,
TOOL_VERSION,
TOOL_AUTHOR,
TOOL_LANG,
TOOL_WSCL_NAME,
TOOL_HELP_URL,
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,
STYLE_FILE
)
if {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
} not in sys.path:
for path in [
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
]:
if path not in sys.path:
sys.path.append(path)
print(f"Qt加载失败: {str(e)}")
QtCore = QtGui = QtWidgets = None
wrapInstance = None
#===================================== 2. Base Widget Class =====================================
class BaseWidget(QtWidgets.QWidget):
"""基础控件类"""
def __init__(self, parent=None):
@ -122,7 +59,7 @@ class LoadButton(QtWidgets.QPushButton):
def setup_ui(self, text, icon_name):
if text:
self.setText(text)
icon_path = os.path.join(ICONS_PATH, icon_name)
icon_path = os.path.join(data.ICONS_PATH, icon_name)
if os.path.exists(icon_path):
self.setIcon(QtGui.QIcon(icon_path))
self.setFixedSize(25, 25)
@ -238,7 +175,7 @@ class IconButton(QtWidgets.QPushButton):
def setup_ui(self, icon_name, tooltip):
if icon_name:
icon_path = os.path.join(ICONS_PATH, icon_name)
icon_path = os.path.join(data.ICONS_PATH, icon_name)
if os.path.exists(icon_path):
self.setIcon(QtGui.QIcon(icon_path))
if tooltip:
@ -335,8 +272,8 @@ class DNABrowser(QtWidgets.QWidget):
self.model.clear()
# 从DNA目录加载文件
dna_path = DNA_FILE_PATH
img_path = DNA_IMG_PATH
dna_path = data.DNA_FILE_PATH
img_path = data.DNA_IMG_PATH
if os.path.exists(dna_path):
for file in os.listdir(dna_path):
@ -907,10 +844,10 @@ class ExpressionPreviewWidget(QtWidgets.QWidget):
"""切换播放状态"""
if checked:
self.play_timer.start(33) # ~30fps
self.play_btn.setIcon(QtGui.QIcon(os.path.join(ICONS_PATH, "pause.png")))
self.play_btn.setIcon(QtGui.QIcon(os.path.join(data.ICONS_PATH, "pause.png")))
else:
self.play_timer.stop()
self.play_btn.setIcon(QtGui.QIcon(os.path.join(ICONS_PATH, "play.png")))
self.play_btn.setIcon(QtGui.QIcon(os.path.join(data.ICONS_PATH, "play.png")))
def update_time(self):
"""更新时间"""

View File

@ -1,6 +1,13 @@
import maya.cmds as cmds
from scripts.config import data
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#===================================== 1. Module Imports =====================================
import maya.cmds as cmds
import maya.mel as mel
import sys
import os
#===================================== 2. BlendShape Manager Class =====================================
class BlendShapeManager:
"""BlendShape管理器"""
def __init__(self):

View File

@ -1,8 +1,34 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#===================================== 1. Module Imports =====================================
import maya.cmds as cmds
import maya.mel as mel
import sys
import os
import json
import maya.cmds as cmds
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
#===================================== 2. DNA Definition Class =====================================
class DNADefinition:
"""DNA定义类"""
def __init__(self):

View File

@ -1,57 +0,0 @@
import os
import maya.cmds as cmds
def check_installation():
"""检查插件安装状态"""
# 获取当前插件路径
plugin_path = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
issues = []
# 检查mod文件
maya_mod_path = os.path.join(os.getenv('MAYA_APP_DIR'), 'modules')
mod_file = os.path.join(maya_mod_path, 'MetaFusion.mod')
if not os.path.exists(mod_file):
issues.append("缺少mod文件")
else:
# 验证mod文件内容
with open(mod_file, 'r') as f:
content = f.read()
if plugin_path not in content:
issues.append("mod文件路径不正确")
# 检查必要目录
required_dirs = [
'ui',
'utils',
'config',
'resources/icons'
]
for dir_path in required_dirs:
if not os.path.exists(os.path.join(plugin_path, dir_path)):
issues.append(f"缺少必要目录: {dir_path}")
# 检查必要文件
required_files = [
'MetaFusion.py',
'ui/__init__.py',
'ui/menu.py',
'ui/models.py',
'ui/rigging.py',
'ui/define.py',
'utils/adjust_utils.py',
'utils/define_utils.py',
'config/data.py'
]
for file_path in required_files:
if not os.path.exists(os.path.join(plugin_path, file_path)):
issues.append(f"缺少必要文件: {file_path}")
# 检查插件加载
if not cmds.pluginInfo('MetaFusion', q=True, loaded=True):
try:
cmds.loadPlugin('MetaFusion')
except:
issues.append("插件无法加载")
return issues

View File

@ -1,8 +1,15 @@
import os
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#===================================== 1. Module Imports =====================================
import maya.cmds as cmds
import maya.mel as mel
import sys
import os
from scripts.config import data
from scripts.utils import model_utils, rigging_utils, adjust_utils, define_utils
#===================================== 2. Menu Utils =====================================
def load_dna():
"""打开DNA文件"""
file_path = cmds.fileDialog2(

View File

@ -1,9 +1,13 @@
import os
import maya.cmds as cmds
from scripts.config import data
import maya.mel as mel
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# LOD模型加载功能
#===================================== 1. Module Imports =====================================
import maya.cmds as cmds
import maya.mel as mel
import sys
import os
#===================================== 2. Model Utils =====================================
def load_model(lod_index, model_type, file_path):
"""加载模型
Args:

View File

@ -1,6 +1,13 @@
import maya.cmds as cmds
from scripts.config import data
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#===================================== 1. Module Imports =====================================
import maya.cmds as cmds
import maya.mel as mel
import sys
import os
#===================================== 2. Rigging Utils =====================================
def export_settings():
"""导出设置"""
print("导出设置功能待实现")