in graphLayout/jetbrains.mps.graphLayout.planarization/source_gen/jetbrains/mps/graphLayout/internal/planarization/ClusterEmbeddingConstructorTemp.java [106:179]
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);
}
ClusterEmbeddingConstructorTemp subProcessor = new ClusterEmbeddingConstructorTemp(myGraph, subcluster, subOuterEdgesOrder);
EmbeddedGraph subclusterEmbedding = subProcessor.constructEmbedding();
CheckEmbeddedGraph.checkEmbeddedGraph(subclusterEmbedding, false);
if (ListSequence.fromList(subclusterEmbedding.getFaces()).count() > 0) {
Face outerFace = subclusterEmbedding.getOuterFace();
for (Face face : ListSequence.fromList(subclusterEmbedding.getFaces())) {
if (face == outerFace) {
continue;
}
myEmbeddedGraph.addFace(face);
}
Edge lastOuterEdge = ListSequence.fromList(darts).last().getEdge();
Tuples._2<Edge, Node> lastOuterEdgeInfo = getCurOuterEdge(lastOuterEdge, subclusterEmbedding);
int i = 0;
Dart prev = ListSequence.fromList(darts).last();
Edge prevCurOuterEdge = lastOuterEdgeInfo._0();
Node prevBorderNode = lastOuterEdgeInfo._1();
outerFace.makeEndsWith(prevBorderNode);
Iterator<Dart> borderItr = ListSequence.fromList(outerFace.getDarts()).reversedList().iterator();
for (Dart dart : ListSequence.fromList(darts)) {
final Edge outerEdge = ListSequence.fromList(subOuterEdgesOrder).getElement(i);
Tuples._2<Edge, Node> outerEdgeInfo = getCurOuterEdge(outerEdge, subclusterEmbedding);
Edge curOuterEdge = outerEdgeInfo._0();
Node borderNode = outerEdgeInfo._1();
Face face = MapSequence.fromMap(myFaceMap).get(mySubEmbeddedGraph.getFace(prev));
List<Dart> faceDarts = face.getDarts();
Dart outerEdgeDart = ListSequence.fromList(faceDarts).findFirst(new IWhereFilter<Dart>() {
public boolean accept(Dart dart) {
return dart.getEdge() == outerEdge;
}
});
if (outerEdgeDart == null) {
throw new RuntimeException("error during merging subcluster's embeddings");
}
face.makeStartsWith(outerEdgeDart);
ListSequence.fromList(faceDarts).removeElementAt(0);
ListSequence.fromList(faceDarts).removeElementAt(0);
ListSequence.fromList(faceDarts).insertElement(0, new Dart(prevCurOuterEdge, prevBorderNode));
// we must process case when all outer edges points to one subcluster node
if (dart == ListSequence.fromList(darts).last()) {
while (borderItr.hasNext()) {
ListSequence.fromList(faceDarts).insertElement(0, borderItr.next());
}
} else if (prevBorderNode != borderNode) {
Dart cur = borderItr.next();
while (cur.getSource() != borderNode) {
ListSequence.fromList(faceDarts).insertElement(0, cur);
cur = borderItr.next();
}
ListSequence.fromList(faceDarts).insertElement(0, cur);
}
ListSequence.fromList(faceDarts).insertElement(0, new Dart(curOuterEdge, curOuterEdge.getOpposite(borderNode)));
prev = dart;
prevCurOuterEdge = curOuterEdge;
prevBorderNode = borderNode;
}
}
}