diff --git a/lib/network/modules/LayoutEngine.js b/lib/network/modules/LayoutEngine.js index c75505f2..76935690 100644 --- a/lib/network/modules/LayoutEngine.js +++ b/lib/network/modules/LayoutEngine.js @@ -1414,7 +1414,7 @@ class LayoutEngine { } /** - * this function allocates nodes in levels based on the direction of the edges + * Allocate nodes in levels based on the direction of the edges. * * @param hubsize * @private @@ -1422,8 +1422,30 @@ class LayoutEngine { _determineLevelsDirected() { let minLevel = 10000; + /** + * Check if there is an edge going the opposite direction for given edge + */ + let self = this; + let isBidirectional = (edge) => { + for (let key in self.body.edges) { + let otherEdge = self.body.edges[key]; + if (otherEdge.toId === edge.fromId && otherEdge.fromId === edge.toId) { + return true; + } + } + + return false; + }; + let levelByDirection = (nodeA, nodeB, edge) => { let levelA = this.hierarchical.levels[nodeA.id]; + let levelB = this.hierarchical.levels[nodeB.id]; + + if (isBidirectional(edge) && levelA !== undefined && levelB !== undefined) { + // Don't redo the level determination if already done in this case. + return; + } + // set initial level if (levelA === undefined) { levelA = this.hierarchical.levels[nodeA.id] = minLevel;} if (edge.toId == nodeB.id) {