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

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

← Panoramica Architettura →