private void findSubclusterEmbedding()

in graphLayout/jetbrains.mps.graphLayout.planarization/source_gen/jetbrains/mps/graphLayout/planarization/ClusterEmbeddingConstructor.java [107:182]


  private void findSubclusterEmbedding(Node subcluster, Map<Edge, Edge> invEdgeMap) {
    Node node = MapSequence.fromMap(mySubclustersMap).get(subcluster);
    List<Dart> darts = mySubEmbeddedGraph.getOrderedDarts(node);
    List<Edge> subOuterEdgesOrder = ListSequence.fromList(new ArrayList<Edge>(ListSequence.fromList(darts).count()));
    for (Dart dart : ListSequence.fromList(darts)) {
      Edge edge = dart.getEdge();
      Edge realEdge = MapSequence.fromMap(invEdgeMap).get(edge);
      List<Edge> history = myHistoryManager.getHistory(realEdge);
      if (edge.getSource() == node) {
        realEdge = ListSequence.fromList(history).first();
      } else {
        realEdge = ListSequence.fromList(history).last();
      }
      ListSequence.fromList(subOuterEdgesOrder).addElement(realEdge);
    }
    if (showInfo > 0) {
      for (Dart dart : ListSequence.fromList(darts)) {
        System.out.println("pr dart " + dart + " -> " + MapSequence.fromMap(invEdgeMap).get(dart.getEdge()));
      }
      System.out.println("pr " + subOuterEdgesOrder);
    }
    ClusterEmbeddingConstructor subProcessor = new ClusterEmbeddingConstructor(myGraph, subcluster, subOuterEdgesOrder);
    subProcessor.setClusterBorderMap(myClusterBorderMap);
    EmbeddedGraph subclusterEmbedding = subProcessor.constructEmbedding();
    CheckEmbeddedGraph.checkEmbeddedGraph(subclusterEmbedding, false);
    if (ListSequence.fromList(subclusterEmbedding.getFaces()).count() > 0) {
      for (Face face : ListSequence.fromList(subclusterEmbedding.getFaces())) {
        if (subclusterEmbedding.isOuterFace(face)) {
          continue;
        }
        myEmbeddedGraph.addFace(face);
      }
      if (showInfo > 0) {
        for (Edge edge : ListSequence.fromList(subOuterEdgesOrder)) {
          System.out.println("order " + edge + ": " + myHistoryManager.getHistory(edge));
        }
        for (Dart dart : ListSequence.fromList(darts)) {
          System.out.println("dart " + dart + " -> " + MapSequence.fromMap(invEdgeMap).get(dart.getEdge()));
        }
      }
      List<Edge> subclusterBorder = subProcessor.getClusterBorder();
      for (int i = 0; i < ListSequence.fromList(darts).count(); i++) {
        Edge borderEdge = ListSequence.fromList(subclusterBorder).getElement(i);
        Edge outerEdge = ListSequence.fromList(subOuterEdgesOrder).getElement(i);
        int next = i + 1;
        if (next == ListSequence.fromList(darts).count()) {
          next = 0;
        }
        final Edge nextOuterEdge = ListSequence.fromList(subOuterEdgesOrder).getElement(next);
        Face face = MapSequence.fromMap(myFaceMap).get(mySubEmbeddedGraph.getFace(ListSequence.fromList(darts).getElement(i)));
        List<Dart> faceDarts = face.getDarts();
        List<Dart> nextOuterFaceDarts = ListSequence.fromList(faceDarts).where(new IWhereFilter<Dart>() {
          public boolean accept(Dart dart) {
            return dart.getEdge() == nextOuterEdge;
          }
        }).toListSequence();
        final Node outerNode = getOuterNode(nextOuterEdge, subcluster);
        Dart nextOuterEdgeDart = ListSequence.fromList(nextOuterFaceDarts).findFirst(new IWhereFilter<Dart>() {
          public boolean accept(Dart it) {
            return it.getSource() == outerNode;
          }
        });
        if (nextOuterEdgeDart == null) {
          throw new RuntimeException("error during merging subcluster's embeddings");
        }
        face.makeStartsWith(nextOuterEdgeDart);
        ListSequence.fromList(faceDarts).removeElementAt(0);
        ListSequence.fromList(faceDarts).removeElementAt(0);
        Edge curOuterEdge = getOuterEdgeAfterModifications(subcluster, outerEdge);
        Edge curNextOuterEdge = getOuterEdgeAfterModifications(subcluster, nextOuterEdge);
        ListSequence.fromList(faceDarts).insertElement(0, new Dart(curOuterEdge, borderEdge.getSource()));
        ListSequence.fromList(faceDarts).insertElement(0, new Dart(borderEdge, borderEdge.getTarget()));
        ListSequence.fromList(faceDarts).insertElement(0, new Dart(curNextOuterEdge, curNextOuterEdge.getOpposite(borderEdge.getTarget())));
      }
    }
  }