# CLAUDE.md para automatizar AutoCAD 2027

Plantilla de libre uso. Cópiala como `CLAUDE.md` en la carpeta de tu proyecto y ajusta las rutas.
Sale de 244 pruebas ejecutadas en AutoCAD 2027 (R26.0, build 26.0.118) con Claude Code (eder3232.com).

---

# Proyecto · automatización de AutoCAD 2027

- AutoCAD 2027, interfaz en <idioma>. .NET 10 (`net10.0-windows`).
- Carpeta de confianza para DLL y LISP: `<ruta>`. Está en `TRUSTEDPATHS`. No cargues nada desde otra carpeta:
  fuera de una ruta de confianza, `NETLOAD` y `/al` fallan **sin avisar** (el comando simplemente no existe).
- Antes de usar un nombre, compruébalo en el inventario:
  - .NET: `<inventario .NET>` (reflexión de `acdbmgd`, `acmgd` y `accoremgd`).
  - LISP: `<inventario LISP>` (sacado con `atoms-family`). En la consola no hay objeto ActiveX: las `vla-*` existen pero no sirven.
  - Comandos: `(getcname "_NOMBRE")` antes de usarlos en un `.scr` o una macro. No supongas que un comando existe.

## Qué vía usar

- Interfaz (cinta, paletas, comandos, jigs): .NET.
- Rutinas y prototipos: AutoLISP (`(load)` recarga al instante).
- Cientos de DWG: `accoreconsole` con una DLL que abre todos los dibujos con `ReadDwgFile` **en un solo proceso**.
  100 dibujos: ~8,3 s en un proceso (7,8 s de arranque) frente a 277 s con un proceso por dibujo.
- Controlar AutoCAD desde Python u otro programa: COM, solo para órdenes grandes (`SelectionSet` filtrado,
  ObjectDBX, `SendCommand`). Nunca recorras entidades una por una desde fuera: cada llamada cuesta ~1 ms.
- No escribas VBA nuevo.

## .NET

- Desde el contexto de aplicación, `LockDocument` antes de escribir (si no, `eLockViolation`).
- Tras un `await` que no sea `CommandAsync`, se pierde el contexto de comando.
- Nunca escribas en un objeto después de cerrar su transacción: tumba AutoCAD sin `try/catch` posible.
- Una DLL cargada no se descarga y `NETLOAD` no recarga. El Hot Reload de Visual Studio no funciona.
- Gana siempre la Newtonsoft.Json de AutoCAD: no dependas de otra versión.
- `Hatch.Area` siempre falla (`eNotApplicable`). Usa `IsMergedCell`, no `IsMerged`.
- Los bundles en `%ProgramData%` se ignoran: usa `%APPDATA%\Autodesk\ApplicationPlugins` o la carpeta de confianza.

## accoreconsole

- `accoreconsole.exe /i dibujo.dwg /s script.scr`. Sin `/i` sale con error 53.
- Ciérrale la entrada estándar y ponle un tiempo límite: si no, espera teclado para siempre.
- `QUIT` con el dibujo modificado la cuelga. Un comando que no existe termina con código 0: no te fíes del código de salida, lee la salida.
- La salida es UTF-16 mezclada con ASCII: quita los NUL y decodifica como latin-1.
- No toques la interfaz (`AcadApplication`, `StatusBar`, `GetAcadDocument`): tumba el proceso sin excepción.
  Escribe trazas a un archivo en cada paso; la salida estándar se pierde si el proceso muere.

## COM

- Usa `DispatchEx` para tener **tu propia** instancia. `GetActiveObject` devuelve la primera, que puede ser la del usuario con trabajo sin guardar.
- `RPC_E_CALL_REJECTED` puede durar minutos (pywin32 lo muestra como `AttributeError`): reintenta con espera.
- Cierra siempre con `Quit()`: si no, queda un `acad.exe` oculto.

## AutoLISP

- `vl-catch-all-apply` no atrapa funciones inexistentes. Una recursión de ~20.000 niveles mata LISP en silencio.
- `write-line` escribe en ANSI. Rutas de más de 260 caracteres fallan.
- En macros y scripts, antepón `_non` a las coordenadas: el OSNAP las desvía.

## Lo que no tiene API

Bloques dinámicos desde cero, restricciones geométricas (.NET/COM), cotas asociativas por código (hace falta
`DIMREASSOCIATE`), `RECOVER`, guardar con contraseña, guardar un proyecto VBA. Si la tarea lo pide, dilo.

## Seguridad

- Las pruebas que pueden tumbar AutoCAD, en una instancia propia que no importe perder.
- Si aparece el informe de error (CER), ciérralo sin enviar.
