Pular para o conteúdo principal

Arquitetura do Importador

Este documento descreve a arquitetura do sistema de importação de arquivos do Rayforge, que lida com a conversão de vários formatos de arquivo (SVG, DXF, PNG, PDF, etc.) em o modelo de documento do Rayforge.

Índice


Visão Geral

O sistema de importação é construído em torno de um pipeline de quatro fases que transforma dados de arquivo brutos em objetos de documento totalmente posicionados. Cada fase tem uma responsabilidade específica e produz estruturas de dados bem definidas.


Pipeline de Importação

Fase 1: Parse

Método: Importer.parse()

Extrai fatos geométricos do arquivo incluindo limites, detalhes do sistema de coordenadas e informações de camadas.

Saída: ParsingResult

  • document_bounds: Tamanho total da tela em Coordenadas Nativas
  • native_unit_to_mm: Fator de conversão para milímetros
  • is_y_down: Flag de orientação do eixo Y
  • layers: Lista de LayerGeometry
  • world_frame_of_reference: Coordenadas Mundiais (mm, Y-Up)
  • background_world_transform: Matriz para posicionamento de fundo
  • untrimmed_document_bounds: Referência para inversão-Y

Sistema de Coordenadas:

  • document_bounds: Coordenadas Nativas (específico do arquivo)
  • world_frame_of_reference: Coordenadas Mundiais (mm, Y-Up)

Fase 2: Vectorize

Método: Importer.vectorize()

Converte dados analisados em objetos Geometry vetoriais de acordo com a VectorizationSpec.

Saída: VectorizationResult

  • geometries_by_layer: Geometria vetorial por camada (Coordenadas Nativas)
  • source_parse_result: Referência ao ParsingResult original
  • fills_by_layer: Geometria de preenchimento opcional (importador Sketch)

Sistema de Coordenadas: Coordenadas Nativas (específico do arquivo)


Fase 3: Layout

Classe: NormalizationEngine

Calcula matrizes de transformação para mapear Coordenadas Nativas para Coordenadas Mundiais com base na intenção do usuário.

Saída: List[LayoutItem]

Cada LayoutItem contém:

  • world_matrix: Normalizado (0-1, Y-Up) → Mundial (mm, Y-Up)
  • normalization_matrix: Nativo → Normalizado (0-1, Y-Up)
  • crop_window: Subconjunto do arquivo original em Coordenadas Nativas
  • layer_id, layer_name: Identificação da camada

Sistema de Coordenadas:

  • Entrada: Coordenadas Nativas
  • Saída: Coordenadas Mundiais (mm, Y-Up) via espaço Normalizado intermediário

Fase 4: Assemble

Classe: ItemAssembler

Instancia objetos de domínio do Rayforge (WorkPiece, Layer) com base no plano de layout.

Saída: ImportPayload

  • source: O SourceAsset
  • items: Lista de DocItem prontos para inserção
  • sketches: Lista opcional de objetos Sketch

Sistema de Coordenadas: Todos DocItems em Coordenadas Mundiais (mm, Y-Up)


Método Scan

Método: Importer.scan()

Um scan leve que extrai metadados sem processamento completo. Usado para construir a UI para um importador, incluindo lista de seleção de camadas. Isso NÃO é parte do pipeline principal de importação executado por get_doc_items().

Saída: ImportManifest

  • layers: Lista de objetos LayerInfo
  • natural_size_mm: Dimensões físicas em milímetros (Y-Up)
  • title: Título opcional do documento
  • warnings, errors: Problemas não críticos descobertos

Sistema de Coordenadas: Coordenadas Mundiais (mm, Y-Up) para natural_size_mm


Sistemas de Coordenadas

O pipeline de importação lida com múltiplos sistemas de coordenadas através de transformação cuidadosa:

Coordenadas Nativas (Entrada)

  • Sistema de coordenadas específico do arquivo (unidades de usuário SVG, unidades DXF, pixels)
  • Orientação do eixo Y varia por formato
  • Limites são absolutos dentro do espaço de coordenadas do documento
  • Unidades convertidas para mm via fator native_unit_to_mm

