HoopLang Docs
/
Playground
El libro · Capítulo 01

1. Hola, bordado

En este capítulo escribes tu primer diseño, lo verificas, lo compilas a un archivo PES y entiendes el sistema de coordenadas que usa todo HoopLang.

El primer archivo#

Crea un archivo llamado hola.hoop con esto:

HoopLang
// hola.hoop: mi primer bordado.
design "Hola" {
  canvas: rect(size: (40mm, 40mm))
}

thread azul = #1f3a8a "Azul"

layer fondo {
  fill azul { shape: circle(center: (20mm, 20mm), r: 15mm) }
}

Son cuatro piezas, y las vas a ver en todos los diseños:

  1. design "Hola" { … } declara el diseño: su nombre y sus propiedades. Hay un solo design por archivo.
  2. canvas: rect(size: (40mm, 40mm)) es el lienzo: el espacio disponible en la prenda. Aquí, un cuadrado de 40 × 40 mm.
  3. thread azul = #1f3a8a "Azul" declara un hilo: un nombre para usar en el código (azul), un color (#1f3a8a) y una etiqueta que verá quien borda ("Azul").
  4. layer fondo { … } es una capa con un objeto: fill azul { … }, un relleno con el hilo azul cuya forma (shape) es un círculo de radio 15 mm centrado en (20 mm, 20 mm).

Las líneas que empiezan con // son comentarios: el compilador las ignora. También existen los comentarios de bloque, /* así */.

Verificar#

Terminal
hoop check hola.hoop
Salida del compilador
hola.hoop: ok — 1 threads, 1 layers, 1 objects

check no escribe nada: revisa tipos, nombres, rangos y que lo cosido quepa en el lienzo. Acostúmbrate a ejecutarlo cada vez que guardas.

Compilar#

Terminal
hoop build hola.hoop salida/
Salida del compilador
hola.hoop: 30.2 × 30.2 mm, 1449 stitches, 1 threads, 1 trims, 9 ms

En la carpeta salida/ quedan hola.pes, hola.dst, hola.exp, hola.jef, hola.vp3 y hola.xxx (uno por familia de máquinas), y dos vistas previas: hola.svg, que muestra el bordado como se verá, y hola.needles.svg, que muestra dónde entra la aguja. Abre hola.svg en el navegador.

Fíjate en el tamaño: el círculo mide 30 mm, pero el bordado mide 30.2 mm. No es un error: el compilador alarga cada fila del relleno unas décimas en los extremos (la compensación de tirón), porque el hilo, al tensarse, encoge la forma hacia adentro. En el capítulo 3 verás por qué.

¿Tienes una máquina Brother? Copia hola.pes a un pendrive y bórdalo. Antes, lee la lista de prueba del capítulo 10: tela firme, estabilizador, y nada de prendas caras la primera vez.

Las unidades son tipos#

En HoopLang todo se escribe en milímetros reales: lo que dice el archivo es lo que mide el bordado. Las medidas llevan siempre su unidad:

EscribesEs unEjemplo de uso
2.5mm, 1cmLength (longitud)tamaños, posiciones, anchos
45degAngle (ángulo)dirección de las puntadas, giros
30%Ratio (proporción)escalar
3Int (entero)repeticiones, pasadas

1cm es exactamente 10mm. Un número sin unidad no es una longitud. Si escribes density: 0.4 en vez de density: 0.4mm:

Salida del compilador
hola-densidad.hoop:8:70: error E001: 0.4 has no unit: add mm, cm, deg or %

El mensaje dice el archivo, la línea (8) y la columna (70), el código del error (E001, tipo incorrecto) y qué hacer. Un entero sin unidad sí es un valor válido (un Int), así que r: 15 no se queja de la unidad sino del tipo del argumento:

Salida del compilador
hola-sin-unidad.hoop:8:22: error E001: circle(center: Point, r: Length)

Lee ese mensaje como la "firma" de la función: circle espera un center que es un punto y un r que es una longitud.

Coordenadas: el origen arriba a la izquierda, y hacia abajo#

