eclipse / elk

Eclipse Layout Kernel - Automatic layout for Java applications.
https://www.eclipse.org/elk/
Other
239 stars 82 forks source link

Layered strategy with 'collapsed' nodes and root node on the top left position #1016

Open eugenehuangsg opened 3 months ago

eugenehuangsg commented 3 months ago

Hi guys, I'm trying to design a 5 columns layout with the following constraints

Expected outcome

image

So far, I'm able to get the expected layout when the graph is fully expanded. However, the graph starts to differ from my intended outcome whenever some nodes are collapsed. I suspect it is due to crossingMinimization options but I have no idea how to fix it. I would appreciate any guidance on this.

Current options: { 'elk.algorithm': 'layered', 'elk.direction': 'RIGHT', 'elk.spacing.nodeNode': 20, 'elk.spacing.edgeEdge': 10, 'elk.layered.spacing.nodeNodeBetweenLayers': 100, 'elk.layered.crossingMinimization.forceNodeModelOrder': true, 'elk.layered.nodePlacement.favorStraightEdges': true, 'elk.layered.layering.strategy': 'BRANDES_KOEPF', 'elk.layered.layered.nodePlacement.bk.fixedAlignment': 'LEFTUP' }

Unintended outcome when nodes are hidden.

Eddykasp commented 3 months ago

Please recreate your problem in elklive so that we can help you.

eugenehuangsg commented 3 months ago

@Eddykasp Thank you for getting back promptly. Here is the link to the model

https://rtsys.informatik.uni-kiel.de/elklive/elkgraph.html?compressedContent=IYGw5g9gTglgLgCwLYC4AEJgE8CmUcAmAUDiANYB0BM+AxnDBAHboBKAkgOIASAKkQGcADsFowmYCkwgEcAORk50AJgAMgkWIkVCYHAFECelesy58BCsNHjJ02QtkAhHHADuOHEwAy2PAPQARlVTPwsKWigIAQFbAFlxGCQYAC9gBmYKADNoWnlFOMUQAHkoWSh0OCgAVxwiMzxCKUUABUw8pC84bOAAN2gAZSrgGDAEOEM9ALQq2qJ7HDbRHE6mboFhuBwwLHQnVgBBOQARfQGAfQBpYv0WgDF51vaVrooAI0osmAAPQgOQUZMVZwdByYpyfRER6yNBMQJoADeRDQKIwwDepDQACIkFiiABfaE4WHKRHI1GYDEgbE5GR4wkLWEAZjJqLRVOxBFgTDI9KJsIALGh+UwAKwigBsIoA7CKABwigCcIuCrIp6MxWNkMTwcD5jLhgRVyhVTJVApV4pIRmJcLQAFoAHwkqEAeldaAAqkxaBAkMCZggYAI0DkoGgcN8hDh6IQ0EJovBGExbER3RGbSSHc6mBb07pbaSnbDxfnM0wizmpda9LD4cWmGaC3Xs3X1M3G62mLKOyyGwre13lR25V3AhaR2PxR3VQ3AkaZ6oxybF2OmUA

soerendomroes commented 2 months ago

Does this solve your problem?

If any questions remain, please do not hesitate to ask.

eugenehuangsg commented 2 months ago

Thank you for the insight. The NETWORK_SIMPLEX + priority.straightness is a possible approach. I'm trying to figure out how to programmatically allocate straightness priority to get the desired look and feel. Naively, the edges represent the weight among its sibling edges, but there is a relevance where the priority of other sections of the graph can still influence. Can you help weigh in on this?

