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())));
}
}
}