# Catálogo de piezas · `iso.py` Toda función devuelve un string de SVG. Se concatenan dentro de un ``. Importar con `from iso import *`. Las constantes disponibles: `K` (negro), `FF` (fuente), `C` (paleta), `DX`, `DY`. --- ## Cuerpos ### `slab(x, y, w, t, c, dx=58, dy=42, sw=4)` Lonja acostada con espesor visible. **La pieza más usada del sistema.** `x,y` esquina frontal izquierda · `w` ancho · `t` espesor · `c` clave de color. Sirve para: película, láminas, superficies, comparar espesores. Cuando el canto frontal se dibuja con una curva irregular en lugar de recto, muestra un perfil desparejo — así se representa el punto flaco. ### `prism(x, y, w, h, c, d1=12, d2=10, sw=3.5)` Barra vertical con volumen. Para magnitudes, hilos, columnas de energía. **La altura debe ser proporcional al dato real.** ### `card(x, y, w, h, c, sw=4)` Tarjeta con volumen, profundidad mayor. Para conceptos, factores, etapas. ### `bubble(cx, base, top, rw, nw, c="y", sw=4)` Burbuja de extrusión soplada: cuello angosto abajo (`nw`), ancha arriba (`rw`). Para la lámina de proceso de soplado. Se le agregan encima la línea de congelamiento (elipse punteada), las flechas de jalón e inflado y los globos. ### `bagfig(x, y, w, h, c="g", sw=4)` Bolsa isométrica simple. Para pruebas de carga y caída. ### `step(x, y, n, label, c="n", w=150, h=96)` Etapa de proceso numerada: tarjeta + círculo negro con el número + rótulo debajo. Se encadenan con `arrow` entre una y otra. --- ## Anotación ### `callout(x, y, lines, ax, ay, side="bottom", c=K, fill="#ffffff", sz=17, pad=16)` Globo con línea de llamada y punto de ancla. `lines` es una lista de strings; la primera va en peso 600. `side` = de qué lado sale la línea: `bottom` · `top` · `left` · `right`. El ancho se calcula solo. Verificar que la caja no se salga del viewBox de 940: cada carácter ocupa ≈ `sz × 0.52` px, más 32 de padding. ### `arrow(x1, y1, x2, y2, c=K, sw=6)` Flecha con punta abierta. Para doble punta se llaman dos, invertidas. ### `cota(x1, y1, x2, y2, label, c="#4a90c2", off=0, sz=16)` Línea de cota con topes y etiqueta. Detecta sola si es horizontal o vertical. Siempre en azul: las cotas no son objetos. ### `txt(x, y, s, sz=19, w=600, f=K, a="start")` Texto. `a` = anclaje: `start` · `middle` · `end`. --- ## Contenido de superficie ### `chains(x, y, w, mode, col=K, dx, dy, sw=3)` Dibuja cadenas moleculares **sobre la cara superior de un slab**, siguiendo su perspectiva. - `"long"` — alineadas en una sola dirección: película desbalanceada - `"mesh"` — cruzadas: película balanceada - `"cross"` — solo transversales - `"tangle"` — enredadas: material fundido - `"wavy"` — parcialmente alineadas: en la burbuja Se llama con las mismas `x, y, w` que el `slab` sobre el que va. ### `molec(x, y, w, tipo, col=K, sw=4.5, amp=16, n=10)` Cadena de polietileno en zigzag con ramificación según tipo: `"ldpe"` ramas largas con sub-ramas · `"lldpe"` ramas cortas regulares · `"mdpe"` pocas ramas · `"hdpe"` sin ramas. ### `stackchains(x, y, w, n, gap, tipo, col, sw, amp, seg, jitter)` Varias cadenas apiladas, con desorden opcional (`jitter`). Para mostrar empaquetamiento: ramificadas con jitter → no logran juntarse; lisas sin jitter → se apilan ordenadas. --- ## Datos ### `tablefig(x, y, cols, rows, cw, rh=42, head="#e8e6df", sz=16)` Tabla dibujada con trazo grueso. `cw` es la lista de anchos de columna. **Advertencia:** una tabla es lo último que se debe usar. Si el contenido se puede dibujar como mecanismo, se dibuja. Las tablas solo sirven para referencia que se consulta, no para explicar. ### `scalebar(x, y, w, marks, lo, hi, h=26, c="#e8e6df")` Barra de escala con marcadores. `marks` = lista de `(valor, etiqueta, color, "up"|"down")`. Alternar `up` y `down` cuando los marcadores están cerca, para que las etiquetas no choquen. ### `upicon(x, y, c, s)` / `downicon(x, y, c, s)` Flechas de gana/pierde. --- ## Recetas probadas **Comparación buena/mala:** dos `slab` del mismo tamaño, uno gris o amarillo y otro verde, con `chains` distintas y un `callout` sobre cada uno. **Proceso:** cinco `step` encadenados con `arrow`, y `callout` sobre las etapas donde se decide algo. **Reparto de una magnitud:** dos grupos de `prism` con alturas inversamente proporcionales a la cantidad, línea punteada roja de límite cruzando ambos. Verificar que las áreas totales coincidan. **Sección de un tubo:** dos círculos concéntricos con `fill-rule="evenodd"` en un solo path. Si el interior se deforma, la pared queda de espesor variable — así se muestra un anillo de aire descentrado. **Mecanismo físico:** el objeto grande a la izquierda, los estados o el detalle a la derecha, separados por una línea vertical `#ececec` de 2 px. --- ## Errores frecuentes | Síntoma | Causa | Arreglo | |---|---|---| | Texto cortado por la derecha | el string excede el viewBox de 940 | acortar o partir en dos líneas | | Globo tapando un rótulo | ancla o caja mal ubicada | mover la caja, no el rótulo | | Elemento cortado arriba | `y` cercano a 0 en el viewBox | desplazar todo el grupo hacia abajo | | Cuerpos que se pisan | paso menor que ancho + profundidad | el paso debe ser `w + d1 + margen` | | Barras que mienten | alturas puestas a ojo | recalcular sobre el dato real | **Ninguno de estos se ve en el código.** Por eso el paso de rasterizar y revisar cada lámina es obligatorio.