| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- 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<SiguiyamaContext> {
- 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<Node, Edge<Node>>, edgeSubdivisions: EdgeSubdivision<Node>[]) : 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<Node, Edge<Node>>, edgeSubdivisions: EdgeSubdivision<Node>[]) : void {
- for(const subdivision of edgeSubdivisions)
- subdivision.chainEdges.forEach((ce) => graph.removeEdge(ce.getId()));
- }
- }
|