Un punto se escribe (x, y), con dos longitudes: (20mm, 20mm).

  • x crece hacia la derecha.
  • y crece hacia abajo, como en la pantalla y en la máquina.
  • rect(size: (40mm, 40mm)) sin más pone su esquina superior izquierda en (0mm, 0mm).
Salida del compilador
(0,0) ──────────► x
  │   ┌──────────┐
  │   │    ●     │  ● = (20mm, 20mm), el centro del lienzo
  │   │          │
  ▼   └──────────┘ (40mm, 40mm)
  y

Así, (5mm, 38mm) está cerca del borde inferior del lienzo, no del superior. Agrega una segunda capa con una línea de corrido bajo el círculo:

HoopLang
// hola.hoop: mi primer bordado.
design "Hola" {
  canvas: rect(size: (40mm, 40mm)) // 40 × 40 mm, esquina en (0, 0)
}

thread azul = #1f3a8a "Azul"
thread rojo = #cc3f24 "Rojo"

layer fondo {
  fill azul { shape: circle(center: (20mm, 20mm), r: 15mm) }
}

layer firma {
  // Una línea de lado a lado, bajo el círculo.
  run rojo { path: path { from (5mm, 38mm) line (35mm, 38mm) } }
}
Salida del compilador
hola.hoop: 30.2 × 33.1 mm, 1470 stitches, 2 threads, 2 trims, 7 ms

Dos hilos, dos capas: la máquina borda primero el círculo azul, se detiene para que cambies al hilo rojo y borda la línea. Las capas dicen qué va encima de qué, en el orden en que las escribes (capítulo 6).

El lienzo te cuida#

El lienzo no es decorativo: el compilador revisa que lo cosido (el relleno, la columna de satín, las letras) quede dentro, con una tolerancia de 0.3 mm. Mueve el círculo a center: (30mm, 20mm):

Salida del compilador
hola-fuera.hoop:8:3: error E006: fill overflows the canvas by 5.0 mm on the right

E006 dice cuánto se sale y por qué lado. El lienzo es "el pecho de la polera" o "el parche": si algo se sale, en la prenda se sale de verdad.

Si omites canvas, el diseño compila igual, pero con una advertencia que te dice cuánto mide y cómo declararlo:

Salida del compilador
hola-sin-canvas.hoop:1:1: warning W008: no canvas: bounds are not checked; the design measures 30.0 × 30.0 mm (declare `canvas: rect(size: (30mm, 30mm))`)
hola-sin-canvas.hoop: ok — 1 threads, 1 layers, 1 objects

Las advertencias (warning, códigos W…) no impiden compilar; los errores (error, códigos E…) sí.

Los nombres se revisan#

Escribe mal el hilo, fill azull { … }:

Salida del compilador
hola-typo.hoop:8:3: error E003: undeclared thread `azull`; did you mean `azul`?

Un color no es un hilo: fill #1f3a8a { … } tampoco compila. En la máquina cada color es un carrete con nombre, y el lenguaje te obliga a declararlo (capítulo 5).

Otras propiedades del diseño#

El bloque design acepta, además de canvas:

HoopLang
design "Hola" {
  canvas: rect(size: (40mm, 40mm))
  margin: 1mm // distancia mínima de lo cosido al borde del lienzo (0 a 20 mm; 0 por defecto)
  fabric: Pique // la tela: Twill (por defecto), Pique, Fleece, Cap o Stretch
}

fabric cambia los valores por defecto de las puntadas (capítulo 3). Existen también origin, fit y frame, que verás en los capítulos 7 y 9.

Una pista de orden: el compilador lee el archivo de arriba abajo, y un nombre existe desde la línea en que se declara. canvas existe a partir del design; por eso el design suele ir primero.

Resumen#

  • Un diseño es design + thread + layer, y cada capa tiene objetos como fill hilo { shape: … }.
  • Todo va en milímetros reales; las unidades (mm, cm, deg, %) son obligatorias.
  • El origen está arriba a la izquierda: x a la derecha, y hacia abajo.
  • canvas es el espacio de la prenda: lo cosido que se salga es E006.
  • hoop check verifica; hoop build escribe los archivos de máquina y las vistas previas.

Referencia: léxico · tipos · declaraciones · diagnósticos · herramientas