CleanupStep.ts 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import AlgorithmStep from "../AlgorithmStep.js";
  2. import {EdgeSubdivision, SiguiyamaContext} from "../siguiyama/SiguiyamaContext.js";
  3. import CleanupStepError from "../../errors/optimizer/CleanupStepError.js";
  4. import Graph from "../../graph/Graph.js";
  5. import Node from "../../graph/node/Node.js";
  6. import Edge from "../../graph/edge/Edge.js";
  7. export default class CleanupStep extends AlgorithmStep<SiguiyamaContext> {
  8. public constructor() {
  9. super(CleanupStep.name)
  10. }
  11. public run(context: SiguiyamaContext): void {
  12. const { graph, edgeSubdivisions } = context;
  13. if(!graph)
  14. throw new CleanupStepError("Graph is undefined");
  15. if(!edgeSubdivisions)
  16. throw new CleanupStepError("Edge subdivision is undefined");
  17. this.restoreEdges(graph, edgeSubdivisions);
  18. this.removeSubdividedEdges(graph, edgeSubdivisions);
  19. }
  20. private restoreEdges(graph: Graph<Node, Edge<Node>>, edgeSubdivisions: EdgeSubdivision<Node>[]) : void {
  21. const subdivisionsMap = new Map(
  22. edgeSubdivisions.map((e) => [e.originalEdge.getId(), e])
  23. );
  24. for(const edge of graph.getEdges()) {
  25. const edgeId = edge.getId();
  26. const subdivision = subdivisionsMap.get(edgeId);
  27. if(!subdivision)
  28. continue;
  29. edge.setWaypoints(subdivision.chainNodes.slice(1, -1).map((n) => ({ x: n.getX(), y: n.getY() })));
  30. }
  31. }
  32. private removeSubdividedEdges(graph:Graph<Node, Edge<Node>>, edgeSubdivisions: EdgeSubdivision<Node>[]) : void {
  33. for(const subdivision of edgeSubdivisions)
  34. subdivision.chainEdges.forEach((ce) => graph.removeEdge(ce.getId()));
  35. }
  36. }