# 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:** ```json { "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:** ```json { "name": "python_help", "arguments": {} } ``` ```json { "name": "python_help", "arguments": { "object_name": "app" } } ``` ## Ejemplos de Uso ### 1. Contar objetos ```python # 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 ```python # 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) ```python # 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 ```python # 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]`.