# Tutorial · Glue-up y Auto-glue-up

Tutorial paso a paso sobre cómo manejar el módulo **Glue-up** (panel
alistonado · alma + 2 tapas) en Despiece: marcar piezas a mano o por
lotes, dejar que `Shift+G` proponga por nombre y leer el desglose en
BOM / nest / pedido / etiquetas.

El modelo de ejemplo es `CocinaV9.despiece`. Cualquier proyecto con
puertas, estantes grandes o tapas sirve — el matcher pliega acentos y es
case-insensitive.

---

## 1. Cargar el modelo y abrir la lista plana

![Vista general al cargar el modelo](img/01-overview-glueup.jpg)

Al importar el STEP/IGES/BREP/glTF/GLB, la sidebar izquierda muestra el
**árbol jerárquico** (assemblies / piezas). Para trabajar con glue-up
lo más cómodo es la **lista plana** (todas las piezas en un solo scroll,
sin anidar assemblies): botón de la topbar o atajo.

La cámara vuelve a vista isométrica con `Home`; el zoom encaja con `F`.

> **Módulo gated.** Si `Configuración → Glue-up → Habilitar Glue-up`
> está apagado, el botón ▣ del topbar, `Shift+G` y el submenú
> `Construcción ▸` del RMB no aparecen. Lo que sigue asume módulo
> **on** — el default de fábrica es **off** (opt-in desde la spec
> 2026-07-18), así que el primer paso del taller es prender el toggle.

## 2. La lista plana y el chip ▣ Alistonado

![Lista plana con filas de piezas y el chip de glue-up](img/02-sidebar-glueup.jpg)

Cada fila muestra, en orden, los chips ya conocidos:

- **Nombre** de la pieza (editable con doble click — paso 5).
- **Cotas** nominales `largo × ancho × espesor` (mm) derivadas del AABB
  en espacio de diseño.
- **4 chips de cantos** L1 · L2 · A1 · A2 (rojo 0,45 mm / azul 2 mm).
- **Chip de veta** (H/V/—) y **chip de material** (color).
- **Chip ▣ Alistonado** — solo aparece en piezas con descriptor (paso 4).
  Las piezas sin descriptor no muestran chip; son sólidos simples en los
  exports.

## 3. Anatomía del chip ▣ Alistonado

![Detalle del chip ▣ Alistonado](img/03-glueup-chip.jpg)

El chip se muestra al final de la fila, después del chip de material, y
arranca con el glifo `▣` (square inside square). El **tooltip** resume
el descriptor resuelto:

```
Alistonado
Alma: Pino FK 18 mm
Tapas: MDF crudo 3 mm
Trim: 5 mm/lado
```

El cálculo `t_alma = espesor_total − 2 × coverThickness` se hace en vivo
a partir del AABB de la pieza (`src/ui/glued-up/chip.ts:buildGluedUpChip`),
así que si el descriptor tiene `cover=3 mm` y la pieza es de `24 mm`,
el alma que reporta el chip es `18 mm`.

## 4. Anatomía del descriptor (alma + 2 tapas)

![Esquema del descriptor 3 sub-piezas](img/04-descriptor-anatomy.jpg)

Cuando marcás una pieza como alistonado, Despiece guarda un
`GluedUpConfig` (`src/glued-up/types.ts`) con **cinco** campos:

| Campo | Significado | Default |
|-------|-------------|---------|
| `enabled` | marca interna; siempre `true` cuando la pieza tiene descriptor | `true` |
| `coverThicknessMm` | espesor de **cada** tapa (son simétricas) | `3` mm |
| `coreMaterialId` | `MaterialDef.id` del alma (rol `core`) | `""` |
| `coverMaterialId` | `MaterialDef.id` de las 2 tapas (rol `face`) | `""` |
| `coreStripsWidthMm` | ancho nominal del listón del alma (informativo) | `35` mm |
| `trimAllowanceMm` | merma prensa por lado (largo y ancho) | `5` mm |

La pieza sigue siendo **un único cuerpo en el viewport 3D**, pero al
momento de exportar (BOM, nest, pedido, etiquetas) se expande en
**3 sub-piezas**:

```
padre 600×1800×24,  cover=3,  trim=5
      │
      ├── Alma · padre          590×1790×18     (Pino FK)
      ├── Tapa · padre          590×1790×3      (MDF crudo)
      └── Tapa · padre          590×1790×3      (MDF crudo)
```

