Volver a la wiki

🧩 Visio Stencil Import v2 — importación de ficheros reales de fabricante

Resumen

Plan completado en 3 entregas (v1.52.0, v1.53.0, v1.54.0 · 2026-07): importación moderna de stencils Visio directamente en el editor de racks, con soporte a ficheros de fabricante reales (Cisco, Dell, Eaton, MikroTik) y calidad de renderizado mejorada.

Cambio arquitectónico principal (PR 3: v1.54.0)

Históricamente los ficheros .vss (binary OLE2, stencils antiguos de fabricante) se convertían a través de una cadena legacy EMF → LibreOffice → PNG que dejaba shapes casi vacíos. El QA de fabricante (Eaton-Racks.vss) reveló que un rack 42U solo renderizaba taladros y logo.

Solución: Los .vss ahora usan el mismo conversor libvisio-ng que los modernos .vsdx/.vsd, con metadatos de calidad (nombre real del master, altura en U, media anchura) extraídos en paralelo mediante vss2raw. La conversión es asíncrona (worker Huey), con indicador de progreso en el UI modal.

Artefactos retirados: convert_vss_masters() (~150 LOC de cadena EMF/LibreOffice) y flujo diferido vss_index del confirm endpoint.

Entregas (v1.52.0 → v1.54.0)

PR 1: v1.52.0 — Motor de conversión Visio

PR 2: v1.53.0 — UI del preview y renombrado

PR 3: v1.54.0 — QA con ficheros reales + modernización de .vss

Impacto usuario

AntesDespués
.vsdx/.vsd convertidos pero .vss casi vacíosTodos los formatos renderizados perfectamente
Conversión síncrona (bloquea UI con ficheros grandes)Conversión asíncrona con spinner y previews vivos
Nombres genéricos “page N”Nombres reales de master desde el stencil (Eaton: “42U Std 42D Rack”)
Metadata = 1U por defectoAltura en U estimada desde dimensiones de pulgadas

Criterio de fabricante / Límites honestos

El QA detectó que ficheros reales de servidor (Cisco UCS .vss) superan el límite de 50 MB:

Decisión arquitectónica: El límite se mantiene; el mensaje es transparente. La mayoría de fabricantes modernos publican ambos formatos.

Técnica

Endpoints públicos

POST /api/racks/visio/analyze

GET /api/racks/visio/session/{session_id}

POST /api/racks/visio/confirm

Servicio: convert_visio_async (racks/tasks.py)

Tarea Huey que realiza:

  1. Invocación de libvisio-ng: .vss/.vsdx/.vsd → carpeta temporal con SVGs (1 por página).
  2. Extracción de metadatos (solo .vss): llama a VisioParser.extract_vss_metadata() para extraer nombre real de master + dimensiones.
  3. Orden numérico de páginas: sortea SVG por página_number (no lexicográfico) para mantener alineación con metadatos.
  4. Sanitización SVG: elimina scripts, onload, path traversal; válida geometría real (no solo root <svg>).
  5. Persistencia de sesión: escribe masters en estado JSON temporal; limpia carpeta tras confirm.

Parser: VisioParser.extract_vss_metadata() (racks/utils/visio_parser.py)

Integraciones

Testing

Unit tests (tests/api/test_visio_import_v2.py): 18/18

QA funcional (tests/qa/test_visio_real_vendor_files.py): 8/8

Documentación

Véase también

Subir