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; } }