CtrEditor/PYTHON_EXECUTION_README.md

4.2 KiB

Python Execution in CtrEditor via MCP

Esta funcionalidad permite ejecutar scripts Python directamente dentro de CtrEditor para debug y testing, con acceso completo a los objetos de la aplicación.

Características

  • Ejecución de Python sin instalaciones externas: Usa IronPython 3.4.2 integrado
  • Acceso completo a objetos: MainViewModel, Canvas, ObjetosSimulables
  • Timeout configurable: Previene scripts que se cuelguen
  • Variables de retorno: Obtén valores específicos del script
  • Help integrado: Documentación automática de objetos disponibles

Objetos Disponibles en Python

Variables Globales

  • app: MainViewModel - El modelo de vista principal de la aplicación
  • canvas: Canvas - El canvas principal donde se muestran los objetos
  • objects: ObservableCollection - Colección de todos los objetos simulables
  • get_objects(): Función que retorna una lista de todos los objetos simulables

Librerías Disponibles

  • sys, math, time, json, random

Herramientas MCP Disponibles

execute_python

Ejecuta código Python con acceso a objetos de CtrEditor.

Parámetros:

  • code (requerido): El código Python a ejecutar
  • return_variables (opcional): Lista de nombres de variables a retornar
  • timeout_seconds (opcional): Timeout en segundos (default: 30)

Ejemplo:

{
  "name": "execute_python",
  "arguments": {
    "code": "count = len(objects)\nprint(f'Total objects: {count}')",
    "return_variables": ["count"],
    "timeout_seconds": 10
  }
}

python_help

Obtiene ayuda sobre objetos y métodos disponibles.

Parámetros:

  • object_name (opcional): Nombre específico del objeto para obtener ayuda

Ejemplos:

{
  "name": "python_help",
  "arguments": {}
}
{
  "name": "python_help",
  "arguments": {
    "object_name": "app"
  }
}

Ejemplos de Uso

1. Contar objetos

# Contar todos los objetos
total = len(objects)
print(f"Total objects: {total}")

# Filtrar objetos por tipo
conveyors = [obj for obj in objects if 'Conveyor' in str(type(obj))]
print(f"Conveyors: {len(conveyors)}")

2. Inspeccionar canvas

# Obtener información del canvas
width = canvas.Width
height = canvas.Height
print(f"Canvas size: {width}x{height}")

# Verificar estado de simulación
is_running = app.IsSimulationRunning
print(f"Simulation running: {is_running}")

3. Modificar objetos (con precaución)

# Buscar un objeto específico
for obj in objects:
    if hasattr(obj, 'Nombre') and obj.Nombre == "MiObjeto":
        print(f"Found object: {obj.Nombre}")
        # Modificar propiedades si es necesario
        if hasattr(obj, 'Visible'):
            obj.Visible = not obj.Visible
        break

4. Debugging avanzado

# Obtener propiedades de todos los objetos
for i, obj in enumerate(objects):
    obj_type = type(obj).__name__
    properties = [prop for prop in dir(obj) if not prop.startswith('_')]
    print(f"Object {i}: {obj_type} - {len(properties)} properties")

Seguridad y Precauciones

⚠️ IMPORTANTE: Esta funcionalidad está diseñada solo para debug y testing. NO está pensada para uso en producción.

  • El código Python se ejecuta en el mismo proceso que CtrEditor
  • Tiene acceso completo a todos los objetos de la aplicación
  • No hay restricciones de seguridad implementadas
  • Use solo en entornos de desarrollo controlados

Configuración

Las herramientas se configuran automáticamente cuando se inicia el MCPServer. No se requiere configuración adicional.

Solución de Problemas

Error: "Python environment initialization failed"

  • Verifica que IronPython esté correctamente instalado via NuGet
  • Revisa los logs de debug para más detalles

Error: "Python execution timed out"

  • Reduce la complejidad del script
  • Aumenta el timeout_seconds si es necesario
  • Verifica que no haya bucles infinitos

Variables no encontradas

  • Usa python_help para ver qué objetos están disponibles
  • Verifica que los objetos existan antes de usarlos
  • Usa hasattr() para verificar propiedades antes de accederlas

Logging

Todos los eventos de ejecución Python se registran en el log de debug de CtrEditor con el prefijo [MCP Server].