From 0e4f9fe160a3a28da252c20b984d9b69a85f55dc Mon Sep 17 00:00:00 2001 From: Agent Zero Date: Wed, 16 Sep 2026 10:04:40 +0200 Subject: [PATCH] fix(CAD-13): mirror existing DB elements into pixi renderer - cachedElements was 0 for old projects (only new V2 elements reached pixi), skipElementRendering fallback restored on pixi failure --- frontend/src/components/CanvasArea.tsx | 42 +++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/CanvasArea.tsx b/frontend/src/components/CanvasArea.tsx index b7165b5..46aaeca 100644 --- a/frontend/src/components/CanvasArea.tsx +++ b/frontend/src/components/CanvasArea.tsx @@ -39,6 +39,8 @@ const CanvasArea: React.FC = ({ const pixiCanvasRef = useRef(null); /** Task C2: Aktiver PixiJS-Renderer (für Cleanup). */ const pixiRendererRef = useRef(null); + /** CAD-13-fix: Bereits in Pixi gespiegelte Bestands-Elemente (id -> Referenz). */ + const pixiMirrorRef = useRef>(new Map()); /** Bereits an onElementCreated gemeldete V2-Element-IDs (verhindert Doppelmeldung bei jedem onChanged-Frame). */ const announcedV2Ids = useRef>(new Set()); const spatialIndexRef = useRef(null); @@ -95,11 +97,17 @@ const CanvasArea: React.FC = ({ logger.warn('Pixi init failed — V2-Overlay deaktiviert:', err); pixi = null; pixiRendererRef.current = null; + // CAD-13-fix Fallback: Ohne Pixi muss Legacy wieder Elemente zeichnen + renderEngine.skipElementRendering = false; + renderEngine.render(); }); } catch (err) { logger.warn('Pixi init exception — V2-Overlay deaktiviert:', err); pixi = null; pixiRendererRef.current = null; + // CAD-13-fix Fallback: Ohne Pixi muss Legacy wieder Elemente zeichnen + renderEngine.skipElementRendering = false; + renderEngine.render(); } } /** Letztes bekanntes Elementobjekt je ID (Referenzdiff statt JSON). */ @@ -297,8 +305,40 @@ const CanvasArea: React.FC = ({ spatialIndex.clear(); spatialIndex.bulkInsert(elements); renderEngine.render(); + + // CAD-13-fix: Bestands-Elemente (aus DB geladen) müssen in Pixi gespiegelt + // werden — nur NEUE V2-Elemente laufen über v2Doc.onChanged in syncPixi. + // Ohne diesen Mirror blieben Alt-Projekte leer (Legacy skippt ja jetzt). + const pixi = pixiRendererRef.current; + if (pixi && renderEngine.skipElementRendering) { + void pixi.waitForReady().then(() => { + const mirror = pixiMirrorRef.current; + const currentIds = new Set(); + const layerFallback = { + id: 'layer-0', name: 'Standard', visible: true, locked: false, + color: '#ffffff', lineType: 'solid', transparency: 0, + sortOrder: 0, parentId: null, + } as never; + for (const el of elements) { + currentIds.add(el.id); + if (mirror.get(el.id) !== el) { + mirror.set(el.id, el); + const layer = layers.find((l) => l.id === el.layerId) ?? layerFallback; + pixi.drawElement(el, layer, { + color: '#ffffff', lineType: 'solid', transparency: 0, visible: true, + }); + } + } + for (const id of Array.from(mirror.keys())) { + if (!currentIds.has(id)) { + mirror.delete(id); + pixi.removeElement(id); + } + } + }); + } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [elements]); + }, [elements, layers]); // Sync layers to LayerManager + render useEffect(() => {