From f63710d69eb4719040cc90c98a50ed4c15b60583 Mon Sep 17 00:00:00 2001 From: katsuhisa yuasa Date: Sun, 15 Dec 2024 16:13:33 +0900 Subject: [PATCH] reduce crossings of connection lines --- source/dagre.js | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/source/dagre.js b/source/dagre.js index c614360910..cf8c274037 100644 --- a/source/dagre.js +++ b/source/dagre.js @@ -1367,11 +1367,27 @@ dagre.layout = (nodes, edges, layout, state) => { const calcDir = (idx0, idx1) => (idx0 < idx1) ? 1 : 2; for (let i = 4; i < best.length; i += 2) { const layer = best[i]; + const upperLayer = best[i - 1]; for (let j = 0; j < layer.length; ++j) { const node = g.nodes.get(layer[j]); - if (node.in && node.in.length === 2) { - let n0 = node.in[0].vNode.in[0].vNode; - let n1 = node.in[1].vNode.in[0].vNode; + if (!node.in || node.in.length < 2) { + continue; + } + const i2s = []; + for (let i2 = 0; i2 < node.in.length - 2; ++i2) { + i2s.push(i2); + } + for (let i2 = node.in.length - 2; i2 >= 0; --i2) { + i2s.push(i2); + } + const inputIndexes = []; + for (let i2 = 0; i2 < node.in.length; ++i2) { + inputIndexes.push(upperLayer.indexOf(node.in[i2].v)); + } + inputIndexes.sort((a, b) => a - b); + for (const i2 of i2s) { + let n0 = g.node(upperLayer[inputIndexes[i2 + 0]]).in[0].vNode; + let n1 = g.node(upperLayer[inputIndexes[i2 + 1]]).in[0].vNode; const indexes = []; let dirTotal = 0; for (let k = i - 2; k >= 0; k -= 2) { @@ -1388,6 +1404,11 @@ dagre.layout = (nodes, edges, layout, state) => { || n1.out.length !== 1 ) { if (dirTotal === 3) { + { + const idx1 = inputIndexes[i2 + 0]; + const idx0 = inputIndexes[i2 + 1]; + [upperLayer[idx0], upperLayer[idx1]] = [upperLayer[idx1], upperLayer[idx0]]; + } const topDir = dir; let l = k + 2; while (indexes.length !== 0) {