CtrEditor/PYTHON_EXECUTION_README.md

147 lines
4.2 KiB
Markdown

# 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]`.