Files
git.stella-ops.org/src/__Libraries/StellaOps.ElkSharp/ElkEdgeRouterIterative.Finalization.HybridBaseline.cs

50 lines
2.1 KiB
C#

namespace StellaOps.ElkSharp;
internal static partial class ElkEdgeRouterIterative
{
private static ElkRoutedEdge[] ApplyLeanHybridBaselinePostProcessing(
ElkRoutedEdge[] edges,
ElkPositionedNode[] nodes,
ElkLayoutOptions layoutOptions)
{
var result = ElkEdgePostProcessor.AvoidNodeCrossings(edges, nodes, layoutOptions.Direction);
result = ElkEdgePostProcessor.EliminateDiagonalSegments(result, nodes);
result = ElkEdgePostProcessorSimplify.SimplifyEdgePaths(result, nodes);
result = ElkEdgePostProcessorSimplify.TightenOuterCorridors(result, nodes);
if (HighwayProcessingEnabled)
{
result = ElkEdgeRouterHighway.BreakShortHighways(result, nodes);
}
var serviceNodes = nodes.Where(n => n.Kind is not "Start" and not "End").ToArray();
var minLineClearance = serviceNodes.Length > 0
? Math.Min(serviceNodes.Average(n => n.Width), serviceNodes.Average(n => n.Height)) / 2d
: 50d;
result = ElkEdgePostProcessor.NormalizeBoundaryAngles(result, nodes);
result = ElkEdgePostProcessor.NormalizeSourceExitAngles(result, nodes);
result = ElkEdgePostProcessor.SpreadSourceDepartureJoins(result, nodes, minLineClearance);
result = ElkEdgePostProcessor.RepairBoundaryAnglesAndTargetApproaches(result, nodes, minLineClearance);
result = RestoreProtectedRepeatCollectorCorridors(result, edges, nodes);
result = ApplyHybridTerminalRuleCleanupRound(
result,
nodes,
layoutOptions.Direction,
minLineClearance);
result = ChoosePreferredBoundarySlotRepairLayout(
result,
ApplyPostSlotDetourClosure(result, nodes, minLineClearance),
nodes);
result = ChoosePreferredBoundarySlotRepairLayout(
result,
ElkEdgePostProcessor.SnapBoundarySlotAssignments(
result,
nodes,
minLineClearance,
enforceAllNodeEndpoints: true),
nodes);
return result;
}
}