# CLAUDE.md para automatizar Revit 2027 con pyRevit 7

Plantilla de libre uso. Cópiala como `CLAUDE.md` en la carpeta de tu proyecto y ajusta las rutas.
Sale de 12 tareas resueltas por Claude Code con pyRevit 7.0.0.26278 y Revit 2027.1 (eder3232.com).

---

# Proyecto · automatización de Revit 2027 con pyRevit

- Revit 2027, interfaz en <idioma>, unidades del proyecto en <milímetros>.
- Las herramientas se crean en `extension/` (ruta registrada con `pyrevit extensions paths add`).
  Estructura: `MiExtension.extension/MiPestaña.tab/MiPanel.panel/MiBoton.pushbutton/script.py`.
- Para ejecutar código dentro de Revit, usa el servidor MCP `pyrevit` (runtime de agente):
  `run_query` para leer y `run_modify` para cambiar el modelo. Consulta `lookup_revit_api` antes de usar
  una clase o un método que no conozcas.
- Trabaja **solo sobre modelos de prueba**: la política del agente está en `auto`.

## Reglas del runtime de agente

- En `run_modify`, **abre tu propia `Transaction`** (`with Transaction(doc, "nombre")` o `t.Start()` / `t.Commit()`).
  Sin ella sale `ModificationOutsideTransactionException`.
- **No se puede guardar desde el script**: `doc.Save()` falla con «Saving is not permitted when there is any
  open transaction phase started by API client». Para guardar, lanza el comando de Revit, que se ejecuta
  cuando termina el script:
  `uiapp.PostCommand(RevitCommandId.LookupPostableCommandId(PostableCommand.Save))`.
- Los avisos de Revit no abren diálogos: vuelven en `failures`. Revísalos.
- Haz los cambios grandes **por etapas** (un script por paso) y comprueba el modelo entre una y otra.
- `PostCommand` no sirve para pulsar botones de add-ins ni de extensiones.

## Rarezas de IronPython 2.7 con la API de 2027

- `tipo.Name` en tipos y familias puede no estar accesible: usa `Element.Name.GetValue(tipo)`
  o el parámetro `BuiltInParameter.SYMBOL_NAME_PARAM`.
- `ElementId(123)` es ambiguo entre sobrecargas: usa `ElementId(System.Int64(123))`.
- `ElementId.IntegerValue` ya no existe en 2027: usa `.Value`.
- Si un `.py` lleva tildes o «ñ», la primera línea es `# -*- coding: utf-8 -*-`.
- Cierra los archivos (`with open(...) as f:`).

## Revit

- Un botón de pyRevit vuelve a leer su `script.py` en cada clic: para probar un cambio no hace falta reiniciar Revit.
- No hay API para: fases, opciones de diseño, scope boxes, familias in situ, leyendas y esquemas de color
  desde cero (sí duplicar), campos calculados en tablas, render, unidades por defecto de Revit.
  Si la tarea lo pide, dilo en vez de buscar un rodeo.
- Guarda los modelos de prueba fuera de carpetas que vigile otro programa (repositorio, Visual Studio,
  sincronización en la nube): ahí Revit puede caerse al guardar en bucle.
- Si algo no cuadra, lee el journal de Revit (`%LOCALAPPDATA%\Autodesk\Revit\Autodesk Revit 2027\Journals`).