Las cotas de cada sub-pieza son **netas** (acabado del padre menos
`2 × trim` por lado), y los `edges` se guardan vacíos (`EMPTY_EDGES`)
porque los cantos del panel van por fuera, no por las capas internas.
Las tapas son **simétricas** (mismo espesor y dimensiones); el índice
`1` y `2` se diferencian solo a nivel de label (`Tapa sup` / `Tapa inf`).

## 5. Marcar una pieza a mano

![Modal de pieza: alma + 2 tapas](img/05-modal-piece.jpg)

1. **Seleccioná** la pieza (click en 3D o en la lista).
2. **RMB ▸ Construcción ▸ Marcar como alistonado…** (o doble click
   sobre el chip ▣ si la pieza ya estaba marcada — abre **Editar**).
3. Se abre el sheet modal con los **defaults de Configuración →
   Glue-up** prefilled.
4. Ajustá:
   - **Espesor de tapas** (`coverThicknessMm`, mm).
   - **Material de tapas** (`coverMaterialId`) — select filtrado por
     `role: face` (MDF, melamina).
   - **Material de alma** (`coreMaterialId`) — select filtrado por
     `role: core` (Pino FK, Eucalipto, Paraíso).
   - **Ancho de listón** (`coreStripsWidthMm`, mm; informativo).
   - **Merma prensa** (`trimAllowanceMm`, mm/lado).
5. **Apply** aplica a la pieza seleccionada.

Si la pieza ya tenía descriptor, el modal abre **Editar** con sus
valores pre-rellenados (no los defaults del taller). El sheet valida
en cada `change`: si el material de alma no tiene `role: core` o el
de tapas no tiene `role: face`, bloquea el `Apply` y muestra el código
de error (`src/glued-up/types-guards.ts:validateGluedUpConfig`).

## 6. Marcar varias piezas en batch

![Apply a N seleccionadas](img/06-batch-apply.jpg)

Con 2+ piezas seleccionadas el modal agrega un segundo botón a la
derecha del `Apply`:

- **Apply** → aplica solo a la primera pieza de la selección.
- **Apply a N seleccionadas** → aplica **la misma config** a todas las
  piezas de la selección en una sola operación de undo.

> **Cuidado con Apply a N.** El modal guarda un único `GluedUpConfig`
> y lo aplica idéntico a cada pieza. Si entre piezas varía el espesor
> (puerta de 24 mm vs estante de 18 mm), ajustá el descriptor en dos
> pasadas: una por lote homogéneo, o pieza por pieza.

Limpiar el descriptor es simétrico: RMB ▸ Construcción ▸ Limpiar
alistonado. Aplica a todas las piezas seleccionadas que tengan
`gluedUp !== null` y deja un toast con el conteo.

## 7. Auto-glue-up con `Shift+G`

![Modelo después de Auto-glue-up](img/07-after-auto-glueup.jpg)

![Sidebar después de Auto-glue-up](img/07-sidebar-after-auto-glueup.jpg)

El atajo **`Shift+G`** (también `⇧G` en Mac) ejecuta **Auto-glue-up ✦**
sobre todas las piezas del proyecto (botón ▣ del topbar entre
Auto-cantos y Nesting). La regla es la misma que auto-cantos /
auto-roles:

> Para cada pieza sin descriptor (`gluedUp === null`), se matchea el
> **keyword** (acorde a *longest-keyword-wins* / *first-def-wins*) que
> aparezca en el nombre. Solo se **rellenan piezas sin marca previa** —
> las que ya tienen descriptor a mano **no se pisan**.

El keyword lleva asociado un `trimAllowanceMm` que pisa al default del
taller para esa pieza puntual. Si el nombre matchea un keyword con
`trim=3` pero el default es `5`, la pieza queda con `trim=3`; el resto
queda con `5`.

Keywords built-in del catálogo default
(`src/glued-up/types.ts:DEFAULT_GLUED_UP_KEYWORDS`):

| Keyword | Trim (mm) | Matchea |
|---------|-----------|---------|
| `alistonado` | 5 | Pieza marcada como panel alistonado |
| `alistonada` | 5 | Variante femenino (nombres de muebles) |
| `alist` | 5 | Forma corta (`ALIST`, `Alist.`) |
| `alma` | 5 | Pieza con alma explícita |
| `sandwich` | 5 | Sandwich panel / multilaminado |
| `paneles` | 5 | Plural genérico |
| `tapa maciza` | 3 | Tapa de madera maciza |
| `puerta maciza` | 3 | Puerta maciza |
| `estante macizo` | 3 | Estante macizo (pocas piezas grandes) |
| `panel nido` | 5 | Paneles con nido de abeja |

