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);
|
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(() => {
|
||||||
|
|||||||
Reference in New Issue
Block a user