https://rtsys.informatik.uni-kiel.de/elklive/elkgraph.html?compressedContent=IYGw5g9gTglgLgCwLYC4AEJgE8CmUcAmAUDiANYB0BM+AxnDBAHboBKAkgOIASAKkQGcADsFowmYCkwgEcAORk50AJgAMgkWIkVCYHAFECe9AEZ1mXPgIVho8ZOmyFsgEI44Adxw4mAGWx4Aqaq6kQA9GEYAVYUtFAQAgL2ALLiMEgwAF7ADMwUAGbQtPKKyYogAPJQslDocFAArjhEFniEsfGJKWkZ2blMNvU5OGBY6HIVcvpoEWjs+WhYEA1QaGBQwEIIaDACaMBo9d6Ly2hI2PsAbhAwBGhxCUkSZz1ZOYxMaBTf4ZHr3gQsABlDzwWgIChwLBCJRoCoAMXhM0i3woOyYAjgOGAdwgC0QODQhSgxTQjkJ0BqaExDXy+SIRHJAAVMMUkD44IMNljRuN9LwAOoVVgAaQA+kD2Mkmb59AANBmzIEMEAgMkQOCHCAQe4gbGrDwIHI7PaIXbUhpCIQJQhatAECAUX7UnAibk4ADCzCYOHohC9SGtPqYcCCRNAAkJs14CEJiHwhMjbuGaAARhAAB44PbAfCHX0IJgwWigEBYF3JrFrDZbARogXwbZmvZeIlFOOxpB21OEt2avGHWPU4DsqJLBpwBnk+4mEyMxT3ZQmNAAbyIaA3UR7aoARLQlzuiABfeeyRfKU+E-cAZlX683mG3aD3ymvh5P0-3ABY75ut6Rn2-d9L0XABWED9wANgg5QAHYYIADgg69lzXP9HwAvcUOAz9rwvXDbzQh9gCfLC32PZCv2Q8DcOg3DYN-YjSNoa9YJwhcWKQ3CAE5GI3DDdxY7j2LPFixTMPj-0E69xNUESrxk2dJIEwDFJMeT7i-VD734kjMNoLSNIM-COK-a8IK-KjPy-GjTLo0z4JIIwryUgBaAA+RdtL-IRYGgeAsC5YAYDABA4B9RJ0Hgk9dBc5cPPPSTfMYWAoSCkKwoisN1Bi5yZ3izzvycvR8rQBL93A2LSvK5RoKq2g3MKuDirisqmqQ+rGsXcyWq8tr7hQ5TonaZL-LSzENgy8LszDbiKPqpd+pYi8FuUJbr0InSxzaaxRtSwKJuC0LpsitAqNykr9zW8rryo1b1sqvKrvWuqntfdaGKI3TLBGvz9vS46svQW9Zm4CAPHuYBPhge08BgS4O3NXyIHWEdzgYEtVXLAQGnBQdjXgNBQVVNAfBxvNDqm0nnPmt7bxujq6fWuaFvpwrFPUBafxu8TvOIn7dr+gKAcymaouROEmDLNAGI8aAyAECjepYtnNL576dooPbhcpwGxbQSCJZjRMhimrL9itfU9hAGAyEJA4vCm4ASvyUQ4GgAAaInYzzH8obuUC0CNPYBAgUccDpX1QzTCd1U1HxllC2nLo2pavxWp7U-KszlazwrLNz1WDMelOi6-V7S7T2CgA

soerendomroes commented 2 months ago

If nodes have only connections to the right without skipping a layer and the order of nodes is fix and the order of edges corresponds to the order of nodes, the outgoing edge has to be straight and needs a straightness priority. Everything else does not need one, hence you can just set priority.straightness: 10 or something like this on every node if you can keep the edge and node order as it is. Since you set crossingMinimization.strategy to NONE this is what you have to do anyway to avoid crossings.

soerendomroes commented 2 months ago

My bad, you only need to take care that the edges are ordered as you want them to be. The nodes are ordered by the edges.

eugenehuangsg commented 2 months ago

Somehow, setting crossMinimization.strategy to NONE does not take effect in the JSON format. Can you help me take a look?

