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

This commit is contained in:
Agent Zero
2026-09-16 10:04:40 +02:00
parent af9f53c61f
commit 0e4f9fe160
+41 -1
View File
@@ -39,6 +39,8 @@ const CanvasArea: React.FC<CanvasAreaProps> = ({
const pixiCanvasRef = useRef<HTMLCanvasElement>(null); const pixiCanvasRef = useRef<HTMLCanvasElement>(null);
/** Task C2: Aktiver PixiJS-Renderer (für Cleanup). */ /** Task C2: Aktiver PixiJS-Renderer (für Cleanup). */
const pixiRendererRef = useRef<PixiRenderer | null>(null); const pixiRendererRef = useRef<PixiRenderer | null>(null);
/** CAD-13-fix: Bereits in Pixi gespiegelte Bestands-Elemente (id -> Referenz). */
const pixiMirrorRef = useRef<Map<string, CADElement>>(new Map());
/** Bereits an onElementCreated gemeldete V2-Element-IDs (verhindert Doppelmeldung bei jedem onChanged-Frame). */ /** Bereits an onElementCreated gemeldete V2-Element-IDs (verhindert Doppelmeldung bei jedem onChanged-Frame). */
const announcedV2Ids = useRef<Set<string>>(new Set()); const announcedV2Ids = useRef<Set<string>>(new Set());
const spatialIndexRef = useRef<SpatialIndex | null>(null); const spatialIndexRef = useRef<SpatialIndex | null>(null);
@@ -95,11 +97,17 @@ const CanvasArea: React.FC<CanvasAreaProps> = ({
logger.warn('Pixi init failed — V2-Overlay deaktiviert:', err); logger.warn('Pixi init failed — V2-Overlay deaktiviert:', err);
pixi = null; pixi = null;
pixiRendererRef.current = null; pixiRendererRef.current = null;
// CAD-13-fix Fallback: Ohne Pixi muss Legacy wieder Elemente zeichnen
renderEngine.skipElementRendering = false;
renderEngine.render();
}); });
} catch (err) { } catch (err) {
logger.warn('Pixi init exception — V2-Overlay deaktiviert:', err); logger.warn('Pixi init exception — V2-Overlay deaktiviert:', err);
pixi = null; pixi = null;
pixiRendererRef.current = 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). */ /** Letztes bekanntes Elementobjekt je ID (Referenzdiff statt JSON). */
@@ -297,8 +305,40 @@ const CanvasArea: React.FC<CanvasAreaProps> = ({
spatialIndex.clear(); spatialIndex.clear();
spatialIndex.bulkInsert(elements); spatialIndex.bulkInsert(elements);
renderEngine.render(); 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<string>();
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 // eslint-disable-next-line react-hooks/exhaustive-deps
}, [elements]); }, [elements, layers]);
// Sync layers to LayerManager + render // Sync layers to LayerManager + render
useEffect(() => { useEffect(() => {