添加 maya_mcp_plugin.py
This commit is contained in:
119
maya_mcp_plugin.py
Normal file
119
maya_mcp_plugin.py
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
"""
|
||||||
|
Maya MCP Plugin
|
||||||
|
This plugin provides integration with the Model Context Protocol for Maya.
|
||||||
|
|
||||||
|
To load this plugin:
|
||||||
|
1. Open Maya's Plugin Manager (Windows > Settings/Preferences > Plug-in Manager)
|
||||||
|
2. Click "Browse" and select this file
|
||||||
|
3. Check "Loaded" and "Auto load"
|
||||||
|
|
||||||
|
Version: 1.0.0
|
||||||
|
Author: Virtuos Games
|
||||||
|
"""
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import maya.api.OpenMaya as om
|
||||||
|
import maya.cmds as cmds
|
||||||
|
import traceback
|
||||||
|
|
||||||
|
# Plugin information
|
||||||
|
def maya_useNewAPI():
|
||||||
|
"""
|
||||||
|
Tell Maya this plugin uses the Python API 2.0
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Plugin initialization
|
||||||
|
def initializePlugin(plugin):
|
||||||
|
"""
|
||||||
|
Initialize the plugin
|
||||||
|
|
||||||
|
Args:
|
||||||
|
plugin: MObject used to register commands
|
||||||
|
"""
|
||||||
|
vendor = "Virtuos Games"
|
||||||
|
version = "1.0.0"
|
||||||
|
|
||||||
|
plugin_fn = om.MFnPlugin(plugin, vendor, version)
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Add the plugin directory to the Python path
|
||||||
|
# Use plugin_fn.loadPath() instead of __file__ to get the plugin path
|
||||||
|
plugin_path = os.path.dirname(plugin_fn.loadPath())
|
||||||
|
om.MGlobal.displayInfo(f"Plugin path: {plugin_path}")
|
||||||
|
|
||||||
|
# Make sure the path is added to sys.path
|
||||||
|
if plugin_path not in sys.path:
|
||||||
|
sys.path.append(plugin_path)
|
||||||
|
om.MGlobal.displayInfo(f"Added to sys.path: {plugin_path}")
|
||||||
|
|
||||||
|
# Print current sys.path for debugging
|
||||||
|
om.MGlobal.displayInfo(f"Current sys.path: {sys.path}")
|
||||||
|
|
||||||
|
# Check if loader.py exists in the plugin directory
|
||||||
|
loader_path = os.path.join(plugin_path, "loader.py")
|
||||||
|
if os.path.exists(loader_path):
|
||||||
|
om.MGlobal.displayInfo(f"loader.py found at: {loader_path}")
|
||||||
|
else:
|
||||||
|
om.MGlobal.displayError(f"loader.py not found at: {loader_path}")
|
||||||
|
|
||||||
|
# Import and start MCP server
|
||||||
|
try:
|
||||||
|
# Try to import directly from the plugin path
|
||||||
|
sys.path.insert(0, plugin_path) # Add to the beginning of sys.path
|
||||||
|
|
||||||
|
# Try to import the module
|
||||||
|
om.MGlobal.displayInfo("Attempting to import loader module...")
|
||||||
|
from loader import auto_load
|
||||||
|
om.MGlobal.displayInfo("Successfully imported loader module")
|
||||||
|
|
||||||
|
# Start the server
|
||||||
|
auto_load()
|
||||||
|
om.MGlobal.displayInfo("MCP server loaded successfully")
|
||||||
|
except Exception as e:
|
||||||
|
om.MGlobal.displayError(f"Failed to load MCP server: {e}")
|
||||||
|
om.MGlobal.displayError(f"Traceback: {traceback.format_exc()}")
|
||||||
|
except Exception as e:
|
||||||
|
om.MGlobal.displayError(f"Error initializing MCP plugin: {e}")
|
||||||
|
raise
|
||||||
|
|
||||||
|
# Plugin cleanup
|
||||||
|
def uninitializePlugin(plugin):
|
||||||
|
"""
|
||||||
|
Uninitialize the plugin
|
||||||
|
|
||||||
|
Args:
|
||||||
|
plugin: MObject used to deregister commands
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
# Stop MCP server
|
||||||
|
try:
|
||||||
|
from server import stop_server
|
||||||
|
stop_server()
|
||||||
|
om.MGlobal.displayInfo("MCP server stopped")
|
||||||
|
except Exception as e:
|
||||||
|
om.MGlobal.displayWarning(f"Failed to stop MCP server: {e}")
|
||||||
|
|
||||||
|
# Remove menu - Try to use a more forceful way to delete menus
|
||||||
|
try:
|
||||||
|
# Try multiple possible menu names
|
||||||
|
for menu_name in ["MCPMenu", "MCP", "MCPMainMenu"]:
|
||||||
|
if cmds.menu(menu_name, exists=True):
|
||||||
|
cmds.deleteUI(menu_name, menu=True)
|
||||||
|
om.MGlobal.displayInfo(f"MCP menu '{menu_name}' removed")
|
||||||
|
|
||||||
|
# Check all menus in the main window, find menus containing MCP
|
||||||
|
main_window = "MayaWindow"
|
||||||
|
if cmds.window(main_window, exists=True):
|
||||||
|
menus = cmds.window(main_window, query=True, menuArray=True) or []
|
||||||
|
for menu in menus:
|
||||||
|
menu_label = cmds.menu(menu, query=True, label=True)
|
||||||
|
if menu_label and "MCP" in menu_label:
|
||||||
|
cmds.deleteUI(menu, menu=True)
|
||||||
|
om.MGlobal.displayInfo(f"Found and removed MCP menu with label: {menu_label}")
|
||||||
|
except Exception as e:
|
||||||
|
om.MGlobal.displayWarning(f"Failed to remove MCP menu: {e}")
|
||||||
|
except Exception as e:
|
||||||
|
om.MGlobal.displayError(f"Error uninitializing MCP plugin: {e}")
|
||||||
|
raise
|
Reference in New Issue
Block a user