Vector Engine

Proces eksportu

Siedem kroków panelu eksportu, targety (scena/selekcja/grupa/warstwa/workspace), batch i ZIP, szablony nazw i anulowanie.

Siedem kroków#

Panel eksportu prowadzi przez workflow:

text
1. Target → 2. Format → 3. Dimensions → 4. Background → 5. Advanced → 6. Preview → 7. Export
KrokCo wybierasz
1. TargetScena, selekcja, grupa, warstwa, obiekty, workspace
2. FormatSVG, PNG, JPEG, BMP 24, BMP 32
3. DimensionsSkala 0.5×–4× lub custom + fit mode
4. BackgroundTło dokumentu, własny HEX, przezroczystość
5. AdvancedMarginesy, trim, includeHidden, clip, minifySvg, jakość JPEG
6. PreviewPodgląd + estymacja rozmiaru i RAM
7. ExportPojedynczy plik albo batch/ZIP

Targety eksportu#

Pipeline wycina scope z zachowaniem transformacji rodziców i kolejności rysowania:

  • scene — cały dokument,
  • selection — zaznaczone obiekty,
  • group — grupa z dziećmi,
  • layer — warstwa,
  • objects — lista id,
  • workspace — nazwany region.
text
JSON snapshot → ekstrakcja scope → tight bounding box → viewport
→ SVG serializer lub rasteryzator 4× subpixel → enkoder → plik

Batch i ZIP#

Batch export przechodzi po wielu targetach (np. wszystkie warstwy albo wszystkie workspace'y) i generuje komplet plików:

  • per-item overrides (format, skala, tło osobno dla każdego elementu),
  • raport BatchExportReport z wynikami i błędami,
  • archiwum PKZIP z CRC-32 i automatycznym wyborem STORE/DEFLATE (zero zależności).

Przykład: komplet kart social#

  1. Target: workspace.
  2. Zaznacz wszystkie workspace'y (og, twitter, square).
  3. Format: PNG, skala 2×.
  4. Eksport → ZIP z trzema plikami.

Szablony nazw plików#

filename.ts rozwija bezpieczne szablony:

text
{document}_{object}_{scale}
{layer}_{width}x{height}
{format}_{index}
TokenWartość
{document}Nazwa dokumentu
{object}Id obiektu
{layer}Nazwa warstwy
{scale}Skala (np. 2x)
{width}, {height}Wymiary
{format}Rozszerzenie
{index}Indeks w batchu

Kolizje nazw są deduplikowane case-insensitive.

Anulowanie#

Eksport przyjmuje AbortSignal:

  • anulowanie natychmiast terminuje workera w locie,
  • UI pozostaje responsywne,
  • następna operacja dostaje czystego workera.
ts
const controller = new AbortController()
const result = await exportService.export(snapshot, options, controller.signal)

cancelButton.onclick = () => controller.abort()

Niezmienne snapshoty#

Każdy eksport pracuje na niezmiennym snapshocie źródła — edycja JSON w trakcie eksportu nie zmienia pliku wyjściowego. To izolacja: snapshot jest zamrażany w momencie kliknięcia.

Walidacja przed eksportem#

validation.ts robi strict preflight:

  • wymiary i liczba pikseli,
  • budżet pamięci,
  • kolory HEX,
  • jakość JPEG,
  • referencje targetów.

Błąd preflight zatrzymuje eksport, zanim worker zostanie uruchomiony.

Przykład: wywołanie serwisu#

ts
import { exportService } from '@/export/exportService'

const report = await exportService.exportBatch(
  sourceSnapshot,
  [
    { target: { type: 'workspace', id: 'og' }, format: 'png', scale: 2 },
    { target: { type: 'workspace', id: 'twitter' }, format: 'png', scale: 2 },
    { target: { type: 'layer', id: 'wm' }, format: 'svg', options: { minifySvg: true } }
  ],
  { filenameTemplate: '{document}_{layer}_{scale}', zip: true },
  controller.signal
)