import AlgorithmStep from "../AlgorithmStep.js"; import {EdgeSubdivision, SiguiyamaContext} from "../siguiyama/SiguiyamaContext.js"; import CleanupStepError from "../../errors/optimizer/CleanupStepError.js"; import Graph from "../../graph/Graph.js"; import Node from "../../graph/node/Node.js"; import Edge from "../../graph/edge/Edge.js"; export default class CleanupStep extends AlgorithmStep { public constructor() { super(CleanupStep.name) } public run(context: SiguiyamaContext): void { const { graph, edgeSubdivisions } = context; if(!graph) throw new CleanupStepError("Graph is undefined"); if(!edgeSubdivisions) throw new CleanupStepError("Edge subdivision is undefined"); this.restoreEdges(graph, edgeSubdivisions); this.removeSubdividedEdges(graph, edgeSubdivisions); } private restoreEdges(graph: Graph>, edgeSubdivisions: EdgeSubdivision[]) : void { const subdivisionsMap = new Map( edgeSubdivisions.map((e) => [e.originalEdge.getId(), e]) ); for(const edge of graph.getEdges()) { const edgeId = edge.getId(); const subdivision = subdivisionsMap.get(edgeId); if(!subdivision) continue; edge.setWaypoints(subdivision.chainNodes.slice(1, -1).map((n) => ({ x: n.getX(), y: n.getY() }))); } } private removeSubdividedEdges(graph:Graph>, edgeSubdivisions: EdgeSubdivision[]) : void { for(const subdivision of edgeSubdivisions) subdivision.chainEdges.forEach((ce) => graph.removeEdge(ce.getId())); } }