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:
@@ -39,6 +39,8 @@ const CanvasArea: React.FC<CanvasAreaProps> = ({
|
||||
const pixiCanvasRef = useRef<HTMLCanvasElement>(null);
|
||||
/** Task C2: Aktiver PixiJS-Renderer (für Cleanup). */
|
||||
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). */
|
||||
const announcedV2Ids = useRef<Set<string>>(new Set());
|
||||
const spatialIndexRef = useRef<SpatialIndex | null>(null);
|
||||
@@ -95,11 +97,17 @@ const CanvasArea: React.FC<CanvasAreaProps> = ({
|
||||
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<CanvasAreaProps> = ({
|
||||
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<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
|
||||
}, [elements]);
|
||||
}, [elements, layers]);
|
||||
|
||||
// Sync layers to LayerManager + render
|
||||
useEffect(() => {
|
||||
|
||||
Reference in New Issue
Block a user