# Scripts

# Fichas de muestra con NFC: un comando por carrete

Tengo más de veinte carretes y cada uno lleva su ficha de muestra impresa: un rectángulo con el nombre del material en relieve y, dentro, un tag NFC con la marca, el color y el lote. Cuando un hueco del CFS se libera, imprimo la ficha del carrete que acaba de entrar.

Hacer cada ficha a mano en el laminador tenía varios sitios donde equivocarse: el preset, el hueco, el color y la altura de la pausa. Ahora es una línea en una tabla y un comando.

## Qué hay dentro de la ficha

- **El texto** del recuadro dice el **tipo de material** (`PLA`, `PETG`, `ABS`, `NYLON`…), no la marca ni el color. Varios carretes de PLA comparten la misma ficha y se distinguen por el color impreso y por el tag.
- **El tag NFC** (NTAG215 de 25 mm, sin adhesivo) va **encerrado**: un hueco de 1 mm de fondo con 0,8 mm de tapa encima. La impresora se para justo antes de cerrar el hueco, metes el tag y reanudas.
- **El color** lo pone el carrete que esté en el hueco del CFS. El color que se declara en el proyecto solo sirve para que el laminador lo pinte bien en pantalla.

## El flujo: tres pasos

**1. Una fila por carrete en el catálogo.** Es un CSV con seis columnas:

```text
id,texto,marca,color,hex,preset
petg_esun_negro,PETG,eSUN,negro,#000000,eSUN PETG @Creality K2 Pro 0.4 nozzle - ABK
pla_hyper_gris,PLA,Creality,gris,#a0a7ad,Hyper PLA @Creality K2 Pro 0.4 nozzle - ABK
```

| Columna | Qué va |
|---|---|
| `id` | nombre corto del carrete, en minúsculas, cifras y guion bajo |
| `texto` | lo que se lee en la ficha; caben unas 7 mayúsculas |
| `marca`, `color` | para mí; no se imprimen |
| `hex` | color en formato `#RRGGBB`, con **un solo** `#` |
| `preset` | el nombre **completo** del preset de filamento, tal como aparece en Creality Print |

**2. Generar la ficha** indicando el carrete y el hueco del CFS donde está cargado:

```bash
uv run --with numpy python tools/nueva_ficha.py pla_hyper_gris 1B
```

Sin argumentos lista el catálogo y marca qué carretes están listos y cuáles bloqueados, y por qué.

**3. Abrir el `.3mf` resultante en Creality Print, laminar e imprimir.** No hace falta configurar nada antes: el proyecto ya lleva el filamento asignado al hueco, su preset, el color y la pausa.

El hueco **no** está en el catálogo a propósito: cambia cada vez que recargo carretes, así que se indica en cada ejecución.

## Lo que hace el comando por dentro

1. **Valida la fila** antes de tocar nada: que el preset exista, que sea de la K2 Pro 0.4 y que sea uno de mis presets revisados (llevan el sufijo `- ABK`; un preset de sistema sin revisar se rechaza), que el color sea un hex válido y que el hueco sea del CFS (1A–1D).
2. **Prepara la base del texto** si no existe ya. Para `PLA`, `PETG`, `ABS`, `ASA` y `TPU` parte de la ficha original, que ya trae ese texto; para cualquier otro escribe las letras sobre la ficha en blanco. Después abre el hueco cerrado del tag, rellena los agujeros de la malla y elimina los vértices en T. Cada base se genera **una sola vez** y se reutiliza.
3. **Comprueba que la malla queda cerrada.** Si no lo está, se detiene y borra el resultado: el modo automático de Creality Print (el de la IA) se niega a laminar una malla con aristas abiertas.
4. **Escribe el `.3mf`** con el filamento en el hueco indicado, el preset, el color y la pausa.

Las piezas pesadas de malla las hace FreeCAD sin interfaz (`freecadcmd`); el resto es Python con numpy.

## Tres detalles que costaron una impresión

### La pausa va en la capa de abajo, no en la de arriba

Creality Print pausa **después** de terminar la capa que le indicas. El hueco del tag acaba en Z 3,2 mm, así que la pausa se programa en 3,2. Con 3,4 la pausa llegaba una capa tarde, con la tapa ya empezada y el tag sin sitio.

Se comprueba en el gcode laminado: debe haber una sola `PAUSE`, entre la línea `;Z:3.2` y la `;Z:3.4`.

### El tag se escribe antes de encerrarlo, y nunca se bloquea

Una vez dentro no se puede sacar sin romper la ficha. Escríbelo y compruébalo con el móvil **antes** de meterlo. Se puede reescribir después a través de la tapa, pero el bloqueo del NTAG215 es **permanente**: si lo bloqueas, la ficha queda con esos datos para siempre.

### Una malla con defectos pasa en modo manual y falla en automático

Las fichas originales traen 19 aristas no-manifold. El modo manual del laminador las acepta y ofrece reparar; el automático rechaza la pieza sin más. Por eso el comando no da por buena una ficha hasta que la malla queda con cero aristas abiertas.

## Errores frecuentes al rellenar el catálogo

- **Preset vacío o abreviado.** Va el nombre entero, por ejemplo `Hyper PLA @Creality K2 Pro 0.4 nozzle - ABK`, no `Hyper PLA`.
- **Color con dos almohadillas** (`##a0a7ad`). Uno solo.
- **Un texto demasiado largo.** `POLICARBONATO` no cabe en el recuadro; el comando se detiene y lo dice. Usa una abreviatura (`PC`).
- **TPU.** El TPU no va por el CFS, así que no tiene hueco que asignar y queda fuera de este flujo.

## Los scripts

Por ahora viven en mi repositorio privado de proyectos 3D y no están publicados: dependen de otras utilidades mías (el verificador de presets y el diagnóstico de mallas) y de mis presets `- ABK`. Esta página describe el método, que es lo que se puede trasladar a cualquier otra impresora con CFS y cualquier modelo de ficha.

La ficha de partida es el modelo *Filament Samples / Filament Color Swatches*; el hueco cerrado del tag y la pausa son una modificación propia, el original no la trae.