添加 loader.py
This commit is contained in:
226
loader.py
Normal file
226
loader.py
Normal file
@@ -0,0 +1,226 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
Maya MCP Loader
|
||||
Module for loading and managing the MCP server in Maya.
|
||||
|
||||
Version: 1.0.0
|
||||
Author: Virtuos Games
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import logging
|
||||
import threading
|
||||
import time
|
||||
import maya.cmds as cmds
|
||||
import maya.utils as utils
|
||||
|
||||
# Configure logging
|
||||
logging.basicConfig(level=logging.INFO,
|
||||
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
||||
logger = logging.getLogger("MayaMCP.Loader")
|
||||
|
||||
# Global variables
|
||||
_mcp_menu = None
|
||||
|
||||
def initialize():
|
||||
"""
|
||||
Initialize the MCP server
|
||||
|
||||
Returns:
|
||||
int: Port number if server started successfully, None otherwise
|
||||
"""
|
||||
try:
|
||||
# Import server module
|
||||
from server import start_server, stop_server
|
||||
|
||||
# Stop any existing server
|
||||
stop_server()
|
||||
|
||||
# Start server
|
||||
port = start_server()
|
||||
|
||||
if port:
|
||||
# Print clear message to script editor
|
||||
message = "=" * 50
|
||||
message += "\nMCP SERVER STARTED SUCCESSFULLY ON PORT {}\n".format(port)
|
||||
message += "=" * 50
|
||||
print(message)
|
||||
|
||||
# Show message in Maya viewport
|
||||
cmds.inViewMessage(
|
||||
message="MCP Server started on port {}".format(port),
|
||||
position="topCenter",
|
||||
fade=True,
|
||||
fadeOutTime=5.0,
|
||||
backColor=(0.2, 0.6, 0.2),
|
||||
fontSize=24
|
||||
)
|
||||
|
||||
logger.info(f"MCP server started on port {port}")
|
||||
return port
|
||||
else:
|
||||
error_msg = "Failed to start MCP server"
|
||||
print("\n" + "!" * 50 + f"\n{error_msg}\n" + "!" * 50)
|
||||
logger.error(error_msg)
|
||||
return None
|
||||
except Exception as e:
|
||||
error_msg = f"Error initializing MCP server: {e}"
|
||||
print("\n" + "!" * 50 + f"\n{error_msg}\n" + "!" * 50)
|
||||
logger.error(error_msg)
|
||||
return None
|
||||
|
||||
def create_menu():
|
||||
"""
|
||||
Create the MCP menu in Maya
|
||||
|
||||
Returns:
|
||||
str: Menu name if created successfully, None otherwise
|
||||
"""
|
||||
global _mcp_menu
|
||||
|
||||
try:
|
||||
# Delete existing menu if it exists
|
||||
if _mcp_menu and cmds.menu(_mcp_menu, exists=True):
|
||||
cmds.deleteUI(_mcp_menu)
|
||||
|
||||
# Get main window
|
||||
main_window = "MayaWindow"
|
||||
|
||||
# Create menu
|
||||
_mcp_menu = cmds.menu("MCPMenu", label="MCP", parent=main_window)
|
||||
|
||||
# Add menu items
|
||||
cmds.menuItem(label="Start Server", command=lambda x: start_server_cmd())
|
||||
cmds.menuItem(label="Stop Server", command=lambda x: stop_server_cmd())
|
||||
cmds.menuItem(divider=True)
|
||||
cmds.menuItem(label="About", command=lambda x: about_cmd())
|
||||
|
||||
print("MCP menu created successfully")
|
||||
logger.info("MCP menu created")
|
||||
return _mcp_menu
|
||||
except Exception as e:
|
||||
error_msg = f"Error creating MCP menu: {e}"
|
||||
print("\n" + "!" * 50 + f"\n{error_msg}\n" + "!" * 50)
|
||||
logger.error(error_msg)
|
||||
return None
|
||||
|
||||
def start_server_cmd():
|
||||
"""Command to start the MCP server"""
|
||||
try:
|
||||
from server import start_server, is_server_running
|
||||
|
||||
if is_server_running():
|
||||
cmds.confirmDialog(
|
||||
title="MCP Server",
|
||||
message="MCP server is already running",
|
||||
button="OK"
|
||||
)
|
||||
return
|
||||
|
||||
port = start_server()
|
||||
|
||||
if port:
|
||||
cmds.inViewMessage(
|
||||
message=f"MCP server started on port {port}",
|
||||
position="topCenter",
|
||||
fade=True,
|
||||
fadeOutTime=5.0,
|
||||
backColor=(0.2, 0.6, 0.2),
|
||||
fontSize=24
|
||||
)
|
||||
else:
|
||||
cmds.confirmDialog(
|
||||
title="MCP Server Error",
|
||||
message="Failed to start MCP server",
|
||||
button="OK"
|
||||
)
|
||||
except Exception as e:
|
||||
error_msg = f"Error starting MCP server: {e}"
|
||||
logger.error(error_msg)
|
||||
cmds.confirmDialog(
|
||||
title="MCP Server Error",
|
||||
message=error_msg,
|
||||
button="OK"
|
||||
)
|
||||
|
||||
def stop_server_cmd():
|
||||
"""Command to stop the MCP server"""
|
||||
try:
|
||||
from server import stop_server, is_server_running
|
||||
|
||||
if not is_server_running():
|
||||
cmds.confirmDialog(
|
||||
title="MCP Server",
|
||||
message="MCP server is not running",
|
||||
button="OK"
|
||||
)
|
||||
return
|
||||
|
||||
success = stop_server()
|
||||
|
||||
if success:
|
||||
cmds.inViewMessage(
|
||||
message="MCP server stopped",
|
||||
position="topCenter",
|
||||
fade=True,
|
||||
fadeOutTime=5.0,
|
||||
backColor=(0.6, 0.2, 0.2),
|
||||
fontSize=24
|
||||
)
|
||||
else:
|
||||
cmds.confirmDialog(
|
||||
title="MCP Server Error",
|
||||
message="Failed to stop MCP server",
|
||||
button="OK"
|
||||
)
|
||||
except Exception as e:
|
||||
error_msg = f"Error stopping MCP server: {e}"
|
||||
logger.error(error_msg)
|
||||
cmds.confirmDialog(
|
||||
title="MCP Server Error",
|
||||
message=error_msg,
|
||||
button="OK"
|
||||
)
|
||||
|
||||
def about_cmd():
|
||||
"""Command to show about dialog"""
|
||||
cmds.confirmDialog(
|
||||
title="About MCP",
|
||||
message="Maya MCP (Model Context Protocol)\nVersion 1.0.0\n\nAuthor: Virtuos Games",
|
||||
button="OK"
|
||||
)
|
||||
|
||||
def auto_load():
|
||||
"""
|
||||
Automatically load the MCP server and create the menu
|
||||
|
||||
Returns:
|
||||
bool: Whether auto-load was successful
|
||||
"""
|
||||
try:
|
||||
# Create menu
|
||||
create_menu()
|
||||
|
||||
# Start server in a separate thread
|
||||
def delayed_start():
|
||||
time.sleep(2) # Wait for Maya to fully initialize
|
||||
initialize()
|
||||
|
||||
thread = threading.Thread(target=delayed_start)
|
||||
thread.daemon = True
|
||||
thread.start()
|
||||
|
||||
print("\n" + "=" * 50)
|
||||
print("MCP AUTO-LOAD INITIATED")
|
||||
print("Menu created and server starting...")
|
||||
print("=" * 50 + "\n")
|
||||
|
||||
return True
|
||||
except Exception as e:
|
||||
error_msg = f"Error in auto-load: {e}"
|
||||
print("\n" + "!" * 50 + f"\n{error_msg}\n" + "!" * 50)
|
||||
logger.error(error_msg)
|
||||
return False
|
Reference in New Issue
Block a user