JSON format https://rtsys.informatik.uni-kiel.de/elklive/json.html?compressedContent=N4KABGCWAmBcYCIBOB7FAXBAacYA2AhgJ4oCu6A8gA7qQoB2AzvMGLhAOQF4DmKSkdAAsAth3gdCRAKZJp0DjgidpeANYA6aJDkBjWg3FgOAJQCSAcQASAFUXtjqzYyoFdkejw30U0aQDlfaSMAJgAGJWUOJw0XNw8veR5pAFFoZKMARgiHaPUNKVl5WNd3T28gwL8AIWl0AHdpaXoAGWJZRiywnNzCuWgKvwAFQl1pEWb0WPQkAnRpHiIjDn8UmwB1ChMAaQB9AGUzAFkhlpSADXsHAHprsBTBIVkwFAAzMGFpRmkwKlQqWS0L5gaAoYE+dAfAhqH7SV6vaT6MD1J70MBmMCkb4fJ4iG53STtfoaXSoRiMBJHDyQESQABeczo9Gms3mi2W-goq0UbGUYFuxj6xVJKHJlOptIZBmZr34Yyq0iOQTwFCQfiQRhmpGk+MFROFDAp6qVfhVatkLLmCyWEk5ABEUvtdgBBfx23YpO0WR0cXAAX0iuiEkDw0Dk9HgAG0HKwYPAEPRMthkTBhPAAMwRMBPSA8IToDNZwgAI1UzDAkeA8wAHgXjImOH6ALpgAMxqBwRD0ELJ+qpoSFrDZ6S5-OD-AEUt4cuVmt1jjdxsttt82OdhPp3v98c5vN1zNDktlqNV6S1iT0dNL1uRCBr+P0AAsW+gabAB+Ho-3Rcnx4rp-PetH2vP1cCbSIki+KN2zjRBpCTIdGDIJAxhnLskzAcCoSQZJ0DQhMe0wldlHvOCe0Q5DUKjdCEEwod0AIHC6nwy9aKbYi7w7eNpE3CjSBQqCKxoujsNwljnyIsCQD9IA

Text format https://rtsys.informatik.uni-kiel.de/elklive/elkgraph.html?compressedContent=IYGw5g9gTglgLgCwLYC4AEJgE8CmUcAmAUDiANYB0BM+AxnDBAHboBKAkgOIASAKkQGcADsFowmYCkwgEcAORk50AJgAMgkWIkVCYHAFECe9AEZ1mXPgIVho8ZOmyFsgEI44Adxw4mAGWx4Aqaq6kSOOAAKmLQ4SD5wNnBQwHA4YFjocvq8AOoA8qwA0gD6AMrsALIRvvoAGkREAPSNGAFWFLRQEAIC9hXiMEgwAF4pjEyJyanpmXlZTS0WeIQdXT19A0OjDMwUAGbQMc44FYogeVCyUOhJAK44C62WK7TMvVensueXeJMpaRk0HI8gARfSlYoAQTkIOK+hBnHBDXCaCYJjQAG8iGgca0AEakNAAcjRRKIAF8wopUcpMdjcZgCSBiUxlGTKSimABmOm4-GEklc9lU2SogAsvIZwCZLLFwpIRhwqPRAFoAHw0hV6ZVodWorlapVo3UaphioA

soerendomroes commented 2 months ago

You have to change the ELK version to 0.8.X or higher.

eugenehuangsg commented 2 months ago

Cool, all my issues have been solved. Thank you for the help!

Here is the final solution for those who might need it.

https://rtsys.informatik.uni-kiel.de/elklive/elkgraph.html?compressedContent=IYGw5g9gTglgLgCwLYC4AEJgE8CmUcAmAUDiANYB0ADsAQTAHZjoBEA2nBFQLwAsAbABoMOAGZxuAJgAMAXRYlyFevgDGcGBAboASgEkA4gAkAKkQDONVYzAUGEAjgByDnOgCs0i1ZsVCYHABRAgD0AEYvTFx8AgpLYGsmO1cXRwAhHDgAdxwcBgAZbDxzcOkvIii8QmTHAAVMVRwkPLg4uChgOBwwLHQnQJMAdQB5HQBpAH0AZT0AWVr8wIANIlUoCHNzG1nGGCQYAC9OzQY2jq6evuH+oiJ7RzRVMLC710fJMLQAbyI0P4xgAAjUhoFiqD4KAC+rwe4MkMJw7wAzN9fv9MMCQKDwUioQj3rxUf8AZjsZJeHj7ojwe58eD+HTJAB2RkADjpSM+P2JGJBYM5lLeqiR8KpjyRKO56KBfOFuKI0LFwt4HNpSqRDPVTKJ0tJ-KZgthSPZ6oAnDq-rysfzTYbqUiJhELSTZQ6InbxY6uWjLTLrcKvR7VLxvTy-diQ0HeKKhbwkXTeCqlbw1bHNbGWcn2UQAPQ5tCSVloKnmNCMNCcOCgEghanPNAAWgAfO9Q-8qLBoPAsGdgDAwAg4AwcJt0IWFTWAo96833pI0JO659ZzjF9Ply3wSr-EvG5vJLSd+u9+8GUenhv3izzzP99nzx8T8K238O5pYHAe+Z2n2B0ORyUBbstCD6XsK8IPvOK4Ss6b5dp+vb9oOw6jkBE6QU+SLbrWc6YYeOFwphZ4EZIKLQdqUqvp2H5fj+SH-qh44gSRZGbsaa44phpocaRmGOl4D6EtBXq3OeMEriGsHUd2iF-ihgFMRx4mbtGSmsY8cZqU+iZaRJ+FTnK2nEQZykadeBFumBvCskAA

