Refactor ElkSharp routing sources into partial modules

This commit is contained in:
master
2026-03-28 11:56:35 +02:00
parent 7be4e855d6
commit 7057819f4d
34 changed files with 33377 additions and 21402 deletions

View File

@@ -8,13 +8,16 @@ internal static class ElkSharpLayoutInitialPlacement
Dictionary<string, List<string>> augmentedOutgoing, Dictionary<string, ElkNode> augmentedNodesById,
Dictionary<string, List<string>> incomingNodeIds, Dictionary<string, List<string>> outgoingNodeIds,
Dictionary<string, ElkNode> nodesById, double adaptiveNodeSpacing,
ElkLayoutOptions options, int placementIterations)
ElkLayoutOptions options, int placementIterations, NodePlacementGrid placementGrid)
{
var globalNodeHeight = augmentedNodesById.Values
.Where(n => !dummyResult.DummyNodeIds.Contains(n.Id))
.Max(x => x.Height);
var gridNodeSpacing = Math.Max(adaptiveNodeSpacing, placementGrid.YStep * 0.4d);
var edgeDensityFactor = adaptiveNodeSpacing / options.NodeSpacing;
var adaptiveLayerSpacing = options.LayerSpacing * Math.Min(1.15d, 0.92d + (Math.Max(0d, edgeDensityFactor - 1d) * 0.35d));
var adaptiveLayerSpacing = Math.Max(
options.LayerSpacing * Math.Min(1.15d, 0.92d + (Math.Max(0d, edgeDensityFactor - 1d) * 0.35d)),
placementGrid.XStep * 0.45d);
var layerXPositions = new double[layers.Length];
var currentX = 0d;
@@ -53,7 +56,7 @@ internal static class ElkSharpLayoutInitialPlacement
}
else
{
desiredY[nodeIndex] = nodeIndex * (slotHeight + adaptiveNodeSpacing);
desiredY[nodeIndex] = nodeIndex * (slotHeight + gridNodeSpacing);
}
}
@@ -62,8 +65,8 @@ internal static class ElkSharpLayoutInitialPlacement
var prevIsDummy = dummyResult.DummyNodeIds.Contains(layer[nodeIndex - 1].Id);
var currIsDummy = dummyResult.DummyNodeIds.Contains(layer[nodeIndex].Id);
var pairSpacing = (prevIsDummy && currIsDummy) ? 2d
: (prevIsDummy || currIsDummy) ? Math.Min(adaptiveNodeSpacing, options.NodeSpacing * 0.5d)
: adaptiveNodeSpacing;
: (prevIsDummy || currIsDummy) ? Math.Min(gridNodeSpacing, options.NodeSpacing * 0.5d)
: gridNodeSpacing;
var minY = desiredY[nodeIndex - 1] + layer[nodeIndex - 1].Height + pairSpacing;
if (desiredY[nodeIndex] < minY)
{
@@ -91,19 +94,19 @@ internal static class ElkSharpLayoutInitialPlacement
ElkNodePlacement.RefineHorizontalPlacement(positionedNodes, layers,
incomingNodeIds, outgoingNodeIds, augmentedNodesById,
options.NodeSpacing, placementIterations, options.Direction);
gridNodeSpacing, placementIterations, options.Direction);
ElkNodePlacement.SnapOriginalPrimaryAxes(positionedNodes, layers,
dummyResult.DummyNodeIds, incomingNodeIds, outgoingNodeIds,
nodesById, options.NodeSpacing, options.Direction);
nodesById, gridNodeSpacing, options.Direction);
ElkNodePlacementAlignment.CompactTowardIncomingFlow(positionedNodes, layers,
dummyResult.DummyNodeIds, incomingNodeIds, nodesById,
options.NodeSpacing, options.Direction);
gridNodeSpacing, options.Direction);
ElkNodePlacement.SnapOriginalPrimaryAxes(positionedNodes, layers,
dummyResult.DummyNodeIds, incomingNodeIds, outgoingNodeIds,
nodesById, options.NodeSpacing, options.Direction);
nodesById, gridNodeSpacing, options.Direction);
ElkNodePlacementPreferredCenter.AlignDummyNodesToFlow(positionedNodes, layers,
dummyResult.DummyNodeIds, augmentedIncoming, augmentedOutgoing,
@@ -123,7 +126,7 @@ internal static class ElkSharpLayoutInitialPlacement
var pos = positionedNodes[nodeId];
positionedNodes[nodeId] = ElkLayoutHelpers.CreatePositionedNode(
augmentedNodesById[nodeId], pos.X, pos.Y - minNodeY, options.Direction);
}
}
}
}
@@ -133,14 +136,15 @@ internal static class ElkSharpLayoutInitialPlacement
Dictionary<string, List<string>> augmentedOutgoing, Dictionary<string, ElkNode> augmentedNodesById,
Dictionary<string, List<string>> incomingNodeIds, Dictionary<string, List<string>> outgoingNodeIds,
Dictionary<string, ElkNode> nodesById, double globalNodeWidth,
double adaptiveNodeSpacing, ElkLayoutOptions options, int placementIterations)
double adaptiveNodeSpacing, ElkLayoutOptions options, int placementIterations, NodePlacementGrid placementGrid)
{
var gridNodeSpacing = Math.Max(adaptiveNodeSpacing, placementGrid.XStep * 0.4d);
var layerYPositions = new double[layers.Length];
var currentY = 0d;
for (var layerIndex = 0; layerIndex < layers.Length; layerIndex++)
{
layerYPositions[layerIndex] = currentY;
currentY += layers[layerIndex].Max(x => x.Height) + options.LayerSpacing;
currentY += layers[layerIndex].Max(x => x.Height) + Math.Max(options.LayerSpacing, placementGrid.YStep * 0.45d);
}
var slotWidth = globalNodeWidth;
@@ -172,7 +176,7 @@ internal static class ElkSharpLayoutInitialPlacement
}
else
{
desiredX[nodeIndex] = nodeIndex * (slotWidth + adaptiveNodeSpacing);
desiredX[nodeIndex] = nodeIndex * (slotWidth + gridNodeSpacing);
}
}
@@ -181,8 +185,8 @@ internal static class ElkSharpLayoutInitialPlacement
var prevIsDummyX = dummyResult.DummyNodeIds.Contains(layer[nodeIndex - 1].Id);
var currIsDummyX = dummyResult.DummyNodeIds.Contains(layer[nodeIndex].Id);
var pairSpacingX = (prevIsDummyX && currIsDummyX) ? 2d
: (prevIsDummyX || currIsDummyX) ? Math.Min(adaptiveNodeSpacing, options.NodeSpacing * 0.5d)
: adaptiveNodeSpacing;
: (prevIsDummyX || currIsDummyX) ? Math.Min(gridNodeSpacing, options.NodeSpacing * 0.5d)
: gridNodeSpacing;
var minX = desiredX[nodeIndex - 1] + layer[nodeIndex - 1].Width + pairSpacingX;
if (desiredX[nodeIndex] < minX)
{
@@ -210,19 +214,19 @@ internal static class ElkSharpLayoutInitialPlacement
ElkNodePlacement.RefineVerticalPlacement(positionedNodes, layers,
incomingNodeIds, outgoingNodeIds, augmentedNodesById,
options.NodeSpacing, placementIterations, options.Direction);
gridNodeSpacing, placementIterations, options.Direction);
ElkNodePlacement.SnapOriginalPrimaryAxes(positionedNodes, layers,
dummyResult.DummyNodeIds, incomingNodeIds, outgoingNodeIds,
nodesById, options.NodeSpacing, options.Direction);
nodesById, gridNodeSpacing, options.Direction);
ElkNodePlacementAlignment.CompactTowardIncomingFlow(positionedNodes, layers,
dummyResult.DummyNodeIds, incomingNodeIds, nodesById,
options.NodeSpacing, options.Direction);
gridNodeSpacing, options.Direction);
ElkNodePlacement.SnapOriginalPrimaryAxes(positionedNodes, layers,
dummyResult.DummyNodeIds, incomingNodeIds, outgoingNodeIds,
nodesById, options.NodeSpacing, options.Direction);
nodesById, gridNodeSpacing, options.Direction);
ElkNodePlacementPreferredCenter.AlignDummyNodesToFlow(positionedNodes, layers,
dummyResult.DummyNodeIds, augmentedIncoming, augmentedOutgoing,
@@ -242,7 +246,7 @@ internal static class ElkSharpLayoutInitialPlacement
var pos = positionedNodes[nodeId];
positionedNodes[nodeId] = ElkLayoutHelpers.CreatePositionedNode(
augmentedNodesById[nodeId], pos.X - minNodeX, pos.Y, options.Direction);
}
}
}
}
}