Come funziona una conversione
Una conversione è tre passaggi: lettura del file di partenza, traduzione in un Intermediate Representation neutro, scrittura nel formato di destinazione. Tutto nel browser, tutto sincrono.
1. Lettura (reader)
Ogni formato ha un suo reader — una funzione
read(bytes: Uint8Array): Pattern in packages/core.
Il reader decodifica i byte del file, tratta le peculiarità del formato
(compressione, XOR, byte order, offset table) e restituisce un
Pattern con punti assoluti in 0.1 mm, fili con
RGB e catalogo, comandi (STITCH, JUMP,
TRIM, COLOR_CHANGE, STOP,
END).
Alcuni lettori sono semplici (DST è testo con coordinate; EXP è un flusso di byte firmati). Altri hanno un'impalcatura più complessa: VIP è un body HUS compresso con EmbCompress dentro un header Husqvarna; PES incorpora un blocco PEC con la sua palette colori; VP3 ha tabelle di fili con metadati del produttore.
2. Intermediate Representation
Il Pattern è il cuore del converter: ogni scrittore lo consuma, ogni lettore lo produce. È neutro, quindi due formati qualsiasi si parlano senza sapere l'uno dell'altro. Vedi la pagina IR per i dettagli del tipo.
Comandi
STITCH— punto normale; l'ago scende e cuce.JUMP— sposto l'ago senza cucire (per salti tra zone di ricamo).TRIM— taglia il filo. Non tutti i formati lo sanno.COLOR_CHANGE— cambio colore della macchina.STOP— pausa: l'operatore cambia filo o sistema la stoffa.END— fine del disegno; l'ultimo comando che il writer deve sempre scrivere.
3. Scrittura (writer)
Ogni formato ha uno scrittore write(pattern: Pattern,
settings): Uint8Array. Lo scrittore prende le coordinate assolute,
le converte nel delta encoding del formato (1/10 mm in ZHS, 0,1 mm con
scaling in DST, ecc.), e innesca i comandi speciali con i byte presi dal
proprio dialetto.
Se il formato di destinazione non sa esprimere un comando del Pattern
(per esempio ZHS non sa scrivere i STOP come pause arbitrarie,
un vecchio formato non ha concetto di TRIM), lo scrittore
applica la strategia di fallback documentata per quel formato e inserisce
una warning strutturata nella
risposta. Lo UI mostra le warning nella lista risultati.
4. La funzione convert()
import { convert } from '@embroidery/core';
// it: bytes di partenza, fromFmt, toFmt → bytes di destinazione
const out = await convert({
bytes: vipBytes,
from: 'vip',
to: 'zhs',
settings: { hoop: 'auto', trims: 'drop' },
});
// out.bytes : Uint8Array
// out.warnings : Warning[] (è vuoto quando tutto è andato liscio)
// out.note? : string (caveat per il formato di destinazione) Cosa NON fa
- Non ricama. Non genera punti da un SVG o da un disegno vettoriale — legge un file di ricamo e ne scrive un altro.
- Non tocca i colori del tuo file. Se un formato conosce solo le proprie matassine, li avvicina ai più vicini e segnala la
warn.COLOR_QUANTIZED. - Non ritocca la geometria: sposta o centra nel telaio solo se tu glielo chiedi.
- Non manda niente in rete. Vedi Privacy.