Refactor ElkSharp hybrid routing and document speed path

This commit is contained in:
master
2026-03-29 19:33:46 +03:00
parent 7d6bc2b0ab
commit e8f7ad7652
89 changed files with 13280 additions and 10732 deletions

View File

@@ -23,31 +23,48 @@ public sealed class ElkSharpWorkflowRenderLayoutEngine : INamedWorkflowRenderGra
ArgumentNullException.ThrowIfNull(graph);
request ??= new WorkflowRenderLayoutRequest();
var direction = request.Direction == WorkflowRenderLayoutDirection.LeftToRight
? ElkLayoutDirection.LeftToRight
: ElkLayoutDirection.TopToBottom;
var effort = request.Effort switch
{
WorkflowRenderLayoutEffort.Draft => ElkLayoutEffort.Draft,
WorkflowRenderLayoutEffort.Balanced => ElkLayoutEffort.Balanced,
_ => ElkLayoutEffort.Best,
};
var elkGraph = new ElkGraph
{
Id = graph.Id,
Nodes = graph.Nodes.Select(MapNode).ToArray(),
Edges = graph.Edges.Select(MapEdge).ToArray(),
};
var layoutOptions = new ElkLayoutOptions
{
Direction = direction,
NodeSpacing = request.NodeSpacing,
LayerSpacing = request.LayerSpacing,
Effort = effort,
OrderingIterations = request.OrderingIterations,
PlacementIterations = request.PlacementIterations,
};
if (direction == ElkLayoutDirection.LeftToRight
&& effort == ElkLayoutEffort.Best)
{
layoutOptions = layoutOptions with
{
IterativeRouting = new IterativeRoutingOptions
{
Enabled = true,
Mode = IterativeRoutingMode.HybridDeterministic,
MaxRepairWaves = 1,
MaxParallelRepairBuilds = Math.Max(1, Environment.ProcessorCount),
},
};
}
var elkResult = await elkLayoutEngine.LayoutAsync(
elkGraph,
new ElkLayoutOptions
{
Direction = request.Direction == WorkflowRenderLayoutDirection.LeftToRight
? ElkLayoutDirection.LeftToRight
: ElkLayoutDirection.TopToBottom,
NodeSpacing = request.NodeSpacing,
LayerSpacing = request.LayerSpacing,
Effort = request.Effort switch
{
WorkflowRenderLayoutEffort.Draft => ElkLayoutEffort.Draft,
WorkflowRenderLayoutEffort.Balanced => ElkLayoutEffort.Balanced,
_ => ElkLayoutEffort.Best,
},
OrderingIterations = request.OrderingIterations,
PlacementIterations = request.PlacementIterations,
},
layoutOptions,
cancellationToken);
return new WorkflowRenderLayoutResult