5. Hilos y paletas
En la pantalla un color es un número; en la máquina es un carrete, con una marca, un código y un lugar en el portacarretes. HoopLang trata los hilos como lo que son: cosas con nombre que se declaran. En este capítulo declaras hilos, usas las paletas de Brother y Janome que vienen con el lenguaje, y armas la biblioteca de tu club para no escribir sus colores dos veces.
thread#
thread negro = #1c1616 "Negro"
thread oro = #d8a21b "Oro" { brand: "Madeira", code: "1172" }negroes el nombre que usas en el código:fill negro { … }.#1c1616es el color, en hexadecimal#rrggbb: lo usa la vista previa y lo guardan los formatos que llevan color (PES, JEF, VP3…)."Negro"es la etiqueta que verá quien borda en la pantalla de la máquina. Es opcional, pero ponla: "Oro" ayuda más que#d8a21b.{ brand: …, code: … }es opcional: la marca y el código del carrete (textos, entre comillas, aunque el código sea un número).
t.hoop:2:30: error E001: `code` is a String, not IntUn hilo no es un color: es su propio tipo, Thread. No puedes escribir un
color donde va un hilo (fill #d8a21b { … } no compila), ni guardar un color
en una const y usarlo para declarar un hilo: el color de un thread se
escribe directamente.
Por qué tanta ceremonia: porque en la máquina dos hilos "negros" de marcas distintas no son el mismo hilo, y porque quien borda necesita saber qué carrete poner. Un diseño que declara sus hilos es un diseño que se puede bordar sin preguntar.
El orden en que se cosen los hilos no depende del orden en que los declaras, sino de las capas (capítulo 6).
Bibliotecas de marcas#
HoopLang trae dos paletas en docs/lenguaje/bibliotecas/:
brother.hoop: los colores de las máquinas Brother, con nombres en inglés (brother.blue,brother.deep_gold,brother.sky_blue…).janome.hoop: los hilos Janome por su código (janome.c002es el negro,janome.c001el blanco,janome.c207el azul…), con la marca y el código guardados.
Una biblioteca es un archivo .hoop con sólo thread, const, shape (e
import): nada que se borde. Se usa con import.
import nombre from "archivo": todo, bajo un prefijo#
import brother from "../bibliotecas/brother.hoop"Trae todos los nombres de la biblioteca bajo el prefijo brother.:
fill brother.sky_blue { shape: cielo, angle: 90deg }El prefijo hace que nunca te preguntes de dónde viene un nombre. Y si te equivocas al escribirlo, el compilador sabe qué había en la biblioteca:
t.hoop:3:11: error E003: undeclared thread `brother.sky_blu`; did you mean `brother.sky_blue`?import { … } from "archivo": sólo lo que nombras#
import { c002 as negro, c204 as amarillo } from "../bibliotecas/janome.hoop"Trae sólo esos nombres, sin prefijo, y as les pone otro nombre aquí.
janome.c002 no dice mucho; negro, sí. Es lo que hace
galeria/aplique.hoop.
t.hoop:1:10: error E007: `bibliotecas/brother.hoop` has no `sky_blu`; did you mean `sky_blue`?No hay "importar todo sin prefijo"#
No existe una manera de traer todos los nombres de una biblioteca sin prefijo.
Es a propósito: dos paletas tienen cada una su black, y mezclarlas sin aviso
es la receta para bordar con el negro equivocado. Si un nombre choca, el
compilador te lo dice y te sugiere as:
t.hoop:2:1: error E007: `azul` is already imported from `club.hoop`; rename one of them (`as` in the import)Sólo viaja lo que usas#
Una paleta trae decenas de hilos, pero al archivo de máquina llegan sólo los
que usa tu diseño. Importar brother.hoop entero no agrega 60 colores a tu
PES.
Rutas#
Las rutas son relativas al archivo que importa. Los ejemplos de la galería
están en docs/lenguaje/galeria/ y las bibliotecas en
docs/lenguaje/bibliotecas/, por eso escriben "../bibliotecas/…". Las
comillas pueden ser simples o dobles; hoop fmt las deja dobles.
La biblioteca de tu club#
Lo mismo sirve para lo tuyo. Si bordas para un club, sus colores, su escudo y sus medidas se escriben una vez:
// club.hoop: lo que comparten todos los diseños del club.
thread azul = #1f3a8a "Azul club"
thread blanco = #f0f0f0 "Blanco"
const borde = 3mm
shape escudo = path {
from (0mm, 0mm) line (50mm, 0mm) line (50mm, 35mm)
curve (50mm, 50mm) (35mm, 55mm) (25mm, 60mm)
curve (15mm, 55mm) (0mm, 50mm) (0mm, 35mm)
close
}y cada diseño la importa, combinada con la paleta de la marca de hilo que tengas en el taller:
import club from "club.hoop"
import { c002 as negro } from "bibliotecas/janome.hoop"
design "Club" { canvas: rect(size: (50mm, 60mm)) }
layer fondo { fill club.azul { shape: club.escudo.inset(club.borde) } }
layer borde { satin negro { border: club.escudo, width: club.borde } }insignia-club.hoop: ok — 2 threads, 2 layers, 2 objectsTodo lo de una biblioteca se usa como si fuera tuyo: club.escudo.inset(2mm),
club.escudo.center, club.borde * 2. Si el club cambia de azul, cambias una
línea de club.hoop y todos los diseños cambian.
Algunas reglas que conviene conocer:
Una biblioteca no reexporta lo que ella importa: si
club.hoopimportajanome.hoop, tu diseño no vejanomea través declub.Lo que la biblioteca usa por dentro sigue valiendo aunque aquí se llame distinto.
Sus errores se informan en la línea de tu
import, con el archivo y la posición.Un archivo con
designolayerno es una biblioteca:Salida del compiladort.hoop:1:1: error E007: `galeria/insignia.hoop` is not a library: it has a design (only thread, const, shape and import)Para usar otro diseño entero dentro del tuyo, se coloca con
place(capítulo 7).hoop checktambién revisa una biblioteca sola, y cuenta lo que trae:Salida del compiladorclub.hoop: library — 3 threads, 0 consts, 0 shapes
Resumen#
thread nombre = #rrggbb "Etiqueta" { brand:, code: }declara un carrete; unThreadno es unColor.import marca from "archivo"trae todo bajomarca.;import { a, b as c } from "archivo"trae sólo esos nombres.- No hay importación sin prefijo; los choques de nombres son
E007. - Al archivo de máquina llegan sólo los hilos que usas.
- Una biblioteca tiene sólo
thread,const,shapeeimport.
Referencia: módulos · declaraciones · catálogos