El reporte al final del toast distingue **cambiadas** vs **skipped**
(ya tenían descriptor) vs **unmatched** (ningún keyword matcheó).
`Shift+G` es **idempotente** — corrélo varias veces seguidas y solo
las piezas nuevas entran al primer bucket.

## 8. Ver el desglose en BOM / nest / pedido / etiquetas

![Desglose en BOM CSV](img/08-bom-breakdown.jpg)

Las piezas con descriptor se expanden en 3 sub-piezas en cada
export. El discriminador llega como `construccion: 'alma' | 'tapa'`
en el `BomPartInput` y como columna o nota según el destino:

- **BOM CSV/XLSX** → cada padre se desglosa en **3 filas** con
  dimensiones netas y material diferenciado (alma = madera maciza,
  tapas = MDF / melamina). La columna `construccion` lleva `alma` o
  `tapa`. Los cantos de las sub-piezas quedan en `0/0/0/0` (no llevan
  canto porque el canto del panel va por fuera).
- **Nest (`N`)** → las 3 sub-piezas se empaquetan **en tableros stock
  independientes** (alma en tablero Pino FK 18 mm, tapas en tablero MDF
  3 mm) — sin mezclar maderas. El discriminador `glue-up` viaja como
  tag del `NestItem` y el optimizador respeta la separación.
- **Pedido PDF/CSV** → agrupa por `(espesor_tapa × material_alma ×
  material_tapa × trim)` y suma al total de obra.
- **Etiquetas PDF** → cada padre genera **1 etiqueta con breakdown**
  abajo: `▣ ALISTONADO + Alma Pino FK 18 mm · Tapas MDF crudo 3 mm`.
  El toggle vive en `settings.labelsIncludeGluedUpBreakdown` (default
  `true`); apagado, la etiqueta vuelve al layout compacto sin bloque
  alistonado.
- **Cut TSV** → las 3 sub-piezas llevan `[glued=alma]` o `[glued=tapa]`
  en el campo `details` y `[veta=none]` (la veta del panel vive en el
  alma, no en las tapas).

## 9. Configuración → Glue-up

![Tab Glue-up en Configuración](img/09-settings-glueup.jpg)

`Configuración → Glue-up` (en el grupo **Pieza**) tiene 3 bloques: un
**toggle maestro**, los **defaults numéricos del taller** y la lista
editable de **keywords de auto-detección**.

### Toggle maestro

![Habilitar Glue-up](img/09a-enabled-toggle.jpg)

`Habilitar Glue-up` (default **off**, opt-in) controla el módulo entero:

- **Off** → el botón ▣ del topbar desaparece, `Shift+G` no hace nada,
  las opciones RMB `Construcción ▸ Alistonado` se ocultan, y **las
  piezas con descriptor guardado colapsan a una sola fila** en
  BOM/nest/etiquetas/pedido. Los datos persisten — el campo
  `parts.gluedUp` se queda en el `.despiece`.
- **On** → todo vuelve a funcionar como alistonado expandido.

> El toggle es **per-proyecto** dentro de la slice global de
> `Settings`. Apagarlo en un proyecto no afecta otros proyectos.

### Defaults del taller

![Defaults del taller](img/09b-defaults.jpg)

Cinco campos numéricos/string que prefilledan el modal del paso 5 y el
auto-glue-up del paso 7:

| Campo | Tipo | Default | Significado |
|-------|------|---------|-------------|
| `coverThicknessMm` | número (0,1–50) | `3` mm | Espesor de cada tapa |
| `coreStripsWidthMm` | número (5–150) | `35` mm | Ancho nominal del listón del alma |
| `trimAllowanceMm` | número (0–30) | `5` mm | Merma prensa perimetral |
| `defaultCoreMaterialId` | `MaterialDef.id` (rol core) | `""` | Material del alma en nuevas piezas |
| `defaultCoverMaterialId` | `MaterialDef.id` (rol face) | `""` | Material de las tapas en nuevas piezas |