Coordenadas Normalizadas (Intermediário)

  • Quadrado unitário de (0,0) a (1,1)
  • Eixo Y aponta PARA CIMA (convenção Y-Up)
  • Usado como representação intermediária entre nativo e mundial

Coordenadas Mundiais (Saída)

  • Coordenadas físicas do mundo em milímetros (mm)
  • Eixo Y aponta PARA CIMA (convenção Y-Up)
  • Origem (0,0) está no canto inferior esquerdo da peça de trabalho
  • Todas as posições são absolutas no sistema de coordenadas mundial

Orientação do Eixo Y

  • Formatos Y-Down (SVG, imagens): Origem no canto superior esquerdo, Y aumenta para baixo
  • Formatos Y-Up (DXF): Origem no canto inferior esquerdo, Y aumenta para cima
  • Importadores devem definir a flag is_y_down corretamente em ParsingResult
  • NormalizationEngine lida com inversão-Y para fontes Y-Down

Classes Principais

Importer (Classe Base)

Classe base abstrata definindo a interface para todos os importadores. Subclasses devem implementar os métodos do pipeline e declarar suas capacidades via atributo features.

Recursos:

  • BITMAP_TRACING: Pode rastrear imagens raster para vetores
  • DIRECT_VECTOR: Pode extrair geometria vetorial diretamente
  • LAYER_SELECTION: Suporta importações baseadas em camadas
  • PROCEDURAL_GENERATION: Gera conteúdo programaticamente

Estruturas de Dados

ClasseFasePropósito
LayerInfoScanMetadados de camada leves
ImportManifestScanResultado da fase de scan
LayerGeometryParseInformação de camada geométrica
ParsingResultParseFatos geométricos
VectorizationResultVectorizeGeometria vetorial
LayoutItemLayoutConfiguração de transformação
ImportPayloadAssembleSaída final
ImportResultFinalWrapper de resultado completo

Componentes de Suporte

  • NormalizationEngine: Cálculos de layout da Fase 3
  • ItemAssembler: Criação de objetos da Fase 4

Criando um Novo Importador

Para adicionar suporte a um novo formato de arquivo:

  1. Crie uma nova classe importadora que herde de Importer
  2. Declare recursos suportados via atributo de classe features
  3. Implemente os métodos obrigatórios:
    • scan(): Extrai metadados rapidamente (para previews na UI)
    • parse(): Extrai fatos geométricos
    • vectorize(): Converte para geometria vetorial
    • create_source_asset(): Cria o asset de origem
  4. Registre o importador em rayforge/image/__init__.py
  5. Adicione mapeamentos de tipo MIME e extensão

Exemplo:

from rayforge.image.base_importer import Importer, ImporterFeature
from rayforge.image.structures import (
ImportManifest,
ParsingResult,
VectorizationResult,
)
from rayforge.core.source_asset import SourceAsset

class MeuFormatoImporter(Importer):
label = "Meu Formato"
mime_types = ("application/x-meuformato",)
extensions = (".mft",)
features = {ImporterFeature.DIRECT_VECTOR}

def scan(self) -> ImportManifest:
# Extrai metadados sem processamento completo
return ImportManifest(
layers=[],
natural_size_mm=(100.0, 100.0),
)

def parse(self) -> Optional[ParsingResult]:
# Extrai fatos geométricos
return ParsingResult(
document_bounds=(0, 0, 100, 100),
native_unit_to_mm=1.0,
is_y_down=False,
layers=[],
world_frame_of_reference=(0, 0, 100, 100),
background_world_transform=Matrix.identity(),
)

def vectorize(
self, parse_result: ParsingResult, spec: VectorizationSpec
) -> VectorizationResult:
# Converte para geometria vetorial
return VectorizationResult(
geometries_by_layer={None: Geometry()},
source_parse_result=parse_result,
)

def create_source_asset(
self, parse_result: ParsingResult
) -> SourceAsset:
# Cria o asset de origem
return SourceAsset(
original_data=self.raw_data,
metadata={},
)