eugenehuangsg commented 2 months ago

Hi @soerendomroes, is there a property I can set to force the position of the root node on the top left corner?

With straightness priority, the root node can potentially still move with the graph.

https://rtsys.informatik.uni-kiel.de/elklive/elkgraph.html?compressedContent=IYGw5g9gTglgLgCwLYC4AEJgE8CmUcAmAUDiANYB0BM+AxnDBAHboBKAkgOIASAKkQGcADsFowmYCkwgEcAORk50AJgAMgkWIkVCYHAFECe9AEZ1mXPgIVho8ZOmyFsgEI44Adxw4mAGWx4Aqaq6kQA9GEYAVYUtFAQAgL2ALLiMEgwAF7ADMwUAGbQtPKKyYogAPJQslDocFAArjhEFniEsfGJKWkZ2blMNvU5OGBY6HIVcvpoEWjs+WhYEA1QaGBQwEIIaDACaMBo9d6Ly2hI2PsAbhAwBGhxCUkSZz1ZOYxMaBTf4ZHr3gQsABlDzwWgIChwLBCJRoCoAMXhM0i3woOyYAjgOGAdwgC0QODQhSgxTQjkJ0BqaExDXy+SIRHJAAVMMUkD44IMNljRuN9LwAOoVVgAaQA+kD2Mkmb59AANBmzAQ4ETcnAAYWYTBw9EImqQQmYHKCRNAyuRaF4CEJiHwhOVquGaAARhAAB44PbAfCHHUIJgwWigEBYakq71O9abBACNEC+DbRC7NBeIlFG3WpCHCAuwmquBoPGHa3U4DsqJLBpwQThtWapja3UEfWG7VMOAm-Jm5qMxT3EwmNAAbyIaDHUWdpDQACJaAPp0QAL692T3ZSDkfjidT2frhfL8lr5Qrwm0ZQAZmHo-HmEnIBnZ-P+5Pa4ALFet7ed2fX8-D2eAFYXzPAA2YDlAAdnAgAOYDzw3a8xy-e9Z3gv8+1oc9j3-c9L03G9gDvB9cPQ1dMNfOCgJwsCcIgj8CKI1CINI09z1gnCAE56KQwjv3PDiWPuc8xTMbjtxQzCRNUQTJIHMTkOIkSTBk18EM-XiJNUlTsIw19z2A18KP-V8qN0mjdKg340AAVSYWgICQdl2zTVY50HOAcyQCBLhtHMCWzIQAFoQBwfIC0NJJ+is3RTzkwKAD41wQ2YtyEWBoHgLAuWAGAwAQOBtUSdAoNmZcYv7QcEqPMS0sYWAoWy3L8sKk11DKoxYsqxKfxIDqKrQKrAN6vR+sG5QwPKtyBu6yDhs66a11gya4pm-S5qShbMLUgjLHaWqMoazENiagrPRNDil3Ws8uqE49JuUZRNtw+Toj29L6qyo6cry06irQCj2pGs9HsG88KPukHuvPICIaeia+sfJ66PwnjdusfaPsan6WvQS9Zm4CAPHuYBPhgNAahgHzi2TNKICjRz3iDEAQ2pBpwWLHIdgLUFmbQHwBBWe0hhOvmOsu+7L1BpaEYvJ6Lolp6pKu5R31BpSXrRigMcyrHmrO4qLQqJgWbojxoDIARLqu57BtUjW2nR96da+k6cbQECLStIXjuxs79iEGFvT2EAYDIQkDi8E7gBGrt6GgAAaFNrR9d8SbuAC0AQYA9gEBzCVC-IdQ7F0qzJCACx8ZY8vFhGbe6187tryX6-0ya6-uQzrebjuYabzbX3hoH29oV8IKAA

soerendomroes commented 2 months ago

No, sadly not.