Persiste en `localStorage[despiece.gluedup.defaults.v1]` vía
`src/glued-up/defaults-store.ts`. **No entra en el `.despiece`** — son
preferencias de taller. **Sí entra en el export de Configuración** (la
sección "taller" del IO config junto con materiales, roles, herraje,
lineales, auto-cantos y logo).

### Auto-detección por nombre (keywords)

![Keywords de auto-detección](img/09c-keywords.jpg)

Lista editable de keywords (el catálogo del paso 7). Cada row expone:

- **Keyword** — palabra/frase matchable, se guarda en minúsculas y
  trim.
- **Trim (mm)** — el `trimAllowanceMm` override para esa keyword
  (numérico, 0–30, step 0,5).
- **×** — botón para eliminar (sin confirmación; agregar y volver a
  tipear es rápido).

`* Agregar` (debajo de la lista) toma los inputs `Palabra` + `Merma (mm)`
y los suma al catálogo. Persiste en
`localStorage[despiece.gluedup.auto.v1]`.

`Restablecer keywords por defecto` (al pie) borra los customs y revierte
a los 10 built-in del paso 7.

> Las **aliases por locale** son internos: cada keyword built-in carga
> 6 listas (es-AR, en-US, pt-BR, fr-FR, de-DE, it-IT) en
> `src/glued-up/defaults-store.ts:GLUED_UP_KEYWORD_DEFS`. Editarlas
> por código es soportado pero no está expuesto en la UI; la UI solo
> edita el mapa `keywords` del locale activo (es-AR).

## 10. Maderas precargadas para el alma

![Maderas precargadas](img/10-woods.jpg)

El catálogo de **Materiales** ya viene con 6 entradas pensadas como
alma del panel alistonado:

- `Madera Pino FK · Listonado 18 mm`
- `Madera Pino FK · Listonado 24 mm`
- `Madera Eucalipto · Listonado 18 mm`
- `Madera Eucalipto · Listonado 24 mm`
- `Madera Paraíso · Listonado 18 mm`
- `Madera Paraíso · Listonado 24 mm`

Todas tienen `role: 'core'`, así que aparecen en el select **Material
de alma** del modal sin configuración extra. Si necesitás más (roble,
guatambú, etc.) agregalas desde **Materiales** con la categoría que
corresponda y `role: 'core'`.

## 11. Atajos de teclado

![Hoja de atajos](img/11-atajos-glueup.jpg)

`Help` (botón de la topbar o `?`) abre la hoja completa. Los más
usados en el flujo de glue-up:

| Atajo | Acción |
|-------|--------|
| `Shift+G` | Auto-glue-up ✦ (sobre todo el proyecto, solo rellena sin descriptor) |
| `G` | Cicla veta en la selección (sin / horizontal / vertical) |
| RMB ▸ Construcción ▸ Marcar… | Abre el modal de pieza con defaults del taller |
| RMB ▸ Construcción ▸ Editar… | Igual, con valores del descriptor actual |
| RMB ▸ Construcción ▸ Limpiar | Saca el descriptor a todas las seleccionadas |
| Doble click en chip ▣ | Abre el modal (Mark si no tiene, Edit si tiene) |
| Doble click en nombre | Renombrar pieza (clave del auto-glue-up) |
| `B` / `Shift+B` | Auto-cantos ✦ (complementario) |
| `Shift+B` | Auto-roles ✦ (también desde la topbar) |
| `I` | Aislar selección |
| `Esc` | Limpiar selección / salir de measure |
| `F` / `Home` | Fit / Fit + iso |

En Mac el modificador de sistema es `⌘`; en otros sistemas `Ctrl`.

---

## Ver también

- [Tutorial · Cantos y auto-cantos](cantos-y-auto-cantos.html) —
  mismo flujo (paleta plana + Shift+letra) sobre los 4 lados de la
  pieza.
- [Tutorial · Roles y auto-roles](roles-y-auto-roles.html) — flujo
  análogo para el campo `partRole`.
- Manual
  [§ 07 · Glue-up (alistonado)](../manual/glue-up-alistonado.html) —
  referencia corta de la feature.
- Manual [§ Configuración](../manual/configuracion.html#glue-up) —
  el tab Glue-up en contexto de la sección de taller.
- Spec
  [`2026-07-18-glued-up-panel.md`](../superpowers/specs/2026-07-18-glued-up-panel.md)
  — diseño del módulo, expansión 3×, locales y rol del toggle.