From 96dff1a7b12875ea9de57aae79fe43269212ea61 Mon Sep 17 00:00:00 2001 From: Malcolm Nixon Date: Thu, 2 Jul 2026 18:37:34 -0400 Subject: [PATCH 1/5] Adopt DemaConsulting.Rendering packages for layout and rendering Replace SysML2Tools' internal copy of the SysML-agnostic layout/rendering code with the released DemaConsulting.Rendering 0.1.0-beta.2 packages. Core now references DemaConsulting.Rendering.Layout (transitively Rendering + Abstractions); the Tool references the Svg and Skia renderer packages. The internal Svg and Png projects and the layout-engine, IR, and rendering-contract sources are removed. The four engine-using view strategies (General, Interconnection, ActionFlow, StateTransition) are rewritten from the internal engine APIs to the public facades via a new LayeredPlacement helper that wraps LayeredLayoutAlgorithm, plus ContainmentLayout and ConnectorRouter. beta.2 honors Direction=Down, so the vertical-flow views migrate faithfully. Stale engine and library-type unit tests are removed; the remaining strategy and rendering tests are re-pointed to the package namespaces. Builds green and all tests pass on net8.0/net9.0/net10.0. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- DemaConsulting.SysML2Tools.slnx | 4 - .../DemaConsulting.SysML2Tools.Core.csproj | 1 + .../Layout/BoxMetrics.cs | 53 - .../Layout/ConnectorLabelPlacer.cs | 171 -- .../Layout/Engine/ChannelRouter.cs | 588 ------ .../Layout/Engine/ContainmentPacker.cs | 116 -- .../Engine/InterconnectionLayoutEngine.cs | 120 -- .../Layout/Engine/Layered/AxisTransform.cs | 186 -- .../Engine/Layered/BrandesKopfPlacer.cs | 806 -------- .../Layout/Engine/Layered/ComponentPacker.cs | 468 ----- .../Engine/Layered/CrossingMinimizer.cs | 110 -- .../Layout/Engine/Layered/CycleBreaker.cs | 101 - .../Engine/Layered/HierarchyHandling.cs | 22 - .../Layout/Engine/Layered/ILayoutStage.cs | 22 - .../Layout/Engine/Layered/LayerAssigner.cs | 63 - .../Layout/Engine/Layered/LayeredGraph.cs | 159 -- .../Engine/Layered/LayeredLayoutMetrics.cs | 37 - .../Engine/Layered/LayeredLayoutPipeline.cs | 127 -- .../Layout/Engine/Layered/LayoutDirection.cs | 29 - .../Layout/Engine/Layered/LongEdgeJoiner.cs | 81 - .../Layout/Engine/Layered/LongEdgeSplitter.cs | 71 - .../Layout/Engine/Layered/OrthogonalRouter.cs | 311 ---- .../Layout/Engine/Layered/PortDistributor.cs | 131 -- .../Layout/Engine/Rect.cs | 14 - .../Internal/ActionFlowViewLayoutStrategy.cs | 117 +- .../Internal/BrowserViewLayoutStrategy.cs | 2 + .../Internal/GeneralViewLayoutStrategy.cs | 222 +-- .../Layout/Internal/GridViewLayoutStrategy.cs | 2 + .../InterconnectionViewLayoutStrategy.cs | 114 +- .../Layout/Internal/LayeredPlacement.cs | 92 + .../Layout/Internal/LayoutWarnings.cs | 2 + .../Internal/SequenceViewLayoutStrategy.cs | 2 + .../StateTransitionViewLayoutStrategy.cs | 78 +- .../Layout/LayoutBadge.cs | 41 - .../Layout/LayoutBand.cs | 36 - .../Layout/LayoutBox.cs | 61 - .../Layout/LayoutGrid.cs | 40 - .../Layout/LayoutLabel.cs | 61 - .../Layout/LayoutLifeline.cs | 33 - .../Layout/LayoutLine.cs | 75 - .../Layout/LayoutNode.cs | 13 - .../Layout/LayoutPort.cs | 36 - .../Layout/LayoutTree.cs | 23 - .../Rendering/DiagramRenderer.cs | 4 +- .../Rendering/ILayoutStrategy.cs | 3 +- .../Rendering/IRenderer.cs | 28 - .../Rendering/NotationMetrics.cs | 237 --- .../Rendering/RenderOptions.cs | 18 - .../Rendering/RenderOutput.cs | 23 - .../Rendering/Theme.cs | 113 -- .../DemaConsulting.SysML2Tools.Png.csproj | 91 - .../Fonts/NotoSans-Bold.ttf | Bin 838072 -> 0 bytes .../Fonts/NotoSans-BoldItalic.ttf | Bin 853344 -> 0 bytes .../Fonts/NotoSans-Italic.ttf | Bin 845312 -> 0 bytes .../Fonts/NotoSans-Regular.ttf | Bin 825628 -> 0 bytes .../Fonts/OFL.txt | 92 - .../PngRenderer.cs | 1581 ---------------- .../DemaConsulting.SysML2Tools.Svg.csproj | 72 - .../SvgRenderer.cs | 1176 ------------ .../DemaConsulting.SysML2Tools.Tool.csproj | 8 +- .../Render/RenderCommand.cs | 5 +- .../SelfTest/Validation.cs | 6 +- ...emaConsulting.SysML2Tools.Png.Tests.csproj | 66 - .../PngEndMarkerTests.cs | 165 -- .../PngRendererTests.cs | 416 ----- ...emaConsulting.SysML2Tools.Svg.Tests.csproj | 64 - .../SvgEndMarkerTests.cs | 115 -- .../SvgRendererTests.cs | 559 ------ .../DemaConsulting.SysML2Tools.Tests.csproj | 4 +- .../ActionFlowViewLayoutStrategyTests.cs | 3 +- .../Layout/BoxMetricsTests.cs | 75 - .../BrowserAndGridViewLayoutStrategyTests.cs | 3 +- .../Layout/ConnectorLabelPlacerTests.cs | 77 - .../Layout/Engine/ChannelRouterTests.cs | 314 ---- .../Layout/Engine/ContainmentPackerTests.cs | 172 -- .../InterconnectionLayoutEngineTests.cs | 172 -- .../Engine/Layered/AxisTransformTests.cs | 195 -- .../Engine/Layered/BrandesKopfPlacerTests.cs | 95 - .../Engine/Layered/ComponentPackerTests.cs | 348 ---- .../Engine/Layered/CrossingMinimizerTests.cs | 164 -- .../Engine/Layered/CycleBreakerTests.cs | 100 - .../Engine/Layered/LayerAssignerTests.cs | 60 - .../Engine/Layered/LayeredGraphTests.cs | 64 - .../Layered/LayeredLayoutPipelineTests.cs | 81 - .../LayeredPipelineEquivalenceTests.cs | 238 --- ...LegacyInterconnectionLayoutEngineOracle.cs | 1617 ----------------- .../Engine/Layered/LongEdgeJoinerTests.cs | 81 - .../Engine/Layered/LongEdgeSplitterTests.cs | 59 - .../Layered/OrthogonalRouterBackEdgeTests.cs | 319 ---- .../Engine/Layered/OrthogonalRouterTests.cs | 68 - .../Engine/Layered/PortDistributorTests.cs | 67 - .../Layout/GeneralViewLayoutStrategyTests.cs | 3 +- .../InterconnectionViewLayoutStrategyTests.cs | 3 +- .../Layout/LayoutTests.cs | 328 ---- .../Layout/SequenceViewLayoutStrategyTests.cs | 3 +- .../StateTransitionViewLayoutStrategyTests.cs | 3 +- .../Rendering/NotationMetricsTests.cs | 214 --- .../Rendering/RenderIntegrationTests.cs | 5 +- .../Rendering/RenderingTests.cs | 7 +- .../Rendering/ThemeTests.cs | 39 - 100 files changed, 330 insertions(+), 14334 deletions(-) delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/BoxMetrics.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/ConnectorLabelPlacer.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/Engine/ChannelRouter.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/Engine/ContainmentPacker.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/Engine/InterconnectionLayoutEngine.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/AxisTransform.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/BrandesKopfPlacer.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/ComponentPacker.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/CrossingMinimizer.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/CycleBreaker.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/HierarchyHandling.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/ILayoutStage.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LayerAssigner.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LayeredGraph.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LayeredLayoutMetrics.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LayeredLayoutPipeline.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LayoutDirection.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LongEdgeJoiner.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LongEdgeSplitter.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/OrthogonalRouter.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/PortDistributor.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Rect.cs create mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/Internal/LayeredPlacement.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/LayoutBadge.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/LayoutBand.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/LayoutBox.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/LayoutGrid.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/LayoutLabel.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/LayoutLifeline.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/LayoutLine.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/LayoutNode.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/LayoutPort.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Layout/LayoutTree.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Rendering/IRenderer.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Rendering/NotationMetrics.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Rendering/RenderOptions.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Rendering/RenderOutput.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Core/Rendering/Theme.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Png/DemaConsulting.SysML2Tools.Png.csproj delete mode 100644 src/DemaConsulting.SysML2Tools.Png/Fonts/NotoSans-Bold.ttf delete mode 100644 src/DemaConsulting.SysML2Tools.Png/Fonts/NotoSans-BoldItalic.ttf delete mode 100644 src/DemaConsulting.SysML2Tools.Png/Fonts/NotoSans-Italic.ttf delete mode 100644 src/DemaConsulting.SysML2Tools.Png/Fonts/NotoSans-Regular.ttf delete mode 100644 src/DemaConsulting.SysML2Tools.Png/Fonts/OFL.txt delete mode 100644 src/DemaConsulting.SysML2Tools.Png/PngRenderer.cs delete mode 100644 src/DemaConsulting.SysML2Tools.Svg/DemaConsulting.SysML2Tools.Svg.csproj delete mode 100644 src/DemaConsulting.SysML2Tools.Svg/SvgRenderer.cs delete mode 100644 test/DemaConsulting.SysML2Tools.Png.Tests/DemaConsulting.SysML2Tools.Png.Tests.csproj delete mode 100644 test/DemaConsulting.SysML2Tools.Png.Tests/PngEndMarkerTests.cs delete mode 100644 test/DemaConsulting.SysML2Tools.Png.Tests/PngRendererTests.cs delete mode 100644 test/DemaConsulting.SysML2Tools.Svg.Tests/DemaConsulting.SysML2Tools.Svg.Tests.csproj delete mode 100644 test/DemaConsulting.SysML2Tools.Svg.Tests/SvgEndMarkerTests.cs delete mode 100644 test/DemaConsulting.SysML2Tools.Svg.Tests/SvgRendererTests.cs delete mode 100644 test/DemaConsulting.SysML2Tools.Tests/Layout/BoxMetricsTests.cs delete mode 100644 test/DemaConsulting.SysML2Tools.Tests/Layout/ConnectorLabelPlacerTests.cs delete mode 100644 test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/ChannelRouterTests.cs delete mode 100644 test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/ContainmentPackerTests.cs delete mode 100644 test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/InterconnectionLayoutEngineTests.cs delete mode 100644 test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/AxisTransformTests.cs delete mode 100644 test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/BrandesKopfPlacerTests.cs delete mode 100644 test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/ComponentPackerTests.cs delete mode 100644 test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/CrossingMinimizerTests.cs delete mode 100644 test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/CycleBreakerTests.cs delete mode 100644 test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LayerAssignerTests.cs delete mode 100644 test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LayeredGraphTests.cs delete mode 100644 test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LayeredLayoutPipelineTests.cs delete mode 100644 test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LayeredPipelineEquivalenceTests.cs delete mode 100644 test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LegacyInterconnectionLayoutEngineOracle.cs delete mode 100644 test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LongEdgeJoinerTests.cs delete mode 100644 test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LongEdgeSplitterTests.cs delete mode 100644 test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/OrthogonalRouterBackEdgeTests.cs delete mode 100644 test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/OrthogonalRouterTests.cs delete mode 100644 test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/PortDistributorTests.cs delete mode 100644 test/DemaConsulting.SysML2Tools.Tests/Layout/LayoutTests.cs delete mode 100644 test/DemaConsulting.SysML2Tools.Tests/Rendering/NotationMetricsTests.cs delete mode 100644 test/DemaConsulting.SysML2Tools.Tests/Rendering/ThemeTests.cs diff --git a/DemaConsulting.SysML2Tools.slnx b/DemaConsulting.SysML2Tools.slnx index 64877af0..ee143e84 100644 --- a/DemaConsulting.SysML2Tools.slnx +++ b/DemaConsulting.SysML2Tools.slnx @@ -3,16 +3,12 @@ - - - - diff --git a/src/DemaConsulting.SysML2Tools.Core/DemaConsulting.SysML2Tools.Core.csproj b/src/DemaConsulting.SysML2Tools.Core/DemaConsulting.SysML2Tools.Core.csproj index 66f8242b..c67689bf 100644 --- a/src/DemaConsulting.SysML2Tools.Core/DemaConsulting.SysML2Tools.Core.csproj +++ b/src/DemaConsulting.SysML2Tools.Core/DemaConsulting.SysML2Tools.Core.csproj @@ -44,6 +44,7 @@ + diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/BoxMetrics.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/BoxMetrics.cs deleted file mode 100644 index 84070b86..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/BoxMetrics.cs +++ /dev/null @@ -1,53 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Rendering; - -namespace DemaConsulting.SysML2Tools.Layout; - -/// -/// Shared geometry helpers that compute box title-area and folder-tab heights from a -/// . Both the layout strategies and the renderers use these formulas so -/// that reserved space and drawn space stay consistent. -/// -public static class BoxMetrics -{ - /// - /// Computes the height of the folder tab drawn at the top-left of a - /// box. - /// - /// Theme providing font and padding metrics. - /// The tab height in logical pixels. - public static double FolderTabHeight(Theme theme) => - theme.FontSizeBody + 2.0 * theme.LabelPadding; - - /// - /// Computes the height of the title area of a box: the vertical space reserved at the top - /// for the optional keyword line and the bold name line. - /// - /// Theme providing font and padding metrics. - /// Whether the box has a name label. - /// Whether the box has a keyword line above the name. - /// The title-area height in logical pixels. - public static double TitleAreaHeight(Theme theme, bool hasLabel, bool hasKeyword) - { - if (!hasLabel && !hasKeyword) - { - return 0.0; - } - - var height = theme.LabelPadding; - if (hasKeyword) - { - height += theme.FontSizeBody + theme.LabelPadding; - } - - if (hasLabel) - { - height += theme.FontSizeTitle + theme.LabelPadding; - } - - return height; - } -} diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/ConnectorLabelPlacer.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/ConnectorLabelPlacer.cs deleted file mode 100644 index 26a8c6d5..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/ConnectorLabelPlacer.cs +++ /dev/null @@ -1,171 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -namespace DemaConsulting.SysML2Tools.Layout; - -/// -/// Computes non-overlapping screen positions for connector (midpoint) labels. -/// -/// -/// Each labelled line prefers the midpoint of its longest segment (an open run between boxes), but -/// when two labels would land on top of each other — for example where two connectors cross — the -/// placer falls back to a shorter segment or nudges the label perpendicular to its segment until it -/// no longer collides with an already-placed label. Lines are processed in the supplied order so the -/// result is deterministic. Both the SVG and PNG renderers share this logic so their label layouts -/// match. -/// -public static class ConnectorLabelPlacer -{ - /// Approximate width of one character as a fraction of the font size. - private const double CharWidthFactor = 0.6; - - /// Label box height as a multiple of the font size (cap height plus padding). - private const double HeightFactor = 1.3; - - /// Extra clearance, in logical pixels, added around each label box when testing overlap. - private const double Gap = 2.0; - - /// - /// Computes a label position for every line that has a . - /// - /// The lines to place labels for, in render order. - /// Body font size, in logical pixels, used to estimate label box sizes. - /// - /// A dictionary mapping each labelled line to its chosen (X, Y) label centre in logical pixels. - /// Lines without a label are omitted. - /// - public static IReadOnlyDictionary Place( - IEnumerable lines, - double fontSize) - { - ArgumentNullException.ThrowIfNull(lines); - - var placed = new List(); - var result = new Dictionary(); - - foreach (var line in lines) - { - if (line.MidpointLabel is null || line.Waypoints.Count == 0) - { - continue; - } - - var halfWidth = (EstimateTextWidth(line.MidpointLabel, fontSize) / 2.0) + Gap; - var halfHeight = (fontSize * HeightFactor / 2.0) + Gap; - - var position = ChoosePosition(line.Waypoints, halfWidth, halfHeight, placed); - placed.Add(new Rect(position.X - halfWidth, position.Y - halfHeight, position.X + halfWidth, position.Y + halfHeight)); - result[line] = position; - } - - return result; - } - - /// Estimates the rendered width of a label string in logical pixels. - /// The label text. - /// Font size in logical pixels. - /// The approximate text width. - private static double EstimateTextWidth(string text, double fontSize) => - text.Length * fontSize * CharWidthFactor; - - /// - /// Selects a label position for a single line, preferring the midpoint of the longest segment and - /// falling back to shorter segments or perpendicular nudges to avoid overlapping placed labels. - /// - /// The line's waypoints. - /// Half the label box width (including gap). - /// Half the label box height (including gap). - /// Boxes of labels already placed. - /// The chosen label centre. - private static (double X, double Y) ChoosePosition( - IReadOnlyList waypoints, - double halfWidth, - double halfHeight, - List placed) - { - if (waypoints.Count == 1) - { - return (waypoints[0].X, waypoints[0].Y); - } - - // Segment midpoints ordered by descending length (longest, most-open run first). - var segments = new List<(double Length, double X, double Y, double DirX, double DirY)>(); - for (var i = 0; i < waypoints.Count - 1; i++) - { - var a = waypoints[i]; - var b = waypoints[i + 1]; - var dx = b.X - a.X; - var dy = b.Y - a.Y; - var length = Math.Sqrt((dx * dx) + (dy * dy)); - var dirX = length > 1e-9 ? dx / length : 0.0; - var dirY = length > 1e-9 ? dy / length : 0.0; - segments.Add((length, (a.X + b.X) / 2.0, (a.Y + b.Y) / 2.0, dirX, dirY)); - } - - segments.Sort((p, q) => q.Length.CompareTo(p.Length)); - - // First pass: take the first segment midpoint that does not collide. - var firstClear = segments - .Where(seg => !Collides(seg.X, seg.Y, halfWidth, halfHeight, placed)) - .Select(seg => ((double X, double Y)?)(seg.X, seg.Y)) - .FirstOrDefault(); - if (firstClear is not null) - { - return firstClear.Value; - } - - // Second pass: nudge along the longest segment's perpendicular until clear. - var best = segments[0]; - var perpX = -best.DirY; - var perpY = best.DirX; - var step = (halfHeight * 2.0) + Gap; - for (var k = 1; k <= 4; k++) - { - var offset = step * k; - if (!Collides(best.X + (perpX * offset), best.Y + (perpY * offset), halfWidth, halfHeight, placed)) - { - return (best.X + (perpX * offset), best.Y + (perpY * offset)); - } - - if (!Collides(best.X - (perpX * offset), best.Y - (perpY * offset), halfWidth, halfHeight, placed)) - { - return (best.X - (perpX * offset), best.Y - (perpY * offset)); - } - } - - // Give up: fall back to the longest segment's midpoint. - return (best.X, best.Y); - } - - /// Tests whether a candidate label box overlaps any already-placed box. - /// Candidate box centre X. - /// Candidate box centre Y. - /// Half the candidate box width. - /// Half the candidate box height. - /// Boxes already placed. - /// if the candidate overlaps a placed box. - private static bool Collides(double centreX, double centreY, double halfWidth, double halfHeight, List placed) - { - var left = centreX - halfWidth; - var top = centreY - halfHeight; - var right = centreX + halfWidth; - var bottom = centreY + halfHeight; - foreach (var r in placed) - { - if (left < r.Right && right > r.Left && top < r.Bottom && bottom > r.Top) - { - return true; - } - } - - return false; - } - - /// An axis-aligned rectangle used for label overlap tests. - /// Left edge. - /// Top edge. - /// Right edge. - /// Bottom edge. - private readonly record struct Rect(double Left, double Top, double Right, double Bottom); -} diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/ChannelRouter.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/ChannelRouter.cs deleted file mode 100644 index 0d2248a1..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/ChannelRouter.cs +++ /dev/null @@ -1,588 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -namespace DemaConsulting.SysML2Tools.Layout.Engine; - -/// -/// The outcome of a routing request: the computed waypoints and whether the route had to cross an -/// obstacle (i.e. no obstacle-free orthogonal path could be found). -/// -/// Ordered orthogonal waypoints from source to target. -/// -/// when the router fell back to a path that may cross a box; this indicates a -/// degenerate (over-dense or overlapping) placement worth surfacing as a layout warning. -/// -internal readonly record struct RouteResult(IReadOnlyList Waypoints, bool Crossed); - -/// -/// A cost band: a region of the canvas where routing is cheaper (or dearer) than normal, used to bias -/// the router toward bundling wires along committed highways. -/// -/// True when the band spans a horizontal stripe (Y range), false for vertical (X range). -/// Lower bound of the band on its perpendicular axis, in logical pixels. -/// Upper bound of the band on its perpendicular axis, in logical pixels. -/// Cost factor applied to segments inside the band (0.6 cheaper, 1.0 neutral). -internal readonly record struct CostBand(bool IsHorizontal, double Start, double End, double Multiplier); - -/// -/// Routes orthogonal (right-angle) connector lines between two points while avoiding a set of -/// rectangular obstacles. -/// -/// -/// -/// The router builds a sparse "Hanan-style" routing grid whose vertical lines are the source and -/// target X coordinates plus each obstacle's left/right edges offset outward by a clearance, and -/// whose horizontal lines are the analogous Y coordinates. It then runs an A* search over the grid, -/// preferring straight runs via a turn penalty. Because the grid lines include the exact source and -/// target coordinates, the returned path starts at the source and ends at the target exactly, and -/// every segment is strictly horizontal or vertical. -/// -/// -/// The caller must exclude the boxes that own the source and target anchors from -/// obstacles; otherwise the very first segment would be blocked by the source's own box. -/// When no obstacle-free path exists, the router falls back to a simple L-shaped route so that a -/// result is always returned. -/// -/// -internal static class ChannelRouter -{ - /// Direction of travel along a segment, used for turn-penalty accounting. - private enum Dir - { - /// No prior direction (search start). - None, - - /// Horizontal travel. - Horizontal, - - /// Vertical travel. - Vertical, - } - - /// - /// Computes an orthogonal route from to - /// avoiding the interiors of the given obstacles. - /// - /// Start point (typically an anchor on the source box boundary). - /// End point (typically an anchor on the target box boundary). - /// - /// Rectangles to route around, excluding the boxes that own the source and target anchors. - /// - /// Minimum gap kept between routed segments and obstacles. - /// - /// Optional box side the source anchor sits on. When given, the route leaves the source with a - /// short stub perpendicular to that side before routing freely, so connectors exit boxes cleanly. - /// - /// Optional box side the target anchor sits on; see . - /// Optional cost bands biasing the route toward highway corridors; null leaves cost neutral. - /// - /// An ordered list of waypoints beginning with and ending with - /// . Consecutive waypoints always share an X or a Y coordinate. - /// - public static IReadOnlyList Route( - Point2D source, - Point2D target, - IReadOnlyList obstacles, - double clearance, - PortSide? sourceSide = null, - PortSide? targetSide = null, - IReadOnlyList? costBands = null) => - RouteWithStatus(source, target, obstacles, clearance, sourceSide, targetSide, costBands).Waypoints; - - /// - /// Computes an orthogonal route and reports whether it had to cross an obstacle. The route is - /// attempted with progressively smaller clearances; only when no obstacle-free orthogonal path - /// exists at any clearance does it fall back to a (possibly crossing) L-shape, in which case - /// is . - /// - /// Start point (typically an anchor on the source box boundary). - /// End point (typically an anchor on the target box boundary). - /// Rectangles to route around, excluding the source and target boxes. - /// Preferred gap between routed segments and obstacles. - /// Optional box side the source anchor sits on (adds a perpendicular stub). - /// Optional box side the target anchor sits on (adds a perpendicular stub). - /// Optional cost bands biasing the route toward highway corridors; null leaves cost neutral. - /// The waypoints and a flag indicating whether the route crosses an obstacle. - public static RouteResult RouteWithStatus( - Point2D source, - Point2D target, - IReadOnlyList obstacles, - double clearance, - PortSide? sourceSide = null, - PortSide? targetSide = null, - IReadOnlyList? costBands = null) - { - ArgumentNullException.ThrowIfNull(source); - ArgumentNullException.ThrowIfNull(target); - ArgumentNullException.ThrowIfNull(obstacles); - - // Step off each anchor's box edge with a perpendicular stub so connectors enter and leave - // boxes at right angles instead of sliding along the edge. The stub is capped so that two - // stubs facing each other across a small gap meet at the midline instead of overshooting - // (which would force a back-and-forth jog right at the arrowhead). - // FUTURE (Phase 14c cleanup): replace this magic 8.0 with theme.ConnectorApproachZone. - var stub = clearance + 8.0; - var routeSource = StepOff(source, sourceSide, StubLength(source, sourceSide, target, stub)); - var routeTarget = StepOff(target, targetSide, StubLength(target, targetSide, source, stub)); - - // Try to find an obstacle-free orthogonal path, preferring the largest clearance that works. - foreach (var c in ClearanceLevels(clearance)) - { - var xs = BuildAxis(routeSource.X, routeTarget.X, obstacles, c, horizontal: true); - var ys = BuildAxis(routeSource.Y, routeTarget.Y, obstacles, c, horizontal: false); - - var path = AStar( - xs, ys, - IndexOf(xs, routeSource.X), IndexOf(ys, routeSource.Y), - IndexOf(xs, routeTarget.X), IndexOf(ys, routeTarget.Y), - obstacles, c, costBands); - - if (path is not null) - { - return new RouteResult(Finalize(source, target, sourceSide, targetSide, path), Crossed: false); - } - } - - // No clean path at any clearance: fall back to the least-bad L-shape (it may cross a box). - var fallback = BuildObstacleAwareFallback(routeSource, routeTarget, obstacles); - return new RouteResult(Finalize(source, target, sourceSide, targetSide, fallback), Crossed: true); - } - - /// - /// Yields the clearances to attempt, from the requested value down to zero, so the router prefers - /// a spacious route but still hugs box edges (clearance 0) rather than crossing them. - /// - private static IEnumerable ClearanceLevels(double clearance) - { - var seen = new HashSet(); - foreach (var c in new[] { clearance, clearance / 2.0, clearance / 4.0, 0.0 }) - { - var v = Math.Max(0.0, c); - if (seen.Add(v)) - { - yield return v; - } - } - } - - /// - /// Re-attaches the original anchor points outside their stubs and simplifies the path. - /// - private static IReadOnlyList Finalize( - Point2D source, - Point2D target, - PortSide? sourceSide, - PortSide? targetSide, - IReadOnlyList path) - { - var full = new List(); - if (sourceSide is not null) - { - full.Add(source); - } - - full.AddRange(path); - - if (targetSide is not null) - { - full.Add(target); - } - - return Simplify(full); - } - - /// - /// Returns the point offset from by in the - /// outward-normal direction of , or the anchor unchanged when no side. - /// - private static Point2D StepOff(Point2D anchor, PortSide? side, double distance) => side switch - { - PortSide.Top => new Point2D(anchor.X, anchor.Y - distance), - PortSide.Bottom => new Point2D(anchor.X, anchor.Y + distance), - PortSide.Left => new Point2D(anchor.X - distance, anchor.Y), - PortSide.Right => new Point2D(anchor.X + distance, anchor.Y), - _ => anchor, - }; - - /// - /// Returns the stub length to step off 's edge: the base length, but - /// capped to half the distance to measured along the side's outward - /// normal when lies in that direction. This keeps two stubs that face - /// each other across a narrow gap from overshooting past the midline (which produces a visible - /// reversal at the connector's end). When the projection is exactly zero (ports at the same - /// coordinate on facing sides, e.g. touching-edge boxes), the stub collapses to zero so the - /// connector routes directly between the ports without stepping into the opposite box. - /// - private static double StubLength(Point2D anchor, PortSide? side, Point2D other, double baseStub) - { - var projection = side switch - { - PortSide.Top => anchor.Y - other.Y, - PortSide.Bottom => other.Y - anchor.Y, - PortSide.Left => anchor.X - other.X, - PortSide.Right => other.X - anchor.X, - _ => double.PositiveInfinity, - }; - - return projection >= 0 ? Math.Min(baseStub, projection / 2.0) : baseStub; - } - - /// - /// Builds the sorted, de-duplicated set of grid coordinates for one axis: the two endpoint - /// coordinates plus each obstacle's near/far edge offset outward by the clearance. - /// - private static double[] BuildAxis( - double a, - double b, - IReadOnlyList obstacles, - double clearance, - bool horizontal) - { - var set = new SortedSet { a, b }; - foreach (var r in obstacles) - { - if (horizontal) - { - set.Add(r.X - clearance); - set.Add(r.X + r.Width + clearance); - } - else - { - set.Add(r.Y - clearance); - set.Add(r.Y + r.Height + clearance); - } - } - - return [.. set]; - } - - /// - /// Returns the index of the grid line equal to . The value is always - /// present because the axis was built to include it. - /// - private static int IndexOf(double[] axis, double value) - { - for (var i = 0; i < axis.Length; i++) - { - if (Math.Abs(axis[i] - value) < 1e-9) - { - return i; - } - } - - // Should never happen: endpoint coordinates are always added to the axis. - return 0; - } - - /// - /// Runs an A* search over the grid, returning the sequence of grid points from start to goal, - /// or when no obstacle-free path exists. - /// - private static List? AStar( - double[] xs, - double[] ys, - int startI, - int startJ, - int goalI, - int goalJ, - IReadOnlyList obstacles, - double clearance, - IReadOnlyList? costBands) - { - var nx = xs.Length; - var ny = ys.Length; - - // Visited cost keyed by (i, j, direction) so straight-through and turning arrivals differ. - var best = new Dictionary<(int, int, Dir), double>(); - var cameFrom = new Dictionary<(int, int, Dir), (int, int, Dir)>(); - var open = new PriorityQueue<(int I, int J, Dir D), double>(); - - var startState = (startI, startJ, Dir.None); - best[startState] = 0.0; - open.Enqueue((startI, startJ, Dir.None), Heuristic(xs, ys, startI, startJ, goalI, goalJ)); - - // Turn penalty expressed in pixels; comparable to a short straight run so detours that - // remove a bend are preferred only when not much longer. - const double TurnPenalty = 20.0; - - while (open.Count > 0) - { - var (ci, cj, cd) = open.Dequeue(); - var current = (ci, cj, cd); - var g = best[current]; - - if (ci == goalI && cj == goalJ) - { - return Reconstruct(xs, ys, cameFrom, current); - } - - foreach (var (ni, nj, nd) in Neighbors(ci, cj, nx, ny)) - { - // Skip moves whose segment passes within the clearance of an obstacle. - if (SegmentBlocked(xs, ys, ci, cj, ni, nj, obstacles, clearance)) - { - continue; - } - - var stepLength = nd == Dir.Horizontal - ? Math.Abs(xs[ni] - xs[ci]) - : Math.Abs(ys[nj] - ys[cj]); - var bandMultiplier = SegmentCostMultiplier(xs, ys, ci, cj, ni, nj, costBands); - var turnCost = cd != Dir.None && cd != nd ? TurnPenalty : 0.0; - var tentative = g + (stepLength * bandMultiplier) + turnCost; - - var neighborState = (ni, nj, nd); - if (best.TryGetValue(neighborState, out var existing) && tentative >= existing) - { - continue; - } - - best[neighborState] = tentative; - cameFrom[neighborState] = current; - var f = tentative + Heuristic(xs, ys, ni, nj, goalI, goalJ); - open.Enqueue(neighborState, f); - } - } - - return null; - } - - /// Enumerates the four grid neighbors of a node along with the travel direction. - private static IEnumerable<(int I, int J, Dir D)> Neighbors(int i, int j, int nx, int ny) - { - if (i + 1 < nx) - { - yield return (i + 1, j, Dir.Horizontal); - } - - if (i - 1 >= 0) - { - yield return (i - 1, j, Dir.Horizontal); - } - - if (j + 1 < ny) - { - yield return (i, j + 1, Dir.Vertical); - } - - if (j - 1 >= 0) - { - yield return (i, j - 1, Dir.Vertical); - } - } - - /// Manhattan-distance heuristic between two grid nodes. - private static double Heuristic(double[] xs, double[] ys, int i, int j, int goalI, int goalJ) => - Math.Abs(xs[i] - xs[goalI]) + Math.Abs(ys[j] - ys[goalJ]); - - /// - /// Returns the cheapest cost multiplier for a segment by testing whether its midpoint lies inside - /// any cost band; a highway band (multiplier < 1) makes bundled runs cheaper so the router - /// prefers them. When no band applies the cost is neutral (1.0). - /// - private static double SegmentCostMultiplier( - double[] xs, - double[] ys, - int i1, - int j1, - int i2, - int j2, - IReadOnlyList? bands) - { - if (bands is null || bands.Count == 0) - { - return 1.0; - } - - // Sample the segment midpoint; bands are stripes, so a point test is enough to classify it. - var mx = (xs[i1] + xs[i2]) / 2.0; - var my = (ys[j1] + ys[j2]) / 2.0; - var best = 1.0; - foreach (var band in bands) - { - var coord = band.IsHorizontal ? my : mx; - if (coord >= band.Start && coord <= band.End) - { - best = Math.Min(best, band.Multiplier); - } - } - - return best; - } - - /// - /// Determines whether the straight grid segment between two adjacent nodes passes within - /// of any obstacle (the obstacle rectangles are inflated by the - /// clearance and tested with strict inequalities, so a segment exactly one clearance away is - /// allowed). - /// - private static bool SegmentBlocked( - double[] xs, - double[] ys, - int i1, - int j1, - int i2, - int j2, - IReadOnlyList obstacles, - double clearance) - { - if (j1 == j2) - { - // Horizontal segment at y = ys[j1] spanning the two x grid lines. - var y = ys[j1]; - var xa = Math.Min(xs[i1], xs[i2]); - var xb = Math.Max(xs[i1], xs[i2]); - foreach (var r in obstacles) - { - if (r.Y - clearance < y && y < r.Y + r.Height + clearance && - Math.Max(xa, r.X - clearance) < Math.Min(xb, r.X + r.Width + clearance)) - { - return true; - } - } - } - else - { - // Vertical segment at x = xs[i1] spanning the two y grid lines. - var x = xs[i1]; - var ya = Math.Min(ys[j1], ys[j2]); - var yb = Math.Max(ys[j1], ys[j2]); - foreach (var r in obstacles) - { - if (r.X - clearance < x && x < r.X + r.Width + clearance && - Math.Max(ya, r.Y - clearance) < Math.Min(yb, r.Y + r.Height + clearance)) - { - return true; - } - } - } - - return false; - } - - /// Reconstructs the grid-point path by walking the came-from chain back to the start. - private static List Reconstruct( - double[] xs, - double[] ys, - Dictionary<(int, int, Dir), (int, int, Dir)> cameFrom, - (int, int, Dir) goal) - { - var points = new List(); - var cursor = goal; - while (true) - { - var (i, j, _) = cursor; - points.Add(new Point2D(xs[i], ys[j])); - if (!cameFrom.TryGetValue(cursor, out var prev)) - { - break; - } - - cursor = prev; - } - - points.Reverse(); - return points; - } - - /// Collapses consecutive collinear waypoints into single straight segments. - private static IReadOnlyList Simplify(List points) - { - if (points.Count <= 2) - { - return points; - } - - var result = new List { points[0] }; - for (var k = 1; k < points.Count - 1; k++) - { - var prev = result[^1]; - var cur = points[k]; - var next = points[k + 1]; - - // Drop exact duplicates of the previous point (stubs can introduce these). - if (Math.Abs(prev.X - cur.X) < 1e-9 && Math.Abs(prev.Y - cur.Y) < 1e-9) - { - continue; - } - - // Drop the middle point only when prev→cur→next is collinear AND monotonic (same - // direction). A direction reversal (U-turn) on the same axis must be preserved, e.g. a - // perpendicular stub that briefly overshoots before entering a box. - var collinearX = Math.Abs(prev.X - cur.X) < 1e-9 && Math.Abs(cur.X - next.X) < 1e-9 && - (cur.Y - prev.Y) * (next.Y - cur.Y) >= 0; - var collinearY = Math.Abs(prev.Y - cur.Y) < 1e-9 && Math.Abs(cur.Y - next.Y) < 1e-9 && - (cur.X - prev.X) * (next.X - cur.X) >= 0; - if (!collinearX && !collinearY) - { - result.Add(cur); - } - } - - // Append the final point unless it duplicates the current last point. - if (Math.Abs(result[^1].X - points[^1].X) >= 1e-9 || Math.Abs(result[^1].Y - points[^1].Y) >= 1e-9) - { - result.Add(points[^1]); - } - - return result; - } - - /// - /// Builds the least-bad L-shaped fallback route used when A* cannot find an obstacle-free path: - /// it tries the horizontal-first and vertical-first elbows and returns whichever crosses fewer - /// obstacles. - /// - private static IReadOnlyList BuildObstacleAwareFallback( - Point2D source, - Point2D target, - IReadOnlyList obstacles) - { - // Aligned endpoints need only a straight segment. - if (Math.Abs(source.X - target.X) < 1e-9 || Math.Abs(source.Y - target.Y) < 1e-9) - { - return [source, target]; - } - - // Two candidate elbows: horizontal-first and vertical-first. - var horizontalFirst = new List { source, new(target.X, source.Y), target }; - var verticalFirst = new List { source, new(source.X, target.Y), target }; - - var hCrossings = CountCrossings(horizontalFirst, obstacles); - var vCrossings = CountCrossings(verticalFirst, obstacles); - - return hCrossings <= vCrossings ? horizontalFirst : verticalFirst; - } - - /// Counts how many (segment, obstacle) pairs along a path cross an obstacle interior. - private static int CountCrossings(IReadOnlyList path, IReadOnlyList obstacles) - { - var count = 0; - for (var i = 0; i < path.Count - 1; i++) - { - var a = path[i]; - var b = path[i + 1]; - count += obstacles.Count(r => SegmentCrossesRect(a, b, r)); - } - - return count; - } - - /// Returns true when an axis-aligned segment passes through a rectangle's strict interior. - private static bool SegmentCrossesRect(Point2D a, Point2D b, Rect r) - { - if (Math.Abs(a.Y - b.Y) < 1e-9) - { - var y = a.Y; - var xa = Math.Min(a.X, b.X); - var xb = Math.Max(a.X, b.X); - return r.Y < y && y < r.Y + r.Height && Math.Max(xa, r.X) < Math.Min(xb, r.X + r.Width); - } - - var x = a.X; - var ya = Math.Min(a.Y, b.Y); - var yb = Math.Max(a.Y, b.Y); - return r.X < x && x < r.X + r.Width && Math.Max(ya, r.Y) < Math.Min(yb, r.Y + r.Height); - } -} diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/ContainmentPacker.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/ContainmentPacker.cs deleted file mode 100644 index 235f3e70..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/ContainmentPacker.cs +++ /dev/null @@ -1,116 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -namespace DemaConsulting.SysML2Tools.Layout.Engine; - -/// -/// A single item to be packed, identified only by its size. Callers map the packed -/// rectangles back to their model elements by index. -/// -/// Required width of the item in logical pixels. -/// Required height of the item in logical pixels. -internal readonly record struct PackItem(double Width, double Height); - -/// -/// A packed rectangle: the position assigned to the item at the same index in the input list. -/// -/// Absolute X coordinate of the left edge in logical pixels. -/// Absolute Y coordinate of the top edge in logical pixels. -/// Width of the item in logical pixels. -/// Height of the item in logical pixels. -internal readonly record struct PackedRect(double X, double Y, double Width, double Height); - -/// -/// The result of a packing operation. -/// -/// Total width of the packed region (including outer padding) in logical pixels. -/// Total height of the packed region (including outer padding) in logical pixels. -/// -/// Packed rectangles, one per input item in the same order. Each rectangle is positioned -/// relative to the region origin (0, 0). -/// -internal sealed record PackResult(double Width, double Height, IReadOnlyList Rects); - -/// -/// A shelf (row) bin-packing engine. Places a sequence of variable-size items left to right, -/// wrapping to a new row when the next item would exceed the maximum content width, and sizes -/// the enclosing region to fit all items plus uniform outer padding. -/// -/// -/// The algorithm is deterministic and preserves input order. It guarantees that no two packed -/// rectangles overlap and that every rectangle lies within the returned region bounds. An item -/// wider than the available content width is placed alone on its own row at the content width's -/// left edge (it may extend the region width). -/// -internal static class ContainmentPacker -{ - /// - /// Packs the given items into rows within . - /// - /// Items to pack, in the desired visual order. - /// - /// Maximum width of the content area (excluding outer padding). Rows wrap when exceeded. - /// Must be positive. - /// - /// Gap between adjacent items in the same row. - /// Gap between adjacent rows. - /// Uniform padding added around the entire packed region. - /// A describing item positions and the region size. - public static PackResult Pack( - IReadOnlyList items, - double maxContentWidth, - double horizontalGap, - double verticalGap, - double padding) - { - ArgumentNullException.ThrowIfNull(items); - - // Empty input yields a zero-content region consisting only of padding on both axes. - if (items.Count == 0) - { - return new PackResult(2.0 * padding, 2.0 * padding, []); - } - - var rects = new PackedRect[items.Count]; - - var cursorX = padding; - var rowTopY = padding; - var rowHeight = 0.0; - var widestContentRight = padding; - var isFirstInRow = true; - - for (var i = 0; i < items.Count; i++) - { - var item = items[i]; - - // Determine whether this item starts a new row: it does not fit in the current row - // and the current row already has at least one item. - var prospectiveRight = cursorX + item.Width; - var contentRightLimit = padding + maxContentWidth; - if (!isFirstInRow && prospectiveRight > contentRightLimit) - { - // Wrap to a new row below the tallest item of the current row. The wrapped item - // is placed immediately below as the sole occupant of the new row; isFirstInRow is - // reset to false at the end of this iteration once the item has been placed. - rowTopY += rowHeight + verticalGap; - cursorX = padding; - rowHeight = 0.0; - } - - rects[i] = new PackedRect(cursorX, rowTopY, item.Width, item.Height); - - // Advance the horizontal cursor past this item plus a trailing gap. - cursorX += item.Width + horizontalGap; - rowHeight = Math.Max(rowHeight, item.Height); - widestContentRight = Math.Max(widestContentRight, rects[i].X + item.Width); - isFirstInRow = false; - } - - // Total size: widest row's right edge + padding; last row's bottom + padding. - var totalWidth = widestContentRight + padding; - var totalHeight = rowTopY + rowHeight + padding; - - return new PackResult(totalWidth, totalHeight, rects); - } -} diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/InterconnectionLayoutEngine.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/InterconnectionLayoutEngine.cs deleted file mode 100644 index 21db85da..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/InterconnectionLayoutEngine.cs +++ /dev/null @@ -1,120 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Layout.Engine.Layered; - -using static DemaConsulting.SysML2Tools.Layout.Engine.Layered.LayeredLayoutMetrics; - -namespace DemaConsulting.SysML2Tools.Layout.Engine; - -/// -/// A node to be placed by the , identified by its size. -/// -/// Width of the node's bounding box in logical pixels. -/// Height of the node's bounding box in logical pixels. -internal readonly record struct LayerNode(double Width, double Height); - -/// -/// A directed edge (from a source node to a target node, by index) used for layering. -/// -/// Index of the source node. -/// Index of the target node. -internal readonly record struct LayerEdge(int Source, int Target); - -/// -/// The result of an interconnection layout pass. -/// -/// Placed rectangles, one per input node in the same order. -/// Total diagram width in logical pixels, including padding. -/// Total diagram height in logical pixels, including padding. -/// Assigned Sugiyama layer index for each node, in node order. -/// Orthogonal connector waypoints for each acyclic edge. -internal sealed record LayerResult( - IReadOnlyList Rects, - double TotalWidth, - double TotalHeight, - IReadOnlyList NodeLayers, - IReadOnlyList> ConnectorWaypoints) -{ - /// - /// Gets the acyclic edge set (by node index), index-aligned with . - /// - /// - /// The layered pipeline's cycle-breaking stage drops self-loops, de-duplicates identical directed - /// pairs, and reverses back edges, so holds one polyline per - /// acyclic edge rather than one per input edge. Consumers key a - /// (source, target) → polyline lookup on this list (reversing the polyline for a reversed - /// back edge) to recover the route for each of their own input edges. - /// - public IReadOnlyList AcyclicEdges { get; init; } = []; -} - -/// -/// Thin façade over the reusable layered layout pipeline (see -/// ). -/// Assembles the default ELK-layered stage sequence and adapts its output to the -/// contract consumed by the interconnection view strategy. -/// -/// -/// All placement and routing logic lives in the individual pipeline stages under -/// Layout/Engine/Layered/. This type exists only to preserve the original public entry -/// point and result shape; it is behavior-preserving with respect to the previous monolithic -/// implementation (verified byte for byte by the pipeline-equivalence tests). -/// -internal static class InterconnectionLayoutEngine -{ - /// - /// Computes a full Sugiyama layered placement and ELK-style slot routing for the given nodes - /// and directed edges, returning box positions and orthogonal connector waypoints. - /// - /// Input nodes to place, in caller order. - /// Directed edges between nodes (by index). - /// Placement result with rects, layer assignments, and connector waypoints. - public static LayerResult Place( - IReadOnlyList nodes, - IReadOnlyList edges) - { - ArgumentNullException.ThrowIfNull(nodes); - ArgumentNullException.ThrowIfNull(edges); - - var n = nodes.Count; - if (n == 0) - { - return new LayerResult([], 2.0 * Padding, 2.0 * Padding, [], []); - } - - var graph = new LayeredGraph(nodes, edges, LayoutDirection.Right); - var pipeline = LayeredLayoutPipeline.Builder() - .Direction(LayoutDirection.Right) - .Hierarchy(HierarchyHandling.Flat) - .AddDefaultStages() - .Build(); - pipeline.Run(graph); - - var augX = graph.AugX; - var augY = graph.AugY; - var columnX = graph.ColumnX; - var maxColWidth = graph.MaxColWidth; - - // Assemble result. - var rects = new Rect[n]; - for (var i = 0; i < n; i++) - { - rects[i] = new Rect(augX[i], augY[i], nodes[i].Width, nodes[i].Height); - } - - var lastLayer = columnX.Length - 1; - var totalWidth = columnX[lastLayer] + maxColWidth[lastLayer] + Padding; - var totalHeight = Padding; - for (var i = 0; i < n; i++) - { - totalHeight = Math.Max(totalHeight, augY[i] + nodes[i].Height + Padding); - } - - return new LayerResult(rects, totalWidth, totalHeight, graph.NodeLayers, graph.Waypoints) - { - AcyclicEdges = graph.Acyclic, - }; - } -} diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/AxisTransform.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/AxisTransform.cs deleted file mode 100644 index 8a937d7d..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/AxisTransform.cs +++ /dev/null @@ -1,186 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -namespace DemaConsulting.SysML2Tools.Layout.Engine.Layered; - -/// -/// Pipeline stage that maps the abstract along/cross coordinates computed by the earlier stages -/// onto screen coordinates for the requested . -/// -/// -/// -/// The direction-agnostic stages always compute in the -equivalent -/// abstract axes: along = +X (layer progression) and cross = +Y (within-layer order). A -/// node's along-extent is its and its cross-extent its -/// . This stage is the single place that converts those abstract -/// coordinates into screen coordinates, isolating all direction handling to one unit. -/// -/// -/// Mapping a layout top-to-bottom or bottom-to-top additionally requires the along-axis to be the node -/// height rather than its width. A purely-final coordinate remap is therefore insufficient -/// for /: the input node sizes must -/// first be normalized (width↔height swapped) so the stages space layers by height. That -/// normalization is performed by , which the pipeline calls before the -/// stage loop. is a literal no-op here (output byte-identical) and -/// only reflects the X axis without swapping. -/// -/// -internal sealed class AxisTransform : ILayoutStage -{ - /// - /// Normalizes the input node axes for the requested direction before the stages run. - /// - /// The graph whose node sizes may be swapped in place. - /// - /// For / the node width and - /// height are swapped so the along-axis (layer spacing) is driven by the node height. For - /// / this is a no-op, which - /// keeps those pipelines byte-identical. - /// - public static void NormalizeInputAxes(LayeredGraph graph) - { - ArgumentNullException.ThrowIfNull(graph); - - if (graph.Direction is LayoutDirection.Down or LayoutDirection.Up) - { - graph.SwapNodeAxes(); - } - } - - /// - public void Apply(LayeredGraph graph) - { - ArgumentNullException.ThrowIfNull(graph); - - if (graph.Direction == LayoutDirection.Right) - { - // RIGHT identity: coordinates are already in screen space; nothing to transform. - return; - } - - // LEFT/UP reflect the along-axis about its maximum; DOWN is a pure transpose (max unused). - var maxAlong = ComputeMaxAlong(graph); - - RemapNodes(graph, maxAlong); - RemapWaypoints(graph, maxAlong); - } - - /// - /// Maps each augmented-node abstract top-left onto its screen top-left for the direction. - /// - /// The graph whose node coordinates are replaced. - /// The maximum along (abstract +X) coordinate, used by LEFT/UP reflection. - private static void RemapNodes(LayeredGraph graph, double maxAlong) - { - var augX = graph.AugX; - var augY = graph.AugY; - var augNodes = graph.AugNodes; - - var newX = new double[augX.Length]; - var newY = new double[augY.Length]; - for (var i = 0; i < augX.Length; i++) - { - var alongExtent = i < augNodes.Count ? augNodes[i].Width : 0.0; - (newX[i], newY[i]) = MapNodeTopLeft(graph.Direction, augX[i], augY[i], alongExtent, maxAlong); - } - - graph.AugX = newX; - graph.AugY = newY; - } - - /// Maps every waypoint of every original edge onto screen space for the direction. - /// The graph whose waypoints are replaced. - /// The maximum along (abstract +X) coordinate, used by LEFT/UP reflection. - private static void RemapWaypoints(LayeredGraph graph, double maxAlong) - { - var waypoints = graph.Waypoints; - var mapped = new IReadOnlyList[waypoints.Count]; - for (var e = 0; e < waypoints.Count; e++) - { - var polyline = waypoints[e]; - var points = new Point2D[polyline.Count]; - for (var p = 0; p < polyline.Count; p++) - { - points[p] = MapPoint(graph.Direction, polyline[p], maxAlong); - } - - mapped[e] = points; - } - - graph.Waypoints = mapped; - } - - /// Maps a single abstract point onto screen space for the given direction. - /// The requested layout flow direction. - /// The abstract-space point (along = X, cross = Y). - /// The maximum along coordinate, used by LEFT/UP reflection. - /// The screen-space point. - private static Point2D MapPoint(LayoutDirection direction, Point2D point, double maxAlong) - { - // S2234: the DOWN/UP transpose deliberately feeds the cross coordinate as screen X and the - // along coordinate as screen Y; the "reversed" argument order is the intended axis swap. -#pragma warning disable S2234 - return direction switch - { - // DOWN: pure transpose (along -> screen Y, cross -> screen X). - LayoutDirection.Down => new Point2D(point.Y, point.X), - - // LEFT: reflect the along-axis; cross is unchanged. - LayoutDirection.Left => new Point2D(maxAlong - point.X, point.Y), - - // UP: transpose with the along-axis reflected into screen Y. - LayoutDirection.Up => new Point2D(point.Y, maxAlong - point.X), - - _ => point, - }; -#pragma warning restore S2234 - } - - /// Maps an abstract node top-left onto its screen top-left for the given direction. - /// The requested layout flow direction. - /// The node's abstract along (X) coordinate. - /// The node's abstract cross (Y) coordinate. - /// The node's along-extent (its abstract width). - /// The maximum along coordinate, used by LEFT/UP reflection. - /// The node's screen top-left (drawn there with its intrinsic width and height). - private static (double X, double Y) MapNodeTopLeft( - LayoutDirection direction, - double alongTopLeft, - double crossTopLeft, - double alongExtent, - double maxAlong) => direction switch - { - LayoutDirection.Down => (crossTopLeft, alongTopLeft), - LayoutDirection.Left => (maxAlong - (alongTopLeft + alongExtent), crossTopLeft), - LayoutDirection.Up => (crossTopLeft, maxAlong - (alongTopLeft + alongExtent)), - _ => (alongTopLeft, crossTopLeft), - }; - - /// - /// Returns the maximum along (abstract +X) coordinate over all augmented-node far corners and all - /// waypoint X values, which LEFT/UP reflect about. - /// - /// The placed and routed graph. - /// The maximum along coordinate (0 when the graph is empty). - private static double ComputeMaxAlong(LayeredGraph graph) - { - var max = 0.0; - var augX = graph.AugX; - var augNodes = graph.AugNodes; - for (var i = 0; i < augX.Length && i < augNodes.Count; i++) - { - max = Math.Max(max, augX[i] + augNodes[i].Width); - } - - foreach (var polyline in graph.Waypoints) - { - foreach (var point in polyline) - { - max = Math.Max(max, point.X); - } - } - - return max; - } -} diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/BrandesKopfPlacer.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/BrandesKopfPlacer.cs deleted file mode 100644 index 40a39b62..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/BrandesKopfPlacer.cs +++ /dev/null @@ -1,806 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// -using static DemaConsulting.SysML2Tools.Layout.Engine.Layered.LayeredLayoutMetrics; - -namespace DemaConsulting.SysML2Tools.Layout.Engine.Layered; - -/// -/// Pipeline stage that assigns absolute X and Y coordinates to all augmented nodes using ELK's -/// horizontal placement and the Brandes-Kopf balanced four-layout Y placement. -/// -internal sealed class BrandesKopfPlacer : ILayoutStage -{ - /// - public void Apply(LayeredGraph graph) - { - ArgumentNullException.ThrowIfNull(graph); - var (augX, augY, columnX, maxColWidth) = AssignCoordinatesAug(graph.AugNodes, graph.Groups, graph.AugEdges); - graph.AugX = augX; - graph.AugY = augY; - graph.ColumnX = columnX; - graph.MaxColWidth = maxColWidth; - } - - /// - /// Assigns absolute X and Y coordinates to all augmented nodes. - /// - /// - /// - /// Y assignment follows the Brandes-Köpf (BK) four-layout balanced algorithm - /// (BKNodePlacer + BKAligner + BKCompactor): four independent - /// vertical alignments (DOWN/UP × RIGHT/LEFT) are compacted and their per-node medians - /// averaged to produce port-aligned, crossing-minimized vertical positions. - /// - /// - /// X assignment follows ELK's LGraphUtil.placeNodesHorizontally: dummies are placed at - /// the horizontal center of their column; real nodes are left-aligned to their column start. - /// Corridor widths are derived from sub-edge counts per corridor. - /// - /// - private static (double[] AugX, double[] AugY, double[] ColumnX, double[] MaxColWidth) AssignCoordinatesAug( - List augNodes, - List> groups, - List augEdges) - { - var layerCount = groups.Count; - var numAug = augNodes.Count; - - // Maximum real-node width per layer (dummies have width 0). - var maxColWidth = new double[layerCount]; - for (var i = 0; i < numAug; i++) - { - if (!augNodes[i].IsDummy) - { - maxColWidth[augNodes[i].Layer] = Math.Max(maxColWidth[augNodes[i].Layer], augNodes[i].Width); - } - } - - // Sub-edges per corridor: one sub-edge per augEdge, keyed on source layer. - var corridorEdgeCounts = new int[Math.Max(1, layerCount - 1)]; - foreach (var ae in augEdges) - { - var l = augNodes[ae.Source].Layer; - if (l >= 0 && l < corridorEdgeCounts.Length) - { - corridorEdgeCounts[l]++; - } - } - - // Column X positions. Corridor width: ELK routingWidth = 2*edgeNodeSpacing + (n-1)*edgeEdgeSpacing. - var columnX = new double[layerCount]; - columnX[0] = Padding; - for (var l = 1; l < layerCount; l++) - { - var cnt = corridorEdgeCounts[l - 1]; - var corridorWidth = cnt > 0 - ? Math.Max(CorridorMinWidth, (2.0 * ConnectorClearance) + ((cnt - 1) * EdgeSpacing)) - : CorridorMinWidth; - columnX[l] = columnX[l - 1] + maxColWidth[l - 1] + corridorWidth; - } - - // Assign X coordinates: dummies are centered in their column; real nodes left-align. - var augX = new double[numAug]; - for (var l = 0; l < layerCount; l++) - { - var colCenterX = columnX[l] + (maxColWidth[l] / 2.0); - foreach (var ni in groups[l]) - { - augX[ni] = augNodes[ni].IsDummy ? colCenterX : columnX[l]; - } - } - - // Assign Y coordinates using the Brandes-Köpf balanced four-layout algorithm. - var augY = BkAssignYCoordinates(augNodes, groups, augEdges); - - return (augX, augY, columnX, maxColWidth); - } - - /// - /// Assigns Y coordinates to all augmented nodes using the four-layout Brandes-Köpf - /// balanced algorithm, producing port-aligned vertical positions. - /// - /// - /// - /// Runs four independent (vDown × hRight) alignment-and-compaction pipelines, one for - /// each combination of vertical scan direction (DOWN = top-to-bottom, UP = bottom-to-top) - /// and horizontal scan direction (RIGHT = layer 0 → max, LEFT = layer max → 0). The - /// per-node average of the two middle values of the four results gives the final balanced - /// position. Padding is added once at the end. - /// - /// - /// Corresponds to ELK's BKNodePlacer orchestrating BKAligner and BKCompactor. - /// - /// - private static double[] BkAssignYCoordinates( - List augNodes, - List> groups, - List augEdges) - { - var numAug = augNodes.Count; - - // Step 0: precompute port positions, layer positions, and neighbor-edge lists. - BkPreprocess( - augNodes, groups, augEdges, - out var posInLayer, - out var srcRelPortY, - out var tgtRelPortY, - out var leftNeighborEdges, - out var rightNeighborEdges); - - // Step 1: mark type-1 conflicts (non-inner segments crossing inner segments). - var markedEdges = BkMarkConflicts(augNodes, groups, augEdges, posInLayer, leftNeighborEdges); - - // Steps 2–4: compute four independent (vDown × hRight) layouts. - var layouts = new double[4][]; - for (var d = 0; d < 4; d++) - { - // d=0: DOWN+RIGHT, d=1: UP+RIGHT, d=2: DOWN+LEFT, d=3: UP+LEFT. - var vDown = d % 2 == 0; - var hRight = d < 2; - - // Step 2: vertical alignment — builds block chains along the scan direction. - BkVerticalAlignment( - augNodes, groups, augEdges, posInLayer, - leftNeighborEdges, rightNeighborEdges, - markedEdges, vDown, hRight, - out var root, out var align); - - // Step 3: inside-block shift — adjusts nodes within each block to align ports. - var innerShift = BkInsideBlockShift( - augNodes, augEdges, root, align, - srcRelPortY, tgtRelPortY, hRight, - rightNeighborEdges, leftNeighborEdges); - - // Step 4: horizontal compaction — assigns absolute Y to each block root. - var blockY = BkHorizontalCompaction(augNodes, groups, root, align, innerShift, posInLayer, vDown); - - // Compute absolute Y for every node in this layout. - var y = new double[numAug]; - for (var i = 0; i < numAug; i++) - { - y[i] = blockY[root[i]] + innerShift[i]; - } - - layouts[d] = y; - } - - // Step 5: normalize each layout and return the balanced (median average) result. - return BkBalancedLayout(layouts, numAug); - } - - /// - /// Precomputes the lookup tables required by all four Brandes-Köpf layout passes: - /// per-node layer position, relative port Y offsets, and sorted neighbor-edge lists. - /// - /// - /// - /// Port positions follow ELK's BKAligner preprocessing convention: a dummy node - /// contributes relative port Y = 0 (the wire passes straight through); a real node - /// distributes its ports evenly between insets, or - /// at the midpoint when it has only one port on that face. - /// - /// - /// [v] lists augmented-edge indices whose target is v, - /// sorted ascending by the source node's position within its layer — used for RIGHT-direction - /// alignment. [v] lists augmented-edge indices whose - /// source is v, sorted ascending by the target node's position — used for LEFT-direction - /// alignment. Both lists are stable-sorted by edge index as a tiebreaker. - /// - /// - private static void BkPreprocess( - List augNodes, - List> groups, - List augEdges, - out int[] posInLayer, - out double[] srcRelPortY, - out double[] tgtRelPortY, - out List[] leftNeighborEdges, - out List[] rightNeighborEdges) - { - var numAug = augNodes.Count; - var numEdges = augEdges.Count; - - // Position of each node within its layer group (0-based index in groups[layer]). - posInLayer = new int[numAug]; - for (var l = 0; l < groups.Count; l++) - { - for (var k = 0; k < groups[l].Count; k++) - { - posInLayer[groups[l][k]] = k; - } - } - - // Collect outgoing/incoming edge indices per node for port computation. - // Capture posInLayer in a local so it can be used inside lambda expressions - // (C# prohibits capturing out parameters directly in lambdas — CS1628). - var posLayer = posInLayer; - var outEdges = new List[numAug]; - var inEdges = new List[numAug]; - for (var i = 0; i < numAug; i++) - { - outEdges[i] = []; - inEdges[i] = []; - } - - for (var ei = 0; ei < numEdges; ei++) - { - outEdges[augEdges[ei].Source].Add(ei); - inEdges[augEdges[ei].Target].Add(ei); - } - - // srcRelPortY[e]: Y of the source (EAST) port relative to source node's top-left. - // Dummy nodes pass the wire through at Y = 0 relative to their own position. - srcRelPortY = new double[numEdges]; - for (var ni = 0; ni < numAug; ni++) - { - var edges = outEdges[ni]; - if (edges.Count == 0) - { - continue; - } - - if (augNodes[ni].IsDummy) - { - foreach (var ei in edges) - { - srcRelPortY[ei] = 0.0; - } - } - else - { - // Sort by target's position in its layer, then edge index for stability. - var sorted = edges - .OrderBy(ei => posLayer[augEdges[ei].Target]) - .ThenBy(ei => ei) - .ToList(); - var portCount = sorted.Count; - for (var k = 0; k < portCount; k++) - { - srcRelPortY[sorted[k]] = portCount == 1 - ? augNodes[ni].Height / 2.0 - : ConnectorClearance + (k * (augNodes[ni].Height - (2.0 * ConnectorClearance)) / (portCount - 1)); - } - } - } - - // tgtRelPortY[e]: Y of the target (WEST) port relative to target node's top-left. - tgtRelPortY = new double[numEdges]; - for (var ni = 0; ni < numAug; ni++) - { - var edges = inEdges[ni]; - if (edges.Count == 0) - { - continue; - } - - if (augNodes[ni].IsDummy) - { - foreach (var ei in edges) - { - tgtRelPortY[ei] = 0.0; - } - } - else - { - // Sort by source's position in its layer, then edge index for stability. - var sorted = edges - .OrderBy(ei => posLayer[augEdges[ei].Source]) - .ThenBy(ei => ei) - .ToList(); - var portCount = sorted.Count; - for (var k = 0; k < portCount; k++) - { - tgtRelPortY[sorted[k]] = portCount == 1 - ? augNodes[ni].Height / 2.0 - : ConnectorClearance + (k * (augNodes[ni].Height - (2.0 * ConnectorClearance)) / (portCount - 1)); - } - } - } - - // leftNeighborEdges[v]: edges whose Target == v, sorted by source posInLayer. - leftNeighborEdges = new List[numAug]; - for (var i = 0; i < numAug; i++) - { - leftNeighborEdges[i] = []; - } - - for (var ei = 0; ei < numEdges; ei++) - { - leftNeighborEdges[augEdges[ei].Target].Add(ei); - } - - for (var i = 0; i < numAug; i++) - { - leftNeighborEdges[i].Sort((a, b) => - { - var c = posLayer[augEdges[a].Source].CompareTo(posLayer[augEdges[b].Source]); - return c != 0 ? c : a.CompareTo(b); - }); - } - - // rightNeighborEdges[v]: edges whose Source == v, sorted by target posInLayer. - rightNeighborEdges = new List[numAug]; - for (var i = 0; i < numAug; i++) - { - rightNeighborEdges[i] = []; - } - - for (var ei = 0; ei < numEdges; ei++) - { - rightNeighborEdges[augEdges[ei].Source].Add(ei); - } - - for (var i = 0; i < numAug; i++) - { - rightNeighborEdges[i].Sort((a, b) => - { - var c = posLayer[augEdges[a].Target].CompareTo(posLayer[augEdges[b].Target]); - return c != 0 ? c : a.CompareTo(b); - }); - } - } - - /// - /// Returns true when is incident to an inner segment — a sub-edge - /// where both endpoints are dummy nodes, forming part of a long-edge chain. - /// - /// - /// An inner segment has both endpoints as dummy nodes. The check inspects v's - /// lowest-positioned left neighbor (leftNeighborEdges[v][0]). Used by type-1 conflict - /// detection to identify nodes that anchor inner segments across layer boundaries. - /// - private static bool IsIncidentToInnerSegment( - int v, - List augNodes, - List augEdges, - List[] leftNeighborEdges) - => augNodes[v].IsDummy - && leftNeighborEdges[v].Count > 0 - && augNodes[augEdges[leftNeighborEdges[v][0]].Source].IsDummy; - - /// - /// Marks augmented edges that participate in type-1 conflicts: a non-inner segment - /// (at least one real-node endpoint) that crosses an inner segment (both endpoints - /// are dummy nodes from a long-edge chain). - /// - /// - /// Implements ELK's markConflicts procedure from BKNodePlacer. For each pair of - /// adjacent middle layers (i, i+1), the algorithm tracks the permitted source-position - /// range [k0, k1] established by each inner segment and marks any non-inner segment - /// whose source falls outside that range. Marked edges are excluded from vertical - /// alignment to preserve the topology of inner segments. - /// - private static HashSet BkMarkConflicts( - List augNodes, - List> groups, - List augEdges, - int[] posInLayer, - List[] leftNeighborEdges) - { - var markedEdges = new HashSet(); - var maxLayer = groups.Count - 1; - - // Examine middle layers: i is the source side, i+1 is the target side. - for (var i = 1; i < maxLayer; i++) - { - var leftLayerSize = groups[i].Count; - var rightLayer = groups[i + 1]; - - // k0: lower bound of the permitted source-position range for the current batch. - var k0 = 0; - - // l: left cursor into the right layer (start of the current batch). - var l = 0; - - for (var l1 = 0; l1 < rightLayer.Count; l1++) - { - var v = rightLayer[l1]; - var incident = IsIncidentToInnerSegment(v, augNodes, augEdges, leftNeighborEdges); - - // Flush the batch at the last node or at each inner-segment anchor. - if (l1 != rightLayer.Count - 1 && !incident) - { - continue; - } - - // k1: upper bound of the permitted source-position range for this batch. - var k1 = leftLayerSize - 1; - if (incident) - { - var innerEdge = leftNeighborEdges[v][0]; - k1 = posInLayer[augEdges[innerEdge].Source]; - } - - // Mark non-inner segments in the batch whose sources are out of range. - while (l <= l1) - { - var vl = rightLayer[l]; - if (!IsIncidentToInnerSegment(vl, augNodes, augEdges, leftNeighborEdges)) - { - foreach (var edgeIdx in leftNeighborEdges[vl]) - { - var k = posInLayer[augEdges[edgeIdx].Source]; - if (k < k0 || k > k1) - { - markedEdges.Add(edgeIdx); - } - } - } - - l++; - } - - k0 = k1; - } - } - - return markedEdges; - } - - /// - /// Performs vertical alignment for one Brandes-Köpf layout direction, building the - /// circular block-chain structure that groups co-aligned nodes into blocks. - /// - /// - /// - /// Implements ELK's BKAligner.verticalAlignment. Each node v is aligned with the - /// median neighbor in the previous (RIGHT) or next (LEFT) layer that is still - /// unaligned (align[v] == v) and whose layer-position satisfies the monotone - /// constraint r. The monotone constraint prevents crossings between aligned pairs. - /// - /// - /// On output, [i] identifies the block root for every node i, - /// and [i] is the next node in the circular chain - /// (root → n1 → n2 → … → root). - /// - /// - private static void BkVerticalAlignment( - List augNodes, - List> groups, - List augEdges, - int[] posInLayer, - List[] leftNeighborEdges, - List[] rightNeighborEdges, - HashSet markedEdges, - bool vDown, - bool hRight, - out int[] root, - out int[] align) - { - var numAug = augNodes.Count; - var maxLayer = groups.Count - 1; - - // Every node starts as its own singleton block. - root = new int[numAug]; - align = new int[numAug]; - for (var i = 0; i < numAug; i++) - { - root[i] = i; - align[i] = i; - } - - // Layer iteration order: RIGHT scans forward (0..maxLayer); LEFT scans in reverse. - var layerStart = hRight ? 0 : maxLayer; - var layerEnd = hRight ? maxLayer : 0; - var layerStep = hRight ? 1 : -1; - - for (var l = layerStart; hRight ? l <= layerEnd : l >= layerEnd; l += layerStep) - { - var layer = groups[l]; - - // r: monotone position constraint; tracks the last aligned neighbor's position. - var r = vDown ? -1 : int.MaxValue; - - // Node iteration order: DOWN scans forward (0..N-1); UP scans in reverse. - var nodeStart = vDown ? 0 : layer.Count - 1; - var nodeEnd = vDown ? layer.Count - 1 : 0; - var nodeStep = vDown ? 1 : -1; - - for (var ni = nodeStart; vDown ? ni <= nodeEnd : ni >= nodeEnd; ni += nodeStep) - { - var v = layer[ni]; - var neighbors = hRight ? leftNeighborEdges[v] : rightNeighborEdges[v]; - var d = neighbors.Count; - if (d == 0) - { - continue; - } - - // Median index range for this node's neighbor list. - var low = (int)Math.Floor((d + 1) / 2.0) - 1; - var high = (int)Math.Ceiling((d + 1) / 2.0) - 1; - - // Try median neighbors in vdir order; stop as soon as v is aligned. - var mStart = vDown ? low : high; - var mEnd = vDown ? high : low; - var mStep = vDown ? 1 : -1; - - for (var m = mStart; vDown ? m <= mEnd : m >= mEnd; m += mStep) - { - // Stop iterating once v has been aligned with a neighbor. - if (align[v] != v) - { - break; - } - - var edgeIdx = neighbors[m]; - var uIdx = hRight ? augEdges[edgeIdx].Source : augEdges[edgeIdx].Target; - - if (markedEdges.Contains(edgeIdx)) - { - continue; - } - - var pos = posInLayer[uIdx]; - if (vDown ? r < pos : r > pos) - { - // Extend the block chain: insert v between uIdx and the current root. - align[uIdx] = v; - root[v] = root[uIdx]; - align[v] = root[v]; - r = pos; - } - } - } - } - } - - /// - /// Computes the inside-block shift for each node: the vertical offset relative to its - /// block root that makes the connecting ports co-linear within the block. - /// - /// - /// - /// Implements ELK's BKAligner.insideBlockShift. For each block root, walks the circular - /// align chain accumulating port-position differences between consecutive nodes. The - /// accumulated shifts are then normalized so the topmost node in the block has - /// innerShift = 0, making blockY the absolute Y of the block's highest point. - /// - /// - /// For hdir=RIGHT the edge between consecutive chain nodes goes source → target (earlier - /// layer to later layer), so portDiff = srcRelPortY − tgtRelPortY. For hdir=LEFT the - /// direction reverses, so portDiff = tgtRelPortY − srcRelPortY. - /// - /// - private static double[] BkInsideBlockShift( - List augNodes, - List augEdges, - int[] root, - int[] align, - double[] srcRelPortY, - double[] tgtRelPortY, - bool hRight, - List[] rightNeighborEdges, - List[] leftNeighborEdges) - { - var numAug = augNodes.Count; - var innerShift = new double[numAug]; - - // Process each block identified by its root node. - for (var r = 0; r < numAug; r++) - { - if (root[r] != r) - { - continue; - } - - // Walk the circular chain accumulating port-difference shifts. - var spaceAbove = 0.0; - var spaceBelow = augNodes[r].Height; - - var current = r; - var next = align[r]; - while (next != r) - { - // Locate the augmented edge that links consecutive block-chain nodes. - // For RIGHT: edge current → next (earlier → later layer). - // For LEFT: edge next → current (earlier → later layer, chain walks backward). - var edgeIdx = hRight - ? BkFindEdge(rightNeighborEdges[current], augEdges, next, findByTarget: true) - : BkFindEdge(leftNeighborEdges[current], augEdges, next, findByTarget: false); - - // Port alignment: accumulate the source-minus-target port offset. - var portDiff = hRight - ? srcRelPortY[edgeIdx] - tgtRelPortY[edgeIdx] - : tgtRelPortY[edgeIdx] - srcRelPortY[edgeIdx]; - - innerShift[next] = innerShift[current] + portDiff; - spaceAbove = Math.Max(spaceAbove, -innerShift[next]); - spaceBelow = Math.Max(spaceBelow, innerShift[next] + augNodes[next].Height); - - current = next; - next = align[current]; - } - - // Normalize: add spaceAbove to all shifts so the topmost node is at offset 0. - if (spaceAbove > 0.0) - { - var node = r; - do - { - innerShift[node] += spaceAbove; - node = align[node]; - } - while (node != r); - } - } - - return innerShift; - } - - /// - /// Finds the augmented edge in that connects to - /// , searching by target when - /// is true, or by source otherwise. - /// - /// - /// Used by to locate the edge that links consecutive - /// nodes in a block chain. Because block chains are built strictly along real augmented - /// edges, the edge is always present; returning −1 would indicate a logic error in the - /// vertical-alignment phase. - /// - private static int BkFindEdge( - List edgeList, - List augEdges, - int matchNode, - bool findByTarget) - { - foreach (var ei in edgeList) - { - if ((findByTarget ? augEdges[ei].Target : augEdges[ei].Source) == matchNode) - { - return ei; - } - } - - return -1; // Should not occur: block chains are always built along real edges. - } - - /// - /// Assigns an absolute Y coordinate (blockY) to each block root by compacting blocks - /// in the vertical direction, respecting per-node heights and gaps. - /// - /// - /// - /// Implements ELK's BKCompactor.horizontalCompaction / placeBlock. For vdir=DOWN, - /// blocks are packed top-to-bottom starting at Y = 0, constrained from above by the - /// node immediately above each chain member in its layer. For vdir=UP, blocks are - /// packed bottom-to-top starting at Y = 0, constrained from below (yielding negative - /// values that are normalized in ). - /// - /// - /// The local PlaceBlock function places a block root's Y coordinate by recursively - /// ensuring every constraining block is placed first (memoized via a NaN sentinel). - /// - /// - private static double[] BkHorizontalCompaction( - List augNodes, - List> groups, - int[] root, - int[] align, - double[] innerShift, - int[] posInLayer, - bool vDown) - { - var maxLayer = groups.Count - 1; - var blockY = new double[augNodes.Count]; - Array.Fill(blockY, double.NaN); - - // Recursively place a block root, memoized by the NaN-unplaced sentinel. - void PlaceBlock(int v) - { - if (!double.IsNaN(blockY[v])) - { - return; - } - - blockY[v] = 0.0; - - // Enforce separation constraints for every node in this block's chain. - var current = v; - do - { - var layer = augNodes[current].Layer; - var idx = posInLayer[current]; - var layerNodes = groups[layer]; - - if (vDown) - { - // DOWN: constrain from above — current must be below the node at idx−1. - if (idx > 0) - { - var above = layerNodes[idx - 1]; - var aboveRoot = root[above]; - PlaceBlock(aboveRoot); - - var requiredY = blockY[aboveRoot] - + innerShift[above] - + augNodes[above].Height - + NodeSpacing - - innerShift[current]; - blockY[v] = Math.Max(blockY[v], requiredY); - } - } - else - { - // UP: constrain from below — current must be above the node at idx+1. - if (idx < layerNodes.Count - 1) - { - var below = layerNodes[idx + 1]; - var belowRoot = root[below]; - PlaceBlock(belowRoot); - - var requiredY = blockY[belowRoot] - + innerShift[below] - - NodeSpacing - - augNodes[current].Height - - innerShift[current]; - blockY[v] = Math.Min(blockY[v], requiredY); - } - } - - current = align[current]; - } - while (current != v); - } - - // Trigger placement for all block roots in vdir processing order. - var layerStart = vDown ? 0 : maxLayer; - var layerEnd = vDown ? maxLayer : 0; - var layerStep = vDown ? 1 : -1; - - for (var l = layerStart; vDown ? l <= layerEnd : l >= layerEnd; l += layerStep) - { - var layer = groups[l]; - var nodeStart = vDown ? 0 : layer.Count - 1; - var nodeEnd = vDown ? layer.Count - 1 : 0; - var nodeStep = vDown ? 1 : -1; - - for (var ni = nodeStart; vDown ? ni <= nodeEnd : ni >= nodeEnd; ni += nodeStep) - { - var v = layer[ni]; - if (root[v] == v) - { - PlaceBlock(v); - } - } - } - - return blockY; - } - - /// - /// Normalizes four independent Brandes-Köpf layouts (each shifted so its minimum Y = 0) - /// and returns the per-node average of the two middle values, giving the balanced result. - /// - /// - /// Implements ELK's BKNodePlacer balanced-layout combination. Each of the four layouts - /// has a distinct direction bias (DOWN/UP × RIGHT/LEFT); the median average cancels - /// those biases while preserving the port-alignment constraints of each individual - /// layout. is added once so all returned coordinates are absolute. - /// - private static double[] BkBalancedLayout(double[][] layouts, int numAug) - { - // Normalize each layout: shift so the minimum absolute Y across all nodes is 0. - foreach (var y in layouts) - { - var minY = y.Min(); - for (var i = 0; i < numAug; i++) - { - y[i] -= minY; - } - } - - // For each node, sort the four Y values and average the two middle ones. - var finalY = new double[numAug]; - for (var i = 0; i < numAug; i++) - { - var ys = new[] { layouts[0][i], layouts[1][i], layouts[2][i], layouts[3][i] }; - Array.Sort(ys); - finalY[i] = ((ys[1] + ys[2]) / 2.0) + Padding; - } - - return finalY; - } -} diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/ComponentPacker.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/ComponentPacker.cs deleted file mode 100644 index 4918571b..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/ComponentPacker.cs +++ /dev/null @@ -1,468 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using static DemaConsulting.SysML2Tools.Layout.Engine.Layered.LayeredLayoutMetrics; - -namespace DemaConsulting.SysML2Tools.Layout.Engine.Layered; - -/// -/// Composite pipeline stage that separates a disconnected graph into its connected components, -/// lays out each component independently with the wrapped inner stage sequence, then packs the -/// laid-out components side by side into a single non-overlapping arrangement. -/// -/// -/// This is a clean-room re-implementation of the documented behavior of ELK's -/// ComponentsProcessor: (a) split the graph into connected components, (b) run the full -/// layered algorithm on each component, then (c) recombine the components by packing their bounding -/// boxes. The default layered pipeline lays a disconnected graph out as if every component shared -/// the same layers, which stacks unrelated subgraphs into one tall column; packing each component -/// separately produces a compact, readable arrangement instead. -/// -/// The single-component case (including a fully connected graph or a lone node) is a transparent -/// pass-through: the inner stages run directly on the supplied graph, so the output is byte-identical -/// to running the same stages without this wrapper. This preserves the behavior of every caller whose -/// graph happens to be connected. -/// -/// -/// Component detection is deterministic — components are ordered by their lowest original node index -/// and nodes within a component by ascending original index — so renders are reproducible. -/// The stage is stateless and may be shared across pipelines. -/// -/// -internal sealed class ComponentPacker : ILayoutStage -{ - /// The inner stages run, in order, against each component sub-graph. - private readonly IReadOnlyList _innerStages; - - /// Gap, in logical pixels, left between adjacent packed components. - private readonly double _spacing; - - /// Target-aspect multiplier used to choose the packing row width. - private readonly double _aspect; - - /// - /// Initializes a new instance of the class. - /// - /// - /// The ordered stage sequence to run on each connected component (and on the whole graph in the - /// single-component fast path). Must not be null. Typically the default ELK-layered sequence. - /// - /// Gap in logical pixels between adjacent packed components. Must be non-negative. - /// - /// Target-aspect multiplier controlling the packing row width (larger values produce wider, shorter - /// arrangements). Must be positive. - /// - /// Thrown when is null. - public ComponentPacker(IReadOnlyList innerStages, double spacing, double aspect) - { - ArgumentNullException.ThrowIfNull(innerStages); - _innerStages = innerStages; - _spacing = spacing; - _aspect = aspect; - } - - /// - /// Creates a wrapping the default ELK-layered inner stage sequence - /// (cycle breaking, layer assignment, long-edge splitting, crossing minimization, Brandes-Köpf - /// placement, port distribution, orthogonal routing, long-edge joining, and the axis transform). - /// - /// Gap in logical pixels between adjacent packed components. - /// Target-aspect multiplier controlling the packing row width. - /// A packer that lays out each component with the standard layered stages. - public static ComponentPacker WithDefaultStages(double spacing = NodeSpacing, double aspect = 1.25) => - new(DefaultInnerStages(), spacing, aspect); - - /// - /// - /// Reads for component detection and writes the real-node outputs - /// , , , - /// and — index-aligned with (and ) - /// — (one polyline per acyclic edge). An empty graph - /// ( == 0) is a no-op. - /// - public void Apply(LayeredGraph graph) - { - ArgumentNullException.ThrowIfNull(graph); - - // An empty graph has nothing to detect, lay out, or pack; the downstream stages would also - // fail on an empty augmented graph, so short-circuit here. - if (graph.N == 0) - { - return; - } - - // Partition the real nodes into connected components over the undirected edge set. - var components = FindComponents(graph); - - // Single-component fast path: run the inner stages directly so the output is byte-identical - // to the default pipeline. This covers a fully connected graph and a lone node. - if (components.Count == 1) - { - RunInner(graph); - return; - } - - LayoutAndPackComponents(graph, components); - } - - /// Builds the default ELK-layered inner stage sequence. - /// A fresh ordered list of the standard stages. - private static IReadOnlyList DefaultInnerStages() => - [ - new CycleBreaker(), - new LayerAssigner(), - new LongEdgeSplitter(), - new CrossingMinimizer(), - new BrandesKopfPlacer(), - new PortDistributor(), - new OrthogonalRouter(), - new LongEdgeJoiner(), - new AxisTransform(), - ]; - - /// - /// Partitions the real nodes into connected components using union-find over the undirected edge - /// set (self-loops are ignored as they connect a node only to itself). - /// - /// The graph whose nodes and edges are partitioned. - /// - /// One list of original node indices per component, components ordered by their lowest original - /// node index, nodes within each component ordered by ascending original index. - /// - private static List> FindComponents(LayeredGraph graph) - { - var n = graph.N; - var parent = new int[n]; - for (var i = 0; i < n; i++) - { - parent[i] = i; - } - - // Union the endpoints of every non-self edge so connected nodes share a representative root. - foreach (var edge in graph.Edges) - { - if (edge.Source != edge.Target) - { - Union(parent, edge.Source, edge.Target); - } - } - - // Group nodes by their representative root. Iterating nodes in ascending order makes the first - // node of each component its lowest index, so first-seen root order == ascending-min order. - var rootToComponent = new Dictionary>(); - var order = new List(); - for (var node = 0; node < n; node++) - { - var root = Find(parent, node); - if (!rootToComponent.TryGetValue(root, out var members)) - { - members = []; - rootToComponent[root] = members; - order.Add(root); - } - - members.Add(node); - } - - return [.. order.Select(root => rootToComponent[root])]; - } - - /// Finds the representative root of a node with path compression. - /// The union-find parent array. - /// The node whose root is sought. - /// The representative root index of the node's set. - private static int Find(int[] parent, int node) - { - var root = node; - while (parent[root] != root) - { - root = parent[root]; - } - - // Path compression: point every node on the walk directly at the root. - while (parent[node] != root) - { - var next = parent[node]; - parent[node] = root; - node = next; - } - - return root; - } - - /// Merges the sets containing two nodes, keeping the lower index as the root. - /// The union-find parent array. - /// First node. - /// Second node. - private static void Union(int[] parent, int a, int b) - { - var ra = Find(parent, a); - var rb = Find(parent, b); - if (ra == rb) - { - return; - } - - // Keep the lower index as the root so representatives stay deterministic. - if (ra < rb) - { - parent[rb] = ra; - } - else - { - parent[ra] = rb; - } - } - - /// Runs every wrapped inner stage, in order, against the supplied graph. - /// The graph (whole graph or a component sub-graph) to lay out in place. - private void RunInner(LayeredGraph graph) - { - foreach (var stage in _innerStages) - { - stage.Apply(graph); - } - } - - /// - /// Lays out each component on its own sub-graph, packs the component bounding boxes into shelves, - /// then merges the placed coordinates and routed waypoints back into the parent graph. - /// - /// The parent graph whose real-node outputs are written. - /// The connected components (original node indices) to lay out and pack. - private void LayoutAndPackComponents(LayeredGraph graph, List> components) - { - // Lay out every component independently on a remapped sub-graph. - var layouts = new List(components.Count); - foreach (var members in components) - { - layouts.Add(LayoutComponent(graph, members)); - } - - // Choose a packing row width and assign each component a shelf offset. - PackComponents(layouts); - - // Merge component placements and routed edges back into the parent graph in original index order. - var augX = new double[graph.N]; - var augY = new double[graph.N]; - var nodeLayers = new int[graph.N]; - - // Each component emits one polyline per ACYCLIC edge (cycle breaking drops self-loops, - // de-duplicates identical directed pairs, and reverses back edges), so the merged graph exposes - // the acyclic edge set with its aligned waypoints — the same contract the single-component fast - // path produces via RunInner — rather than one entry per input edge. Consumers key a - // (source, target) lookup on Acyclic to recover each input edge's route. - var mergedAcyclic = new List(); - var mergedReversed = new List(); - var mergedWaypoints = new List>(); - - foreach (var layout in layouts) - { - // Translate the component so its content bounding box starts at the assigned shelf offset. - var dx = -layout.MinX + layout.OffsetX; - var dy = -layout.MinY + layout.OffsetY; - - for (var local = 0; local < layout.Members.Count; local++) - { - var orig = layout.Members[local]; - augX[orig] = layout.LocalX[local] + dx; - augY[orig] = layout.LocalY[local] + dy; - nodeLayers[orig] = layout.LocalLayers[local]; - } - - for (var k = 0; k < layout.AcyclicEdges.Count; k++) - { - var localWaypoints = layout.EdgeWaypoints[k]; - var translated = new Point2D[localWaypoints.Count]; - for (var p = 0; p < localWaypoints.Count; p++) - { - translated[p] = new Point2D(localWaypoints[p].X + dx, localWaypoints[p].Y + dy); - } - - mergedAcyclic.Add(layout.AcyclicEdges[k]); - mergedReversed.Add(layout.AcyclicReversed[k]); - mergedWaypoints.Add(translated); - } - } - - graph.AugX = augX; - graph.AugY = augY; - graph.NodeLayers = nodeLayers; - graph.Acyclic = mergedAcyclic; - graph.AcyclicReversed = [.. mergedReversed]; - graph.Waypoints = mergedWaypoints; - } - - /// - /// Builds a sub-graph for one component (with a local-to-original index remap), runs the inner - /// stages on it, and captures the placed real-node coordinates, layer assignments, content - /// bounding box, and routed edge waypoints. - /// - /// The parent graph supplying node sizes, edges, and flow direction. - /// Original node indices belonging to this component (ascending order). - /// The laid-out component, normalized against its own content bounding box. - private ComponentLayout LayoutComponent(LayeredGraph graph, List members) - { - // Map original node indices to dense local indices for the sub-graph. - var origToLocal = new Dictionary(members.Count); - for (var local = 0; local < members.Count; local++) - { - origToLocal[members[local]] = local; - } - - var localNodes = new List(members.Count); - foreach (var orig in members) - { - localNodes.Add(graph.Nodes[orig]); - } - - // Collect this component's edges (in original edge order for determinism), remapping endpoints - // to local indices. - var localEdges = new List(); - for (var e = 0; e < graph.Edges.Count; e++) - { - var edge = graph.Edges[e]; - if (origToLocal.TryGetValue(edge.Source, out var localSource) && - origToLocal.TryGetValue(edge.Target, out var localTarget)) - { - localEdges.Add(new LayerEdge(localSource, localTarget)); - } - } - - // Lay out the component sub-graph with the wrapped inner stages. - var child = new LayeredGraph(localNodes, localEdges, graph.Direction); - RunInner(child); - - // Map the child's acyclic edges (local indices) back to original node indices so the merged - // parent graph exposes one (source, target) polyline per acyclic edge, aligned with - // child.Waypoints and child.AcyclicReversed. - var acyclicEdges = new LayerEdge[child.Acyclic.Count]; - for (var k = 0; k < child.Acyclic.Count; k++) - { - var edge = child.Acyclic[k]; - acyclicEdges[k] = new LayerEdge(members[edge.Source], members[edge.Target]); - } - - // Compute the content bounding box over the real nodes only (dummies are excluded). - var minX = double.PositiveInfinity; - var minY = double.PositiveInfinity; - var maxX = double.NegativeInfinity; - var maxY = double.NegativeInfinity; - var localX = new double[members.Count]; - var localY = new double[members.Count]; - var localLayers = new int[members.Count]; - for (var local = 0; local < members.Count; local++) - { - var x = child.AugX[local]; - var y = child.AugY[local]; - localX[local] = x; - localY[local] = y; - localLayers[local] = child.NodeLayers[local]; - minX = Math.Min(minX, x); - minY = Math.Min(minY, y); - maxX = Math.Max(maxX, x + localNodes[local].Width); - maxY = Math.Max(maxY, y + localNodes[local].Height); - } - - return new ComponentLayout - { - Members = members, - LocalX = localX, - LocalY = localY, - LocalLayers = localLayers, - MinX = minX, - MinY = minY, - Width = maxX - minX, - Height = maxY - minY, - AcyclicEdges = acyclicEdges, - AcyclicReversed = child.AcyclicReversed, - EdgeWaypoints = child.Waypoints, - }; - } - - /// - /// Assigns each component a shelf offset using a greedy row (shelf) packer. The target row width is - /// the larger of the widest component and sqrt(totalArea) * aspect, which biases the overall - /// arrangement toward the requested aspect ratio. - /// - /// The laid-out components; their offsets are assigned in place. - private void PackComponents(List layouts) - { - var totalArea = 0.0; - var widest = 0.0; - foreach (var layout in layouts) - { - totalArea += layout.Width * layout.Height; - widest = Math.Max(widest, layout.Width); - } - - var targetRowWidth = Math.Max(widest, Math.Sqrt(totalArea) * _aspect); - - var cursorX = 0.0; - var shelfTop = 0.0; - var shelfHeight = 0.0; - foreach (var layout in layouts) - { - // Wrap to a new shelf when the running row width would exceed the target (but never leave a - // shelf empty — an over-wide component sits alone on its own shelf). - if (cursorX > 0.0 && cursorX + layout.Width > targetRowWidth) - { - shelfTop += shelfHeight + _spacing; - cursorX = 0.0; - shelfHeight = 0.0; - } - - layout.OffsetX = cursorX; - layout.OffsetY = shelfTop; - cursorX += layout.Width + _spacing; - shelfHeight = Math.Max(shelfHeight, layout.Height); - } - } - - /// The laid-out result of one connected component, normalized to its own bounding box. - private sealed class ComponentLayout - { - /// Original node indices in this component, ascending. - public required IReadOnlyList Members { get; init; } - - /// Placed X coordinate of each real node, by local index. - public required double[] LocalX { get; init; } - - /// Placed Y coordinate of each real node, by local index. - public required double[] LocalY { get; init; } - - /// Assigned layer of each real node, by local index. - public required int[] LocalLayers { get; init; } - - /// Left edge of the component's content bounding box. - public required double MinX { get; init; } - - /// Top edge of the component's content bounding box. - public required double MinY { get; init; } - - /// Width of the component's content bounding box. - public required double Width { get; init; } - - /// Height of the component's content bounding box. - public required double Height { get; init; } - - /// Acyclic edges (original node indices), index-aligned with . - public required IReadOnlyList AcyclicEdges { get; init; } - - /// - /// Whether each acyclic edge was produced by reversing a back edge, index-aligned with - /// . - /// - public required IReadOnlyList AcyclicReversed { get; init; } - - /// Routed waypoints for each acyclic edge, in order. - public required IReadOnlyList> EdgeWaypoints { get; init; } - - /// Packed shelf X offset assigned to this component. - public double OffsetX { get; set; } - - /// Packed shelf Y offset assigned to this component. - public double OffsetY { get; set; } - } -} diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/CrossingMinimizer.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/CrossingMinimizer.cs deleted file mode 100644 index 146859a6..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/CrossingMinimizer.cs +++ /dev/null @@ -1,110 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// -using static DemaConsulting.SysML2Tools.Layout.Engine.Layered.LayeredLayoutMetrics; - -namespace DemaConsulting.SysML2Tools.Layout.Engine.Layered; - -/// -/// Pipeline stage that reduces edge crossings via Barycenter ordering over the augmented graph. -/// -internal sealed class CrossingMinimizer : ILayoutStage -{ - /// - public void Apply(LayeredGraph graph) - { - ArgumentNullException.ThrowIfNull(graph); - graph.Groups = GroupByLayerAug(graph.AugNodes); - OrderLayersAug(graph.Groups, graph.AugNodes.Count, graph.AugEdges); - } - - /// Groups augmented-node indices by layer. - private static List> GroupByLayerAug(List augNodes) - { - var maxLayer = augNodes.Max(a => a.Layer); - var groups = new List>(maxLayer + 1); - for (var l = 0; l <= maxLayer; l++) - { - groups.Add([]); - } - - for (var i = 0; i < augNodes.Count; i++) - { - groups[augNodes[i].Layer].Add(i); - } - - return groups; - } - - /// - /// Runs Barycenter sweeps over the augmented graph - /// (real nodes and dummies) to reduce edge crossings. - /// - private static void OrderLayersAug(List> groups, int numAug, List augEdges) - { - var leftNeighbors = new List[numAug]; - var rightNeighbors = new List[numAug]; - for (var i = 0; i < numAug; i++) - { - leftNeighbors[i] = []; - rightNeighbors[i] = []; - } - - foreach (var ae in augEdges) - { - rightNeighbors[ae.Source].Add(ae.Target); - leftNeighbors[ae.Target].Add(ae.Source); - } - - for (var sweep = 0; sweep < BarycentricSweeps; sweep++) - { - if (sweep % 2 == 0) - { - for (var l = 1; l < groups.Count; l++) - { - SortByBarycenter(groups[l], groups[l - 1], leftNeighbors); - } - } - else - { - for (var l = groups.Count - 2; l >= 0; l--) - { - SortByBarycenter(groups[l], groups[l + 1], rightNeighbors); - } - } - } - } - - /// - /// Sorts by the average position of each node's neighbors in - /// ; nodes without neighbors keep their current relative order. - /// - private static void SortByBarycenter(List layer, List adjacentLayer, List[] neighbors) - { - var position = new Dictionary(); - for (var i = 0; i < adjacentLayer.Count; i++) - { - position[adjacentLayer[i]] = i; - } - - var keyed = new List<(int Node, double Key, int Original)>(layer.Count); - for (var i = 0; i < layer.Count; i++) - { - var node = layer[i]; - var ns = neighbors[node].Where(position.ContainsKey).ToList(); - var key = ns.Count > 0 ? ns.Average(x => position[x]) : i; - keyed.Add((node, key, i)); - } - - keyed.Sort((a, b) => - { - var c = a.Key.CompareTo(b.Key); - return c != 0 ? c : a.Original.CompareTo(b.Original); - }); - - for (var i = 0; i < layer.Count; i++) - { - layer[i] = keyed[i].Node; - } - } -} diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/CycleBreaker.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/CycleBreaker.cs deleted file mode 100644 index d6d5a2df..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/CycleBreaker.cs +++ /dev/null @@ -1,101 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// -namespace DemaConsulting.SysML2Tools.Layout.Engine.Layered; - -/// -/// Pipeline stage that makes the input graph acyclic by reversing cycle-causing back edges, -/// following ELK's cycle-breaking phase. -/// -internal sealed class CycleBreaker : ILayoutStage -{ - /// - public void Apply(LayeredGraph graph) - { - ArgumentNullException.ThrowIfNull(graph); - var (acyclic, reversed) = BreakCycles(graph.N, graph.Edges); - graph.Acyclic = acyclic; - graph.AcyclicReversed = reversed; - } - - /// - /// Returns the edge set with cycle-causing back edges reversed, using DFS to classify any - /// edge to a node still on the recursion stack as a back edge. The second tuple element is a - /// parallel flag array marking which retained edges were produced by reversing a back edge. - /// - private static (List Acyclic, bool[] Reversed) BreakCycles(int n, IReadOnlyList edges) - { - var adjacency = new List[n]; - for (var i = 0; i < n; i++) - { - adjacency[i] = []; - } - - foreach (var e in edges) - { - if (e.Source != e.Target) - { - adjacency[e.Source].Add(e.Target); - } - } - - var visited = new bool[n]; - var onStack = new bool[n]; - var backEdges = new HashSet<(int, int)>(); - - void Dfs(int u) - { - visited[u] = true; - onStack[u] = true; - foreach (var v in adjacency[u]) - { - if (onStack[v]) - { - backEdges.Add((u, v)); - } - else if (!visited[v]) - { - Dfs(v); - } - } - - // S4143: standard DFS coloring — onStack[u] is read by recursive calls between the - // true/false assignments; the analyzer cannot see across the recursion. -#pragma warning disable S4143 - onStack[u] = false; -#pragma warning restore S4143 - } - - for (var i = 0; i < n; i++) - { - if (!visited[i]) - { - Dfs(i); - } - } - - var result = new List(); - var reversed = new List(); - var seen = new HashSet<(int, int)>(); - foreach (var e in edges) - { - if (e.Source == e.Target) - { - continue; - } - - var isBack = backEdges.Contains((e.Source, e.Target)); - var (from, to) = isBack - ? (e.Target, e.Source) - : (e.Source, e.Target); - - if (from != to && seen.Add((from, to))) - { - result.Add(new LayerEdge(from, to)); - reversed.Add(isBack); - } - } - - return (result, [.. reversed]); - } -} diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/HierarchyHandling.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/HierarchyHandling.cs deleted file mode 100644 index 95c809b0..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/HierarchyHandling.cs +++ /dev/null @@ -1,22 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -namespace DemaConsulting.SysML2Tools.Layout.Engine.Layered; - -/// -/// How a layered layout treats nested (compound) nodes. -/// -/// -/// Only is exercised by the current behavior-preserving extraction; -/// is reserved scaffolding for a later phase that lays out each -/// container's children bottom-up and treats each container as a fixed-size atomic node. -/// -internal enum HierarchyHandling -{ - /// Run the pipeline once over a single flat graph. - Flat, - - /// Run the flat pipeline per container, bottom-up (reserved for a later phase). - Recursive, -} diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/ILayoutStage.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/ILayoutStage.cs deleted file mode 100644 index 0727be1c..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/ILayoutStage.cs +++ /dev/null @@ -1,22 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -namespace DemaConsulting.SysML2Tools.Layout.Engine.Layered; - -/// -/// A single composable phase of the layered layout pipeline. -/// -/// -/// Each stage reads the state it needs from the shared and writes its -/// results back onto the same instance, so stages can be ordered, replaced, and unit-tested in -/// isolation. Stages are stateless and may be shared across pipelines. -/// -internal interface ILayoutStage -{ - /// - /// Applies this stage to the supplied graph, mutating it in place. - /// - /// The shared layered-layout state to read from and write to. - void Apply(LayeredGraph graph); -} diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LayerAssigner.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LayerAssigner.cs deleted file mode 100644 index 5dfdaae8..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LayerAssigner.cs +++ /dev/null @@ -1,63 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// -namespace DemaConsulting.SysML2Tools.Layout.Engine.Layered; - -/// -/// Pipeline stage that assigns each node to a layer using longest-path layering. -/// -internal sealed class LayerAssigner : ILayoutStage -{ - /// - public void Apply(LayeredGraph graph) - { - ArgumentNullException.ThrowIfNull(graph); - graph.NodeLayers = AssignLayers(graph.N, graph.Acyclic); - } - - /// - /// Assigns each node to a layer equal to the length of its longest incoming path - /// (sources at layer 0, sinks at the maximum layer). - /// - private static int[] AssignLayers(int n, List edges) - { - var outgoing = new List[n]; - var inDegree = new int[n]; - for (var i = 0; i < n; i++) - { - outgoing[i] = []; - } - - foreach (var e in edges) - { - outgoing[e.Source].Add(e.Target); - inDegree[e.Target]++; - } - - var layer = new int[n]; - var queue = new Queue(); - for (var i = 0; i < n; i++) - { - if (inDegree[i] == 0) - { - queue.Enqueue(i); - } - } - - var remaining = (int[])inDegree.Clone(); - while (queue.Count > 0) - { - var u = queue.Dequeue(); - foreach (var v in outgoing[u]) - { - layer[v] = Math.Max(layer[v], layer[u] + 1); - if (--remaining[v] == 0) - { - queue.Enqueue(v); - } - } - } - - return layer; - } -} diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LayeredGraph.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LayeredGraph.cs deleted file mode 100644 index 683f714a..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LayeredGraph.cs +++ /dev/null @@ -1,159 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -namespace DemaConsulting.SysML2Tools.Layout.Engine.Layered; - -/// A node in the augmented Sugiyama graph (real part box or long-edge dummy). -/// Width of the node's bounding box in logical pixels. -/// Height of the node's bounding box in logical pixels. -/// Assigned Sugiyama layer index. -/// Whether this node is a zero-size long-edge dummy. -internal sealed record AugNode(double Width, double Height, int Layer, bool IsDummy = false); - -/// A sub-edge in the augmented graph after long-edge splitting. -/// Index of the source augmented node. -/// Index of the target augmented node. -/// Index of the original (pre-split) edge this sub-edge belongs to. -internal readonly record struct AugEdge(int Source, int Target, int OrigEdgeIndex); - -/// -/// The mutable shared state threaded through every of the layered -/// pipeline. Each stage reads the fields produced by earlier stages and writes the fields it owns. -/// -/// -/// This object replaces the ad-hoc local variables that the monolithic interconnection engine -/// passed between its private phase methods, while preserving exactly the same intermediate values -/// (and therefore the same floating-point results). -/// -internal sealed class LayeredGraph -{ - /// - /// Initializes a new instance of the class. - /// - /// Input nodes to place, in caller order. - /// Directed edges between nodes (by index). - /// The requested layout flow direction. - public LayeredGraph( - IReadOnlyList nodes, - IReadOnlyList edges, - LayoutDirection direction) - { - ArgumentNullException.ThrowIfNull(nodes); - ArgumentNullException.ThrowIfNull(edges); - - Nodes = nodes; - Edges = edges; - Direction = direction; - N = nodes.Count; - } - - /// Gets the number of real input nodes. - public int N { get; } - - /// Gets the input nodes, in caller order. - /// - /// The setter is private; the only in-place mutation is , the seam - /// used by to feed the direction-agnostic stages - /// node sizes whose along-extent matches the requested flow direction. - /// - public IReadOnlyList Nodes { get; private set; } - - /// Gets the directed input edges (by node index). - public IReadOnlyList Edges { get; } - - /// Gets the requested layout flow direction. - public LayoutDirection Direction { get; } - - /// - /// Gets or sets the minimum straight entry approach reserved for a reversed (back) edge's final - /// sub-edge — the wrap-around corridor that ends at the true target where the consumer draws the - /// end marker. - /// - /// - /// The default is , which exactly reproduces - /// the original engine: the router's first slot already starts one - /// past the source column, so the - /// Math.Max clamp in is a no-op at the default and forward - /// geometry stays byte-identical. A consumer that draws a longer end decoration (for example the - /// state-transition view's open chevron) raises this so the rounded corner never intrudes into the - /// decoration. - /// - public double BackEdgeEntryApproach { get; set; } = LayeredLayoutMetrics.ConnectorClearance; - - /// Gets or sets the acyclic edge set after cycle breaking. - public List Acyclic { get; set; } = []; - - /// - /// Gets or sets, parallel to (same index order), whether each retained - /// acyclic edge was produced by reversing a cycle-causing back edge. - /// - /// - /// records this flag so later stages can recognize edges whose true - /// direction was flipped for layering. reads it to guarantee a - /// minimum entry approach for the arrowhead that the consumer draws on the (un-reversed) target. - /// - public bool[] AcyclicReversed { get; set; } = []; - - /// Gets or sets the assigned layer index for each real node, in node order. - public int[] NodeLayers { get; set; } = []; - - /// Gets or sets the augmented nodes (real boxes followed by long-edge dummies). - public List AugNodes { get; set; } = []; - - /// Gets or sets the augmented sub-edges produced by long-edge splitting. - public List AugEdges { get; set; } = []; - - /// Gets or sets the augmented-node indices grouped (and ordered) by layer. - public List> Groups { get; set; } = []; - - /// Gets or sets the X coordinate of each augmented node. - public double[] AugX { get; set; } = []; - - /// Gets or sets the Y coordinate of each augmented node. - public double[] AugY { get; set; } = []; - - /// Gets or sets the left X coordinate of each layer column. - public double[] ColumnX { get; set; } = []; - - /// Gets or sets the maximum real-node width per layer column. - public double[] MaxColWidth { get; set; } = []; - - /// Gets or sets the source-side (right face) port Y for each augmented sub-edge. - public double[] AugPortYSrc { get; set; } = []; - - /// Gets or sets the target-side (left face) port Y for each augmented sub-edge. - public double[] AugPortYTgt { get; set; } = []; - - /// Gets or sets the orthogonal bend points for each augmented sub-edge. - public List[] AugBendPoints { get; set; } = []; - - /// Gets or sets the assembled orthogonal waypoints for each original (acyclic) edge. - public IReadOnlyList> Waypoints { get; set; } = []; - - /// - /// Swaps each input node's and . - /// - /// - /// The direction-agnostic stages always treat a node's width as its along-axis (layer - /// progression) extent and its height as its cross-axis (within-layer) extent. For a top-to-bottom - /// () or bottom-to-top () flow, - /// the along-axis must instead be the node height, so - /// calls this seam before the stages run. It is never invoked for the - /// / paths, which keeps those - /// outputs byte-identical. - /// - public void SwapNodeAxes() - { - var swapped = new LayerNode[Nodes.Count]; - for (var i = 0; i < Nodes.Count; i++) - { - // S2234: width and height are deliberately swapped so the stages space layers by height. -#pragma warning disable S2234 - swapped[i] = new LayerNode(Nodes[i].Height, Nodes[i].Width); -#pragma warning restore S2234 - } - - Nodes = swapped; - } -} diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LayeredLayoutMetrics.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LayeredLayoutMetrics.cs deleted file mode 100644 index 172abc2e..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LayeredLayoutMetrics.cs +++ /dev/null @@ -1,37 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -namespace DemaConsulting.SysML2Tools.Layout.Engine.Layered; - -/// -/// Fixed spacing and tolerance constants shared by every layered-layout stage. -/// -/// -/// These values are intentionally identical to the constants previously embedded in the -/// monolithic interconnection engine; the extraction preserves them exactly so the pipeline -/// reproduces the legacy output byte for byte. -/// -internal static class LayeredLayoutMetrics -{ - /// Vertical gap between adjacent nodes stacked within the same layer. - internal const double NodeSpacing = 30.0; - - /// Minimum corridor width (node-node spacing) between adjacent columns. - internal const double CorridorMinWidth = 70.0; - - /// Slot-to-slot spacing within a corridor (ELK edgeEdgeSpacing). - internal const double EdgeSpacing = 16.0; - - /// Clearance from corridor edge to the nearest routing slot (ELK edgeNodeSpacing). - internal const double ConnectorClearance = 10.0; - - /// Uniform padding added around the placed content. - internal const double Padding = 20.0; - - /// Number of Barycenter ordering sweeps (down + up = one round). - internal const int BarycentricSweeps = 4; - - /// Tolerance for treating a segment as straight (no bend points needed). - internal const double StraightTolerance = 1e-6; -} diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LayeredLayoutPipeline.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LayeredLayoutPipeline.cs deleted file mode 100644 index e5d9c3b8..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LayeredLayoutPipeline.cs +++ /dev/null @@ -1,127 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -namespace DemaConsulting.SysML2Tools.Layout.Engine.Layered; - -/// -/// An ordered sequence of instances that, when run, transforms a -/// from raw nodes and edges into a fully placed and routed layout. -/// -/// -/// Pipelines are assembled with the fluent returned by -/// . The default stage sequence reproduces ELK's layered algorithm in the -/// order used by the original interconnection engine. -/// -internal sealed class LayeredLayoutPipeline -{ - private readonly IReadOnlyList _stages; - - private LayeredLayoutPipeline( - LayoutDirection direction, - HierarchyHandling hierarchy, - IReadOnlyList stages) - { - Direction = direction; - Hierarchy = hierarchy; - _stages = stages; - } - - /// Gets the layout flow direction this pipeline was built for. - public LayoutDirection Direction { get; } - - /// Gets the hierarchy-handling mode this pipeline was built for. - public HierarchyHandling Hierarchy { get; } - - /// Creates a new . - /// A fresh builder with default direction and hierarchy. - public static PipelineBuilder Builder() => new(); - - /// Runs every stage, in order, against the supplied graph. - /// The graph to lay out; mutated in place. - public void Run(LayeredGraph graph) - { - ArgumentNullException.ThrowIfNull(graph); - - // Normalize the input node axes for the requested direction before any stage runs, so the - // direction-agnostic stages space layers by the correct extent (a no-op for RIGHT/LEFT). - AxisTransform.NormalizeInputAxes(graph); - - foreach (var stage in _stages) - { - stage.Apply(graph); - } - } - - /// - /// Fluent builder that assembles a from an ordered list - /// of stages plus a direction and hierarchy-handling selection. - /// - internal sealed class PipelineBuilder - { - private readonly List _stages = []; - private LayoutDirection _direction = LayoutDirection.Right; - private HierarchyHandling _hierarchy = HierarchyHandling.Flat; - - /// Sets the layout flow direction. - /// The desired direction. - /// This builder, for chaining. - public PipelineBuilder Direction(LayoutDirection direction) - { - _direction = direction; - return this; - } - - /// Sets the hierarchy-handling mode. - /// The desired hierarchy handling. - /// This builder, for chaining. - public PipelineBuilder Hierarchy(HierarchyHandling hierarchy) - { - _hierarchy = hierarchy; - return this; - } - - /// Appends a single stage to the pipeline. - /// The stage to append. - /// This builder, for chaining. - public PipelineBuilder AddStage(ILayoutStage stage) - { - ArgumentNullException.ThrowIfNull(stage); - _stages.Add(stage); - return this; - } - - /// - /// Appends the default ELK-layered stage sequence: cycle breaking, layer assignment, - /// long-edge splitting, crossing minimization, Brandes-Kopf placement, port distribution, - /// orthogonal routing, long-edge joining, and the final axis transform. - /// - /// This builder, for chaining. - public PipelineBuilder AddDefaultStages() - { - _stages.Add(new CycleBreaker()); - _stages.Add(new LayerAssigner()); - _stages.Add(new LongEdgeSplitter()); - _stages.Add(new CrossingMinimizer()); - _stages.Add(new BrandesKopfPlacer()); - _stages.Add(new PortDistributor()); - _stages.Add(new OrthogonalRouter()); - _stages.Add(new LongEdgeJoiner()); - _stages.Add(new AxisTransform()); - return this; - } - - /// Builds the configured pipeline. - /// A new . - public LayeredLayoutPipeline Build() - { - if (_hierarchy == HierarchyHandling.Recursive) - { - throw new NotSupportedException( - "Recursive hierarchy handling is not yet supported."); - } - - return new LayeredLayoutPipeline(_direction, _hierarchy, _stages.ToArray()); - } - } -} diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LayoutDirection.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LayoutDirection.cs deleted file mode 100644 index 3020c49e..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LayoutDirection.cs +++ /dev/null @@ -1,29 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -namespace DemaConsulting.SysML2Tools.Layout.Engine.Layered; - -/// -/// The primary flow direction of a layered layout. -/// -/// -/// Stages always compute in the RIGHT-equivalent abstract axes (along = layer progression on -/// the +X axis, cross = within-layer on the +Y axis). A final stage -/// rotates or flips those abstract coordinates onto screen coordinates for the requested -/// direction, isolating all direction handling to a single unit. -/// -internal enum LayoutDirection -{ - /// Layers progress left-to-right (the abstract, identity direction). - Right, - - /// Layers progress top-to-bottom. - Down, - - /// Layers progress right-to-left. - Left, - - /// Layers progress bottom-to-top. - Up, -} diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LongEdgeJoiner.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LongEdgeJoiner.cs deleted file mode 100644 index 993af0e7..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LongEdgeJoiner.cs +++ /dev/null @@ -1,81 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// -namespace DemaConsulting.SysML2Tools.Layout.Engine.Layered; - -/// -/// Pipeline stage that assembles per-original-edge orthogonal waypoints by concatenating the bend -/// points of each sub-edge in source-to-target layer order (ELK's LongEdgeJoiner). -/// -internal sealed class LongEdgeJoiner : ILayoutStage -{ - /// - public void Apply(LayeredGraph graph) - { - ArgumentNullException.ThrowIfNull(graph); - var augNodes = graph.AugNodes; - var augEdges = graph.AugEdges; - var augX = graph.AugX; - var augPortYSrc = graph.AugPortYSrc; - var augPortYTgt = graph.AugPortYTgt; - var augBendPoints = graph.AugBendPoints; - var numAugEdges = augEdges.Count; - var numOrigEdges = graph.Acyclic.Count; - - // Assemble per-original-edge waypoints from sub-edge bend points (ELK LongEdgeJoiner). - var subEdgesByOrig = new List[numOrigEdges]; - for (var ei = 0; ei < numOrigEdges; ei++) - { - subEdgesByOrig[ei] = []; - } - - for (var ei = 0; ei < numAugEdges; ei++) - { - subEdgesByOrig[augEdges[ei].OrigEdgeIndex].Add(ei); - } - - // Sub-edges must be in source-to-target layer order for concatenation. - for (var ei = 0; ei < numOrigEdges; ei++) - { - subEdgesByOrig[ei].Sort((a, b) => - augNodes[augEdges[a].Source].Layer.CompareTo(augNodes[augEdges[b].Source].Layer)); - } - - var result = new IReadOnlyList[numOrigEdges]; - for (var origIdx = 0; origIdx < numOrigEdges; origIdx++) - { - var subEdges = subEdgesByOrig[origIdx]; - if (subEdges.Count == 0) - { - result[origIdx] = []; - continue; - } - - var firstSubEdge = augEdges[subEdges[0]]; - var lastSubEdge = augEdges[subEdges[^1]]; - - var srcNodeIdx = firstSubEdge.Source; - var tgtNodeIdx = lastSubEdge.Target; - - var srcRight = augX[srcNodeIdx] + augNodes[srcNodeIdx].Width; - var tgtLeft = augX[tgtNodeIdx]; - var srcPortY = augPortYSrc[subEdges[0]]; - var tgtPortY = augPortYTgt[subEdges[^1]]; - - var wps = new List - { - new(srcRight, srcPortY), - }; - - foreach (var subEdgeIdx in subEdges) - { - wps.AddRange(augBendPoints[subEdgeIdx]); - } - - wps.Add(new Point2D(tgtLeft, tgtPortY)); - result[origIdx] = wps; - } - - graph.Waypoints = result; - } -} diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LongEdgeSplitter.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LongEdgeSplitter.cs deleted file mode 100644 index 7fd7b05e..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LongEdgeSplitter.cs +++ /dev/null @@ -1,71 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// -namespace DemaConsulting.SysML2Tools.Layout.Engine.Layered; - -/// -/// Pipeline stage that splits every multi-layer edge into a chain of unit-span sub-edges by -/// inserting one zero-size dummy node per intermediate layer (ELK's LongEdgeSplitter). -/// -internal sealed class LongEdgeSplitter : ILayoutStage -{ - /// - public void Apply(LayeredGraph graph) - { - ArgumentNullException.ThrowIfNull(graph); - var (augNodes, augEdges) = InsertLongEdgeDummies(graph.N, graph.Nodes, graph.NodeLayers, graph.Acyclic); - graph.AugNodes = augNodes; - graph.AugEdges = augEdges; - } - - /// - /// Splits every edge spanning more than one layer into a chain of unit-span sub-edges by - /// inserting one zero-size dummy node at each intermediate layer, following - /// ELK's LongEdgeSplitter phase. - /// - private static (List AugNodes, List AugEdges) InsertLongEdgeDummies( - int n, - IReadOnlyList nodes, - int[] nodeLayers, - List acyclic) - { - var augNodes = new List(n + acyclic.Count); - for (var i = 0; i < n; i++) - { - augNodes.Add(new AugNode(nodes[i].Width, nodes[i].Height, nodeLayers[i])); - } - - var augEdges = new List(acyclic.Count * 2); - for (var e = 0; e < acyclic.Count; e++) - { - var edge = acyclic[e]; - var span = nodeLayers[edge.Target] - nodeLayers[edge.Source]; - - if (span <= 0) - { - continue; - } - - if (span == 1) - { - augEdges.Add(new AugEdge(edge.Source, edge.Target, e)); - } - else - { - // Chain: src → d1 → d2 → … → tgt with one dummy per intermediate layer. - var prev = edge.Source; - for (var l = nodeLayers[edge.Source] + 1; l < nodeLayers[edge.Target]; l++) - { - var dIdx = augNodes.Count; - augNodes.Add(new AugNode(0.0, 0.0, l, IsDummy: true)); - augEdges.Add(new AugEdge(prev, dIdx, e)); - prev = dIdx; - } - - augEdges.Add(new AugEdge(prev, edge.Target, e)); - } - } - - return (augNodes, augEdges); - } -} diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/OrthogonalRouter.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/OrthogonalRouter.cs deleted file mode 100644 index d0456fb0..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/OrthogonalRouter.cs +++ /dev/null @@ -1,311 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// -using static DemaConsulting.SysML2Tools.Layout.Engine.Layered.LayeredLayoutMetrics; - -namespace DemaConsulting.SysML2Tools.Layout.Engine.Layered; - -/// -/// Pipeline stage that routes every corridor using ELK's OrthogonalRoutingGenerator slot -/// algorithm, producing the orthogonal bend points for each augmented sub-edge. -/// -internal sealed class OrthogonalRouter : ILayoutStage -{ - /// - public void Apply(LayeredGraph graph) - { - ArgumentNullException.ThrowIfNull(graph); - var augNodes = graph.AugNodes; - var augEdges = graph.AugEdges; - var columnX = graph.ColumnX; - var maxColWidth = graph.MaxColWidth; - var augPortYSrc = graph.AugPortYSrc; - var augPortYTgt = graph.AugPortYTgt; - var numAugEdges = augEdges.Count; - - // Route each corridor using ELK's slot algorithm. - var layerCount = columnX.Length; - var augBendPoints = new List[numAugEdges]; - for (var ei = 0; ei < numAugEdges; ei++) - { - augBendPoints[ei] = []; - } - - for (var l = 0; l + 1 < layerCount; l++) - { - // Collect sub-edges whose source is in layer l. - var corridorEdges = augEdges - .Select((ae, i) => (ae, i)) - .Where(x => augNodes[x.ae.Source].Layer == l) - .ToList(); - - if (corridorEdges.Count == 0) - { - continue; - } - - // First slot starts one ConnectorClearance past the right edge of the source column. - var startPos = columnX[l] + maxColWidth[l] + ConnectorClearance; - - // Build routing segments. - var segments = corridorEdges - .Select(x => - { - var srcY = augPortYSrc[x.i]; - var tgtY = augPortYTgt[x.i]; - return new Segment - { - AugEdgeIndex = x.i, - SourceY = srcY, - TargetY = tgtY, - Lo = Math.Min(srcY, tgtY), - Hi = Math.Max(srcY, tgtY), - }; - }) - .ToList(); - - // Build crossing-based dependencies between segment pairs (ELK countCrossings). - for (var i = 0; i < segments.Count - 1; i++) - { - for (var j = i + 1; j < segments.Count; j++) - { - CreateDependency(segments[i], segments[j]); - } - } - - // Break cycles in the dependency graph by removing back edges. - BreakSegmentCycles(segments); - - // Assign routing slots via topological BFS (ELK topologicalNumbering). - TopologicalNumbering(segments); - - // Emit bend points: ELK WestToEastRoutingStrategy.calculateBendPoints. - foreach (var seg in segments) - { - if (Math.Abs(seg.SourceY - seg.TargetY) < StraightTolerance) - { - // Straight edge: no bend points, no slot consumed. - continue; - } - - var segX = startPos + (seg.RoutingSlot * EdgeSpacing); - - // Reversed (back) edges are stored flipped, so the consumer draws the end marker on - // the augmented-source face of the first sub-edge (whose source is the real node, not - // a long-edge dummy). For that sub-edge the wrap-around corridor is the final straight - // approach into the true target, and at the default slot it is only one - // ConnectorClearance wide. Guarantee that approach is at least - // graph.BackEdgeEntryApproach so the rounded corner never intrudes into the end - // decoration. Math.Max only ever pushes the jog outward, and at the default - // (BackEdgeEntryApproach == ConnectorClearance == startPos offset) it is a no-op, so - // forward edges (and every other sub-edge) are byte-identical. It runs in abstract - // RIGHT-equivalent coordinates so AxisTransform maps it to any requested direction. - var aug = augEdges[seg.AugEdgeIndex]; - if (graph.AcyclicReversed[aug.OrigEdgeIndex] && !augNodes[aug.Source].IsDummy) - { - segX = Math.Max(segX, columnX[l] + maxColWidth[l] + graph.BackEdgeEntryApproach); - } - - augBendPoints[seg.AugEdgeIndex] = - [ - new Point2D(segX, seg.SourceY), - new Point2D(segX, seg.TargetY), - ]; - } - } - - graph.AugBendPoints = augBendPoints; - } - - /// - /// Creates a directed dependency between two segments based on ELK's crossing-count heuristic - /// (countCrossings): the segment whose left placement causes fewer crossings becomes the - /// source (lower slot) of the dependency. - /// - /// - /// For 1:1 edges each segment has exactly one EAST port (SourceY, ELK incomingConnectionCoordinates) - /// and one WEST port (TargetY, ELK outgoingConnectionCoordinates). The crossing count is computed - /// per ELK's countCrossings(posis, start, end): number of positions in posis that fall - /// within [start, end]. - /// - private static void CreateDependency(Segment s1, Segment s2) - { - // crossings1: cost of placing s1 LEFT of s2. - // outgoing(s1)=[s1.TargetY] ∩ [s2.Lo, s2.Hi] → does s1's exit cross s2's extent? - // incoming(s2)=[s2.SourceY] ∩ [s1.Lo, s1.Hi] → does s2's entry fall inside s1's extent? - var c1 = CountCrossings(s1.TargetY, s2.Lo, s2.Hi) - + CountCrossings(s2.SourceY, s1.Lo, s1.Hi); - - // crossings2: cost of placing s2 LEFT of s1. - // outgoing(s2)=[s2.TargetY] ∩ [s1.Lo, s1.Hi] - // incoming(s1)=[s1.SourceY] ∩ [s2.Lo, s2.Hi] - var c2 = CountCrossings(s2.TargetY, s1.Lo, s1.Hi) - + CountCrossings(s1.SourceY, s2.Lo, s2.Hi); - - if (c1 < c2) - { - // s1 prefers to be left of s2. - _ = new SegDep(s1, s2, c2 - c1); - } - else if (c2 < c1) - { - // s2 prefers to be left of s1. - _ = new SegDep(s2, s1, c1 - c2); - } - else if (c1 > 0) - { - // Equal non-zero crossings: unavoidable conflict — pick s1 left (deterministic tie-break). - _ = new SegDep(s1, s2, 0); - } - - // c1 == c2 == 0: both orderings cross-free; no dependency needed. - } - - /// - /// Returns 1 if falls within [, - /// ], 0 otherwise. Implements ELK's single-position - /// countCrossings. - /// - private static int CountCrossings(double pos, double lo, double hi) - => (pos >= lo && pos <= hi) ? 1 : 0; - - /// - /// Detects and removes back edges in the dependency graph using DFS coloring, following - /// ELK's breakNonCriticalCycles. Removing a back edge accepts one additional crossing - /// in exchange for an acyclic ordering. - /// - private static void BreakSegmentCycles(List segments) - { - // 0 = unvisited, 1 = on stack (gray), 2 = done (black). - var color = new Dictionary(); - - void Dfs(Segment s) - { - color[s] = 1; - - // Snapshot the list before iterating to allow safe removal. - foreach (var dep in s.Outgoing.ToList()) - { - var t = dep.Target; - if (!color.TryGetValue(t, out var c)) - { - color[t] = 0; - Dfs(t); - } - else if (c == 1) - { - // Back edge detected: remove it to break the cycle. - dep.Remove(); - } - } - - // S4143: standard DFS coloring across recursion boundary. -#pragma warning disable S4143 - color[s] = 2; -#pragma warning restore S4143 - } - - foreach (var s in segments.Where(s => !color.ContainsKey(s))) - { - color[s] = 0; - Dfs(s); - } - } - - /// - /// Assigns routing slots to segments by topological BFS, implementing ELK's - /// topologicalNumbering. Each segment's slot equals the maximum predecessor slot - /// plus one (Kahn's algorithm on the dependency DAG). - /// - private static void TopologicalNumbering(List segments) - { - // Reset weights from the current (post-cycle-breaking) dependency graph. - foreach (var s in segments) - { - s.InWeight = s.Incoming.Count; - s.RoutingSlot = 0; - } - - var sources = segments.Where(s => s.InWeight == 0).ToList(); - - while (sources.Count > 0) - { - var node = sources[0]; - sources.RemoveAt(0); - - foreach (var tgt in node.Outgoing.Select(dep => dep.Target)) - { - tgt.RoutingSlot = Math.Max(tgt.RoutingSlot, node.RoutingSlot + 1); - tgt.InWeight--; - if (tgt.InWeight == 0) - { - sources.Add(tgt); - } - } - } - - // Any segments unreachable due to remaining cycles (should not occur after cycle-breaking) - // keep slot 0 and will be routed at the first available position. - } - - /// - /// A routing segment: one sub-edge crossing a single corridor, carrying its ELK port - /// coordinates and the slot assigned by topological numbering. - /// - private sealed class Segment - { - public int AugEdgeIndex; - - /// Y coordinate of the EAST (source-layer) port (ELK incomingConnectionCoordinates). - public double SourceY; - - /// Y coordinate of the WEST (target-layer) port (ELK outgoingConnectionCoordinates). - public double TargetY; - - /// Min of SourceY and TargetY, used for ELK crossing-count computation. - public double Lo; - - /// Max of SourceY and TargetY, used for ELK crossing-count computation. - public double Hi; - - /// Assigned routing slot (column offset within corridor). Set by topological numbering. - public int RoutingSlot; - - /// Remaining in-degree during topological BFS; initialized from Incoming.Count. - public int InWeight; - - - /// Dependencies for which this segment must precede the target. - public List Outgoing { get; } = []; - - /// Dependencies for which a predecessor must precede this segment. - public List Incoming { get; } = []; - } - - /// - /// A directed dependency between two routing segments: the source segment prefers - /// to occupy a lower slot than the target segment (ELK HyperEdgeSegmentDependency). - /// - private sealed class SegDep - { - public Segment Source { get; } - public Segment Target { get; } - public int Weight { get; } - - public SegDep(Segment src, Segment tgt, int weight) - { - Source = src; - Target = tgt; - Weight = weight; - src.Outgoing.Add(this); - tgt.Incoming.Add(this); - } - - /// Removes this dependency from both endpoints' adjacency lists. - public void Remove() - { - Source.Outgoing.Remove(this); - Target.Incoming.Remove(this); - } - } -} diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/PortDistributor.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/PortDistributor.cs deleted file mode 100644 index 787d8183..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/PortDistributor.cs +++ /dev/null @@ -1,131 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// -using static DemaConsulting.SysML2Tools.Layout.Engine.Layered.LayeredLayoutMetrics; - -namespace DemaConsulting.SysML2Tools.Layout.Engine.Layered; - -/// -/// Pipeline stage that distributes connector ports evenly along each box face and records the -/// source-side and target-side port Y coordinate for every augmented sub-edge. -/// -internal sealed class PortDistributor : ILayoutStage -{ - /// - public void Apply(LayeredGraph graph) - { - ArgumentNullException.ThrowIfNull(graph); - var n = graph.N; - var nodes = graph.Nodes; - var augNodes = graph.AugNodes; - var augEdges = graph.AugEdges; - var augY = graph.AugY; - var numAugEdges = augEdges.Count; - - // Port Y values: augPortYSrc[i] = source (right face) Y; augPortYTgt[i] = target (left face) Y. - var augPortYSrc = new double[numAugEdges]; - var augPortYTgt = new double[numAugEdges]; - - // Distribute outgoing (source-side) ports on each real node's right face. - var outByNode = new Dictionary>(); - for (var ei = 0; ei < numAugEdges; ei++) - { - var src = augEdges[ei].Source; - if (!outByNode.TryGetValue(src, out var list)) - { - list = []; - outByNode[src] = list; - } - - list.Add(ei); - } - - foreach (var (ni, edgeList) in outByNode) - { - if (augNodes[ni].IsDummy) - { - // Dummies pass the wire straight through at their own Y. - foreach (var ei in edgeList) - { - augPortYSrc[ei] = augY[ni]; - } - } - else - { - // Sort by target Y center, then edge index for stability. - var sorted = edgeList - .OrderBy(ei => augY[augEdges[ei].Target] + (augNodes[augEdges[ei].Target].Height / 2.0)) - .ThenBy(ei => ei) - .ToList(); - DistributePorts(sorted, augY[ni], nodes[ni].Height, augPortYSrc); - } - } - - // Distribute incoming (target-side) ports on each real node's left face. - var inByNode = new Dictionary>(); - for (var ei = 0; ei < numAugEdges; ei++) - { - var tgt = augEdges[ei].Target; - if (!inByNode.TryGetValue(tgt, out var list)) - { - list = []; - inByNode[tgt] = list; - } - - list.Add(ei); - } - - foreach (var (ni, edgeList) in inByNode) - { - if (augNodes[ni].IsDummy) - { - foreach (var ei in edgeList) - { - augPortYTgt[ei] = augY[ni]; - } - } - else - { - var sorted = edgeList - .OrderBy(ei => augY[augEdges[ei].Source] + (augNodes[augEdges[ei].Source].Height / 2.0)) - .ThenBy(ei => ei) - .ToList(); - DistributePorts(sorted, augY[ni], nodes[ni < n ? ni : 0].Height, augPortYTgt); - } - } - - graph.AugPortYSrc = augPortYSrc; - graph.AugPortYTgt = augPortYTgt; - } - - /// - /// Evenly distributes port Y positions along a node face, with - /// inset from the top and bottom edges. - /// - private static void DistributePorts( - IReadOnlyList sortedEdgeIndices, - double nodeTop, - double nodeHeight, - double[] portY) - { - var count = sortedEdgeIndices.Count; - for (var k = 0; k < count; k++) - { - double y; - if (count == 1) - { - y = nodeTop + (nodeHeight / 2.0); - } - else - { - var usable = nodeHeight - (2.0 * ConnectorClearance); - y = nodeTop + ConnectorClearance + (k * usable / (count - 1)); - } - - portY[sortedEdgeIndices[k]] = Math.Clamp( - y, - nodeTop + ConnectorClearance, - nodeTop + nodeHeight - ConnectorClearance); - } - } -} diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Rect.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Rect.cs deleted file mode 100644 index 4558a84a..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Rect.cs +++ /dev/null @@ -1,14 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -namespace DemaConsulting.SysML2Tools.Layout.Engine; - -/// -/// An axis-aligned rectangle in logical pixels, shared across the layout engine. -/// -/// Absolute X coordinate of the left edge in logical pixels. -/// Absolute Y coordinate of the top edge in logical pixels. -/// Width in logical pixels. -/// Height in logical pixels. -internal readonly record struct Rect(double X, double Y, double Width, double Height); diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/ActionFlowViewLayoutStrategy.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/ActionFlowViewLayoutStrategy.cs index 131afcc2..c99ca66d 100644 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/ActionFlowViewLayoutStrategy.cs +++ b/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/ActionFlowViewLayoutStrategy.cs @@ -2,8 +2,8 @@ // Copyright (c) DemaConsulting. All rights reserved. // -using DemaConsulting.SysML2Tools.Layout.Engine; -using DemaConsulting.SysML2Tools.Layout.Engine.Layered; +using DemaConsulting.Rendering; +using DemaConsulting.Rendering.Abstractions; using DemaConsulting.SysML2Tools.Rendering; using DemaConsulting.SysML2Tools.Rendering.Internal; using DemaConsulting.SysML2Tools.Semantic; @@ -13,14 +13,14 @@ namespace DemaConsulting.SysML2Tools.Layout.Internal; /// /// Layout strategy for Action Flow View diagrams. Renders action usages as rounded boxes placed -/// top-to-bottom by the layered layout pipeline, with a start node entering the initial actions, a +/// top-to-bottom by the layered layout algorithm, with a start node entering the initial actions, a /// done node leaving the final actions, and successions drawn as dashed flow arrows. /// /// -/// Actions are placed by with so -/// the flow reads top-to-bottom: a succession leaves its source on the SOUTH face and enters its target -/// on the NORTH face, and each succession follows the orthogonal polyline the pipeline routed for it. -/// The (possibly cyclic) succession graph is made acyclic by the pipeline's cycle-breaking stage; a +/// Actions are placed by the bundled layered algorithm flowing top-to-bottom (down) so the flow reads +/// top-to-bottom: a succession leaves its source on the SOUTH face and enters its target on the NORTH +/// face, and each succession follows the orthogonal polyline the algorithm routed for it. The +/// (possibly cyclic) succession graph is made acyclic by the algorithm's cycle-breaking stage; a /// filled-circle start marker enters the actions with no predecessor and a bullseye done marker leaves /// the actions with no successor, with a reserved marker band at the top and bottom of the canvas. /// @@ -36,11 +36,11 @@ internal sealed class ActionFlowViewLayoutStrategy : ILayoutStrategy private const double MarkerSize = 20.0; /// - /// Gap between a start/done marker and the adjacent action layer. Set to the layered pipeline's - /// between-layer spacing () so the control - /// markers keep the same vertical rhythm as the action layers. + /// Gap between a start/done marker and the adjacent action layer. Mirrors the layered algorithm's + /// between-layer corridor width (70 px) so the control markers keep the same vertical rhythm as + /// the action layers. /// - private const double MarkerLayerGap = LayeredLayoutMetrics.CorridorMinWidth; + private const double MarkerLayerGap = 70.0; /// An action with its computed box size. private sealed record ActionItem(string Name, double Width, double Height); @@ -67,29 +67,14 @@ public LayoutTree BuildLayout(ViewContext context, RenderOptions options) var edges = ResolveSuccessions(root, index); - // Place action boxes with the layered pipeline flowing top-to-bottom (DOWN). Each action - // becomes a node and each succession a directed edge; the pipeline's cycle-breaking stage + // Place action boxes with the layered algorithm flowing top-to-bottom (down). Each action + // becomes a node and each succession a directed edge; the algorithm's cycle-breaking stage // makes the (possibly cyclic) flow graph acyclic, so it tolerates back edges. Self-loops are // already excluded by ResolveSuccessions (it keeps only from != to). - var layerNodes = actions.Select(a => new LayerNode(a.Width, a.Height)).ToList(); - var layerEdges = edges.Select(e => new LayerEdge(e.From, e.To)).ToList(); - - var graph = new LayeredGraph(layerNodes, layerEdges, LayoutDirection.Down) - { - // Reserve a clean straight approach for the open-chevron target marker that every - // succession carries, so the pipeline pushes reversed (back) edges far enough out that the - // renderer's rounded corner never intrudes into the decoration. The approach equals the - // marker's along-line length plus one corner radius (consumed by the rounded corner) plus - // a safety margin — identical injection to the State Transition strategy. - BackEdgeEntryApproach = NotationMetrics.AlongLineLength(EndMarkerStyle.OpenChevron) - + theme.LineCornerRadius + theme.CleanLegMargin, - }; - var pipeline = LayeredLayoutPipeline.Builder() - .Direction(LayoutDirection.Down) - .Hierarchy(HierarchyHandling.Flat) - .AddDefaultStages() - .Build(); - pipeline.Run(graph); + var placed = LayeredPlacement.Place( + actions.Select(a => (a.Width, a.Height)).ToList(), + edges, + LayoutFlowDirection.Down); // Compute the top-left of the content bounding box over the real action nodes and the screen // offset that normalizes it into the canvas, reserving a marker band at the top (start) and @@ -99,8 +84,8 @@ public LayoutTree BuildLayout(ViewContext context, RenderOptions options) var minY = double.PositiveInfinity; for (var i = 0; i < actions.Count; i++) { - minX = Math.Min(minX, graph.AugX[i]); - minY = Math.Min(minY, graph.AugY[i]); + minX = Math.Min(minX, placed.Rects[i].X); + minY = Math.Min(minY, placed.Rects[i].Y); } var offsetX = margin - minX; @@ -109,7 +94,7 @@ public LayoutTree BuildLayout(ViewContext context, RenderOptions options) var rects = new Rect[actions.Count]; for (var i = 0; i < actions.Count; i++) { - rects[i] = new Rect(graph.AugX[i] + offsetX, graph.AugY[i] + offsetY, actions[i].Width, actions[i].Height); + rects[i] = new Rect(placed.Rects[i].X + offsetX, placed.Rects[i].Y + offsetY, actions[i].Width, actions[i].Height); } var nodes = new List(); @@ -118,7 +103,7 @@ public LayoutTree BuildLayout(ViewContext context, RenderOptions options) nodes.Add(MakeActionBox(actions[i], rects[i])); } - var crossings = AddSuccessionEdges(edges, graph, rects, offsetX, offsetY, nodes); + var crossings = AddSuccessionEdges(edges, placed.EdgePolylines, rects, offsetX, offsetY, nodes); AddStartAndDone(actions, rects, edges, margin, nodes); // Size the canvas to the actual rendered content: action boxes plus routed succession @@ -245,42 +230,34 @@ private static LayoutBox MakeActionBox(ActionItem action, Rect rect) => Keyword: "action"); /// - /// Adds the succession flow edges (top-to-bottom) between action boxes, mapping each succession to - /// the orthogonal polyline the layered pipeline routed for it, and returns the number of + /// Adds the succession flow edges (top-to-bottom) between action boxes, using the orthogonal + /// polyline the layered algorithm routed for each succession, and returns the number of /// successions whose polyline crosses a non-endpoint action box. /// /// - /// The pipeline's cycle-breaking stage de-duplicates identical directed pairs and reverses back - /// edges, so is not 1:1 with the input successions. A lookup - /// keyed by the routed (source, target) pair recovers each succession's polyline; a - /// succession whose routed edge was reversed reuses that polyline in reverse so the open chevron - /// end marker lands on the true target. + /// The layered algorithm returns exactly one routed polyline per input succession, in input order + /// and already oriented source-to-target, so succession e uses edgePolylines[e] + /// directly. The open chevron end marker therefore always lands on the true target. /// private static int AddSuccessionEdges( IReadOnlyList<(int From, int To)> edges, - LayeredGraph graph, + IReadOnlyList> edgePolylines, Rect[] rects, double offsetX, double offsetY, List nodes) { - // Build the routed (source, target) -> polyline lookup over the acyclic edge set. - var routed = new Dictionary<(int Source, int Target), IReadOnlyList>(); - for (var k = 0; k < graph.Acyclic.Count; k++) - { - var edge = graph.Acyclic[k]; - routed[(edge.Source, edge.Target)] = graph.Waypoints[k]; - } - var crossings = 0; - foreach (var (from, to) in edges) + for (var e = 0; e < edges.Count; e++) { - var routedPoints = ResolveSuccessionPolyline(from, to, routed) - ?? [Centre(rects[from]), Centre(rects[to])]; + var (from, to) = edges[e]; + var poly = edgePolylines[e]; - var waypoints = routedPoints - .Select(p => new Point2D(p.X + offsetX, p.Y + offsetY)) - .ToList(); + // The algorithm routes every edge, so poly normally has >= 2 points; fall back to a + // straight segment between the (already-offset) box centres only if it does not. + var waypoints = poly.Count >= 2 + ? poly.Select(p => new Point2D(p.X + offsetX, p.Y + offsetY)).ToList() + : [Centre(rects[from]), Centre(rects[to])]; if (CrossesNonEndpointBox(waypoints, rects, from, to)) { @@ -298,30 +275,6 @@ private static int AddSuccessionEdges( return crossings; } - /// - /// Returns the routed polyline for a succession, reversing it when only the opposite direction was - /// routed (a reversed back edge), or null when neither direction was routed. - /// - private static IReadOnlyList? ResolveSuccessionPolyline( - int from, - int to, - IReadOnlyDictionary<(int Source, int Target), IReadOnlyList> routed) - { - if (routed.TryGetValue((from, to), out var forward)) - { - return forward; - } - - if (routed.TryGetValue((to, from), out var backward)) - { - // The pipeline reversed this back edge; reverse the polyline so it runs source -> target - // with the open chevron end marker at the true target. - return [.. backward.Reverse()]; - } - - return null; - } - /// /// Adds the start marker (filled circle) entering the actions with no predecessor and the done /// marker (bullseye) leaving the actions with no successor, each joined by a solid flow line. diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/BrowserViewLayoutStrategy.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/BrowserViewLayoutStrategy.cs index 302892e3..9014bf37 100644 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/BrowserViewLayoutStrategy.cs +++ b/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/BrowserViewLayoutStrategy.cs @@ -2,6 +2,8 @@ // Copyright (c) DemaConsulting. All rights reserved. // +using DemaConsulting.Rendering; +using DemaConsulting.Rendering.Abstractions; using DemaConsulting.SysML2Tools.Rendering; using DemaConsulting.SysML2Tools.Rendering.Internal; using DemaConsulting.SysML2Tools.Semantic; diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/GeneralViewLayoutStrategy.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/GeneralViewLayoutStrategy.cs index 1fffaffe..4c0396ed 100644 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/GeneralViewLayoutStrategy.cs +++ b/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/GeneralViewLayoutStrategy.cs @@ -2,8 +2,9 @@ // Copyright (c) DemaConsulting. All rights reserved. // -using DemaConsulting.SysML2Tools.Layout.Engine; -using DemaConsulting.SysML2Tools.Layout.Engine.Layered; +using DemaConsulting.Rendering; +using DemaConsulting.Rendering.Abstractions; +using DemaConsulting.Rendering.Layout; using DemaConsulting.SysML2Tools.Rendering; using DemaConsulting.SysML2Tools.Rendering.Internal; using DemaConsulting.SysML2Tools.Semantic; @@ -18,14 +19,15 @@ namespace DemaConsulting.SysML2Tools.Layout.Internal; /// attribute-typing edges orthogonally between the boxes. /// /// -/// Box placement and intra-package edge routing use the reusable layered pipeline -/// () running left-to-right with a -/// stage: each package's definitions and the edges between them are laid out together inside the -/// package folder, with disconnected definitions (such as standalone interface or attribute defs) -/// packed beside the connected core. The folders themselves are packed across the canvas with -/// so they never overlap. The rare cross-package edge (an endpoint -/// in a different package folder) falls back to , which routes orthogonally -/// around the placed folders. Standard-library declarations are excluded via . +/// Box placement and intra-package edge routing use the bundled layered algorithm (via +/// ) running left-to-right: each package's definitions and the edges +/// between them are laid out together inside the package folder, with disconnected definitions (such +/// as standalone interface or attribute defs) packed beside the connected core by the algorithm's +/// component packing. The folders themselves are packed across the canvas with +/// so they never overlap. The rare cross-package edge (an endpoint in +/// a different package folder) is routed orthogonally around the placed folders with +/// . Standard-library declarations are excluded via +/// . /// internal sealed class GeneralViewLayoutStrategy : ILayoutStrategy { @@ -379,13 +381,18 @@ private static (List Nodes, List Placed, List blocks.Add(new BlockPlan(package, items, blockWidth, blockHeight) { Layout = layout }); } - // Pack the blocks across the canvas (atomic blocks → folders never overlap). - var outer = ContainmentPacker.Pack( - [.. blocks.Select(b => new PackItem(b.Width, b.Height))], - maxContentWidth: ComputeCanvasWidth(blocks), - horizontalGap: hGap, - verticalGap: vGap, - padding: margin); + // Pack the blocks across the canvas (atomic blocks → folders never overlap). The blocks are + // represented as sized placeholder boxes; ContainmentLayout returns them repositioned. + var packChildren = blocks + .Select(b => new LayoutBox(0, 0, b.Width, b.Height, null, 0, BoxShape.Rectangle, [], [])) + .ToList(); + var outer = ContainmentLayout.Pack( + packChildren, + new ContainmentOptions( + MaxContentWidth: ComputeCanvasWidth(blocks), + HorizontalGap: hGap, + VerticalGap: vGap, + Padding: margin)); var nodes = new List(); var placed = new List(); @@ -393,34 +400,32 @@ private static (List Nodes, List Placed, List for (var i = 0; i < blocks.Count; i++) { - PlaceBlock(blocks[i], outer.Rects[i], folderTitleHeight, margin, theme, nodes, placed, intraEdges); + var c = outer.Children[i]; + PlaceBlock(blocks[i], new Rect(c.X, c.Y, c.Width, c.Height), folderTitleHeight, margin, theme, nodes, placed, intraEdges); } return (nodes, placed, intraEdges, outer.Width, outer.Height); } /// - /// Lays out one package group with the layered pipeline plus a stage, - /// then reads back each definition's package-local top-left and each intra-group edge's polyline, - /// normalized against the group's content bounding box. + /// Lays out one package group with the layered algorithm (whose component packing places + /// disconnected definitions beside the connected core), then reads back each definition's + /// package-local top-left and each intra-group edge's polyline, normalized against the group's + /// content bounding box. /// /// The group's definitions, in group order. /// The intra-group edges in package-local node indices. /// The package-local placement of the group's definitions and routed edges. private static GroupLayout LayoutGroup(IReadOnlyList items, IReadOnlyList intraEdges) { - var layerNodes = items.Select(d => new LayerNode(d.Width, d.Height)).ToList(); - var layerEdges = intraEdges.Select(e => new LayerEdge(e.SourceLocal, e.TargetLocal)).ToList(); - - // Run the layered pipeline left-to-right; ComponentPacker packs disconnected definitions - // (e.g. standalone interface/attribute defs) beside the connected core within the folder. - var graph = new LayeredGraph(layerNodes, layerEdges, LayoutDirection.Right); - var pipeline = LayeredLayoutPipeline.Builder() - .Direction(LayoutDirection.Right) - .Hierarchy(HierarchyHandling.Flat) - .AddStage(ComponentPacker.WithDefaultStages()) - .Build(); - pipeline.Run(graph); + // Run the layered algorithm left-to-right; its component packing places disconnected + // definitions (e.g. standalone interface/attribute defs) beside the connected core. Self-edges + // carry no routed polyline, so only non-self edges are placed and mapped back by index. + var flowIntra = intraEdges.Where(e => e.SourceLocal != e.TargetLocal).ToList(); + var placed = LayeredPlacement.Place( + items.Select(d => (d.Width, d.Height)).ToList(), + flowIntra.Select(e => (e.SourceLocal, e.TargetLocal)).ToList(), + LayoutFlowDirection.Right); // Compute the content bounding box over the real definition nodes (indices [0, items.Count)). var minX = double.PositiveInfinity; @@ -429,42 +434,30 @@ private static GroupLayout LayoutGroup(IReadOnlyList items, IReadOnlyLis var maxY = double.NegativeInfinity; for (var i = 0; i < items.Count; i++) { - minX = Math.Min(minX, graph.AugX[i]); - minY = Math.Min(minY, graph.AugY[i]); - maxX = Math.Max(maxX, graph.AugX[i] + items[i].Width); - maxY = Math.Max(maxY, graph.AugY[i] + items[i].Height); + minX = Math.Min(minX, placed.Rects[i].X); + minY = Math.Min(minY, placed.Rects[i].Y); + maxX = Math.Max(maxX, placed.Rects[i].X + items[i].Width); + maxY = Math.Max(maxY, placed.Rects[i].Y + items[i].Height); } // Normalize node positions so the content bounding box starts at the local origin (0, 0). var localPos = new (double X, double Y)[items.Count]; for (var i = 0; i < items.Count; i++) { - localPos[i] = (graph.AugX[i] - minX, graph.AugY[i] - minY); + localPos[i] = (placed.Rects[i].X - minX, placed.Rects[i].Y - minY); } - // The layered pipeline populates graph.Waypoints per ACYCLIC edge, not per intra-edge: its - // cycle-breaking stage drops self-loops, de-duplicates identical directed pairs, and reverses - // back edges. Build a (source, target) -> polyline lookup over the acyclic edge set and resolve - // each intra-edge by its endpoints, reversing the polyline for a reversed back edge so the - // arrowhead lands on the true target. Each polyline is translated into the content-local frame. - var routed = new Dictionary<(int Source, int Target), IReadOnlyList>(); - for (var k = 0; k < graph.Acyclic.Count; k++) + // The algorithm returns exactly one routed polyline per non-self edge, in input order and + // oriented source -> target, so non-self edge k uses EdgePolylines[k] directly. Each polyline + // is translated into the content-local frame. + var edges = new List<(IReadOnlyList Points, EndMarkerStyle Arrowhead, LineStyle LineStyle)>(flowIntra.Count); + for (var k = 0; k < flowIntra.Count; k++) { - var edge = graph.Acyclic[k]; - routed[(edge.Source, edge.Target)] = graph.Waypoints[k]; - } - - var edges = new List<(IReadOnlyList Points, EndMarkerStyle Arrowhead, LineStyle LineStyle)>(intraEdges.Count); - foreach (var intra in intraEdges) - { - // Self-edges are dropped by the pipeline and have no routed polyline; skip them. - if (intra.SourceLocal == intra.TargetLocal) - { - continue; - } - - var routedPoints = ResolveIntraPolyline(intra.SourceLocal, intra.TargetLocal, routed) - ?? [NodeCentre(graph, items, intra.SourceLocal), NodeCentre(graph, items, intra.TargetLocal)]; + var intra = flowIntra[k]; + var poly = placed.EdgePolylines[k]; + var routedPoints = poly.Count >= 2 + ? poly + : [NodeCentre(placed.Rects, items, intra.SourceLocal), NodeCentre(placed.Rects, items, intra.TargetLocal)]; var points = routedPoints.Select(p => new Point2D(p.X - minX, p.Y - minY)).ToList(); edges.Add((points, intra.Arrowhead, LineStyleForKind(intra.Kind))); @@ -473,41 +466,13 @@ private static GroupLayout LayoutGroup(IReadOnlyList items, IReadOnlyLis return new GroupLayout(localPos, maxX - minX, maxY - minY, edges); } - /// - /// Returns the routed polyline for an intra-group edge, reversing it when only the opposite - /// direction was routed (a reversed back edge), or when neither direction - /// was routed. - /// - /// Group-local index of the edge's source definition. - /// Group-local index of the edge's target definition. - /// The (source, target) to polyline lookup over the acyclic edge set. - /// The polyline running source to target, or null when neither direction was routed. - private static IReadOnlyList? ResolveIntraPolyline( - int source, - int target, - IReadOnlyDictionary<(int Source, int Target), IReadOnlyList> routed) - { - if (routed.TryGetValue((source, target), out var forward)) - { - return forward; - } - - if (routed.TryGetValue((target, source), out var backward)) - { - // The pipeline reversed this back edge; reverse the polyline so it runs source -> target. - return [.. backward.Reverse()]; - } - - return null; - } - - /// Returns the centre point of a group definition's placed box, in graph coordinates. - /// The laid-out group graph. + /// Returns the centre point of a group definition's placed box, in algorithm coordinates. + /// The placed box rectangles, in group order. /// The group's definitions, in group order. /// Group-local index of the definition. /// The box centre used as a straight-line fallback when no route was found. - private static Point2D NodeCentre(LayeredGraph graph, IReadOnlyList items, int index) => - new(graph.AugX[index] + (items[index].Width / 2.0), graph.AugY[index] + (items[index].Height / 2.0)); + private static Point2D NodeCentre(IReadOnlyList rects, IReadOnlyList items, int index) => + new(rects[index].X + (items[index].Width / 2.0), rects[index].Y + (items[index].Height / 2.0)); /// /// Emits the layout nodes for one placed block: a package folder with its child definition boxes, @@ -516,7 +481,7 @@ private static Point2D NodeCentre(LayeredGraph graph, IReadOnlyList item /// private static void PlaceBlock( BlockPlan block, - PackedRect rect, + Rect rect, double folderTitleHeight, double margin, Theme theme, @@ -591,7 +556,7 @@ private static void PlaceBlock( } /// Creates the folder for a package block with the given children. - private static LayoutBox MakeFolderBox(BlockPlan block, PackedRect rect, List children) => + private static LayoutBox MakeFolderBox(BlockPlan block, Rect rect, List children) => new( X: rect.X, Y: rect.Y, @@ -750,7 +715,7 @@ private static bool TryResolveLoc( } /// - /// Routes the cross-package edges around the placed folders with . + /// Routes the cross-package edges around the placed folders with . /// Cross-package edges are rare in practice (most General-view models are single-package); each is /// drawn cost-neutrally between the two folders, with the recorded arrowhead at the target end. /// @@ -793,53 +758,36 @@ private static List RouteCrossEdges(IReadOnlyList crossEd /// private static LayoutLine RouteCrossEdge(PlacedBox from, PlacedBox to, IReadOnlyList placed, EndMarkerStyle targetArrowhead, LineStyle lineStyle) { - var fromCenter = new Point2D(from.X + (from.Width / 2.0), from.Y + (from.Height / 2.0)); - var toCenter = new Point2D(to.X + (to.Width / 2.0), to.Y + (to.Height / 2.0)); - - var (source, sourceSide) = AnchorToward(from, toCenter); - var (target, targetSide) = AnchorToward(to, fromCenter); - - // Obstacles are all boxes except the two endpoints of this edge. - var obstacles = placed - .Where(b => b.QualifiedName != from.QualifiedName && b.QualifiedName != to.QualifiedName) - .Select(b => new Rect(b.X, b.Y, b.Width, b.Height)) - .ToList(); - - var route = ChannelRouter.RouteWithStatus(source, target, obstacles, EdgeClearance, sourceSide, targetSide); - - return new LayoutLine( - Waypoints: route.Waypoints, - SourceEnd: EndMarkerStyle.None, - TargetEnd: targetArrowhead, - LineStyle: lineStyle, - MidpointLabel: null); - } - - /// - /// Returns the midpoint of the box side whose outward normal best points at the target, along - /// with that side. - /// - private static (Point2D Point, PortSide Side) AnchorToward(PlacedBox box, Point2D target) - { - var cx = box.X + (box.Width / 2.0); - var cy = box.Y + (box.Height / 2.0); - var dx = target.X - cx; - var dy = target.Y - cy; - - if (Math.Abs(dx) >= Math.Abs(dy)) + // Represent every placed definition as a box for the router. The from/to boxes are the + // connection endpoints; every other box is an obstacle the router steers around. The router + // picks the anchor faces the two endpoints present to each other. + var fromBox = ToRouteBox(from); + var toBox = ToRouteBox(to); + var boxes = new List(placed.Count); + foreach (var b in placed) { - // Left or right side. - return dx >= 0 - ? (new Point2D(box.X + box.Width, cy), PortSide.Right) - : (new Point2D(box.X, cy), PortSide.Left); + if (b.QualifiedName == from.QualifiedName) + { + boxes.Add(fromBox); + } + else if (b.QualifiedName == to.QualifiedName) + { + boxes.Add(toBox); + } + else + { + boxes.Add(ToRouteBox(b)); + } } - // Top or bottom side. - return dy >= 0 - ? (new Point2D(cx, box.Y + box.Height), PortSide.Bottom) - : (new Point2D(cx, box.Y), PortSide.Top); + var connection = new Connection(fromBox, toBox, targetArrowhead, lineStyle, null); + return ConnectorRouter.Route(boxes, connection, new ConnectorRouteOptions(EdgeRouting.Orthogonal, EdgeClearance)); } + /// Represents a placed definition as a plain rectangle box for connector routing. + private static LayoutBox ToRouteBox(PlacedBox box) => + new(box.X, box.Y, box.Width, box.Height, null, 0, BoxShape.Rectangle, [], []); + /// Computes the packing width used to lay out top-level blocks across the canvas. private static double ComputeCanvasWidth(IReadOnlyList blocks) { diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/GridViewLayoutStrategy.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/GridViewLayoutStrategy.cs index c36004d0..fd06cd2e 100644 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/GridViewLayoutStrategy.cs +++ b/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/GridViewLayoutStrategy.cs @@ -2,6 +2,8 @@ // Copyright (c) DemaConsulting. All rights reserved. // +using DemaConsulting.Rendering; +using DemaConsulting.Rendering.Abstractions; using DemaConsulting.SysML2Tools.Rendering; using DemaConsulting.SysML2Tools.Rendering.Internal; using DemaConsulting.SysML2Tools.Semantic; diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/InterconnectionViewLayoutStrategy.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/InterconnectionViewLayoutStrategy.cs index 8d77b130..d86ebc16 100644 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/InterconnectionViewLayoutStrategy.cs +++ b/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/InterconnectionViewLayoutStrategy.cs @@ -2,8 +2,8 @@ // Copyright (c) DemaConsulting. All rights reserved. // -using DemaConsulting.SysML2Tools.Layout.Engine; -using DemaConsulting.SysML2Tools.Layout.Engine.Layered; +using DemaConsulting.Rendering; +using DemaConsulting.Rendering.Abstractions; using DemaConsulting.SysML2Tools.Rendering; using DemaConsulting.SysML2Tools.Rendering.Internal; using DemaConsulting.SysML2Tools.Semantic; @@ -17,27 +17,24 @@ namespace DemaConsulting.SysML2Tools.Layout.Internal; /// /// /// Shows the internal structure of a single part definition: its nested part usages as -/// boxes placed by , ports on the box boundaries, -/// and connection usages routed as orthogonal connector polylines between the ports, all -/// enclosed by a container box for the host definition. +/// boxes placed by the bundled layered algorithm, ports on the box boundaries, and connection +/// usages routed as orthogonal connector polylines between the ports, all enclosed by a container +/// box for the host definition. /// /// /// Box heights are scaled to ensure each port has at least px of /// vertical clearance, so connectors remain visually distinct regardless of connection count. -/// All placement and routing is delegated to , which -/// implements the full ELK-compatible Sugiyama pipeline. +/// All placement and routing is delegated to the layered algorithm via . /// /// /// When a nested part is itself typed by a part def that has its own internal parts, the -/// strategy lays out that inner structure recursively (bottom-up, ELK SEPARATE_CHILDREN): -/// the inner definition is laid out first with the same flat engine, the container part is then -/// treated as an atomic fixed-size node by the parent, and the inner content is nested as the -/// container box's . A single-level model (no part typed by a -/// definition with internal parts) is a strict no-op: the recursion never fires and the output is -/// identical to the non-recursive layout. The reserved -/// pipeline mode -/// is intentionally left not wired; recursion is driven here, at the strategy level, because -/// container detection is a semantic-model concern the model-independent engine cannot see. +/// strategy lays out that inner structure recursively (bottom-up): the inner definition is laid out +/// first with the same flat algorithm, the container part is then treated as an atomic fixed-size node +/// by the parent, and the inner content is nested as the container box's +/// . A single-level model (no part typed by a definition with internal +/// parts) is a strict no-op: the recursion never fires and the output is identical to the +/// non-recursive layout. Recursion is driven here, at the strategy level, because container detection +/// is a semantic-model concern the model-independent algorithm cannot see. /// /// internal sealed class InterconnectionViewLayoutStrategy : ILayoutStrategy @@ -54,6 +51,12 @@ internal sealed class InterconnectionViewLayoutStrategy : ILayoutStrategy /// Clearance used when computing the minimum box height from port count. private const double ConnectorClearance = 10.0; + /// + /// Uniform padding the layered algorithm adds around placed content (mirrors its internal + /// content padding), used to give routed connectors the same trailing inset as the boxes. + /// + private const double LayeredContentPadding = 20.0; + /// /// A nested part usage with its computed intrinsic box size. When the part is a container (its /// type is a part def with its own internal parts), holds the @@ -134,7 +137,7 @@ public LayoutTree BuildLayout(ViewContext context, RenderOptions options) /// /// Lays out the interior of one definition: collects its parts (recursing into container - /// parts), places them with , and emits one rounded + /// parts), places them with the bundled layered algorithm, and emits one rounded /// box per part plus a port pair and connector line per connection — all positioned relative to /// the container's own top-left origin (0, 0). /// @@ -163,33 +166,33 @@ private static InteriorLayout LayOutInterior( degree[p.B]++; } - var layerNodes = parts + var nodeSizes = parts .Select((p, i) => { var minH = (degree[i] * MinPortSlot) + (2.0 * ConnectorClearance); - return new LayerNode(p.Width, Math.Max(p.Height, minH)); + return (p.Width, Math.Max(p.Height, minH)); }) .ToList(); - var layerEdges = pairs.Select(p => new LayerEdge(p.A, p.B)).ToList(); + var edgePairs = pairs.Select(p => (p.A, p.B)).ToList(); - // Delegate all placement and routing to the engine. - var placed = InterconnectionLayoutEngine.Place(layerNodes, layerEdges); + // Delegate all placement and routing to the layered algorithm. + var placed = LayeredPlacement.Place(nodeSizes, edgePairs, LayoutFlowDirection.Right); // Shift placed content down/right to sit inside the container box. var titleArea = BoxMetrics.TitleAreaHeight(theme, hasLabel: true, hasKeyword: true); var offsetX = theme.LabelPadding * 2.0; var offsetY = titleArea + (theme.LabelPadding * 2.0); - var containerWidth = placed.TotalWidth + (offsetX * 2.0); - var containerHeight = placed.TotalHeight + offsetY + (theme.LabelPadding * 2.0); + var containerWidth = placed.Width + (offsetX * 2.0); + var containerHeight = placed.Height + offsetY + (theme.LabelPadding * 2.0); - // InterconnectionLayoutEngine derives TotalWidth/Height from box extents only, but a - // connector can route beyond the boxes (e.g. wrapping below them). Extend the container so - // every waypoint is enclosed with the same trailing inset the boxes already receive, so no - // connector scrapes the container edge. - var trailingInset = LayeredLayoutMetrics.Padding + (theme.LabelPadding * 2.0); - foreach (var wp in placed.ConnectorWaypoints) + // The layered algorithm derives its size from box extents only, but a connector can route + // beyond the boxes (e.g. wrapping below them). Extend the container so every waypoint is + // enclosed with the same trailing inset the boxes already receive, so no connector scrapes the + // container edge. + var trailingInset = LayeredContentPadding + (theme.LabelPadding * 2.0); + foreach (var wp in placed.EdgePolylines) { foreach (var p in wp) { @@ -207,24 +210,13 @@ private static InteriorLayout LayOutInterior( content.Add(MakePartBox(parts[i], new Rect(r.X + offsetX, r.Y + offsetY, r.Width, r.Height), depth + 1)); } - // InterconnectionLayoutEngine populates ConnectorWaypoints per ACYCLIC edge: its cycle-breaking - // stage de-duplicates identical directed pairs and reverses back edges, so the polylines are not - // 1:1 with pairs (self-connections were already dropped in ResolveConnections). Build a - // (source, target) -> polyline lookup over the acyclic edge set and resolve each connection by - // its endpoints, reversing the polyline for a reversed back edge so the source/target ports - // stay on the correct box faces. - var routed = new Dictionary<(int Source, int Target), IReadOnlyList>(); - for (var k = 0; k < placed.AcyclicEdges.Count; k++) + // One port pair and one connector line per connection. The algorithm returns exactly one + // routed polyline per input connection, in input order and oriented source -> target, so + // connection k uses EdgePolylines[k] directly. + for (var k = 0; k < pairs.Count; k++) { - var edge = placed.AcyclicEdges[k]; - routed[(edge.Source, edge.Target)] = placed.ConnectorWaypoints[k]; - } - - // One port pair and one connector line per connection. - foreach (var pair in pairs) - { - var wp = ResolveConnectorPolyline(pair.A, pair.B, routed); - if (wp is null || wp.Count < 2) + var wp = placed.EdgePolylines[k]; + if (wp.Count < 2) { continue; } @@ -249,34 +241,6 @@ private static InteriorLayout LayOutInterior( return new InteriorLayout(containerWidth, containerHeight, content); } - /// - /// Returns the routed connector polyline for a connection, reversing it when only the opposite - /// direction was routed (a reversed back edge), or when neither direction - /// was routed. - /// - /// Source part index of the connection. - /// Target part index of the connection. - /// The (source, target) to polyline lookup over the acyclic edge set. - /// The polyline running from part to , or null. - private static IReadOnlyList? ResolveConnectorPolyline( - int a, - int b, - IReadOnlyDictionary<(int Source, int Target), IReadOnlyList> routed) - { - if (routed.TryGetValue((a, b), out var forward)) - { - return forward; - } - - if (routed.TryGetValue((b, a), out var backward)) - { - // The pipeline reversed this back edge; reverse the polyline so it runs a -> b. - return [.. backward.Reverse()]; - } - - return null; - } - /// /// Finds the part definition whose interior to render: the non-stdlib part def /// with the most connections, falling back to the one with the most part usages. diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/LayeredPlacement.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/LayeredPlacement.cs new file mode 100644 index 00000000..e54f399d --- /dev/null +++ b/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/LayeredPlacement.cs @@ -0,0 +1,92 @@ +// +// Copyright (c) DemaConsulting. All rights reserved. +// + +using System.Globalization; + +using DemaConsulting.Rendering; +using DemaConsulting.Rendering.Layout; + +namespace DemaConsulting.SysML2Tools.Layout.Internal; + +/// +/// Result of a layered placement. +/// +/// Placed box rectangles, one per input node in input-node order. +/// +/// Routed orthogonal connector polylines, one per input edge in input-edge order. Each polyline is +/// already oriented source-to-target (the algorithm reverses back edges internally). +/// +/// Overall content width in logical pixels. +/// Overall content height in logical pixels. +internal sealed record PlacedLayout( + IReadOnlyList Rects, + IReadOnlyList> EdgePolylines, + double Width, + double Height); + +/// +/// Adapts the DemaConsulting.Rendering bundled "layered" layout algorithm to the SysML view +/// strategies. It builds a from sized nodes and directed edges, runs the +/// , and returns the placed box rectangles (in input-node order) +/// together with the routed connector polylines (one per input edge, in input-edge order). +/// +/// +/// The algorithm emits exactly one placed box per input node and exactly one routed connector per +/// input edge, preserving the caller's ordering, so callers map results back to their own model by +/// index. Back edges are reversed internally, so every returned polyline runs source-to-target. +/// +internal static class LayeredPlacement +{ + /// + /// Places sized nodes and directed edges with the bundled layered algorithm. + /// + /// Sized nodes to place, in caller order. + /// Directed edges between nodes (by index), in caller order. + /// Primary flow direction for the layered layout. + /// The placed rectangles, routed polylines, and overall content size. + public static PlacedLayout Place( + IReadOnlyList<(double Width, double Height)> nodes, + IReadOnlyList<(int From, int To)> edges, + LayoutFlowDirection direction) + { + ArgumentNullException.ThrowIfNull(nodes); + ArgumentNullException.ThrowIfNull(edges); + + var graph = new LayoutGraph(); + var graphNodes = new LayoutGraphNode[nodes.Count]; + for (var i = 0; i < nodes.Count; i++) + { + graphNodes[i] = graph.AddNode( + i.ToString(CultureInfo.InvariantCulture), nodes[i].Width, nodes[i].Height); + } + + for (var e = 0; e < edges.Count; e++) + { + var (from, to) = edges[e]; + graph.AddEdge(e.ToString(CultureInfo.InvariantCulture), graphNodes[from], graphNodes[to]); + } + + var options = new LayoutOptions(); + options.Set(CoreOptions.Direction, direction); + + var tree = new LayeredLayoutAlgorithm().Apply(graph, options); + + var boxes = tree.Nodes.OfType().ToList(); + var lines = tree.Nodes.OfType().ToList(); + + var rects = new Rect[boxes.Count]; + for (var i = 0; i < boxes.Count; i++) + { + rects[i] = new Rect(boxes[i].X, boxes[i].Y, boxes[i].Width, boxes[i].Height); + } + + var polylines = new IReadOnlyList[lines.Count]; + for (var i = 0; i < lines.Count; i++) + { + polylines[i] = lines[i].Waypoints; + } + + return new PlacedLayout(rects, polylines, tree.Width, tree.Height); + } +} diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/LayoutWarnings.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/LayoutWarnings.cs index 7785cd51..c7c57aa5 100644 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/LayoutWarnings.cs +++ b/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/LayoutWarnings.cs @@ -4,6 +4,8 @@ using System.Globalization; +using DemaConsulting.Rendering; + namespace DemaConsulting.SysML2Tools.Layout.Internal; /// diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/SequenceViewLayoutStrategy.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/SequenceViewLayoutStrategy.cs index 42cfc6db..ad141ad3 100644 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/SequenceViewLayoutStrategy.cs +++ b/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/SequenceViewLayoutStrategy.cs @@ -2,6 +2,8 @@ // Copyright (c) DemaConsulting. All rights reserved. // +using DemaConsulting.Rendering; +using DemaConsulting.Rendering.Abstractions; using DemaConsulting.SysML2Tools.Rendering; using DemaConsulting.SysML2Tools.Rendering.Internal; using DemaConsulting.SysML2Tools.Semantic; diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/StateTransitionViewLayoutStrategy.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/StateTransitionViewLayoutStrategy.cs index 800447c9..b4dbbd37 100644 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/StateTransitionViewLayoutStrategy.cs +++ b/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/StateTransitionViewLayoutStrategy.cs @@ -2,8 +2,8 @@ // Copyright (c) DemaConsulting. All rights reserved. // -using DemaConsulting.SysML2Tools.Layout.Engine; -using DemaConsulting.SysML2Tools.Layout.Engine.Layered; +using DemaConsulting.Rendering; +using DemaConsulting.Rendering.Abstractions; using DemaConsulting.SysML2Tools.Rendering; using DemaConsulting.SysML2Tools.Rendering.Internal; using DemaConsulting.SysML2Tools.Semantic; @@ -13,16 +13,16 @@ namespace DemaConsulting.SysML2Tools.Layout.Internal; /// /// Layout strategy for State Transition View diagrams. Renders state usages as rounded boxes placed -/// top-to-bottom by the layered layout pipeline, an initial pseudo-state marker entering the first +/// top-to-bottom by the layered layout algorithm, an initial pseudo-state marker entering the first /// declared state, and transitions as orthogonal arrows annotated with their guard conditions. /// /// -/// States are placed by with so -/// the state machine reads top-to-bottom: a transition leaves its source on the SOUTH face and enters -/// its target on the NORTH face, and each transition follows the orthogonal polyline the pipeline -/// routed for it. The cyclic transition graph is made acyclic by the pipeline's cycle-breaking stage; -/// self-transitions are drawn as a small loop above the state. The initial state is taken to be the -/// first state declared in the owning definition. +/// States are placed by the bundled layered algorithm flowing top-to-bottom (down) so the state +/// machine reads top-to-bottom: a transition leaves its source on the SOUTH face and enters its target +/// on the NORTH face, and each transition follows the orthogonal polyline the algorithm routed for it. +/// The cyclic transition graph is made acyclic by the algorithm's cycle-breaking stage; self-transitions +/// are drawn as a small loop above the state. The initial state is taken to be the first state declared +/// in the owning definition. /// internal sealed class StateTransitionViewLayoutStrategy : ILayoutStrategy { @@ -72,29 +72,14 @@ public LayoutTree BuildLayout(ViewContext context, RenderOptions options) var transitions = ResolveTransitions(root, index); - // Place state boxes with the layered pipeline flowing top-to-bottom (DOWN). Non-self - // transitions become directed edges; the pipeline's cycle-breaking stage makes the (cyclic) + // Place state boxes with the layered algorithm flowing top-to-bottom (down). Non-self + // transitions become directed edges; the algorithm's cycle-breaking stage makes the (cyclic) // state graph acyclic, so it tolerates back edges and loops. - var layerNodes = states.Select(s => new LayerNode(s.Width, s.Height)).ToList(); var flowTransitions = transitions.Where(t => t.Source != t.Target).ToList(); - var layerEdges = flowTransitions.Select(t => new LayerEdge(t.Source, t.Target)).ToList(); - - var graph = new LayeredGraph(layerNodes, layerEdges, LayoutDirection.Down) - { - // Reserve a clean straight approach for the open-chevron target marker that every - // transition carries, so the pipeline pushes reversed (back) edges far enough out that the - // renderer's rounded corner never intrudes into the decoration. The approach equals the - // marker's along-line length plus one corner radius (consumed by the rounded corner) plus - // a safety margin. - BackEdgeEntryApproach = NotationMetrics.AlongLineLength(EndMarkerStyle.OpenChevron) - + theme.LineCornerRadius + theme.CleanLegMargin, - }; - var pipeline = LayeredLayoutPipeline.Builder() - .Direction(LayoutDirection.Down) - .Hierarchy(HierarchyHandling.Flat) - .AddDefaultStages() - .Build(); - pipeline.Run(graph); + var placed = LayeredPlacement.Place( + states.Select(s => (s.Width, s.Height)).ToList(), + flowTransitions.Select(t => (t.Source, t.Target)).ToList(), + LayoutFlowDirection.Down); // Compute the top-left of the content bounding box over the real state nodes and the screen // offset that normalizes it into the canvas (leaving room at the top for the initial marker). @@ -103,8 +88,8 @@ public LayoutTree BuildLayout(ViewContext context, RenderOptions options) var minY = double.PositiveInfinity; for (var i = 0; i < states.Count; i++) { - minX = Math.Min(minX, graph.AugX[i]); - minY = Math.Min(minY, graph.AugY[i]); + minX = Math.Min(minX, placed.Rects[i].X); + minY = Math.Min(minY, placed.Rects[i].Y); } var topReserve = margin + InitialMarkerSize + InitialMarkerGap; @@ -114,7 +99,7 @@ public LayoutTree BuildLayout(ViewContext context, RenderOptions options) var stateRects = new Rect[states.Count]; for (var i = 0; i < states.Count; i++) { - stateRects[i] = new Rect(graph.AugX[i] + offsetX, graph.AugY[i] + offsetY, states[i].Width, states[i].Height); + stateRects[i] = new Rect(placed.Rects[i].X + offsetX, placed.Rects[i].Y + offsetY, states[i].Width, states[i].Height); } var nodes = new List(); @@ -128,8 +113,8 @@ public LayoutTree BuildLayout(ViewContext context, RenderOptions options) // Initial pseudo-state entering the first declared state. AddInitialMarker(stateRects[0], nodes); - // Transition edges (with guard labels), mapped from the pipeline's routed polylines. - var crossings = AddTransitions(transitions, graph, stateRects, offsetX, offsetY, nodes); + // Transition edges (with guard labels), mapped from the algorithm's routed polylines. + var crossings = AddTransitions(transitions, flowTransitions, placed.EdgePolylines, stateRects, offsetX, offsetY, nodes); // Size the canvas to the actual rendered content: state boxes plus routed transition // polylines (back edges can bulge beyond the box columns), the initial marker, and the @@ -361,28 +346,27 @@ private static void AddInitialMarker(Rect first, List nodes) /// whose polyline crosses a non-endpoint state box. /// /// - /// The pipeline's cycle-breaking stage drops self-loops, de-duplicates identical directed pairs, - /// and reverses back edges, so is not 1:1 with the input - /// transitions. A lookup keyed by the routed (source, target) pair recovers each - /// transition's polyline; a transition whose routed edge was reversed reuses that polyline in - /// reverse so the open arrowhead lands on the true target. Successive transitions sharing one - /// routed corridor (parallel guards, or a forward/back-edge pair) are spread laterally so their - /// anchor points and labels do not coincide. + /// The layered algorithm returns exactly one routed polyline per input (non-self) transition, in + /// input order and already oriented source-to-target. A lookup keyed by the (source, target) + /// pair recovers each transition's polyline (self-transitions are drawn as a loop and carry no + /// routed edge). Successive transitions sharing one routed corridor (parallel guards, or a + /// forward/back-edge pair) are spread laterally so their anchor points and labels do not coincide. /// private static int AddTransitions( IReadOnlyList transitions, - LayeredGraph graph, + IReadOnlyList flowTransitions, + IReadOnlyList> edgePolylines, Rect[] stateRects, double offsetX, double offsetY, List nodes) { - // Build the routed (source, target) -> polyline lookup over the acyclic edge set. + // Build the routed (source, target) -> polyline lookup from the non-self transitions, which are + // index-aligned with the algorithm's returned polylines. var routed = new Dictionary<(int Source, int Target), IReadOnlyList>(); - for (var k = 0; k < graph.Acyclic.Count; k++) + for (var k = 0; k < flowTransitions.Count; k++) { - var edge = graph.Acyclic[k]; - routed[(edge.Source, edge.Target)] = graph.Waypoints[k]; + routed[(flowTransitions[k].Source, flowTransitions[k].Target)] = edgePolylines[k]; } var corridorUse = new Dictionary<(int, int), int>(); diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/LayoutBadge.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/LayoutBadge.cs deleted file mode 100644 index a24b8d5f..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/LayoutBadge.cs +++ /dev/null @@ -1,41 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -namespace DemaConsulting.SysML2Tools.Layout; - -/// -/// Shape of a badge icon. -/// -public enum BadgeShape -{ - /// Solid filled circle. - FilledCircle, - - /// Circle with concentric inner circle (bullseye). - Bullseye, - - /// Diamond (rotated square). - Diamond, - - /// Short horizontal bar. - HorizontalBar, - - /// Short vertical bar. - VerticalBar, -} - -/// -/// A small icon badge at an absolute centre position. -/// -/// Absolute X coordinate of the badge centre in logical pixels. -/// Absolute Y coordinate of the badge centre in logical pixels. -/// Diameter of the badge bounding circle in logical pixels. -/// Visual shape of the badge icon. -/// Optional text label displayed beside the badge; for icon-only badges. -public sealed record LayoutBadge( - double CentreX, - double CentreY, - double Size, - BadgeShape Shape, - string? Label) : LayoutNode; diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/LayoutBand.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/LayoutBand.cs deleted file mode 100644 index 8f81cf48..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/LayoutBand.cs +++ /dev/null @@ -1,36 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -namespace DemaConsulting.SysML2Tools.Layout; - -/// -/// Orientation of a swim-lane band. -/// -public enum BandOrientation -{ - /// Band runs horizontally. - Horizontal, - - /// Band runs vertically. - Vertical, -} - -/// -/// A swim-lane band with optional label and nested children. -/// -/// Absolute X coordinate of the band left edge in logical pixels. -/// Absolute Y coordinate of the band top edge in logical pixels. -/// Width of the band in logical pixels. -/// Height of the band in logical pixels. -/// Whether the band runs horizontally or vertically. -/// Optional header text displayed at the band edge; for unlabelled bands. -/// Layout nodes nested inside this band. -public sealed record LayoutBand( - double X, - double Y, - double Width, - double Height, - BandOrientation Orientation, - string? Label, - IReadOnlyList Children) : LayoutNode; diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/LayoutBox.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/LayoutBox.cs deleted file mode 100644 index c68e271d..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/LayoutBox.cs +++ /dev/null @@ -1,61 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -namespace DemaConsulting.SysML2Tools.Layout; - -/// -/// Shape of a layout box. -/// -public enum BoxShape -{ - /// Plain rectangle. - Rectangle, - - /// Rectangle with rounded corners. - RoundedRectangle, - - /// Folder shape (rectangle with a tab on the top-left), used for packages. - Folder, - - /// Note shape (rectangle with a folded-down top-right corner), used for documentation and comments. - Note, -} - -/// -/// A single compartment within a box (e.g., attributes section, operations section). -/// -/// Optional compartment header text; for untitled compartments. -/// Text rows displayed inside the compartment. -public sealed record LayoutCompartment( - string? Title, - IReadOnlyList Rows); - -/// -/// A rectangular container node with optional label, depth, compartments, and nested children. -/// -/// Absolute X coordinate of the left edge in logical pixels. -/// Absolute Y coordinate of the top edge in logical pixels. -/// Width of the box in logical pixels. -/// Height of the box in logical pixels. -/// Optional text label displayed at the top of the box. -/// Nesting depth used by the renderer to index into . -/// Visual shape of the box outline. -/// Ordered list of compartments displayed below the label. -/// Nested layout nodes contained spatially within this box. -/// -/// Optional SysML keyword (e.g. "part def", "port") rendered on a smaller line -/// above the bold label, following the SysML v2 graphical convention. when no -/// keyword should be shown. -/// -public sealed record LayoutBox( - double X, - double Y, - double Width, - double Height, - string? Label, - int Depth, - BoxShape Shape, - IReadOnlyList Compartments, - IReadOnlyList Children, - string? Keyword = null) : LayoutNode; diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/LayoutGrid.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/LayoutGrid.cs deleted file mode 100644 index 8a7cde19..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/LayoutGrid.cs +++ /dev/null @@ -1,40 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -namespace DemaConsulting.SysML2Tools.Layout; - -/// -/// A single cell within a grid row. -/// -/// Width of the cell in logical pixels. -/// Height of the cell in logical pixels. -/// Text content displayed inside the cell. -/// Horizontal alignment of the text within the cell. -/// Number of columns this cell spans; normally 1. -public sealed record LayoutGridCell( - double Width, - double Height, - string Text, - TextAlign Align, - int ColSpan); - -/// -/// A single row within a layout grid. -/// -/// When , the row is rendered with header styling. -/// Ordered list of cells in this row. -public sealed record LayoutGridRow( - bool IsHeader, - IReadOnlyList Cells); - -/// -/// A tabular layout node at an absolute position. -/// -/// Absolute X coordinate of the grid left edge in logical pixels. -/// Absolute Y coordinate of the grid top edge in logical pixels. -/// Ordered list of rows in the grid. -public sealed record LayoutGrid( - double X, - double Y, - IReadOnlyList Rows) : LayoutNode; diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/LayoutLabel.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/LayoutLabel.cs deleted file mode 100644 index a97ee3ca..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/LayoutLabel.cs +++ /dev/null @@ -1,61 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -namespace DemaConsulting.SysML2Tools.Layout; - -/// -/// Horizontal text alignment. -/// -public enum TextAlign -{ - /// Align text to the left. - Left, - - /// Align text to the center. - Center, - - /// Align text to the right. - Right, -} - -/// Weight of a font. -public enum FontWeight -{ - /// Regular (normal) weight. - Regular, - - /// Bold weight. - Bold, -} - -/// Style of a font. -public enum FontStyle -{ - /// Normal (upright) style. - Normal, - - /// Italic style. - Italic, -} - -/// -/// A standalone text label at an absolute position. Width is capped to . -/// -/// Absolute X coordinate of the label origin in logical pixels. -/// Absolute Y coordinate of the label baseline in logical pixels. -/// Maximum width before text wraps or truncates. -/// Text content of the label. -/// Horizontal alignment of the text within the label bounds. -/// Font weight applied to the label text. -/// Font style applied to the label text. -/// Font size in logical pixels. -public sealed record LayoutLabel( - double X, - double Y, - double MaxWidth, - string Text, - TextAlign Align, - FontWeight Weight, - FontStyle Style, - double FontSize) : LayoutNode; diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/LayoutLifeline.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/LayoutLifeline.cs deleted file mode 100644 index 22746cfd..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/LayoutLifeline.cs +++ /dev/null @@ -1,33 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -namespace DemaConsulting.SysML2Tools.Layout; - -/// -/// A sequence-diagram lifeline: a vertical dashed line with a header box. -/// -/// Absolute X coordinate of the lifeline centre in logical pixels. -/// Absolute Y coordinate of the top of the lifeline in logical pixels. -/// Absolute Y coordinate of the bottom of the lifeline in logical pixels. -/// Text label displayed in the header box. -/// Width of the header box in logical pixels. -/// Height of the header box in logical pixels. -public sealed record LayoutLifeline( - double CentreX, - double TopY, - double BottomY, - string Label, - double HeaderWidth, - double HeaderHeight) : LayoutNode; - -/// -/// An activation bar on a lifeline: a narrow rectangle indicating when the lifeline is active. -/// -/// Absolute X coordinate of the activation bar centre in logical pixels. -/// Absolute Y coordinate of the top of the activation bar in logical pixels. -/// Absolute Y coordinate of the bottom of the activation bar in logical pixels. -public sealed record LayoutActivation( - double CentreX, - double TopY, - double BottomY) : LayoutNode; diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/LayoutLine.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/LayoutLine.cs deleted file mode 100644 index bc4691ef..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/LayoutLine.cs +++ /dev/null @@ -1,75 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -namespace DemaConsulting.SysML2Tools.Layout; - -/// -/// An immutable 2-D point with absolute coordinates. -/// -/// Absolute X coordinate in logical pixels. -/// Absolute Y coordinate in logical pixels. -public sealed record Point2D(double X, double Y); - -/// -/// Style of an end marker (arrowhead, diamond, circle, or bar) at a line end. -/// -public enum EndMarkerStyle -{ - /// No end marker. - None, - - /// Open chevron: a two-stroke V with no closing edge. - OpenChevron, - - /// Hollow (unfilled) closed triangle. - HollowTriangle, - - /// Hollow closed triangle with a perpendicular crossbar (for redefinition). - HollowTriangleCrossbar, - - /// Filled (solid) triangle arrow. - FilledArrow, - - /// Hollow (open) diamond. - HollowDiamond, - - /// Filled diamond. - FilledDiamond, - - /// Circle. - Circle, - - /// Bar (perpendicular line). - Bar, -} - -/// -/// Stroke style of a line. -/// -public enum LineStyle -{ - /// Solid line. - Solid, - - /// Dashed line. - Dashed, - - /// Dotted line. - Dotted, -} - -/// -/// A pre-routed orthogonal line connecting two nodes. Corner rounding is controlled by . -/// -/// Ordered absolute waypoints; the renderer draws straight segments between consecutive points. -/// End-marker style at the source (start) end of the line. -/// End-marker style at the target (end) end of the line. -/// Stroke style (solid, dashed, dotted) for the line. -/// Optional text label placed at the midpoint of the line; for unlabelled lines. -public sealed record LayoutLine( - IReadOnlyList Waypoints, - EndMarkerStyle SourceEnd, - EndMarkerStyle TargetEnd, - LineStyle LineStyle, - string? MidpointLabel) : LayoutNode; diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/LayoutNode.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/LayoutNode.cs deleted file mode 100644 index 77f150c5..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/LayoutNode.cs +++ /dev/null @@ -1,13 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -namespace DemaConsulting.SysML2Tools.Layout; - -/// -/// Abstract base for all layout nodes. Renderers switch on concrete type; unknown subtypes should be skipped for forward compatibility. -/// -// S2094: intentionally empty abstract record — acts as a discriminated-union root; no shared members are needed -#pragma warning disable S2094 -public abstract record LayoutNode; -#pragma warning restore S2094 diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/LayoutPort.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/LayoutPort.cs deleted file mode 100644 index 011bfdb0..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/LayoutPort.cs +++ /dev/null @@ -1,36 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -namespace DemaConsulting.SysML2Tools.Layout; - -/// -/// Side of a box that a port is attached to. -/// -public enum PortSide -{ - /// Port is on the top edge. - Top, - - /// Port is on the bottom edge. - Bottom, - - /// Port is on the left edge. - Left, - - /// Port is on the right edge. - Right, -} - -/// -/// A port node pinned to the edge of its parent box. Position is absolute. -/// -/// Absolute X coordinate of the port centre in logical pixels. -/// Absolute Y coordinate of the port centre in logical pixels. -/// Edge of the parent box that this port is attached to. -/// Optional text label displayed beside the port symbol. -public sealed record LayoutPort( - double CentreX, - double CentreY, - PortSide Side, - string? Label) : LayoutNode; diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/LayoutTree.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/LayoutTree.cs deleted file mode 100644 index d6391d77..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/LayoutTree.cs +++ /dev/null @@ -1,23 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -namespace DemaConsulting.SysML2Tools.Layout; - -/// -/// Complete layout for one rendered view. All coordinates are absolute (origin = top-left). -/// -/// Canvas width in logical pixels. -/// Canvas height in logical pixels. -/// Flat list of top-level layout nodes to render. -public sealed record LayoutTree( - double Width, - double Height, - IReadOnlyList Nodes) -{ - /// - /// Gets non-fatal layout-quality warnings produced while building this view (e.g. connectors - /// that could not be routed without crossing a box). Empty when the layout is clean. - /// - public IReadOnlyList Warnings { get; init; } = []; -} diff --git a/src/DemaConsulting.SysML2Tools.Core/Rendering/DiagramRenderer.cs b/src/DemaConsulting.SysML2Tools.Core/Rendering/DiagramRenderer.cs index ea092775..34c7513f 100644 --- a/src/DemaConsulting.SysML2Tools.Core/Rendering/DiagramRenderer.cs +++ b/src/DemaConsulting.SysML2Tools.Core/Rendering/DiagramRenderer.cs @@ -2,6 +2,8 @@ // Copyright (c) DemaConsulting. All rights reserved. // +using DemaConsulting.Rendering; +using DemaConsulting.Rendering.Abstractions; using DemaConsulting.SysML2Tools.Semantic; using DemaConsulting.SysML2Tools.Semantic.Internal; @@ -9,7 +11,7 @@ namespace DemaConsulting.SysML2Tools.Rendering; /// /// High-level rendering orchestrator that iterates over all views in a -/// , builds a via an +/// , builds a via an /// , and writes each view to an output stream via /// an . /// diff --git a/src/DemaConsulting.SysML2Tools.Core/Rendering/ILayoutStrategy.cs b/src/DemaConsulting.SysML2Tools.Core/Rendering/ILayoutStrategy.cs index 12eebfe1..75aef746 100644 --- a/src/DemaConsulting.SysML2Tools.Core/Rendering/ILayoutStrategy.cs +++ b/src/DemaConsulting.SysML2Tools.Core/Rendering/ILayoutStrategy.cs @@ -2,7 +2,8 @@ // Copyright (c) DemaConsulting. All rights reserved. // -using DemaConsulting.SysML2Tools.Layout; +using DemaConsulting.Rendering; +using DemaConsulting.Rendering.Abstractions; using DemaConsulting.SysML2Tools.Semantic; namespace DemaConsulting.SysML2Tools.Rendering; diff --git a/src/DemaConsulting.SysML2Tools.Core/Rendering/IRenderer.cs b/src/DemaConsulting.SysML2Tools.Core/Rendering/IRenderer.cs deleted file mode 100644 index bb8a3ef1..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Rendering/IRenderer.cs +++ /dev/null @@ -1,28 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Layout; - -namespace DemaConsulting.SysML2Tools.Rendering; - -/// -/// Low-level renderer: converts one to one output stream. -/// Implementations must be pure, stateless, and must not perform filesystem access. -/// -public interface IRenderer -{ - /// Gets the MIME media type produced by this renderer. - string MediaType { get; } - - /// Gets the default file extension (including leading dot) produced by this renderer. - string DefaultExtension { get; } - - /// - /// Renders the layout tree and writes the output to . - /// - /// The layout tree describing all nodes to render. - /// Render options including theme and scale. - /// Destination stream that receives all rendered bytes. - void Render(LayoutTree layout, RenderOptions options, Stream output); -} diff --git a/src/DemaConsulting.SysML2Tools.Core/Rendering/NotationMetrics.cs b/src/DemaConsulting.SysML2Tools.Core/Rendering/NotationMetrics.cs deleted file mode 100644 index 6963c5e3..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Rendering/NotationMetrics.cs +++ /dev/null @@ -1,237 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Layout; - -namespace DemaConsulting.SysML2Tools.Rendering; - -/// -/// A single vertex of an end-marker decoration, expressed in tip-relative notation units (before the -/// renderer's uniform scale is applied). -/// -/// -/// The coordinate frame is shared by both renderers so that the SVG marker and the PNG path describe -/// the identical shape: is the distance measured back from the line endpoint (the -/// tip) into the line, and is the perpendicular offset. A negative -/// places the vertex ahead of the endpoint (e.g. a triangle apex that overshoots -/// the tip by ). -/// -/// Distance back from the tip along the line, in notation units. -/// Perpendicular offset from the line, in notation units. -public readonly record struct MarkerVertex(double Along, double Across); - -/// -/// The single home for all intrinsic, theme-independent notation geometry shared by the SVG and PNG -/// renderers: end-marker (arrowhead) shapes and sizes, port squares, folder-tab proportions, note -/// dog-ear folds, rounded-rectangle corner scaling, badge fractions, and the label-background inset. -/// -/// -/// This class is the notation-geometry peer of : -/// every value is either a documented primitive notation constant or a documented derivation of those -/// primitives, so a geometry literal never appears more than once in the rendering path. The canonical -/// values are the historical SVG marker values (open/triangle 10x7 with refX 9, diamond 14x8 with -/// refX 13, circle 10x10 r4, bar 4x12); the PNG renderer derives its sizes from the same constants so -/// the two renderers draw the identical shape. -/// -public static class NotationMetrics -{ - // ── End-marker primitives (triangle family: open chevron, hollow/filled triangle) ────────── - - /// Along-line length of a triangular end marker (chevron, hollow/filled triangle). - public const double EndMarkerLength = 10.0; - - /// Across-line width (base span) of a triangular end marker. - public const double EndMarkerWidth = 7.0; - - /// - /// Along-line position, measured from the marker box origin, of the vertex that lands on the line - /// endpoint (the SVG refX). The triangle apex sits one - /// beyond it. - /// - public const double EndMarkerRefX = 9.0; - - /// Half of : the perpendicular offset of each base corner. - public const double EndMarkerHalfWidth = EndMarkerWidth / 2.0; - - /// - /// Distance the triangle apex overshoots the line endpoint, equal to the marker box length minus - /// its tip anchor ( - ). - /// - public const double EndMarkerTipOvershoot = EndMarkerLength - EndMarkerRefX; - - // ── Diamond primitives (hollow/filled diamond) ───────────────────────────────────────────── - - /// Along-line length of the diamond marker box. - public const double DiamondLength = 14.0; - - /// Across-line width of the diamond marker box. - public const double DiamondWidth = 8.0; - - /// - /// Along-line position, from the diamond box origin, of the far point that lands on the line - /// endpoint (the SVG refX). - /// - public const double DiamondRefX = 13.0; - - /// Half of : the perpendicular offset of each side point. - public const double DiamondHalfWidth = DiamondWidth / 2.0; - - /// Mid-length along-line position of the diamond side points ( / 2). - public const double DiamondMidX = DiamondLength / 2.0; - - /// - /// Along-line position, from the diamond box origin, of the near point, mirrored from the far - /// point about the mid-length ( - ). - /// - public const double DiamondNearX = DiamondLength - DiamondRefX; - - // ── Circle primitives ────────────────────────────────────────────────────────────────────── - - /// Radius of the circle end marker. - public const double CircleRadius = 4.0; - - /// - /// Square box that contains the circle marker; equal to the triangular marker length so circle and - /// triangle share one marker viewport. - /// - public const double CircleMarkerBox = EndMarkerLength; - - /// Centre of the circle marker box (half of ). - public const double CircleCenter = CircleMarkerBox / 2.0; - - /// - /// Along-line tip anchor of the circle marker: the far edge of the circle - /// ( + ) sits on the line endpoint. - /// - public const double CircleRefX = CircleCenter + CircleRadius; - - // ── Bar primitives ───────────────────────────────────────────────────────────────────────── - - /// Along-line thickness of the bar end marker (marker box length). - public const double BarAlong = 4.0; - - /// Across-line extent of the bar end marker (marker box height). - public const double BarAcross = 12.0; - - /// Half of : the bar's tip anchor along the line. - public const double BarHalfAlong = BarAlong / 2.0; - - /// Half of : the bar's perpendicular half-length. - public const double BarHalf = BarAcross / 2.0; - - // ── Crossbar (hollow triangle with crossbar) ─────────────────────────────────────────────── - - /// - /// Fraction of from the base at which the redefinition crossbar - /// crosses the triangle shaft. - /// - public const double CrossbarFraction = 0.7; - - /// Along-line position of the crossbar from the marker box origin ( x ). - public const double CrossbarX = CrossbarFraction * EndMarkerLength; - - // ── Port square ──────────────────────────────────────────────────────────────────────────── - - /// Half the side length of the square drawn for a port. - public const double PortHalfSize = 4.0; - - /// Full side length of the square drawn for a port (2 x ). - public const double PortSize = PortHalfSize * 2.0; - - // ── Folder tab ───────────────────────────────────────────────────────────────────────────── - - /// Maximum folder-tab width as a fraction of the box width. - public const double FolderTabMaxWidthFraction = 0.45; - - /// Minimum folder-tab width in logical pixels. - public const double FolderTabMinWidth = 60.0; - - /// Approximate character-width factor (relative to body font size) used to size the folder-tab label. - public const double FolderLabelCharWidthFactor = 0.55; - - // ── Note dog-ear fold ────────────────────────────────────────────────────────────────────── - - /// Note dog-ear fold size as a fraction of the box's shorter side. - public const double NoteFoldFraction = 0.25; - - /// Maximum note dog-ear fold size in logical pixels. - public const double NoteFoldMaxSize = 16.0; - - // ── Rounded rectangle ────────────────────────────────────────────────────────────────────── - - /// Factor applied to the theme corner radius for a rounded-rectangle box corner. - public const double RoundedRectCornerFactor = 2.0; - - // ── Badge fractions ──────────────────────────────────────────────────────────────────────── - - /// Inner (white) radius of a bullseye badge as a fraction of the badge radius. - public const double BadgeBullseyeInnerFraction = 1.0 / 3.0; - - /// Bar-badge half-length as a fraction of the badge radius. - public const double BadgeBarLengthFraction = 0.8; - - // ── Label background filter ──────────────────────────────────────────────────────────────── - - /// Negative inset (each side) of the SVG label-background filter region. - public const double LabelBgInset = 0.05; - - /// Total label-background filter extent (1 + 2 x ). - public const double LabelBgExtent = 1.0 + (2.0 * LabelBgInset); - - /// - /// Returns the rounded-rectangle corner radius for a box: the theme corner radius scaled by - /// . - /// - /// Theme providing the base line corner radius. - /// The rounded-rectangle corner radius in logical pixels. - public static double RoundedRectRadius(Theme theme) - { - ArgumentNullException.ThrowIfNull(theme); - return theme.LineCornerRadius * RoundedRectCornerFactor; - } - - /// - /// Returns the along-line length consumed by an end-marker decoration, used by the layout - /// strategies (to reserve a clean approach) and the renderers (to clamp the final corner radius). - /// - /// The end-marker style. - /// The along-line length in notation units; zero for . - public static double AlongLineLength(EndMarkerStyle style) => style switch - { - EndMarkerStyle.OpenChevron => EndMarkerLength, - EndMarkerStyle.HollowTriangle => EndMarkerLength, - EndMarkerStyle.HollowTriangleCrossbar => EndMarkerLength, - EndMarkerStyle.FilledArrow => EndMarkerLength, - EndMarkerStyle.HollowDiamond => DiamondLength, - EndMarkerStyle.FilledDiamond => DiamondLength, - EndMarkerStyle.Circle => CircleMarkerBox, - EndMarkerStyle.Bar => BarAlong, - _ => 0.0, - }; - - /// - /// Returns the triangle vertices (base corner, apex, base corner) in tip-relative notation units, - /// shared by the open chevron, hollow triangle, and filled arrow markers. - /// - /// The three triangle vertices in draw order. - public static IReadOnlyList TriangleVertices() => - [ - new MarkerVertex(EndMarkerRefX, -EndMarkerHalfWidth), - new MarkerVertex(-EndMarkerTipOvershoot, 0.0), - new MarkerVertex(EndMarkerRefX, EndMarkerHalfWidth), - ]; - - /// - /// Returns the diamond vertices (near, side, far, side) in tip-relative notation units, shared by - /// the hollow and filled diamond markers. The far point lands on the line endpoint. - /// - /// The four diamond vertices in draw order. - public static IReadOnlyList DiamondVertices() => - [ - new MarkerVertex(DiamondRefX - DiamondNearX, 0.0), - new MarkerVertex(DiamondRefX - DiamondMidX, -DiamondHalfWidth), - new MarkerVertex(0.0, 0.0), - new MarkerVertex(DiamondRefX - DiamondMidX, DiamondHalfWidth), - ]; -} diff --git a/src/DemaConsulting.SysML2Tools.Core/Rendering/RenderOptions.cs b/src/DemaConsulting.SysML2Tools.Core/Rendering/RenderOptions.cs deleted file mode 100644 index 76d235d9..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Rendering/RenderOptions.cs +++ /dev/null @@ -1,18 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -namespace DemaConsulting.SysML2Tools.Rendering; - -/// -/// Options that control the rendering of a . -/// -/// Visual theme (colors, fonts, line metrics). -/// Uniform scale factor applied to all coordinates. Default is 1.0. -/// Output resolution in dots per inch. Default is 96. -/// Maximum nesting depth to render. 0 means unlimited. -public sealed record RenderOptions( - Theme Theme, - double Scale = 1.0, - double Dpi = 96.0, - int DepthLimit = 0); diff --git a/src/DemaConsulting.SysML2Tools.Core/Rendering/RenderOutput.cs b/src/DemaConsulting.SysML2Tools.Core/Rendering/RenderOutput.cs deleted file mode 100644 index 61e83065..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Rendering/RenderOutput.cs +++ /dev/null @@ -1,23 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -namespace DemaConsulting.SysML2Tools.Rendering; - -/// -/// A single rendered output stream with metadata. -/// -/// Suggested file name including extension (no path). -/// MIME media type of the output stream. -/// The rendered output data stream. -public sealed record RenderOutput( - string SuggestedFileName, - string MediaType, - Stream Data) -{ - /// - /// Gets non-fatal layout-quality warnings produced while laying out this view (e.g. connectors - /// that could not be routed without crossing a box). Empty when the layout is clean. - /// - public IReadOnlyList Warnings { get; init; } = []; -} diff --git a/src/DemaConsulting.SysML2Tools.Core/Rendering/Theme.cs b/src/DemaConsulting.SysML2Tools.Core/Rendering/Theme.cs deleted file mode 100644 index 748946ed..00000000 --- a/src/DemaConsulting.SysML2Tools.Core/Rendering/Theme.cs +++ /dev/null @@ -1,113 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -namespace DemaConsulting.SysML2Tools.Rendering; - -/// -/// Visual theme for rendering a diagram. -/// -/// -/// Font choice is not part of the theme; each renderer hardcodes its own typeface internally -/// to ensure consistent output across all platforms. -/// -/// -/// Hex colour strings indexed by nesting depth. Wraps if depth exceeds count. -/// Example: ["#FFFFFF", "#EEF4FF", "#D6E8FF"]. -/// -/// Hex colour used for all borders and lines. -/// Width of borders and lines in logical pixels. -/// Corner radius for orthogonal-line elbows. 0 = sharp; >0 = rounded. -/// Font size for title / heading text. -/// Font size for body / row text. -/// Internal padding between text and its bounding box. -/// Perpendicular step-off distance from a box face before a connector bends. -/// -/// Corner bend radius reserved for a connector's approach zone by -/// (layout approach reservation). It is not read by any renderer; renderers round connector elbows -/// using instead. -/// -/// -/// Safety margin (in logical pixels) added to a decorated connector end's required clean straight -/// approach, beyond the end-marker length plus one corner radius, so the rounded corner never intrudes -/// into the end decoration. -/// -public sealed record Theme( - IReadOnlyList DepthFillColors, - string StrokeColor, - double StrokeWidth, - double LineCornerRadius, - double FontSizeTitle, - double FontSizeBody, - double LabelPadding, - double ConnectorStub, - double BendRadius, - double CleanLegMargin) -{ - /// - /// Computes the connector approach zone: the clear distance a connector needs off a box face - /// before it can bend, combining the perpendicular stub, the corner bend radius, and the - /// caller-supplied connector clearance. - /// - /// Clearance kept between routed connectors and part boxes. - /// The required approach-zone distance in logical pixels. - public double ConnectorApproachZone(double connectorClearance) => - ConnectorStub + BendRadius + connectorClearance; - - /// - /// Gets the canvas/base background fill color (the depth-0 fill). Used to occlude connector lines - /// behind hollow (unfilled) enclosing end markers so the line does not show through the decoration. - /// - public string BackgroundColor => DepthFillColors[0]; -} - -/// -/// Built-in themes for common rendering scenarios. -/// -public static class Themes -{ - /// - /// Gets a light theme suitable for screen display. - /// - public static Theme Light { get; } = new( - DepthFillColors: ["#FFFFFF", "#EEF4FF", "#D6E8FF", "#C0D8F8"], - StrokeColor: "#1A1A2E", - StrokeWidth: 1.5, - LineCornerRadius: 4.0, - FontSizeTitle: 14.0, - FontSizeBody: 12.0, - LabelPadding: 6.0, - ConnectorStub: 8.0, - BendRadius: 4.0, - CleanLegMargin: 1.0); - - /// - /// Gets a dark theme suitable for dark-mode screen display. - /// - public static Theme Dark { get; } = new( - DepthFillColors: ["#1E1E2E", "#2A2A40", "#363650", "#424260"], - StrokeColor: "#C0C0D8", - StrokeWidth: 1.5, - LineCornerRadius: 4.0, - FontSizeTitle: 14.0, - FontSizeBody: 12.0, - LabelPadding: 6.0, - ConnectorStub: 8.0, - BendRadius: 4.0, - CleanLegMargin: 1.0); - - /// - /// Gets a print theme optimized for black-and-white output. - /// - public static Theme Print { get; } = new( - DepthFillColors: ["#FFFFFF", "#F0F0F0", "#E0E0E0", "#D0D0D0"], - StrokeColor: "#000000", - StrokeWidth: 1.0, - LineCornerRadius: 0.0, - FontSizeTitle: 12.0, - FontSizeBody: 10.0, - LabelPadding: 4.0, - ConnectorStub: 6.0, - BendRadius: 0.0, - CleanLegMargin: 1.0); -} diff --git a/src/DemaConsulting.SysML2Tools.Png/DemaConsulting.SysML2Tools.Png.csproj b/src/DemaConsulting.SysML2Tools.Png/DemaConsulting.SysML2Tools.Png.csproj deleted file mode 100644 index 87fd1c51..00000000 --- a/src/DemaConsulting.SysML2Tools.Png/DemaConsulting.SysML2Tools.Png.csproj +++ /dev/null @@ -1,91 +0,0 @@ - - - - net8.0;net9.0;net10.0 - latest - enable - enable - - - false - 0.0.0 - DEMA Consulting - DEMA Consulting - SysML v2 PNG renderer for .NET - MIT - https://github.com/demaconsulting/SysML2Tools - https://github.com/demaconsulting/SysML2Tools - Copyright DEMA Consulting - SysML2 Tools PNG Renderer - DemaConsulting.SysML2Tools.Png - -This package embeds the Noto Sans font (SIL Open Font License 1.1, copyright Google Inc.). -SkiaSharp is used for PNG rendering (MIT license, copyright Microsoft Corporation). - - - - true - snupkg - true - true - true - - - true - true - true - true - latest - - - true - $(Product) - $(Version) - Organization: $(Company) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - diff --git a/src/DemaConsulting.SysML2Tools.Png/Fonts/NotoSans-Bold.ttf b/src/DemaConsulting.SysML2Tools.Png/Fonts/NotoSans-Bold.ttf deleted file mode 100644 index 713a76885c341ba5b49e0f708d916e2ff176ee43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 838072 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 z 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

Cnz$+q$l!z$g#ffn#OC=$s*~u1@K~fT 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%0A_>9k?^GdiEAOFkWU1s%aBZ8epg__v&;;TE20e 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

&7m8CY|d`qv8$??9b3fK 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%0AswZ3O!)5`a;#N<@x>MEml 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�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%0AsxV~BO? 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 J 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

ofHQABG!2VkKSPu%N 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

c$qw;cFT;P7VaTI?d%qQ-2R{ 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

  • Vw=jiS-6dr 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°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 E1M@Y|%K!iX diff --git a/src/DemaConsulting.SysML2Tools.Png/Fonts/NotoSans-Regular.ttf b/src/DemaConsulting.SysML2Tools.Png/Fonts/NotoSans-Regular.ttf deleted file mode 100644 index 5de3fa7da539d71d507557eda1396af86be15a9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 825628 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

    fG_5-GT_x5=8xb@IIJvq4Tt#?_)-q5 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 z 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 diff --git a/src/DemaConsulting.SysML2Tools.Png/Fonts/OFL.txt b/src/DemaConsulting.SysML2Tools.Png/Fonts/OFL.txt deleted file mode 100644 index 5da64ef3..00000000 --- a/src/DemaConsulting.SysML2Tools.Png/Fonts/OFL.txt +++ /dev/null @@ -1,92 +0,0 @@ -Copyright 2022 The Noto Project Authors (https://github.com/notofonts/latin-greek-cyrillic) - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -https://openfontlicense.org - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This can -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, replacing -removing, or reorganizing -- in part or in whole -- any of the components -of the Original Version, by changing formats or by porting the Font -Software to a new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION AND CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/src/DemaConsulting.SysML2Tools.Png/PngRenderer.cs b/src/DemaConsulting.SysML2Tools.Png/PngRenderer.cs deleted file mode 100644 index 791eefde..00000000 --- a/src/DemaConsulting.SysML2Tools.Png/PngRenderer.cs +++ /dev/null @@ -1,1581 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Layout; -using DemaConsulting.SysML2Tools.Rendering; -using SkiaSharp; - -namespace DemaConsulting.SysML2Tools.Png; - -///

    -/// Renders a to PNG format using SkiaSharp. -/// -/// -/// The renderer is pure and stateless: each call to allocates a new -/// and , draws all nodes, and encodes the result -/// to the output stream before disposing all SkiaSharp resources. The output stream is not -/// closed or flushed by this renderer; the caller is responsible for its lifetime. -/// -/// Node rendering: -/// - → filled rectangle (plain or rounded) + optional centered label -/// + compartment dividers and text rows; children rendered recursively. -/// - → corner-radius-aware polyline built as a single -/// with optional dashing; arrowheads at both ends; optional midpoint -/// label with white background. -/// - → text element with -derived alignment. -/// - → small filled square centered at the port position with -/// optional label offset away from the attached edge. -/// - → icon shape (filled circle, bullseye, diamond, or bar) -/// centered at the badge position with optional label to the right. -/// - → swim-lane rectangle; label rendered vertically on the left -/// edge for Horizontal orientation or horizontally at the top for Vertical; children -/// rendered recursively. -/// - → header box at the top with a dashed vertical stem below. -/// - → narrow white-filled rectangle with stroke border -/// centered at CentreX. -/// - → bordered table; header rows use depth-1 fill color, body -/// rows use depth-0 fill color; per-cell text alignment respected. -/// - All other node types are silently skipped for forward compatibility. -/// -/// Fill colors are derived from using modulo wrapping on -/// . Hex color strings (e.g., #RRGGBB) are parsed with -/// . -/// -/// A minimum bitmap size of 1×1 pixels is enforced to prevent SkiaSharp allocation errors -/// when the layout tree is empty. -/// -public sealed class PngRenderer : IRenderer -{ - /// - /// Lazily-loaded typeface for regular-weight, upright text. Loaded once from the embedded - /// NotoSans-Regular.ttf resource so all renders use the same font regardless of which fonts - /// are installed on the host system. - /// - private static readonly Lazy RegularTypeface = new(() => LoadTypeface("NotoSans-Regular.ttf")); - - /// - /// Lazily-loaded typeface for bold-weight, upright text. Loaded from NotoSans-Bold.ttf. - /// - private static readonly Lazy BoldTypeface = new(() => LoadTypeface("NotoSans-Bold.ttf")); - - /// - /// Lazily-loaded typeface for regular-weight, italic text. Loaded from NotoSans-Italic.ttf. - /// - private static readonly Lazy ItalicTypeface = new(() => LoadTypeface("NotoSans-Italic.ttf")); - - /// - /// Lazily-loaded typeface for bold-weight, italic text. Loaded from NotoSans-BoldItalic.ttf. - /// - private static readonly Lazy BoldItalicTypeface = new(() => LoadTypeface("NotoSans-BoldItalic.ttf")); - - /// - /// Loads a typeface from an embedded assembly resource. The resource is matched by its - /// filename suffix (case-insensitive). Falls back to if - /// the resource is not found, so the renderer remains functional even when the font is not - /// embedded (e.g., during development without the downloaded font files). - /// - /// File name suffix to match in the assembly manifest resource names. - /// - /// An loaded from the embedded resource, or - /// if the resource is not found. - /// - private static SKTypeface LoadTypeface(string fileName) - { - var asm = typeof(PngRenderer).Assembly; - var resourceName = asm.GetManifestResourceNames() - .FirstOrDefault(n => n.EndsWith(fileName, StringComparison.OrdinalIgnoreCase)); - if (resourceName is null) - { - return SKTypeface.Default; - } - - using var stream = asm.GetManifestResourceStream(resourceName)!; - using var data = SKData.Create(stream); - return SKTypeface.FromData(data) ?? SKTypeface.Default; - } - - /// - /// Creates an configured for text rendering with the Noto Sans typeface - /// matching the requested weight and style. The caller is responsible for disposing the - /// returned paint. - /// - /// Fill color for the text glyphs. - /// Font size in scaled pixels. - /// When , selects the bold typeface variant. - /// When , selects the italic typeface variant. - /// A new ready for use with canvas.DrawText. - private static SKPaint CreateTextPaint(SKColor color, float fontSize, bool bold, bool italic) - { - var typeface = (bold, italic) switch - { - (true, true) => BoldItalicTypeface.Value, - (true, false) => BoldTypeface.Value, - (false, true) => ItalicTypeface.Value, - _ => RegularTypeface.Value, - }; - return new SKPaint - { - Color = color, - TextSize = fontSize, - IsAntialias = true, - Typeface = typeface, - }; - } - - /// - /// Computes a reduced font size that fits within - /// scaled pixels by scaling down proportionally. - /// Returns unchanged when the text already fits or - /// when there is no meaningful width constraint. - /// - /// Paint whose is temporarily set - /// to to measure the text width. - /// Text whose rendered width is measured. - /// Maximum allowed width in scaled pixels. 0 or negative disables shrinking. - /// Preferred (maximum) font size in scaled pixels. - /// Font size in scaled pixels, guaranteed to be > 0. - private static float FitFontSize(SKPaint paint, string text, float availableWidth, float maxFontSize) - { - paint.TextSize = maxFontSize; - if (availableWidth <= 0 || string.IsNullOrEmpty(text)) - { - return maxFontSize; - } - - var measuredWidth = paint.MeasureText(text); - if (measuredWidth <= availableWidth) - { - return maxFontSize; - } - - // Scale font size proportionally so the text fits within the available width - return maxFontSize * (availableWidth / measuredWidth); - } - - /// - public string MediaType => "image/png"; - - /// - public string DefaultExtension => ".png"; - - /// - /// - /// The bitmap dimensions are derived from and - /// scaled by , - /// with a minimum of 1×1 pixels. The background is filled with - /// before any nodes are drawn. - /// - public void Render(LayoutTree layout, RenderOptions options, Stream output) - { - // Validate inputs — null arguments would produce silent failures - ArgumentNullException.ThrowIfNull(layout); - ArgumentNullException.ThrowIfNull(options); - ArgumentNullException.ThrowIfNull(output); - - // Compute bitmap size, enforcing minimum 1×1 to prevent SKBitmap allocation errors - var w = Math.Max(1, (int)Math.Ceiling(layout.Width * options.Scale)); - var h = Math.Max(1, (int)Math.Ceiling(layout.Height * options.Scale)); - - // Allocate bitmap, canvas and render all nodes - using var bitmap = new SKBitmap(w, h, SKColorType.Rgba8888, SKAlphaType.Premul); - using var canvas = new SKCanvas(bitmap); - - // Fill the background with white before drawing diagram elements - canvas.Clear(SKColors.White); - - foreach (var node in layout.Nodes) - { - RenderNode(canvas, node, options); - } - - // Final pass: draw every connector label on top of all wires and boxes, so that no later - // wire can draw over an earlier wire's label. Positions are computed up front so that labels - // that would collide (for example where two connectors cross) are spread apart. - var lines = CollectLines(layout.Nodes).ToList(); - var labelPositions = ConnectorLabelPlacer.Place(lines, options.Theme.FontSizeBody); - foreach (var line in lines) - { - if (line.MidpointLabel is not null && labelPositions.TryGetValue(line, out var pos)) - { - RenderLineLabel(canvas, line, options, pos.X, pos.Y); - } - } - - // Encode as PNG and write to the output stream - using var image = SKImage.FromBitmap(bitmap); - using var data = image.Encode(SKEncodedImageFormat.Png, 100); - data.SaveTo(output); - } - - /// - /// Dispatches a single to the appropriate typed render method. - /// Unknown concrete types are silently skipped so that future node types do not break - /// existing callers. - /// - /// Canvas to draw on. - /// Node to render. - /// Render options providing theme and scale. - private static void RenderNode(SKCanvas canvas, LayoutNode node, RenderOptions options) - { - switch (node) - { - case LayoutBox box: - RenderBox(canvas, box, options); - break; - - case LayoutLine line: - RenderLine(canvas, line, options); - break; - - case LayoutLabel label: - RenderLabel(canvas, label, options); - break; - - case LayoutPort port: - RenderPort(canvas, port, options); - break; - - case LayoutBadge badge: - RenderBadge(canvas, badge, options); - break; - - case LayoutBand band: - RenderBand(canvas, band, options); - break; - - case LayoutLifeline lifeline: - RenderLifeline(canvas, lifeline, options); - break; - - case LayoutActivation activation: - RenderActivation(canvas, activation, options); - break; - - case LayoutGrid grid: - RenderGrid(canvas, grid, options); - break; - - default: - // Skip unknown node types for forward compatibility - break; - } - } - - /// - /// Renders a as a filled and stroked rectangle — plain or - /// rounded depending on — with an optional centered label, - /// compartment dividers and rows, then recursively renders its children. - /// - /// Canvas to draw on. - /// Box node to render. - /// Render options providing theme and scale. - private static void RenderBox(SKCanvas canvas, LayoutBox box, RenderOptions options) - { - var theme = options.Theme; - - var strokeColor = SKColor.Parse(theme.StrokeColor); - var fillHex = theme.DepthFillColors[box.Depth % theme.DepthFillColors.Count]; - var fillColor = SKColor.Parse(fillHex); - - // Draw the shape-specific outline (fill + border) - RenderBoxOutline(canvas, box, options, fillColor, strokeColor); - - // Draw the keyword line and bold name label in the title area - RenderBoxTitle(canvas, box, options, strokeColor); - - // Render compartments below the label area with horizontal dividers - if (box.Compartments.Count > 0) - { - RenderBoxCompartments(canvas, box, options, strokeColor); - } - - // Render children recursively - foreach (var child in box.Children) - { - RenderNode(canvas, child, options); - } - } - - /// - /// Draws the fill and border of a , selecting geometry based on - /// . - /// - /// Canvas to draw on. - /// Box whose outline is drawn. - /// Render options providing theme and scale. - /// Fill color for the interior. - /// Stroke color for the border. - private static void RenderBoxOutline( - SKCanvas canvas, - LayoutBox box, - RenderOptions options, - SKColor fillColor, - SKColor strokeColor) - { - var theme = options.Theme; - var scale = (float)options.Scale; - - var x = (float)(box.X * scale); - var y = (float)(box.Y * scale); - var rect = new SKRect(x, y, x + (float)(box.Width * scale), y + (float)(box.Height * scale)); - - using var fillPaint = new SKPaint { Color = fillColor, Style = SKPaintStyle.Fill, IsAntialias = true }; - using var strokePaint = new SKPaint - { - Color = strokeColor, - Style = SKPaintStyle.Stroke, - StrokeWidth = (float)theme.StrokeWidth * scale, - IsAntialias = true, - }; - - switch (box.Shape) - { - case BoxShape.Folder: - using (var path = BuildFolderPath(box, theme, scale)) - { - canvas.DrawPath(path, fillPaint); - canvas.DrawPath(path, strokePaint); - } - - break; - - case BoxShape.Note: - RenderNotePng(canvas, box, scale, fillPaint, strokePaint); - break; - - case BoxShape.RoundedRectangle when theme.LineCornerRadius > 0: - var cornerR = (float)(NotationMetrics.RoundedRectRadius(theme) * scale); - canvas.DrawRoundRect(rect, cornerR, cornerR, fillPaint); - canvas.DrawRoundRect(rect, cornerR, cornerR, strokePaint); - break; - - default: - canvas.DrawRect(rect, fillPaint); - canvas.DrawRect(rect, strokePaint); - break; - } - } - - /// - /// Builds the folder outline path (a tab at the top-left above a full-width body). - /// - private static SKPath BuildFolderPath(LayoutBox box, Theme theme, float scale) - { - var tabHeight = BoxMetrics.FolderTabHeight(theme); - var tabWidth = Math.Min( - box.Width * NotationMetrics.FolderTabMaxWidthFraction, - Math.Max( - NotationMetrics.FolderTabMinWidth, - (box.Label?.Length ?? 4) * theme.FontSizeBody * NotationMetrics.FolderLabelCharWidthFactor + 2.0 * theme.LabelPadding)); - - var x = (float)(box.X * scale); - var yTab = (float)(box.Y * scale); - var yBody = (float)((box.Y + tabHeight) * scale); - var xTabRight = (float)((box.X + tabWidth) * scale); - var xRight = (float)((box.X + box.Width) * scale); - var yBottom = (float)((box.Y + box.Height) * scale); - - var path = new SKPath(); - path.MoveTo(x, yBody); - path.LineTo(x, yTab); - path.LineTo(xTabRight, yTab); - path.LineTo(xTabRight, yBody); - path.LineTo(xRight, yBody); - path.LineTo(xRight, yBottom); - path.LineTo(x, yBottom); - path.Close(); - return path; - } - - /// - /// Draws a note-shaped box (a rectangle with a folded-down top-right corner). - /// - private static void RenderNotePng( - SKCanvas canvas, - LayoutBox box, - float scale, - SKPaint fillPaint, - SKPaint strokePaint) - { - var fold = Math.Min(Math.Min(box.Width, box.Height) * NotationMetrics.NoteFoldFraction, NotationMetrics.NoteFoldMaxSize); - - var x = (float)(box.X * scale); - var y = (float)(box.Y * scale); - var xRight = (float)((box.X + box.Width) * scale); - var xFold = (float)((box.X + box.Width - fold) * scale); - var yFold = (float)((box.Y + fold) * scale); - var yBottom = (float)((box.Y + box.Height) * scale); - - using var body = new SKPath(); - body.MoveTo(x, y); - body.LineTo(xFold, y); - body.LineTo(xRight, yFold); - body.LineTo(xRight, yBottom); - body.LineTo(x, yBottom); - body.Close(); - canvas.DrawPath(body, fillPaint); - canvas.DrawPath(body, strokePaint); - - using var corner = new SKPath(); - corner.MoveTo(xFold, y); - corner.LineTo(xFold, yFold); - corner.LineTo(xRight, yFold); - canvas.DrawPath(corner, strokePaint); - } - - /// - /// Draws the optional keyword line and bold name label in the title area of a box. - /// - /// Canvas to draw on. - /// Box whose title is drawn. - /// Render options providing theme and scale. - /// Text color. - private static void RenderBoxTitle(SKCanvas canvas, LayoutBox box, RenderOptions options, SKColor strokeColor) - { - var theme = options.Theme; - var scale = (float)options.Scale; - var centerX = (float)((box.X + box.Width / 2.0) * scale); - var cursorY = box.Y + theme.LabelPadding; - - // Keyword line (smaller, italic, guillemet-wrapped) above the name - if (box.Keyword != null) - { - using var kwPaint = CreateTextPaint(strokeColor, (float)theme.FontSizeBody * scale, bold: false, italic: true); - kwPaint.TextAlign = SKTextAlign.Center; - var kwY = (float)((cursorY + theme.FontSizeBody) * scale); - canvas.DrawText("\u00AB" + box.Keyword + "\u00BB", centerX, kwY, kwPaint); - cursorY += theme.FontSizeBody + theme.LabelPadding; - } - - // Bold name label, shrink-to-fit - if (box.Label != null) - { - using var textPaint = CreateTextPaint(strokeColor, (float)theme.FontSizeTitle * scale, bold: true, italic: false); - textPaint.TextAlign = SKTextAlign.Center; - var availableWidth = (float)((box.Width - 2 * theme.LabelPadding) * scale); - textPaint.TextSize = FitFontSize(textPaint, box.Label, availableWidth, textPaint.TextSize); - var textY = (float)((cursorY + theme.FontSizeTitle) * scale); - canvas.DrawText(box.Label, centerX, textY, textPaint); - } - } - - /// - /// Renders the compartments of a below the title area. - /// Each compartment begins with a full-width horizontal divider, followed by an optional - /// bold title row and then zero or more body-font text rows, each indented by - /// . - /// - /// Canvas to draw on. - /// Box whose compartments are rendered. - /// Render options providing theme and scale. - /// Pre-parsed stroke color reused across all compartment draws. - private static void RenderBoxCompartments( - SKCanvas canvas, - LayoutBox box, - RenderOptions options, - SKColor strokeColor) - { - var theme = options.Theme; - var scale = (float)options.Scale; - - // Compartments start below the title area (keyword + label), computed via shared metrics - var labelAreaHeight = BoxMetrics.TitleAreaHeight(theme, box.Label != null, box.Keyword != null); - var compartmentY = box.Y + labelAreaHeight; - - foreach (var compartment in box.Compartments) - { - // Draw a full-width horizontal divider at the top of this compartment - using (var divPaint = new SKPaint()) - { - divPaint.Color = strokeColor; - divPaint.Style = SKPaintStyle.Stroke; - divPaint.StrokeWidth = (float)theme.StrokeWidth * scale; - canvas.DrawLine( - (float)(box.X * scale), - (float)(compartmentY * scale), - (float)((box.X + box.Width) * scale), - (float)(compartmentY * scale), - divPaint); - } - - // Draw the optional bold compartment title - if (compartment.Title != null) - { - using var titlePaint = CreateTextPaint(strokeColor, (float)theme.FontSizeBody * scale, bold: true, italic: true); - titlePaint.TextAlign = SKTextAlign.Left; - var titleX = (float)((box.X + theme.LabelPadding) * scale); - var titleY = (float)((compartmentY + theme.LabelPadding + theme.FontSizeBody) * scale); - canvas.DrawText(compartment.Title, titleX, titleY, titlePaint); - compartmentY += theme.LabelPadding + theme.FontSizeBody + theme.LabelPadding; - } - - // Draw each body row at body font size, left-aligned with LabelPadding indent - foreach (var row in compartment.Rows) - { - using var rowPaint = CreateTextPaint(strokeColor, (float)theme.FontSizeBody * scale, bold: false, italic: false); - rowPaint.TextAlign = SKTextAlign.Left; - var rowX = (float)((box.X + theme.LabelPadding) * scale); - var rowY = (float)((compartmentY + theme.LabelPadding + theme.FontSizeBody) * scale); - canvas.DrawText(row, rowX, rowY, rowPaint); - compartmentY += theme.LabelPadding + theme.FontSizeBody; - } - - // Bottom gap so the last row clears the next compartment divider. - compartmentY += theme.LabelPadding; - } - } - - /// - /// Renders a as a corner-radius-aware polyline, built from a - /// single so that CornerPathEffect can round every bend - /// uniformly. Arrowheads are drawn on top of the finished path. An optional midpoint - /// label is centered over the line with a white background rectangle. - /// - /// - /// When is zero (e.g., the Print theme) the path is - /// drawn with sharp corners. When both corner rounding and dashing are active, the two - /// effects are composed so that the dash pattern follows the rounded path. - /// - /// Canvas to draw on. - /// Line node to render. - /// Render options providing theme and scale. - private static void RenderLine(SKCanvas canvas, LayoutLine line, RenderOptions options) - { - // Lines with fewer than 2 waypoints cannot be drawn - if (line.Waypoints.Count < 2) - { - return; - } - - var theme = options.Theme; - var scale = (float)options.Scale; - var strokeColor = SKColor.Parse(theme.StrokeColor); - - // Build the connector path. Lines that carry an end marker whose decoration would otherwise be - // intruded by a rounded corner are built with explicit, per-end clamped corners; all other - // lines keep the uniform CornerPathEffect so their geometry is byte-identical to before. - var clampCorners = (line.SourceEnd != EndMarkerStyle.None || line.TargetEnd != EndMarkerStyle.None) - && theme.LineCornerRadius > 0 - && NeedsEndCornerClamp(line.Waypoints, theme.LineCornerRadius, line.SourceEnd, line.TargetEnd); - - using var path = clampCorners - ? BuildClampedLinePath(line.Waypoints, theme.LineCornerRadius, scale, line.SourceEnd, line.TargetEnd) - : BuildSimpleLinePath(line.Waypoints, scale); - - using var paint = new SKPaint(); - paint.Color = strokeColor; - paint.Style = SKPaintStyle.Stroke; - paint.StrokeWidth = (float)theme.StrokeWidth * scale; - paint.IsAntialias = true; - - // Apply corner and/or dash path effects based on theme and line style - var cornerRadius = (float)(theme.LineCornerRadius * scale); - var hasDash = line.LineStyle != LineStyle.Solid; - - if (clampCorners) - { - // Corners are already baked into the path; apply only the dash effect when needed. - if (hasDash) - { - float[] intervals = line.LineStyle == LineStyle.Dashed - ? [6f * scale, 3f * scale] - : [2f * scale, 2f * scale]; - paint.PathEffect = SKPathEffect.CreateDash(intervals, 0); - } - } - else if (hasDash && cornerRadius > 0) - { - // Compose: apply corner rounding (inner effect) then dashing (outer effect) - float[] intervals = line.LineStyle == LineStyle.Dashed - ? [6f * scale, 3f * scale] - : [2f * scale, 2f * scale]; - using var dash = SKPathEffect.CreateDash(intervals, 0); - using var corner = SKPathEffect.CreateCorner(cornerRadius); - paint.PathEffect = SKPathEffect.CreateCompose(dash, corner); - } - else if (hasDash) - { - float[] intervals = line.LineStyle == LineStyle.Dashed - ? [6f * scale, 3f * scale] - : [2f * scale, 2f * scale]; - paint.PathEffect = SKPathEffect.CreateDash(intervals, 0); - } - else if (cornerRadius > 0) - { - paint.PathEffect = SKPathEffect.CreateCorner(cornerRadius); - } - - canvas.DrawPath(path, paint); - - // Draw source end marker at the first waypoint, direction pointing away from the line - if (line.SourceEnd != EndMarkerStyle.None) - { - var tip = line.Waypoints[0]; - var next = line.Waypoints[1]; - var (dx, dy) = ComputeDirection(next.X, next.Y, tip.X, tip.Y); - DrawEndMarker( - canvas, - (float)(tip.X * scale), (float)(tip.Y * scale), - (float)dx, (float)dy, - line.SourceEnd, - new EndMarkerPaint(strokeColor, SKColor.Parse(theme.BackgroundColor), (float)theme.StrokeWidth * scale, scale)); - } - - // Draw target end marker at the last waypoint, direction pointing away from the line - if (line.TargetEnd != EndMarkerStyle.None) - { - var n = line.Waypoints.Count; - var tip = line.Waypoints[n - 1]; - var prev = line.Waypoints[n - 2]; - var (dx, dy) = ComputeDirection(prev.X, prev.Y, tip.X, tip.Y); - DrawEndMarker( - canvas, - (float)(tip.X * scale), (float)(tip.Y * scale), - (float)dx, (float)dy, - line.TargetEnd, - new EndMarkerPaint(strokeColor, SKColor.Parse(theme.BackgroundColor), (float)theme.StrokeWidth * scale, scale)); - } - - // Note: the midpoint label is intentionally NOT drawn here. It is drawn in a final pass - // (see RenderLineLabel) so that no later wire can draw over an earlier wire's label. - } - - /// - /// Builds a plain scaled polyline path through all waypoints, used together with the uniform - /// CornerPathEffect for lines that do not need decoration-aware corner clamping. - /// - /// Ordered waypoints. - /// Uniform scale factor. - /// The polyline path. - private static SKPath BuildSimpleLinePath(IReadOnlyList waypoints, float scale) - { - var path = new SKPath(); - path.MoveTo((float)(waypoints[0].X * scale), (float)(waypoints[0].Y * scale)); - for (var i = 1; i < waypoints.Count; i++) - { - path.LineTo((float)(waypoints[i].X * scale), (float)(waypoints[i].Y * scale)); - } - - return path; - } - - /// - /// Returns whether a uniform rounded corner of would intrude into - /// an end-marker decoration, i.e. the straight approach at a decorated end is shorter than the - /// marker's along-line length plus the corner radius. Computed in unscaled notation units. - /// - /// Ordered waypoints (unscaled). - /// Unscaled line corner radius. - /// Source end-marker style. - /// Target end-marker style. - /// true if explicit clamped corners are required; otherwise false. - private static bool NeedsEndCornerClamp( - IReadOnlyList waypoints, - double cornerRadius, - EndMarkerStyle sourceEnd, - EndMarkerStyle targetEnd) - { - // Without an interior corner there is nothing to round, so nothing can intrude. - if (waypoints.Count < 3) - { - return false; - } - - if (sourceEnd != EndMarkerStyle.None) - { - var inLen = Distance(waypoints[0], waypoints[1]); - if (inLen - NotationMetrics.AlongLineLength(sourceEnd) < cornerRadius) - { - return true; - } - } - - if (targetEnd != EndMarkerStyle.None) - { - var n = waypoints.Count; - var outLen = Distance(waypoints[n - 2], waypoints[n - 1]); - if (outLen - NotationMetrics.AlongLineLength(targetEnd) < cornerRadius) - { - return true; - } - } - - return false; - } - - /// - /// Builds a scaled connector path with arc-rounded interior corners, mirroring the SVG renderer's - /// BuildLinePath: the first interior corner additionally clamps its radius to - /// inLen − AlongLineLength(sourceEnd) and the last to - /// outLen − AlongLineLength(targetEnd), so the rounded corner never intrudes into an end - /// decoration. Corners are baked into the geometry, so no CornerPathEffect is applied. - /// - /// Ordered waypoints (unscaled); at least two entries. - /// Unscaled line corner radius. - /// Uniform scale factor. - /// Source end-marker style. - /// Target end-marker style. - /// The corner-baked connector path. - private static SKPath BuildClampedLinePath( - IReadOnlyList waypoints, - double cornerRadius, - float scale, - EndMarkerStyle sourceEnd, - EndMarkerStyle targetEnd) - { - var path = new SKPath(); - var first = waypoints[0]; - path.MoveTo((float)(first.X * scale), (float)(first.Y * scale)); - - for (var i = 1; i < waypoints.Count; i++) - { - var cur = waypoints[i]; - var isInterior = i < waypoints.Count - 1; - if (!isInterior) - { - path.LineTo((float)(cur.X * scale), (float)(cur.Y * scale)); - continue; - } - - var prev = waypoints[i - 1]; - var next = waypoints[i + 1]; - - var inDx = cur.X - prev.X; - var inDy = cur.Y - prev.Y; - var inLen = Math.Sqrt(inDx * inDx + inDy * inDy); - var outDx = next.X - cur.X; - var outDy = next.Y - cur.Y; - var outLen = Math.Sqrt(outDx * outDx + outDy * outDy); - - if (inLen < 0.001 || outLen < 0.001) - { - path.LineTo((float)(cur.X * scale), (float)(cur.Y * scale)); - continue; - } - - var inNx = inDx / inLen; - var inNy = inDy / inLen; - var outNx = outDx / outLen; - var outNy = outDy / outLen; - - var r = Math.Min(cornerRadius, Math.Min(inLen / 2.0, outLen / 2.0)); - if (i == 1) - { - r = Math.Min(r, inLen - NotationMetrics.AlongLineLength(sourceEnd)); - } - - if (i == waypoints.Count - 2) - { - r = Math.Min(r, outLen - NotationMetrics.AlongLineLength(targetEnd)); - } - - if (r <= 0.0) - { - path.LineTo((float)(cur.X * scale), (float)(cur.Y * scale)); - continue; - } - - var shortEndX = cur.X - inNx * r; - var shortEndY = cur.Y - inNy * r; - var shortStartX = cur.X + outNx * r; - var shortStartY = cur.Y + outNy * r; - - var cross = inNx * outNy - inNy * outNx; - var dir = cross > 0 ? SKPathDirection.Clockwise : SKPathDirection.CounterClockwise; - - path.LineTo((float)(shortEndX * scale), (float)(shortEndY * scale)); - path.ArcTo( - (float)(r * scale), (float)(r * scale), 0, SKPathArcSize.Small, dir, - (float)(shortStartX * scale), (float)(shortStartY * scale)); - } - - return path; - } - - /// Returns the Euclidean distance between two points. - /// First point. - /// Second point. - /// The distance. - private static double Distance(Point2D a, Point2D b) - { - var dx = a.X - b.X; - var dy = a.Y - b.Y; - return Math.Sqrt(dx * dx + dy * dy); - } - - /// - /// Draws a line's optional midpoint label, called in a final pass after all wires and boxes are - /// drawn so labels are never drawn over by another wire. - /// - /// Canvas to draw on. - /// The line whose label is rendered. - /// Render options providing theme and scale. - /// Pre-computed label centre X in logical pixels. - /// Pre-computed label centre Y in logical pixels. - private static void RenderLineLabel(SKCanvas canvas, LayoutLine line, RenderOptions options, double midX, double midY) - { - if (line.MidpointLabel is null) - { - return; - } - - var theme = options.Theme; - var scale = (float)options.Scale; - var strokeColor = SKColor.Parse(theme.StrokeColor); - RenderLineMidpointLabel(canvas, midX, midY, line.MidpointLabel, theme, scale, strokeColor); - } - - /// Recursively collects all nodes from a node tree. - /// Top-level nodes to walk. - /// Every line node, including those nested inside boxes or bands. - private static IEnumerable CollectLines(IReadOnlyList nodes) - { - foreach (var node in nodes) - { - switch (node) - { - case LayoutLine line: - yield return line; - break; - - case LayoutBox box: - foreach (var inner in CollectLines(box.Children)) - { - yield return inner; - } - - break; - - case LayoutBand band: - foreach (var inner in CollectLines(band.Children)) - { - yield return inner; - } - - break; - - default: - break; - } - } - } - - /// - /// Groups the visual paint parameters for line-end marker rendering, reducing the parameter - /// count on to within the allowed limit. - /// - /// Stroke and fill color for the end marker. - /// Background fill for hollow enclosing markers, so the connector line does not show through. - /// Stroke width applied to open (non-filled) end-marker styles. - /// Uniform scale factor used to size the end marker relative to the diagram. - private readonly record struct EndMarkerPaint(SKColor Color, SKColor BackgroundColor, float StrokeWidth, float Scale); - - /// - /// Maps a tip-relative to a scaled canvas point, shared by all marker - /// shapes so the PNG draws the identical geometry as the SVG marker definitions. - /// - /// - /// The endpoint (tip) is the line end; (dx, dy) points outward along the line and - /// (px, py) is its left perpendicular. A vertex at distance Along back from the tip - /// and Across to the side maps to tip − dir·Along·scale + perp·Across·scale, so a - /// negative Along (the triangle apex) overshoots the tip outward. - /// - /// Scaled X coordinate of the line endpoint. - /// Scaled Y coordinate of the line endpoint. - /// X component of the outward unit direction. - /// Y component of the outward unit direction. - /// X component of the perpendicular unit direction. - /// Y component of the perpendicular unit direction. - /// The tip-relative marker vertex in notation units. - /// Uniform scale factor. - /// The mapped canvas point. - private static SKPoint MarkerPoint( - float tipX, float tipY, float dx, float dy, float px, float py, MarkerVertex vertex, float scale) - { - var along = (float)vertex.Along; - var across = (float)vertex.Across; - return new SKPoint( - tipX - dx * along * scale + px * across * scale, - tipY - dy * along * scale + py * across * scale); - } - - /// - /// Draws a line-end marker of the specified style at a line endpoint, with every coordinate - /// derived from so the PNG marker matches the SVG marker exactly. - /// - /// - /// The direction vector (, ) must be a unit vector - /// pointing from the line body outward through the tip. The triangle, filled arrow, and both - /// diamonds reuse / - /// ; draws - /// those triangle vertices as an OPEN two-stroke polyline (no closing base edge), whereas - /// closes the path. - /// - /// Canvas to draw on. - /// Scaled X coordinate of the line endpoint. - /// Scaled Y coordinate of the line endpoint. - /// X component of the normalized outward direction vector. - /// Y component of the normalized outward direction vector. - /// End-marker style to draw; is a no-op. - /// Color, stroke width, and scale parameters for the end marker. - private static void DrawEndMarker( - SKCanvas canvas, - float tipX, float tipY, - float dx, float dy, - EndMarkerStyle style, - EndMarkerPaint paint) - { - if (style == EndMarkerStyle.None) - { - return; - } - - // Perpendicular direction (90° CCW rotation of the outward vector) - var px = -dy; - var py = dx; - var scale = paint.Scale; - - using var paintObj = new SKPaint(); - paintObj.Color = paint.Color; - paintObj.IsAntialias = true; - paintObj.StrokeWidth = paint.StrokeWidth; - - switch (style) - { - case EndMarkerStyle.OpenChevron: - { - // OPEN chevron: two strokes meeting at the apex, no closing base edge. - paintObj.Style = SKPaintStyle.Stroke; - using var p = TrianglePath(tipX, tipY, dx, dy, px, py, scale, close: false); - canvas.DrawPath(p, paintObj); - break; - } - - case EndMarkerStyle.HollowTriangle: - { - // Closed hollow triangle, background-filled so the line does not show through. - using var p = TrianglePath(tipX, tipY, dx, dy, px, py, scale, close: true); - paintObj.Style = SKPaintStyle.Fill; - paintObj.Color = paint.BackgroundColor; - canvas.DrawPath(p, paintObj); - paintObj.Style = SKPaintStyle.Stroke; - paintObj.Color = paint.Color; - canvas.DrawPath(p, paintObj); - break; - } - - case EndMarkerStyle.HollowTriangleCrossbar: - { - // Closed hollow triangle (background-filled) + perpendicular crossbar on the shaft. - using var p = TrianglePath(tipX, tipY, dx, dy, px, py, scale, close: true); - paintObj.Style = SKPaintStyle.Fill; - paintObj.Color = paint.BackgroundColor; - canvas.DrawPath(p, paintObj); - paintObj.Style = SKPaintStyle.Stroke; - paintObj.Color = paint.Color; - canvas.DrawPath(p, paintObj); - - var crossAlong = NotationMetrics.EndMarkerRefX - NotationMetrics.CrossbarX; - var a = MarkerPoint(tipX, tipY, dx, dy, px, py, new MarkerVertex(crossAlong, -NotationMetrics.EndMarkerHalfWidth), scale); - var b = MarkerPoint(tipX, tipY, dx, dy, px, py, new MarkerVertex(crossAlong, NotationMetrics.EndMarkerHalfWidth), scale); - canvas.DrawLine(a.X, a.Y, b.X, b.Y, paintObj); - break; - } - - case EndMarkerStyle.FilledArrow: - { - // Filled solid triangle. - paintObj.Style = SKPaintStyle.Fill; - using var p = TrianglePath(tipX, tipY, dx, dy, px, py, scale, close: true); - canvas.DrawPath(p, paintObj); - break; - } - - case EndMarkerStyle.HollowDiamond: - { - // Hollow four-point diamond, background-filled so the line does not show through. - using var p = DiamondPath(tipX, tipY, dx, dy, px, py, scale); - paintObj.Style = SKPaintStyle.Fill; - paintObj.Color = paint.BackgroundColor; - canvas.DrawPath(p, paintObj); - paintObj.Style = SKPaintStyle.Stroke; - paintObj.Color = paint.Color; - canvas.DrawPath(p, paintObj); - break; - } - - case EndMarkerStyle.FilledDiamond: - { - // Filled four-point diamond. - paintObj.Style = SKPaintStyle.Fill; - using var p = DiamondPath(tipX, tipY, dx, dy, px, py, scale); - canvas.DrawPath(p, paintObj); - break; - } - - case EndMarkerStyle.Circle: - { - // Hollow circle (background-filled) whose near edge touches the tip; center pulled back by one radius. - var center = MarkerPoint( - tipX, tipY, dx, dy, px, py, new MarkerVertex(NotationMetrics.CircleRadius, 0.0), scale); - var r = (float)NotationMetrics.CircleRadius * scale; - paintObj.Style = SKPaintStyle.Fill; - paintObj.Color = paint.BackgroundColor; - canvas.DrawCircle(center.X, center.Y, r, paintObj); - paintObj.Style = SKPaintStyle.Stroke; - paintObj.Color = paint.Color; - canvas.DrawCircle(center.X, center.Y, r, paintObj); - break; - } - - case EndMarkerStyle.Bar: - { - // Perpendicular bar centered on the tip. - paintObj.Style = SKPaintStyle.Stroke; - var a = MarkerPoint(tipX, tipY, dx, dy, px, py, new MarkerVertex(0.0, NotationMetrics.BarHalf), scale); - var b = MarkerPoint(tipX, tipY, dx, dy, px, py, new MarkerVertex(0.0, -NotationMetrics.BarHalf), scale); - canvas.DrawLine(a.X, a.Y, b.X, b.Y, paintObj); - break; - } - - default: - // Unknown styles are treated as None - break; - } - } - - /// - /// Builds the triangle marker path from , optionally - /// closing the base edge (closed for the hollow/filled triangle, open for the chevron). - /// - private static SKPath TrianglePath( - float tipX, float tipY, float dx, float dy, float px, float py, float scale, bool close) - { - var vertices = NotationMetrics.TriangleVertices(); - var p = new SKPath(); - var v0 = MarkerPoint(tipX, tipY, dx, dy, px, py, vertices[0], scale); - p.MoveTo(v0.X, v0.Y); - for (var i = 1; i < vertices.Count; i++) - { - var v = MarkerPoint(tipX, tipY, dx, dy, px, py, vertices[i], scale); - p.LineTo(v.X, v.Y); - } - - if (close) - { - p.Close(); - } - - return p; - } - - /// - /// Builds the closed diamond marker path from . - /// - private static SKPath DiamondPath( - float tipX, float tipY, float dx, float dy, float px, float py, float scale) - { - var vertices = NotationMetrics.DiamondVertices(); - var p = new SKPath(); - var v0 = MarkerPoint(tipX, tipY, dx, dy, px, py, vertices[0], scale); - p.MoveTo(v0.X, v0.Y); - for (var i = 1; i < vertices.Count; i++) - { - var v = MarkerPoint(tipX, tipY, dx, dy, px, py, vertices[i], scale); - p.LineTo(v.X, v.Y); - } - - p.Close(); - return p; - } - - /// - /// Computes a normalized direction unit vector from (, - /// ) toward (, ). - /// Returns (1, 0) as a safe fallback when the two points coincide. - /// - /// X coordinate of the source point. - /// Y coordinate of the source point. - /// X coordinate of the target point. - /// Y coordinate of the target point. - /// Normalized (Dx, Dy) direction tuple. - private static (double Dx, double Dy) ComputeDirection( - double fromX, double fromY, double toX, double toY) - { - var dx = toX - fromX; - var dy = toY - fromY; - var len = Math.Sqrt(dx * dx + dy * dy); - return len < 0.001 ? (1.0, 0.0) : (dx / len, dy / len); - } - - /// - /// Renders a text label centered at the midpoint of a polyline, with a white background - /// rectangle drawn first to ensure readability over the line stroke. - /// - /// Canvas to draw on. - /// Label centre X in logical pixels. - /// Label centre Y in logical pixels. - /// Label text to render. - /// Theme providing font size and padding. - /// Uniform scale factor. - /// Color used for the label text. - private static void RenderLineMidpointLabel( - SKCanvas canvas, - double midX, - double midY, - string label, - Theme theme, - float scale, - SKColor strokeColor) - { - var scaledX = (float)(midX * scale); - var scaledY = (float)(midY * scale); - - using var textPaint = CreateTextPaint(strokeColor, (float)theme.FontSizeBody * scale, bold: false, italic: false); - textPaint.TextAlign = SKTextAlign.Center; - - // Measure the text so the background rectangle fits snugly around it - var textWidth = textPaint.MeasureText(label); - var textHeight = (float)theme.FontSizeBody * scale; - var padding = (float)theme.LabelPadding * scale * 0.5f; - var bgRect = new SKRect( - scaledX - textWidth / 2f - padding, - scaledY - textHeight - padding, - scaledX + textWidth / 2f + padding, - scaledY + padding); - - using (var bgPaint = new SKPaint()) - { - bgPaint.Color = SKColors.White; - bgPaint.Style = SKPaintStyle.Fill; - canvas.DrawRect(bgRect, bgPaint); - } - - canvas.DrawText(label, scaledX, scaledY, textPaint); - } - - /// - /// Renders a as a text element at its absolute position. - /// - /// Canvas to draw on. - /// Label node to render. - /// Render options providing theme and scale. - private static void RenderLabel(SKCanvas canvas, LayoutLabel label, RenderOptions options) - { - var theme = options.Theme; - var scale = (float)options.Scale; - - using var paint = CreateTextPaint( - SKColor.Parse(theme.StrokeColor), - (float)label.FontSize * scale, - bold: label.Weight == FontWeight.Bold, - italic: label.Style == FontStyle.Italic); - paint.TextAlign = label.Align switch - { - TextAlign.Center => SKTextAlign.Center, - TextAlign.Right => SKTextAlign.Right, - _ => SKTextAlign.Left - }; - - var availableWidth = (float)(label.MaxWidth * scale); - paint.TextSize = FitFontSize(paint, label.Text, availableWidth, paint.TextSize); - - canvas.DrawText(label.Text, (float)(label.X * scale), (float)(label.Y * scale), paint); - } - - /// - /// Renders a as a small (8×8 logical pixels) filled square - /// centered at the port position. When a label is present it is offset away from the - /// edge the port is attached to, ensuring it does not overlap with the host box. - /// - /// Canvas to draw on. - /// Port node to render. - /// Render options providing theme and scale. - private static void RenderPort(SKCanvas canvas, LayoutPort port, RenderOptions options) - { - var theme = options.Theme; - var scale = (float)options.Scale; - var strokeColor = SKColor.Parse(theme.StrokeColor); - - // Port square: filled, centered at (CentreX, CentreY), sized from NotationMetrics. - var portRect = new SKRect( - (float)((port.CentreX - NotationMetrics.PortHalfSize) * scale), - (float)((port.CentreY - NotationMetrics.PortHalfSize) * scale), - (float)((port.CentreX + NotationMetrics.PortHalfSize) * scale), - (float)((port.CentreY + NotationMetrics.PortHalfSize) * scale)); - - // Ports are conventionally drawn as filled squares using the stroke color - using (var fillPaint = new SKPaint()) - { - fillPaint.Color = strokeColor; - fillPaint.Style = SKPaintStyle.Fill; - canvas.DrawRect(portRect, fillPaint); - } - - // Draw the optional label offset away from the attached edge - if (port.Label != null) - { - // Offset the label far enough from the port square so it does not overlap - var offset = NotationMetrics.PortHalfSize + theme.LabelPadding; - var (labelX, labelY, align) = port.Side switch - { - PortSide.Top => (port.CentreX, port.CentreY - offset, SKTextAlign.Center), - PortSide.Bottom => (port.CentreX, port.CentreY + offset + theme.FontSizeBody, SKTextAlign.Center), - PortSide.Left => (port.CentreX - offset, port.CentreY + theme.FontSizeBody / 2.0, SKTextAlign.Right), - _ => (port.CentreX + offset, port.CentreY + theme.FontSizeBody / 2.0, SKTextAlign.Left) - }; - - using var textPaint = CreateTextPaint(strokeColor, (float)theme.FontSizeBody * scale, bold: false, italic: false); - textPaint.TextAlign = align; - canvas.DrawText(port.Label, (float)(labelX * scale), (float)(labelY * scale), textPaint); - } - } - - /// - /// Renders a as the specified icon shape centered at the badge - /// position. An optional label is drawn to the right of the bounding circle. - /// - /// Canvas to draw on. - /// Badge node to render. - /// Render options providing theme and scale. - private static void RenderBadge(SKCanvas canvas, LayoutBadge badge, RenderOptions options) - { - var theme = options.Theme; - var scale = (float)options.Scale; - var strokeColor = SKColor.Parse(theme.StrokeColor); - - var cx = (float)(badge.CentreX * scale); - var cy = (float)(badge.CentreY * scale); - var r = (float)(badge.Size / 2.0 * scale); - - using var strokePaint = new SKPaint(); - strokePaint.Color = strokeColor; - strokePaint.Style = SKPaintStyle.Stroke; - strokePaint.StrokeWidth = (float)theme.StrokeWidth * scale; - strokePaint.IsAntialias = true; - - using var fillPaint = new SKPaint(); - fillPaint.Color = strokeColor; - fillPaint.Style = SKPaintStyle.Fill; - fillPaint.IsAntialias = true; - - // Draw the badge shape centered at (cx, cy) within a bounding circle of radius r - switch (badge.Shape) - { - case BadgeShape.FilledCircle: - canvas.DrawCircle(cx, cy, r, fillPaint); - break; - - case BadgeShape.Bullseye: - { - // Outer filled circle + white inner circle to create a visible ring - canvas.DrawCircle(cx, cy, r, fillPaint); - using var innerWhite = new SKPaint(); - innerWhite.Color = SKColors.White; - innerWhite.Style = SKPaintStyle.Fill; - innerWhite.IsAntialias = true; - canvas.DrawCircle(cx, cy, r * (float)NotationMetrics.BadgeBullseyeInnerFraction, innerWhite); - canvas.DrawCircle(cx, cy, r * (float)NotationMetrics.BadgeBullseyeInnerFraction, strokePaint); - break; - } - - case BadgeShape.Diamond: - { - // Open rotated-square diamond with vertices at the compass cardinal points - using var p = new SKPath(); - p.MoveTo(cx, cy - r); // top - p.LineTo(cx + r, cy); // right - p.LineTo(cx, cy + r); // bottom - p.LineTo(cx - r, cy); // left - p.Close(); - canvas.DrawPath(p, strokePaint); - break; - } - - case BadgeShape.HorizontalBar: - canvas.DrawLine(cx - r * (float)NotationMetrics.BadgeBarLengthFraction, cy, cx + r * (float)NotationMetrics.BadgeBarLengthFraction, cy, strokePaint); - break; - - case BadgeShape.VerticalBar: - canvas.DrawLine(cx, cy - r * (float)NotationMetrics.BadgeBarLengthFraction, cx, cy + r * (float)NotationMetrics.BadgeBarLengthFraction, strokePaint); - break; - - default: - // Unknown badge shapes are skipped for forward compatibility - break; - } - - // Draw the optional label to the right of the bounding circle - if (badge.Label != null) - { - using var textPaint = CreateTextPaint(strokeColor, (float)theme.FontSizeBody * scale, bold: false, italic: false); - textPaint.TextAlign = SKTextAlign.Left; - var labelX = (float)((badge.CentreX + badge.Size / 2.0 + theme.LabelPadding) * scale); - var labelY = (float)((badge.CentreY + theme.FontSizeBody / 2.0) * scale); - canvas.DrawText(badge.Label, labelX, labelY, textPaint); - } - } - - /// - /// Renders a as a swim-lane rectangle with an optional label. - /// For Horizontal bands the label is rendered vertically (rotated 90° CCW) along the - /// left edge; for Vertical bands it is rendered horizontally at the top. Children are - /// rendered recursively. - /// - /// Canvas to draw on. - /// Band node to render. - /// Render options providing theme and scale. - private static void RenderBand(SKCanvas canvas, LayoutBand band, RenderOptions options) - { - var theme = options.Theme; - var scale = (float)options.Scale; - var strokeColor = SKColor.Parse(theme.StrokeColor); - - var rect = new SKRect( - (float)(band.X * scale), - (float)(band.Y * scale), - (float)((band.X + band.Width) * scale), - (float)((band.Y + band.Height) * scale)); - - // Fill band with the primary (depth-0) background color - using (var fillPaint = new SKPaint()) - { - fillPaint.Color = SKColor.Parse(theme.DepthFillColors[0]); - fillPaint.Style = SKPaintStyle.Fill; - canvas.DrawRect(rect, fillPaint); - } - - // Draw the band border - using (var strokePaint = new SKPaint()) - { - strokePaint.Color = strokeColor; - strokePaint.Style = SKPaintStyle.Stroke; - strokePaint.StrokeWidth = (float)theme.StrokeWidth * scale; - canvas.DrawRect(rect, strokePaint); - } - - // Draw the optional label; position and rotation depends on band orientation - if (band.Label != null) - { - using var textPaint = CreateTextPaint(strokeColor, (float)theme.FontSizeBody * scale, bold: false, italic: false); - textPaint.TextAlign = SKTextAlign.Center; - - if (band.Orientation == BandOrientation.Horizontal) - { - // Vertical text on the left edge: translate to label center, rotate CCW - var labelCx = (float)((band.X + theme.LabelPadding + theme.FontSizeBody / 2.0) * scale); - var labelCy = (float)((band.Y + band.Height / 2.0) * scale); - canvas.Save(); - canvas.Translate(labelCx, labelCy); - canvas.RotateDegrees(-90); - canvas.DrawText(band.Label, 0, 0, textPaint); - canvas.Restore(); - } - else - { - // Horizontal text at the top of the band - var textX = (float)((band.X + band.Width / 2.0) * scale); - var textY = (float)((band.Y + theme.LabelPadding + theme.FontSizeBody) * scale); - canvas.DrawText(band.Label, textX, textY, textPaint); - } - } - - // Render children recursively - foreach (var child in band.Children) - { - RenderNode(canvas, child, options); - } - } - - /// - /// Renders a as a header box centered at - /// containing the lifeline label, followed by a - /// dashed vertical stem running from the bottom of the header to - /// . - /// - /// Canvas to draw on. - /// Lifeline node to render. - /// Render options providing theme and scale. - private static void RenderLifeline(SKCanvas canvas, LayoutLifeline lifeline, RenderOptions options) - { - var theme = options.Theme; - var scale = (float)options.Scale; - var strokeColor = SKColor.Parse(theme.StrokeColor); - - // Header box: centered at CentreX, top edge at TopY - var headerLeft = lifeline.CentreX - lifeline.HeaderWidth / 2.0; - var headerRect = new SKRect( - (float)(headerLeft * scale), - (float)(lifeline.TopY * scale), - (float)((headerLeft + lifeline.HeaderWidth) * scale), - (float)((lifeline.TopY + lifeline.HeaderHeight) * scale)); - - // Fill header with the primary background color - using (var fillPaint = new SKPaint()) - { - fillPaint.Color = SKColor.Parse(theme.DepthFillColors[0]); - fillPaint.Style = SKPaintStyle.Fill; - canvas.DrawRect(headerRect, fillPaint); - } - - // Draw header border - using (var strokePaint = new SKPaint()) - { - strokePaint.Color = strokeColor; - strokePaint.Style = SKPaintStyle.Stroke; - strokePaint.StrokeWidth = (float)theme.StrokeWidth * scale; - canvas.DrawRect(headerRect, strokePaint); - } - - // Draw the header label centered within the header box - using (var textPaint = CreateTextPaint(strokeColor, (float)theme.FontSizeBody * scale, bold: true, italic: false)) - { - textPaint.TextAlign = SKTextAlign.Center; - var textX = (float)(lifeline.CentreX * scale); - var textY = (float)((lifeline.TopY + (lifeline.HeaderHeight + theme.FontSizeBody) / 2.0) * scale); - canvas.DrawText(lifeline.Label, textX, textY, textPaint); - } - - // Dashed vertical stem from the bottom of the header box to BottomY - using var stemPaint = new SKPaint(); - stemPaint.Color = strokeColor; - stemPaint.Style = SKPaintStyle.Stroke; - stemPaint.StrokeWidth = (float)theme.StrokeWidth * scale; - stemPaint.IsAntialias = true; - stemPaint.PathEffect = SKPathEffect.CreateDash([6f * scale, 3f * scale], 0); - - var stemX = (float)(lifeline.CentreX * scale); - canvas.DrawLine( - stemX, (float)((lifeline.TopY + lifeline.HeaderHeight) * scale), - stemX, (float)(lifeline.BottomY * scale), - stemPaint); - } - - /// - /// Renders a as a narrow white-filled rectangle with a - /// stroke border, centered horizontally at . - /// - /// - /// The activation bar width is Theme.LabelPadding * 2, giving it a size that - /// scales proportionally with the diagram's text padding setting. - /// - /// Canvas to draw on. - /// Activation node to render. - /// Render options providing theme and scale. - private static void RenderActivation(SKCanvas canvas, LayoutActivation activation, RenderOptions options) - { - var theme = options.Theme; - var scale = (float)options.Scale; - var strokeColor = SKColor.Parse(theme.StrokeColor); - - // Bar width = LabelPadding * 2, centered at CentreX - var halfWidth = theme.LabelPadding; - var rect = new SKRect( - (float)((activation.CentreX - halfWidth) * scale), - (float)(activation.TopY * scale), - (float)((activation.CentreX + halfWidth) * scale), - (float)(activation.BottomY * scale)); - - // White fill indicates the lifeline is active during this time interval - using (var fillPaint = new SKPaint()) - { - fillPaint.Color = SKColors.White; - fillPaint.Style = SKPaintStyle.Fill; - canvas.DrawRect(rect, fillPaint); - } - - // Stroke border delineates the bar from surrounding elements - using var strokePaint = new SKPaint(); - strokePaint.Color = strokeColor; - strokePaint.Style = SKPaintStyle.Stroke; - strokePaint.StrokeWidth = (float)theme.StrokeWidth * scale; - canvas.DrawRect(rect, strokePaint); - } - - /// - /// Renders a as a bordered table. Header rows are filled with - /// the depth-1 theme color; body rows use the depth-0 color. Each cell's text is - /// aligned according to and vertically centered - /// within the row height. - /// - /// Canvas to draw on. - /// Grid node to render. - /// Render options providing theme and scale. - private static void RenderGrid(SKCanvas canvas, LayoutGrid grid, RenderOptions options) - { - var theme = options.Theme; - var scale = (float)options.Scale; - var strokeColor = SKColor.Parse(theme.StrokeColor); - - // Header rows use depth-1 color; body rows use depth-0 color - var headerFill = SKColor.Parse(theme.DepthFillColors[1 % theme.DepthFillColors.Count]); - var bodyFill = SKColor.Parse(theme.DepthFillColors[0]); - - // Accumulate Y position across rows; X resets at the start of each row - var currentY = grid.Y; - foreach (var row in grid.Rows) - { - // Row height = maximum cell height in this row - var rowHeight = 0.0; - foreach (var cell in row.Cells) - { - rowHeight = Math.Max(rowHeight, cell.Height); - } - - var currentX = grid.X; - foreach (var cell in row.Cells) - { - var cellRect = new SKRect( - (float)(currentX * scale), - (float)(currentY * scale), - (float)((currentX + cell.Width) * scale), - (float)((currentY + rowHeight) * scale)); - - // Fill cell with header or body background - using (var fillPaint = new SKPaint()) - { - fillPaint.Color = row.IsHeader ? headerFill : bodyFill; - fillPaint.Style = SKPaintStyle.Fill; - canvas.DrawRect(cellRect, fillPaint); - } - - // Draw the cell border - using (var borderPaint = new SKPaint()) - { - borderPaint.Color = strokeColor; - borderPaint.Style = SKPaintStyle.Stroke; - borderPaint.StrokeWidth = (float)theme.StrokeWidth * scale; - canvas.DrawRect(cellRect, borderPaint); - } - - // Draw cell text, horizontally aligned per cell spec and vertically centered - using (var textPaint = CreateTextPaint(strokeColor, (float)theme.FontSizeBody * scale, bold: row.IsHeader, italic: false)) - { - textPaint.TextAlign = cell.Align switch - { - TextAlign.Center => SKTextAlign.Center, - TextAlign.Right => SKTextAlign.Right, - _ => SKTextAlign.Left - }; - - var textX = cell.Align switch - { - TextAlign.Center => currentX + cell.Width / 2.0, - TextAlign.Right => currentX + cell.Width - theme.LabelPadding, - _ => currentX + theme.LabelPadding - }; - - // Vertically center the baseline within the row - var textY = currentY + (rowHeight + theme.FontSizeBody) / 2.0; - canvas.DrawText(cell.Text, (float)(textX * scale), (float)(textY * scale), textPaint); - } - - currentX += cell.Width; - } - - currentY += rowHeight; - } - } -} - diff --git a/src/DemaConsulting.SysML2Tools.Svg/DemaConsulting.SysML2Tools.Svg.csproj b/src/DemaConsulting.SysML2Tools.Svg/DemaConsulting.SysML2Tools.Svg.csproj deleted file mode 100644 index 86408196..00000000 --- a/src/DemaConsulting.SysML2Tools.Svg/DemaConsulting.SysML2Tools.Svg.csproj +++ /dev/null @@ -1,72 +0,0 @@ - - - - net8.0;net9.0;net10.0 - latest - enable - enable - - - false - 0.0.0 - DEMA Consulting - DEMA Consulting - SysML v2 SVG renderer for .NET - MIT - https://github.com/demaconsulting/SysML2Tools - https://github.com/demaconsulting/SysML2Tools - Copyright DEMA Consulting - SysML2 Tools SVG Renderer - DemaConsulting.SysML2Tools.Svg - - - true - snupkg - true - true - true - - - true - true - true - true - latest - - - true - $(Product) - $(Version) - Organization: $(Company) - - - - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - diff --git a/src/DemaConsulting.SysML2Tools.Svg/SvgRenderer.cs b/src/DemaConsulting.SysML2Tools.Svg/SvgRenderer.cs deleted file mode 100644 index 7815ccaa..00000000 --- a/src/DemaConsulting.SysML2Tools.Svg/SvgRenderer.cs +++ /dev/null @@ -1,1176 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using System.Globalization; -using System.Text; -using DemaConsulting.SysML2Tools.Layout; -using DemaConsulting.SysML2Tools.Rendering; - -namespace DemaConsulting.SysML2Tools.Svg; - -/// -/// Renders a to SVG format using zero external dependencies. -/// -/// -/// The renderer is pure and stateless: each call to builds a complete -/// SVG document from the supplied and writes it to the output stream. -/// No state is shared between calls. The produced SVG targets SVG 1.1 and is encoded in UTF-8. -/// -/// Node rendering: -/// - <rect> (with rx/ry for rounded -/// corners) + optional <text> for the label + <line> dividers -/// and <text> rows for each compartment; children rendered recursively. -/// - <path> with M/L/A commands for corner-radius- -/// aware bends; arrowheads as marker references defined in <defs>; optional -/// midpoint label as <text>. -/// - <text>. -/// - <rect> filled square with optional -/// <text> label offset away from the attached edge. -/// - → shape-specific SVG elements centered at the badge position -/// with optional <text> label. -/// - <rect> with optional rotated or horizontal -/// <text> label; children rendered recursively. -/// - <rect> header + dashed -/// <line> stem + <text> label. -/// - <rect> with white fill. -/// - → bordered <rect> cells with per-cell -/// <text> elements. -/// - All other node types are silently skipped for forward compatibility. -/// -/// Fill colors are derived from using modulo wrapping on -/// . -/// -public sealed class SvgRenderer : IRenderer -{ - /// Closing tag for an SVG marker element, indented to match the defs block. - private const string MarkerClose = " "; - - /// SVG text-anchor value for centered alignment. - private const string TextAnchorMiddle = "middle"; - - /// - public string MediaType => "image/svg+xml"; - - /// - public string DefaultExtension => ".svg"; - - /// - /// - /// Writes a complete SVG 1.1 document to . The canvas size is - /// taken from and . - /// All coordinates are expressed as doubles formatted to two decimal places. - /// - public void Render(LayoutTree layout, RenderOptions options, Stream output) - { - // Validate inputs — null arguments would produce silent failures - ArgumentNullException.ThrowIfNull(layout); - ArgumentNullException.ThrowIfNull(options); - ArgumentNullException.ThrowIfNull(output); - - // Build the SVG document in memory then flush once to avoid partial writes - var sb = new StringBuilder(); - var theme = options.Theme; - - // Compute canvas dimensions, ensuring a minimum 1×1 canvas - var width = Math.Max(1.0, layout.Width * options.Scale); - var height = Math.Max(1.0, layout.Height * options.Scale); - - // Write SVG root element with explicit namespace and viewBox - sb.Append(CultureInfo.InvariantCulture, - $""""""); - sb.AppendLine(); - - // Write defs section with all line-end markers - WriteEndMarkerDefs(sb, theme); - - // Render all top-level nodes recursively (wires are drawn without their labels here) - foreach (var node in layout.Nodes) - { - RenderNode(sb, node, theme, options.Scale); - } - - // Final pass: draw every connector label on top of all wires and boxes, so that no later - // wire can draw over an earlier wire's label. Positions are computed up front so that labels - // that would collide (for example where two connectors cross) are spread apart. - var lines = CollectLines(layout.Nodes).ToList(); - var labelPositions = ConnectorLabelPlacer.Place(lines, theme.FontSizeBody); - foreach (var line in lines) - { - if (line.MidpointLabel is not null && labelPositions.TryGetValue(line, out var pos)) - { - RenderLineLabel(sb, line, theme, options.Scale, pos.X, pos.Y); - } - } - - // Close SVG root - sb.AppendLine(""); - - // Encode as UTF-8 and write to output stream - var bytes = Encoding.UTF8.GetBytes(sb.ToString()); - output.Write(bytes, 0, bytes.Length); - } - - /// - /// Writes the <defs> block containing all line-end (connector decoration) marker - /// definitions used by . - /// - /// - /// Markers defined: line-end-open-chevron (open two-stroke chevron drawn as a - /// <polyline> with no closing base edge), line-end-hollow-triangle (hollow - /// triangle), line-end-hollow-triangle-crossbar (hollow triangle with perpendicular - /// crossbar), line-end-filled-arrow (filled triangle), line-end-hollow-diamond - /// (hollow diamond), line-end-filled-diamond (filled diamond), line-end-circle - /// (hollow circle), and line-end-bar (perpendicular bar). Every coordinate is derived from - /// , so a geometry literal never appears twice and the PNG renderer - /// draws the identical shapes from the same source constants. - /// - /// String builder receiving the SVG markup. - /// Theme providing stroke color and width. - private static void WriteEndMarkerDefs(StringBuilder sb, Theme theme) - { - var stroke = theme.StrokeColor; - var sw = F(theme.StrokeWidth); - var bg = theme.BackgroundColor; - var trianglePoints = MarkerPoints( - NotationMetrics.TriangleVertices(), NotationMetrics.EndMarkerRefX, NotationMetrics.EndMarkerHalfWidth); - var diamondPoints = MarkerPoints( - NotationMetrics.DiamondVertices(), NotationMetrics.DiamondRefX, NotationMetrics.DiamondHalfWidth); - - sb.AppendLine(" "); - - // Open-chevron marker — OPEN two-stroke chevron (polyline with no closing base edge), drawn - // from the same triangle vertices as the hollow triangle but left open along the line. - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - sb.AppendLine(MarkerClose); - - // Hollow-triangle marker — closed hollow triangle pointing along the line direction; filled - // with the background color so the connector line does not show through the unfilled interior. - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - sb.AppendLine(MarkerClose); - - // Filled-arrow marker — solid triangle pointing along the line direction - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - sb.AppendLine(MarkerClose); - - // Hollow-triangle-with-crossbar marker — hollow triangle + perpendicular crossbar on the shaft. - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - sb.AppendLine(MarkerClose); - - // Hollow-diamond marker — open four-point diamond straddling the line end - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - sb.AppendLine(MarkerClose); - - // Filled-diamond marker — solid four-point diamond straddling the line end - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - sb.AppendLine(MarkerClose); - - // Circle marker — open circle whose near edge sits at the line endpoint - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - sb.AppendLine(MarkerClose); - - // Bar marker — perpendicular line centered on the line endpoint - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - sb.AppendLine(MarkerClose); - - // Auto-sizing white background for text drawn over lines (e.g. message and guard labels). - // The filter region defaults to the text bounding box; the small negative inset adds padding. - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - sb.AppendLine(""" """); - sb.AppendLine(""" """); - sb.AppendLine(" "); - - sb.AppendLine(" "); - } - - /// - /// Builds an SVG points string from tip-relative marker vertices by mapping each vertex to - /// marker-box coordinates: boxX = refAlong - Along and boxY = refAcross + Across. - /// - /// Tip-relative marker vertices in draw order. - /// Along-line position of the marker box anchor (the SVG refX). - /// Across-line position of the marker box anchor (the SVG refY). - /// An SVG points attribute value, for example "0 0, 10 3.5, 0 7". - private static string MarkerPoints(IReadOnlyList vertices, double refAlong, double refAcross) - { - var sb = new StringBuilder(); - for (var i = 0; i < vertices.Count; i++) - { - if (i > 0) - { - sb.Append(", "); - } - - sb.Append(CultureInfo.InvariantCulture, - $"{M(refAlong - vertices[i].Along)} {M(refAcross + vertices[i].Across)}"); - } - - return sb.ToString(); - } - - /// - /// Formats a notation-metric coordinate for an SVG marker definition: rounded to six decimals - /// (to absorb floating-point noise in derived constants such as the crossbar position) and emitted - /// with the minimal invariant-culture representation, so a derived value reproduces the historical - /// literal byte-for-byte (for example 10, 3.5, -0.05). - /// - /// The notation-metric coordinate. - /// The formatted number. - private static string M(double value) => - Math.Round(value, 6).ToString(CultureInfo.InvariantCulture); - - /// - /// Dispatches a single to the appropriate typed render method. - /// Unknown concrete types are silently skipped so that future node types do not break - /// existing callers. - /// - /// String builder receiving the SVG markup. - /// The node to render. - /// Visual theme providing colors and dimensions. - /// Uniform scale factor applied to all coordinates. - private static void RenderNode(StringBuilder sb, LayoutNode node, Theme theme, double scale) - { - switch (node) - { - case LayoutBox box: - RenderBox(sb, box, theme, scale); - break; - - case LayoutLine line: - RenderLine(sb, line, theme, scale); - break; - - case LayoutLabel label: - RenderLabel(sb, label, theme, scale); - break; - - case LayoutPort port: - RenderPort(sb, port, theme, scale); - break; - - case LayoutBadge badge: - RenderBadge(sb, badge, theme, scale); - break; - - case LayoutBand band: - RenderBand(sb, band, theme, scale); - break; - - case LayoutLifeline lifeline: - RenderLifeline(sb, lifeline, theme, scale); - break; - - case LayoutActivation activation: - RenderActivation(sb, activation, theme, scale); - break; - - case LayoutGrid grid: - RenderGrid(sb, grid, theme, scale); - break; - - default: - // Skip unknown node types for forward compatibility - break; - } - } - - /// - /// Renders a as a <rect> with rx/ry - /// attributes for rounded corners, an optional centered <text> label, - /// horizontal divider <line> elements and text rows for each compartment, - /// then recursively renders its children. - /// - /// String builder receiving the SVG markup. - /// The box node to render. - /// Visual theme providing fill colors, stroke, and font size. - /// Uniform scale factor. - private static void RenderBox(StringBuilder sb, LayoutBox box, Theme theme, double scale) - { - // Derive fill color from theme using depth modulo wrapping - var fillColor = theme.DepthFillColors[box.Depth % theme.DepthFillColors.Count]; - - // Draw the box outline (shape-specific) - RenderBoxOutline(sb, box, theme, fillColor, scale); - - // Draw the keyword and label in the title area - RenderBoxTitle(sb, box, theme, scale); - - // Render compartments below the label area - if (box.Compartments.Count > 0) - { - RenderBoxCompartments(sb, box, theme, scale); - } - - // Render children recursively - foreach (var child in box.Children) - { - RenderNode(sb, child, theme, scale); - } - } - - /// - /// Renders the outline (border and fill) of a , selecting the path - /// geometry based on . - /// - /// String builder receiving the SVG markup. - /// The box whose outline is drawn. - /// Visual theme providing stroke settings and corner radius. - /// Resolved fill color for the box interior. - /// Uniform scale factor. - private static void RenderBoxOutline(StringBuilder sb, LayoutBox box, Theme theme, string fillColor, double scale) - { - var x = box.X * scale; - var y = box.Y * scale; - var w = box.Width * scale; - var h = box.Height * scale; - - switch (box.Shape) - { - case BoxShape.Folder: - RenderFolderOutline(sb, box, theme, fillColor, scale); - break; - - case BoxShape.Note: - RenderNoteOutline(sb, box, theme, fillColor, scale); - break; - - case BoxShape.RoundedRectangle: - var cornerStr = theme.LineCornerRadius > 0 - ? $" rx=\"{F(NotationMetrics.RoundedRectRadius(theme) * scale)}\" ry=\"{F(NotationMetrics.RoundedRectRadius(theme) * scale)}\"" - : string.Empty; - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - break; - - default: - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - break; - } - } - - /// - /// Renders a folder-shaped outline (a tab at the top-left above a full-width body), - /// used for package nodes. - /// - private static void RenderFolderOutline(StringBuilder sb, LayoutBox box, Theme theme, string fillColor, double scale) - { - var tabHeight = BoxMetrics.FolderTabHeight(theme); - var tabWidth = Math.Min( - box.Width * NotationMetrics.FolderTabMaxWidthFraction, - Math.Max( - NotationMetrics.FolderTabMinWidth, - (box.Label?.Length ?? 4) * theme.FontSizeBody * NotationMetrics.FolderLabelCharWidthFactor + 2.0 * theme.LabelPadding)); - - var x = box.X * scale; - var yTab = box.Y * scale; - var yBody = (box.Y + tabHeight) * scale; - var xTabRight = (box.X + tabWidth) * scale; - var xRight = (box.X + box.Width) * scale; - var yBottom = (box.Y + box.Height) * scale; - - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - } - - /// - /// Renders a note-shaped outline (a rectangle with a folded-down top-right corner), - /// used for documentation and comment nodes. - /// - private static void RenderNoteOutline(StringBuilder sb, LayoutBox box, Theme theme, string fillColor, double scale) - { - var fold = Math.Min(box.Width, box.Height) * NotationMetrics.NoteFoldFraction; - fold = Math.Min(fold, NotationMetrics.NoteFoldMaxSize); - - var x = box.X * scale; - var y = box.Y * scale; - var xRight = (box.X + box.Width) * scale; - var xFold = (box.X + box.Width - fold) * scale; - var yFold = (box.Y + fold) * scale; - var yBottom = (box.Y + box.Height) * scale; - - // Main body with the top-right corner cut - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - - // The folded corner triangle - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - } - - /// - /// Renders the optional keyword line and bold name label in the title area of a box. - /// - /// String builder receiving the SVG markup. - /// Box whose title is rendered. - /// Visual theme providing font sizes and padding. - /// Uniform scale factor. - private static void RenderBoxTitle(StringBuilder sb, LayoutBox box, Theme theme, double scale) - { - var centerX = (box.X + box.Width / 2.0) * scale; - var cursorY = box.Y + theme.LabelPadding; - - // Keyword line (smaller, italic, guillemet-wrapped) above the name - if (box.Keyword != null) - { - var kwY = (cursorY + theme.FontSizeBody / 2.0) * scale; - sb.Append(CultureInfo.InvariantCulture, - $""" {EscapeXml("\u00AB" + box.Keyword + "\u00BB")}"""); - sb.AppendLine(); - cursorY += theme.FontSizeBody + theme.LabelPadding; - } - - // Bold name label — only constrain width when the text would actually overflow the box, - // so short labels render at their natural size instead of being stretched to fill. - if (box.Label != null) - { - var textY = (cursorY + theme.FontSizeTitle / 2.0) * scale; - var availableWidth = box.Width - (2 * theme.LabelPadding); - var fit = FitTextLength(box.Label, theme.FontSizeTitle, availableWidth, scale); - sb.Append(CultureInfo.InvariantCulture, - $""" {EscapeXml(box.Label)}"""); - sb.AppendLine(); - } - } - - /// - /// Returns an SVG textLength/lengthAdjust attribute fragment that constrains text - /// to only when the text's estimated natural width exceeds it; - /// otherwise returns an empty string so the text renders at its natural width (no stretching). - /// - /// The text to be rendered. - /// Unscaled font size of the text. - /// Unscaled width available for the text. - /// Uniform scale factor. - /// A leading-space attribute fragment, or an empty string when no constraint is needed. - private static string FitTextLength(string text, double fontSize, double availableWidth, double scale) - { - // Rough average glyph-width estimate; matches the layout engine's sizing factor. - const double GlyphWidthFactor = 0.6; - var estimatedWidth = text.Length * fontSize * GlyphWidthFactor; - if (availableWidth <= 0 || estimatedWidth <= availableWidth) - { - return string.Empty; - } - - return $""" textLength="{F(availableWidth * scale)}" lengthAdjust="spacingAndGlyphs" """.TrimEnd(); - } - - /// - /// Renders the compartments of a below the title area as SVG - /// <line> dividers and <text> elements. - /// - /// String builder receiving the SVG markup. - /// Box whose compartments are rendered. - /// Visual theme providing font sizes, padding, and stroke settings. - /// Uniform scale factor. - private static void RenderBoxCompartments(StringBuilder sb, LayoutBox box, Theme theme, double scale) - { - // Compartments start below the title area (keyword + label), computed via shared metrics - var labelAreaHeight = BoxMetrics.TitleAreaHeight(theme, box.Label != null, box.Keyword != null); - var compartmentY = box.Y + labelAreaHeight; - - foreach (var compartment in box.Compartments) - { - // Full-width horizontal divider at the top of this compartment - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - - // Draw optional bold compartment title - if (compartment.Title != null) - { - var titleX = (box.X + theme.LabelPadding) * scale; - var titleY = (compartmentY + theme.LabelPadding + theme.FontSizeBody / 2.0) * scale; - sb.Append(CultureInfo.InvariantCulture, - $""" {EscapeXml(compartment.Title)}"""); - sb.AppendLine(); - compartmentY += theme.LabelPadding + theme.FontSizeBody + theme.LabelPadding; - } - - // Draw each body row with body font size and left-aligned indent - foreach (var row in compartment.Rows) - { - var rowX = (box.X + theme.LabelPadding) * scale; - var rowY = (compartmentY + theme.LabelPadding + theme.FontSizeBody / 2.0) * scale; - sb.Append(CultureInfo.InvariantCulture, - $""" {EscapeXml(row)}"""); - sb.AppendLine(); - compartmentY += theme.LabelPadding + theme.FontSizeBody; - } - - // Bottom gap so the last row clears the next compartment divider. - compartmentY += theme.LabelPadding; - } - } - - /// - /// Renders a as an SVG <path> element with - /// arc-at-bend corner rounding, optional arrowhead marker references, optional dashing, - /// and an optional midpoint label. - /// - /// - /// When is zero, each interior waypoint is - /// connected with a plain L command. When the radius is positive, each interior - /// waypoint is replaced with a shortened incoming L command and an A - /// (arc) command whose sweep direction is derived from the cross product of the incoming - /// and outgoing direction vectors. - /// - /// String builder receiving the SVG markup. - /// The line node to render. - /// Visual theme providing stroke color and width. - /// Uniform scale factor. - private static void RenderLine(StringBuilder sb, LayoutLine line, Theme theme, double scale) - { - // Lines with fewer than 2 waypoints cannot be drawn - if (line.Waypoints.Count < 2) - { - return; - } - - // Build SVG path data with optional arc-at-bend corner rounding. The final corner before each - // end is clamped so the rounded arc completes at least the marker's along-line length before - // the endpoint, keeping the decoration on a clean straight approach. - var pathData = BuildLinePath( - line.Waypoints, theme.LineCornerRadius, scale, line.SourceEnd, line.TargetEnd); - - // Resolve line-end marker attribute strings - var markerStart = line.SourceEnd switch - { - EndMarkerStyle.OpenChevron => " marker-start=\"url(#line-end-open-chevron)\"", - EndMarkerStyle.HollowTriangle => " marker-start=\"url(#line-end-hollow-triangle)\"", - EndMarkerStyle.HollowTriangleCrossbar => " marker-start=\"url(#line-end-hollow-triangle-crossbar)\"", - EndMarkerStyle.FilledArrow => " marker-start=\"url(#line-end-filled-arrow)\"", - EndMarkerStyle.HollowDiamond => " marker-start=\"url(#line-end-hollow-diamond)\"", - EndMarkerStyle.FilledDiamond => " marker-start=\"url(#line-end-filled-diamond)\"", - EndMarkerStyle.Circle => " marker-start=\"url(#line-end-circle)\"", - EndMarkerStyle.Bar => " marker-start=\"url(#line-end-bar)\"", - _ => string.Empty - }; - var markerEnd = line.TargetEnd switch - { - EndMarkerStyle.OpenChevron => " marker-end=\"url(#line-end-open-chevron)\"", - EndMarkerStyle.HollowTriangle => " marker-end=\"url(#line-end-hollow-triangle)\"", - EndMarkerStyle.HollowTriangleCrossbar => " marker-end=\"url(#line-end-hollow-triangle-crossbar)\"", - EndMarkerStyle.FilledArrow => " marker-end=\"url(#line-end-filled-arrow)\"", - EndMarkerStyle.HollowDiamond => " marker-end=\"url(#line-end-hollow-diamond)\"", - EndMarkerStyle.FilledDiamond => " marker-end=\"url(#line-end-filled-diamond)\"", - EndMarkerStyle.Circle => " marker-end=\"url(#line-end-circle)\"", - EndMarkerStyle.Bar => " marker-end=\"url(#line-end-bar)\"", - _ => string.Empty - }; - - // Determine stroke dash pattern for non-solid lines - var dashArray = line.LineStyle switch - { - LineStyle.Dashed => " stroke-dasharray=\"6 3\"", - LineStyle.Dotted => " stroke-dasharray=\"2 2\"", - _ => string.Empty - }; - - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - - // Note: the midpoint label is intentionally NOT drawn here. It is drawn in a final pass - // (see RenderLineLabel) so that no later wire can draw over an earlier wire's label. - } - - /// - /// Renders a line's optional midpoint label as a centered text element with an auto-sizing white - /// background (via the label-bg filter). Called in a final pass after all wires and boxes - /// are drawn so labels are never drawn over by another wire. - /// - /// String builder receiving the SVG markup. - /// The line whose label is rendered. - /// Visual theme providing font and color settings. - /// Uniform scale factor. - /// Pre-computed label centre X in logical pixels. - /// Pre-computed label centre Y in logical pixels. - private static void RenderLineLabel(StringBuilder sb, LayoutLine line, Theme theme, double scale, double midX, double midY) - { - if (line.MidpointLabel is null) - { - return; - } - - sb.Append(CultureInfo.InvariantCulture, - $""" {EscapeXml(line.MidpointLabel)}"""); - sb.AppendLine(); - } - - /// Recursively collects all nodes from a node tree. - /// Top-level nodes to walk. - /// Every line node, including those nested inside boxes or bands. - private static IEnumerable CollectLines(IReadOnlyList nodes) - { - foreach (var node in nodes) - { - switch (node) - { - case LayoutLine line: - yield return line; - break; - - case LayoutBox box: - foreach (var inner in CollectLines(box.Children)) - { - yield return inner; - } - - break; - - case LayoutBand band: - foreach (var inner in CollectLines(band.Children)) - { - yield return inner; - } - - break; - - default: - break; - } - } - } - - /// - /// Builds the SVG path d attribute string for a polyline, applying arc-at-bend - /// corner rounding for each interior waypoint when is - /// greater than zero. - /// - /// - /// For each interior waypoint the incoming segment is shortened by - /// and an SVG arc (A command) bridges the gap. - /// The arc sweep direction is determined by the cross product of the incoming and outgoing - /// direction vectors: positive cross product (clockwise turn in SVG screen space) uses - /// sweep-flag 1; negative uses sweep-flag 0. The radius is clamped to half the shorter - /// adjacent segment so the arc never overshoots. - /// - /// Ordered waypoints; must contain at least 2 entries. - /// Corner rounding radius in logical pixels; 0 disables arcs. - /// Uniform scale factor. - /// End-marker style at the first waypoint (source endpoint). - /// End-marker style at the last waypoint (target endpoint). - /// SVG path data string starting with M. - private static string BuildLinePath( - IReadOnlyList waypoints, - double cornerRadius, - double scale, - EndMarkerStyle sourceEnd, - EndMarkerStyle targetEnd) - { - var sb = new StringBuilder(); - var first = waypoints[0]; - sb.Append(CultureInfo.InvariantCulture, $"M {F(first.X * scale)} {F(first.Y * scale)}"); - - if (cornerRadius <= 0) - { - // No corner rounding: plain M/L path - for (var i = 1; i < waypoints.Count; i++) - { - var wp = waypoints[i]; - sb.Append(CultureInfo.InvariantCulture, $" L {F(wp.X * scale)} {F(wp.Y * scale)}"); - } - - return sb.ToString(); - } - - // Arc-at-bends: replace each interior waypoint with a shortened L + arc A command - for (var i = 1; i < waypoints.Count; i++) - { - var cur = waypoints[i]; - - var isInterior = i < waypoints.Count - 1; - if (!isInterior) - { - // Last waypoint: plain line to the endpoint - sb.Append(CultureInfo.InvariantCulture, $" L {F(cur.X * scale)} {F(cur.Y * scale)}"); - continue; - } - - var prev = waypoints[i - 1]; - var next = waypoints[i + 1]; - - // Incoming direction from prev to cur - var inDx = cur.X - prev.X; - var inDy = cur.Y - prev.Y; - var inLen = Math.Sqrt(inDx * inDx + inDy * inDy); - - // Outgoing direction from cur to next - var outDx = next.X - cur.X; - var outDy = next.Y - cur.Y; - var outLen = Math.Sqrt(outDx * outDx + outDy * outDy); - - if (inLen < 0.001 || outLen < 0.001) - { - // Degenerate segment: fall back to a plain line command - sb.Append(CultureInfo.InvariantCulture, $" L {F(cur.X * scale)} {F(cur.Y * scale)}"); - continue; - } - - // Normalize both direction vectors - var inNx = inDx / inLen; - var inNy = inDy / inLen; - var outNx = outDx / outLen; - var outNy = outDy / outLen; - - // Clamp radius so the arc never overshoots either adjacent segment - var r = Math.Min(cornerRadius, Math.Min(inLen / 2.0, outLen / 2.0)); - - // Decoration-aware final-corner clamp: keep the rounded corner from intruding into an - // end-marker decoration. The first interior corner must leave at least the source marker's - // along-line length of straight run after the source endpoint; the last interior corner - // must leave at least the target marker's along-line length of straight run before the - // target endpoint. For forward edges (whose approaches are already long) this is a no-op. - if (i == 1) - { - r = Math.Min(r, inLen - NotationMetrics.AlongLineLength(sourceEnd)); - } - - if (i == waypoints.Count - 2) - { - r = Math.Min(r, outLen - NotationMetrics.AlongLineLength(targetEnd)); - } - - if (r <= 0.0) - { - // The decoration consumes the whole approach: fall back to a plain line (no arc). - sb.Append(CultureInfo.InvariantCulture, $" L {F(cur.X * scale)} {F(cur.Y * scale)}"); - continue; - } - - // Endpoint of the shortened incoming segment (just before the corner) - var shortEndX = cur.X - inNx * r; - var shortEndY = cur.Y - inNy * r; - - // Start of the outgoing segment after the arc (just past the corner) - var shortStartX = cur.X + outNx * r; - var shortStartY = cur.Y + outNy * r; - - // Cross product z-component determines clockwise vs counter-clockwise arc in SVG - // (positive cross = clockwise screen turn = sweep-flag 1) - var cross = inNx * outNy - inNy * outNx; - var sweep = cross > 0 ? 1 : 0; - - sb.Append(CultureInfo.InvariantCulture, - $" L {F(shortEndX * scale)} {F(shortEndY * scale)}"); - sb.Append(CultureInfo.InvariantCulture, - $" A {F(r * scale)} {F(r * scale)} 0 0 {sweep} {F(shortStartX * scale)} {F(shortStartY * scale)}"); - } - - return sb.ToString(); - } - - /// - /// Renders a as an SVG <text> element with - /// text-anchor derived from . - /// - /// String builder receiving the SVG markup. - /// The label node to render. - /// Visual theme providing font and color settings. - /// Uniform scale factor. - private static void RenderLabel(StringBuilder sb, LayoutLabel label, Theme theme, double scale) - { - var x = label.X * scale; - var y = label.Y * scale; - var anchor = label.Align switch - { - TextAlign.Center => TextAnchorMiddle, - TextAlign.Right => "end", - _ => "start" - }; - var fontWeight = label.Weight == FontWeight.Bold ? "bold" : "normal"; - var fontStyle = label.Style == FontStyle.Italic ? "italic" : "normal"; - - // Only constrain width when the text would overflow MaxWidth (no stretching of short text). - var textLengthAttr = FitTextLength(label.Text, label.FontSize, label.MaxWidth, scale); - - sb.Append(CultureInfo.InvariantCulture, - $""" {EscapeXml(label.Text)}"""); - sb.AppendLine(); - } - - /// - /// Renders a as a filled 8×8 <rect> centered at - /// the port position, with an optional <text> label offset away from the - /// attached edge. - /// - /// String builder receiving the SVG markup. - /// The port node to render. - /// Visual theme providing stroke color and font settings. - /// Uniform scale factor. - private static void RenderPort(StringBuilder sb, LayoutPort port, Theme theme, double scale) - { - // Port square: filled with the stroke color, sized from NotationMetrics. - var rx = (port.CentreX - NotationMetrics.PortHalfSize) * scale; - var ry = (port.CentreY - NotationMetrics.PortHalfSize) * scale; - var rs = NotationMetrics.PortSize * scale; - - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - - // Optional label offset away from the attached edge - if (port.Label != null) - { - var offset = NotationMetrics.PortHalfSize + theme.LabelPadding; - var (labelX, labelY, anchor) = port.Side switch - { - PortSide.Top => (port.CentreX, port.CentreY - offset, TextAnchorMiddle), - PortSide.Bottom => (port.CentreX, port.CentreY + offset + theme.FontSizeBody, TextAnchorMiddle), - PortSide.Left => (port.CentreX - offset, port.CentreY + theme.FontSizeBody / 2.0, "end"), - _ => (port.CentreX + offset, port.CentreY + theme.FontSizeBody / 2.0, "start") - }; - - sb.Append(CultureInfo.InvariantCulture, - $""" {EscapeXml(port.Label)}"""); - sb.AppendLine(); - } - } - - /// - /// Renders a as shape-specific SVG elements centered at the - /// badge position, with an optional <text> label to the right. - /// - /// String builder receiving the SVG markup. - /// The badge node to render. - /// Visual theme providing stroke color, width, and font settings. - /// Uniform scale factor. - private static void RenderBadge(StringBuilder sb, LayoutBadge badge, Theme theme, double scale) - { - var cx = badge.CentreX * scale; - var cy = badge.CentreY * scale; - var r = badge.Size / 2.0 * scale; - var sw = F(theme.StrokeWidth); - - // Draw the badge shape centered at (cx, cy) within bounding radius r - switch (badge.Shape) - { - case BadgeShape.FilledCircle: - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - break; - - case BadgeShape.Bullseye: - // Outer filled circle + white inner circle for the ring effect - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - break; - - case BadgeShape.Diamond: - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - break; - - case BadgeShape.HorizontalBar: - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - break; - - case BadgeShape.VerticalBar: - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - break; - - default: - // Unknown badge shapes are skipped for forward compatibility - break; - } - - // Optional label to the right of the bounding circle - if (badge.Label != null) - { - var labelX = (badge.CentreX + badge.Size / 2.0 + theme.LabelPadding) * scale; - var labelY = (badge.CentreY + theme.FontSizeBody / 2.0) * scale; - sb.Append(CultureInfo.InvariantCulture, - $""" {EscapeXml(badge.Label)}"""); - sb.AppendLine(); - } - } - - /// - /// Renders a as a <rect> with a depth-0 fill, - /// an optional label (rotated for Horizontal orientation, horizontal for Vertical), - /// then recursively renders its children. - /// - /// String builder receiving the SVG markup. - /// The band node to render. - /// Visual theme providing fill colors, stroke, and font settings. - /// Uniform scale factor. - private static void RenderBand(StringBuilder sb, LayoutBand band, Theme theme, double scale) - { - var x = band.X * scale; - var y = band.Y * scale; - var w = band.Width * scale; - var h = band.Height * scale; - var fillColor = theme.DepthFillColors[0]; - - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - - // Draw the optional label; Horizontal → rotated 90° CCW on left edge, Vertical → top - if (band.Label != null) - { - if (band.Orientation == BandOrientation.Horizontal) - { - // Label center on the left edge strip, rotated 90° CCW - var labelCx = (band.X + theme.LabelPadding + theme.FontSizeBody / 2.0) * scale; - var labelCy = (band.Y + band.Height / 2.0) * scale; - sb.Append(CultureInfo.InvariantCulture, - $""" {EscapeXml(band.Label)}"""); - sb.AppendLine(); - } - else - { - // Horizontal label at the top of the band - var textX = (band.X + band.Width / 2.0) * scale; - var textY = (band.Y + theme.LabelPadding + theme.FontSizeBody / 2.0) * scale; - sb.Append(CultureInfo.InvariantCulture, - $""" {EscapeXml(band.Label)}"""); - sb.AppendLine(); - } - } - - // Render children recursively - foreach (var child in band.Children) - { - RenderNode(sb, child, theme, scale); - } - } - - /// - /// Renders a as a header <rect> with a - /// centered label, followed by a dashed <line> stem running from the - /// bottom of the header to . - /// - /// String builder receiving the SVG markup. - /// The lifeline node to render. - /// Visual theme providing colors, font, and stroke settings. - /// Uniform scale factor. - private static void RenderLifeline(StringBuilder sb, LayoutLifeline lifeline, Theme theme, double scale) - { - // Header box: centered at CentreX, top edge at TopY - var headerLeft = lifeline.CentreX - lifeline.HeaderWidth / 2.0; - var hx = headerLeft * scale; - var hy = lifeline.TopY * scale; - var hw = lifeline.HeaderWidth * scale; - var hh = lifeline.HeaderHeight * scale; - var fillColor = theme.DepthFillColors[0]; - - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - - // Centered label within the header box - var textX = lifeline.CentreX * scale; - var textY = (lifeline.TopY + lifeline.HeaderHeight / 2.0) * scale; - sb.Append(CultureInfo.InvariantCulture, - $""" {EscapeXml(lifeline.Label)}"""); - sb.AppendLine(); - - // Dashed vertical stem from the bottom of the header to BottomY - var stemX = lifeline.CentreX * scale; - var stemTopY = (lifeline.TopY + lifeline.HeaderHeight) * scale; - var stemBottomY = lifeline.BottomY * scale; - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - } - - /// - /// Renders a as a narrow white-filled - /// <rect> with a stroke border, centered at - /// . - /// - /// - /// The bar width is Theme.LabelPadding * 2 so it scales proportionally with - /// the diagram's text padding. - /// - /// String builder receiving the SVG markup. - /// The activation node to render. - /// Visual theme providing stroke settings and padding. - /// Uniform scale factor. - private static void RenderActivation(StringBuilder sb, LayoutActivation activation, Theme theme, double scale) - { - // Bar width = LabelPadding * 2, centered at CentreX - var halfWidth = theme.LabelPadding; - var ax = (activation.CentreX - halfWidth) * scale; - var ay = activation.TopY * scale; - var aw = halfWidth * 2.0 * scale; - var ah = (activation.BottomY - activation.TopY) * scale; - - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - } - - /// - /// Renders a as a bordered table. Header rows are filled with - /// the depth-1 theme color; body rows use the depth-0 color. Each cell contains a - /// <text> element aligned per . - /// - /// String builder receiving the SVG markup. - /// The grid node to render. - /// Visual theme providing fill colors, stroke, and font settings. - /// Uniform scale factor. - private static void RenderGrid(StringBuilder sb, LayoutGrid grid, Theme theme, double scale) - { - // Header rows use depth-1 color; body rows use depth-0 color - var headerFill = theme.DepthFillColors[1 % theme.DepthFillColors.Count]; - var bodyFill = theme.DepthFillColors[0]; - - var currentY = grid.Y; - foreach (var row in grid.Rows) - { - // Row height = maximum cell height in this row - var rowHeight = 0.0; - foreach (var cell in row.Cells) - { - rowHeight = Math.Max(rowHeight, cell.Height); - } - - var fillColor = row.IsHeader ? headerFill : bodyFill; - var currentX = grid.X; - - foreach (var cell in row.Cells) - { - var cx = currentX * scale; - var cy = currentY * scale; - var cw = cell.Width * scale; - var ch = rowHeight * scale; - - // Cell background and border - sb.Append(CultureInfo.InvariantCulture, - $""" """); - sb.AppendLine(); - - // Cell text properties are computed in a helper to stay within complexity limits - var (anchor, textX, fontWeightAttr) = GetCellTextProperties(cell, currentX, theme, row.IsHeader); - var textY = currentY + rowHeight / 2.0; - - sb.Append(CultureInfo.InvariantCulture, - $""" {EscapeXml(cell.Text)}"""); - sb.AppendLine(); - - currentX += cell.Width; - } - - currentY += rowHeight; - } - } - - /// - /// Computes the SVG text-anchor, horizontal text position, and font-weight attribute for a - /// single grid cell. Extracted from to reduce its cognitive complexity. - /// - /// The grid cell whose alignment drives the computed values. - /// Logical X origin of the cell within the grid. - /// Visual theme providing label padding. - /// - /// when the cell belongs to a header row; controls font weight. - /// - /// - /// A tuple of (Anchor, TextX, FontWeightAttr) ready for SVG output. - /// - private static (string Anchor, double TextX, string FontWeightAttr) GetCellTextProperties( - LayoutGridCell cell, - double cellLeft, - Theme theme, - bool isHeader) - { - var anchor = cell.Align switch - { - TextAlign.Center => TextAnchorMiddle, - TextAlign.Right => "end", - _ => "start" - }; - var textX = cell.Align switch - { - TextAlign.Center => cellLeft + cell.Width / 2.0, - TextAlign.Right => cellLeft + cell.Width - theme.LabelPadding, - _ => cellLeft + theme.LabelPadding - }; - var fontWeightAttr = isHeader ? " font-weight=\"bold\"" : string.Empty; - return (anchor, textX, fontWeightAttr); - } - - /// - /// Formats a double to two decimal places using invariant culture. - /// - /// Value to format. - /// String representation with exactly two decimal digits. - private static string F(double value) => - value.ToString("F2", CultureInfo.InvariantCulture); - - /// - /// Escapes XML special characters in a string for safe embedding in SVG text content. - /// - /// Raw text to escape. - /// XML-safe text with <, >, and & replaced by - /// their entity equivalents. - private static string EscapeXml(string text) => - text.Replace("&", "&", StringComparison.Ordinal) - .Replace("<", "<", StringComparison.Ordinal) - .Replace(">", ">", StringComparison.Ordinal); -} - diff --git a/src/DemaConsulting.SysML2Tools.Tool/DemaConsulting.SysML2Tools.Tool.csproj b/src/DemaConsulting.SysML2Tools.Tool/DemaConsulting.SysML2Tools.Tool.csproj index 7a242028..0c322057 100644 --- a/src/DemaConsulting.SysML2Tools.Tool/DemaConsulting.SysML2Tools.Tool.csproj +++ b/src/DemaConsulting.SysML2Tools.Tool/DemaConsulting.SysML2Tools.Tool.csproj @@ -86,8 +86,12 @@ - - + + + + + + diff --git a/src/DemaConsulting.SysML2Tools.Tool/Render/RenderCommand.cs b/src/DemaConsulting.SysML2Tools.Tool/Render/RenderCommand.cs index 14784363..2d1930ea 100644 --- a/src/DemaConsulting.SysML2Tools.Tool/Render/RenderCommand.cs +++ b/src/DemaConsulting.SysML2Tools.Tool/Render/RenderCommand.cs @@ -2,13 +2,14 @@ // Copyright (c) DemaConsulting. All rights reserved. // +using DemaConsulting.Rendering.Abstractions; +using DemaConsulting.Rendering.Skia; +using DemaConsulting.Rendering.Svg; using DemaConsulting.SysML2Tools.Cli; using DemaConsulting.SysML2Tools.Parser; -using DemaConsulting.SysML2Tools.Png; using DemaConsulting.SysML2Tools.Rendering; using DemaConsulting.SysML2Tools.Semantic; using DemaConsulting.SysML2Tools.Stdlib; -using DemaConsulting.SysML2Tools.Svg; namespace DemaConsulting.SysML2Tools.Render; diff --git a/src/DemaConsulting.SysML2Tools.Tool/SelfTest/Validation.cs b/src/DemaConsulting.SysML2Tools.Tool/SelfTest/Validation.cs index 14bcf2f9..ddc0907a 100644 --- a/src/DemaConsulting.SysML2Tools.Tool/SelfTest/Validation.cs +++ b/src/DemaConsulting.SysML2Tools.Tool/SelfTest/Validation.cs @@ -19,12 +19,14 @@ // SOFTWARE. using System.Runtime.InteropServices; + +using DemaConsulting.Rendering.Abstractions; +using DemaConsulting.Rendering.Skia; +using DemaConsulting.Rendering.Svg; using DemaConsulting.SysML2Tools.Cli; using DemaConsulting.SysML2Tools.Parser; -using DemaConsulting.SysML2Tools.Png; using DemaConsulting.SysML2Tools.Rendering; using DemaConsulting.SysML2Tools.Semantic; -using DemaConsulting.SysML2Tools.Svg; using DemaConsulting.SysML2Tools.Utilities; using DemaConsulting.TestResults.IO; diff --git a/test/DemaConsulting.SysML2Tools.Png.Tests/DemaConsulting.SysML2Tools.Png.Tests.csproj b/test/DemaConsulting.SysML2Tools.Png.Tests/DemaConsulting.SysML2Tools.Png.Tests.csproj deleted file mode 100644 index b1b2a921..00000000 --- a/test/DemaConsulting.SysML2Tools.Png.Tests/DemaConsulting.SysML2Tools.Png.Tests.csproj +++ /dev/null @@ -1,66 +0,0 @@ - - - - - Exe - net8.0;net9.0;net10.0 - latest - enable - enable - - false - true - true - - - true - true - true - latest - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - - - - diff --git a/test/DemaConsulting.SysML2Tools.Png.Tests/PngEndMarkerTests.cs b/test/DemaConsulting.SysML2Tools.Png.Tests/PngEndMarkerTests.cs deleted file mode 100644 index 81dbf178..00000000 --- a/test/DemaConsulting.SysML2Tools.Png.Tests/PngEndMarkerTests.cs +++ /dev/null @@ -1,165 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Layout; -using DemaConsulting.SysML2Tools.Png; -using DemaConsulting.SysML2Tools.Rendering; -using SkiaSharp; - -namespace DemaConsulting.SysML2Tools.Png.Tests; - -/// -/// Tests for PNG line-end (connector decoration) markers. These confirm that the open chevron -/// is drawn OPEN (two strokes, no closing base edge), and that the PNG marker geometry matches -/// the shared source used by the SVG renderer (along-line overshoot -/// and across-line width), so SVG and PNG produce identical end-marker geometry. -/// -public sealed class PngEndMarkerTests -{ - private static SKBitmap RenderToBitmap(LayoutTree layout, RenderOptions options) - { - var renderer = new PngRenderer(); - using var ms = new MemoryStream(); - renderer.Render(layout, options, ms); - ms.Position = 0; - using var data = SKData.Create(ms); - return SKBitmap.Decode(data); - } - - /// A pixel is "ink" when it is noticeably darker than the white background. - private static bool IsInk(SKColor c) => c.Alpha > 32 && (c.Red + c.Green + c.Blue) < 600; - - /// Counts ink pixels within the given inclusive pixel rectangle. - private static int CountInk(SKBitmap bmp, int x0, int y0, int x1, int y1) - { - var count = 0; - for (var y = y0; y <= y1; y++) - { - for (var x = x0; x <= x1; x++) - { - if (IsInk(bmp.GetPixel(x, y))) - { - count++; - } - } - } - - return count; - } - - private static LayoutTree HorizontalLineTo(EndMarkerStyle target) - { - // Horizontal line from (10,50) to (150,50); marker is drawn at the (150,50) endpoint. - var line = new LayoutLine( - [new Point2D(10, 50), new Point2D(150, 50)], - EndMarkerStyle.None, - target, - LineStyle.Solid, - null); - return new LayoutTree(200, 100, [line]); - } - - /// - /// The open chevron is drawn OPEN: it has strictly fewer ink pixels in the marker zone than - /// the closed hollow triangle (which adds the closing base edge). - /// - [Fact] - public void OpenChevron_HasFewerInkPixelsThanClosedTriangle() - { - var options = new RenderOptions(Themes.Light); - using var chevron = RenderToBitmap(HorizontalLineTo(EndMarkerStyle.OpenChevron), options); - using var triangle = RenderToBitmap(HorizontalLineTo(EndMarkerStyle.HollowTriangle), options); - - // Marker zone: the back edge of the triangle marker sits near x=141 (refX 9 back from the - // x=150 endpoint). Count ink strictly behind the shaft join so the base edge is isolated. - var chevronInk = CountInk(chevron, 138, 42, 144, 58); - var triangleInk = CountInk(triangle, 138, 42, 144, 58); - - Assert.True( - chevronInk < triangleInk, - $"Expected open chevron ({chevronInk}) to have fewer base-edge ink pixels than closed triangle ({triangleInk})."); - } - - /// - /// The PNG filled-arrow spans along the line — - /// from the base (at behind the endpoint) to the apex - /// (overshooting the endpoint) — matching the SVG marker box length. Measured from the widest - /// (base) column to the furthest ink column. - /// - [Fact] - public void FilledArrow_AlongLength_MatchesNotationMetrics() - { - var options = new RenderOptions(Themes.Light); - using var bmp = RenderToBitmap(HorizontalLineTo(EndMarkerStyle.FilledArrow), options); - - // For each column near the endpoint, measure the vertical ink extent. The base column has the - // greatest extent (full marker width); the tip is the furthest column carrying marker ink. - var baseX = -1; - var baseExtent = 0; - var tipX = -1; - for (var x = 135; x <= 155; x++) - { - var minY = int.MaxValue; - var maxY = int.MinValue; - for (var y = 43; y <= 57; y++) - { - if (IsInk(bmp.GetPixel(x, y))) - { - minY = Math.Min(minY, y); - maxY = Math.Max(maxY, y); - } - } - - if (maxY < minY) - { - continue; - } - - var extent = maxY - minY + 1; - if (extent > baseExtent) - { - baseExtent = extent; - baseX = x; - } - - tipX = x; // furthest column with any ink - } - - Assert.True(baseX >= 0, "Expected to locate the marker base column."); - var alongLength = tipX - baseX; - - // Allow +/-2 px for anti-aliasing around the canonical 10-unit along length. - Assert.InRange(alongLength, NotationMetrics.EndMarkerLength - 2, NotationMetrics.EndMarkerLength + 2); - } - - /// - /// The PNG arrow base spans the shared across the - /// line, matching the SVG marker height. Measured at the marker base column. - /// - [Fact] - public void FilledArrow_BaseWidth_MatchesNotationMetrics() - { - var options = new RenderOptions(Themes.Light); - using var bmp = RenderToBitmap(HorizontalLineTo(EndMarkerStyle.FilledArrow), options); - - // Base column: refX (9) back from the x=150 endpoint => x≈141. - var baseX = (int)Math.Round(150 - NotationMetrics.EndMarkerRefX); - var minY = int.MaxValue; - var maxY = int.MinValue; - for (var y = 40; y <= 60; y++) - { - if (IsInk(bmp.GetPixel(baseX, y))) - { - minY = Math.Min(minY, y); - maxY = Math.Max(maxY, y); - } - } - - Assert.True(maxY >= minY, "Expected ink at the marker base column."); - var measuredWidth = maxY - minY + 1; - - // Allow +/-2 px for anti-aliasing around the canonical 7-unit width. - Assert.InRange(measuredWidth, NotationMetrics.EndMarkerWidth - 2, NotationMetrics.EndMarkerWidth + 2); - } -} diff --git a/test/DemaConsulting.SysML2Tools.Png.Tests/PngRendererTests.cs b/test/DemaConsulting.SysML2Tools.Png.Tests/PngRendererTests.cs deleted file mode 100644 index ffd8ff25..00000000 --- a/test/DemaConsulting.SysML2Tools.Png.Tests/PngRendererTests.cs +++ /dev/null @@ -1,416 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Layout; -using DemaConsulting.SysML2Tools.Png; -using DemaConsulting.SysML2Tools.Rendering; -using SkiaSharp; - -namespace DemaConsulting.SysML2Tools.Png.Tests; - -/// -/// Tests for the PNG renderer. -/// -public sealed class PngRendererTests -{ - /// - /// Helper: renders a to a decoded so - /// pixel values can be inspected in tests. - /// - /// Layout tree to render. - /// Render options providing theme and scale. - /// Decoded bitmap. Caller is responsible for disposing. - private static SKBitmap RenderToBitmap(LayoutTree layout, RenderOptions options) - { - var renderer = new PngRenderer(); - using var ms = new MemoryStream(); - renderer.Render(layout, options, ms); - ms.Position = 0; - using var data = SKData.Create(ms); - return SKBitmap.Decode(data); - } - - /// - /// Helper: parses a CSS hex color string such as #RRGGBB or #RRGGBBAA - /// using SkiaSharp. - /// - /// Hex color string to parse. - /// Parsed . - private static SKColor ParseHex(string hex) => SKColor.Parse(hex); - - /// - /// Helper: returns true when each RGB channel of is within - /// of the corresponding channel of . - /// A tolerance of 2 is sufficient to absorb sub-pixel anti-aliasing at well-interior pixels. - /// - /// Expected color. - /// Actual sampled color. - /// Maximum allowed difference per channel (0–255). - /// when all channels are within tolerance. - private static bool ColorNear(SKColor expected, SKColor actual, int tolerance = 2) => - Math.Abs(expected.Red - actual.Red) <= tolerance && - Math.Abs(expected.Green - actual.Green) <= tolerance && - Math.Abs(expected.Blue - actual.Blue) <= tolerance; - - /// - /// Render with an empty LayoutTree produces a non-empty output stream whose first - /// four bytes are the PNG signature bytes, confirming that a valid PNG is produced - /// for a minimal empty layout. - /// - [Fact] - public void PngRenderer_Render_EmptyTree_WritesPngSignature() - { - // Arrange: a renderer with a zero-size LayoutTree and default options - var renderer = new PngRenderer(); - var layout = new LayoutTree(0, 0, []); - var options = new RenderOptions(Themes.Light); - using var output = new MemoryStream(); - - // Act: render the empty tree - renderer.Render(layout, options, output); - - // Assert: PNG signature bytes 0x89 0x50 0x4E 0x47 are present at offset 0 - Assert.True(output.Length > 4); - output.Position = 0; - var header = new byte[4]; - _ = output.Read(header, 0, 4); - Assert.Equal(0x89, header[0]); - Assert.Equal(0x50, header[1]); - Assert.Equal(0x4E, header[2]); - Assert.Equal(0x47, header[3]); - } - - /// - /// Render with a LayoutTree containing one LayoutBox produces a non-empty output - /// stream, confirming that box rendering does not throw and produces valid PNG. - /// - [Fact] - public void PngRenderer_Render_SingleBox_ProducesNonEmptyOutput() - { - // Arrange: a renderer with a tree containing one LayoutBox - var renderer = new PngRenderer(); - var box = new LayoutBox(10, 10, 100, 50, "TestBox", 0, BoxShape.Rectangle, [], []); - var layout = new LayoutTree(200, 100, [box]); - var options = new RenderOptions(Themes.Light); - using var output = new MemoryStream(); - - // Act: render the tree with one box - renderer.Render(layout, options, output); - - // Assert: output is a non-empty PNG stream - Assert.True(output.Length > 4); - output.Position = 0; - var header = new byte[4]; - _ = output.Read(header, 0, 4); - Assert.Equal(0x89, header[0]); - Assert.Equal(0x50, header[1]); - } - - /// - /// Render a LayoutBox at depth 0 and sample a pixel at the box center. The pixel - /// color must match the depth-0 fill color from Themes.Light, confirming that - /// boxes are filled with the correct theme color. - /// - [Fact] - public void PngRenderer_Render_SingleBox_FillColorMatchesTheme() - { - // Arrange: box at (10,10) 100×60 depth 0; center pixel is at (60, 40) - var box = new LayoutBox(10, 10, 100, 60, null, 0, BoxShape.Rectangle, [], []); - var layout = new LayoutTree(200, 100, [box]); - var options = new RenderOptions(Themes.Light); - - // Act - using var bmp = RenderToBitmap(layout, options); - - // Assert: interior pixel matches depth-0 fill - var expected = ParseHex(Themes.Light.DepthFillColors[0]); - var actual = bmp.GetPixel(60, 40); - Assert.True(ColorNear(expected, actual), $"Expected {expected} ≈ {actual}"); - } - - /// - /// Render a LayoutBox at depth 1 and sample a pixel at the box center. The pixel - /// color must match the depth-1 fill color from Themes.Light, confirming that - /// depth-based fill colors are applied correctly. - /// - [Fact] - public void PngRenderer_Render_SingleBox_DepthOneUsesSecondColor() - { - // Arrange: box at (10,10) 100×60 depth 1; center pixel is at (60, 40) - var box = new LayoutBox(10, 10, 100, 60, null, 1, BoxShape.Rectangle, [], []); - var layout = new LayoutTree(200, 100, [box]); - var options = new RenderOptions(Themes.Light); - - // Act - using var bmp = RenderToBitmap(layout, options); - - // Assert: interior pixel matches depth-1 fill - var expected = ParseHex(Themes.Light.DepthFillColors[1]); - var actual = bmp.GetPixel(60, 40); - Assert.True(ColorNear(expected, actual), $"Expected {expected} ≈ {actual}"); - } - - /// - /// Render an empty LayoutTree and sample the pixel at (0, 0). The background fill - /// must be white, confirming the canvas is initialized to white before any drawing. - /// - [Fact] - public void PngRenderer_Render_BackgroundIsWhite() - { - // Arrange: empty tree at 100×100 - var layout = new LayoutTree(100, 100, []); - var options = new RenderOptions(Themes.Light); - - // Act - using var bmp = RenderToBitmap(layout, options); - - // Assert: top-left pixel is white - var actual = bmp.GetPixel(0, 0); - Assert.True(ColorNear(SKColors.White, actual), $"Expected white ≈ {actual}"); - } - - /// - /// Render a horizontal LayoutLine and sample a pixel on the line. The sampled pixel - /// color must approximate the theme stroke color, confirming that lines are drawn - /// with the correct stroke color. - /// - [Fact] - public void PngRenderer_Render_SingleLine_PixelOnLineIsStrokeColor() - { - // Arrange: horizontal line from (10,50) to (190,50) - var line = new LayoutLine( - [new Point2D(10, 50), new Point2D(190, 50)], - EndMarkerStyle.None, - EndMarkerStyle.None, - LineStyle.Solid, - null); - var layout = new LayoutTree(200, 100, [line]); - var options = new RenderOptions(Themes.Light); - - // Act - using var bmp = RenderToBitmap(layout, options); - - // Assert: pixel at the line midpoint is close to the stroke color - var strokeColor = ParseHex(Themes.Light.StrokeColor); - var actual = bmp.GetPixel(100, 50); - // Use a wider tolerance (80) for anti-aliased line pixels against white background - Assert.True(ColorNear(strokeColor, actual, tolerance: 80), $"Expected stroke {strokeColor} ≈ {actual}"); - } - - /// - /// Render a LayoutPort and sample a pixel at the port center. The pixel must - /// approximate the theme stroke color, confirming ports are rendered as filled squares. - /// - [Fact] - public void PngRenderer_Render_SinglePort_CenterPixelIsStrokeColor() - { - // Arrange: port at (50,50) right side; sample at center (50,50) - var port = new LayoutPort(50, 50, PortSide.Right, null); - var layout = new LayoutTree(200, 100, [port]); - var options = new RenderOptions(Themes.Light); - - // Act - using var bmp = RenderToBitmap(layout, options); - - // Assert: center pixel is close to the stroke color (port is a filled square) - var strokeColor = ParseHex(Themes.Light.StrokeColor); - var actual = bmp.GetPixel(50, 50); - Assert.True(ColorNear(strokeColor, actual, tolerance: 10), $"Expected stroke {strokeColor} ≈ {actual}"); - } - - /// - /// Render a LayoutActivation bar and sample a pixel in its interior. The pixel must - /// be white, confirming activation bars are filled with white (not the background color). - /// - [Fact] - public void PngRenderer_Render_SingleActivation_CenterPixelIsWhite() - { - // Arrange: activation at CentreX=100, TopY=20, BottomY=80; interior pixel at (100,50) - var activation = new LayoutActivation(100, 20, 80); - var layout = new LayoutTree(200, 100, [activation]); - var options = new RenderOptions(Themes.Light); - - // Act - using var bmp = RenderToBitmap(layout, options); - - // Assert: interior pixel is white - var actual = bmp.GetPixel(100, 50); - Assert.True(ColorNear(SKColors.White, actual), $"Expected white ≈ {actual}"); - } - - /// - /// Render a LayoutLifeline and sample the stem pixel. The pixel at the CentreX - /// midway down the stem must approximate the stroke color, confirming the stem is drawn. - /// - [Fact] - public void PngRenderer_Render_SingleLifeline_StemPixelIsStrokeColor() - { - // Arrange: lifeline at CentreX=100, TopY=10, BottomY=200; stem starts at y=50; sample at (100,125) - var lifeline = new LayoutLifeline(100, 10, 200, ":Actor", 80, 40); - var layout = new LayoutTree(300, 300, [lifeline]); - var options = new RenderOptions(Themes.Light); - - // Act - using var bmp = RenderToBitmap(layout, options); - - // Assert: a pixel on the dashed stem is close to the stroke color - // Note: dashed lines may have gaps, so use wider tolerance and try a few Y positions - var strokeColor = ParseHex(Themes.Light.StrokeColor); - var foundStroke = false; - for (var y = 55; y < 90; y += 3) - { - var actual = bmp.GetPixel(100, y); - if (ColorNear(strokeColor, actual, tolerance: 80)) - { - foundStroke = true; - break; - } - } - Assert.True(foundStroke, "Expected to find stroke-colored pixel on lifeline stem"); - } - - /// - /// Render a LayoutGrid with a header row and sample the header cell pixel. The pixel - /// must match the depth-1 fill color, confirming header rows use the secondary fill color. - /// - [Fact] - public void PngRenderer_Render_SingleGrid_HeaderFillMatchesTheme() - { - // Arrange: grid at (10,10) with a 100×30 header cell; center pixel at (60, 25) - var headerRow = new LayoutGridRow(true, [new LayoutGridCell(100, 30, "Name", TextAlign.Left, 1)]); - var grid = new LayoutGrid(10, 10, [headerRow]); - var layout = new LayoutTree(200, 100, [grid]); - var options = new RenderOptions(Themes.Light); - - // Act - using var bmp = RenderToBitmap(layout, options); - - // Assert: header cell interior pixel matches depth-1 fill - var expected = ParseHex(Themes.Light.DepthFillColors[1]); - var actual = bmp.GetPixel(60, 25); - Assert.True(ColorNear(expected, actual), $"Expected {expected} ≈ {actual}"); - } - - /// - /// Render a LayoutBadge with FilledCircle shape and sample the badge center pixel. - /// The pixel must approximate the theme stroke color, confirming that the filled-circle - /// badge is drawn with the stroke color as fill. - /// - [Fact] - public void PngRenderer_Render_SingleBadge_FilledCircle_CenterPixelIsStrokeColor() - { - // Arrange: filled-circle badge at (50,50) with size 20; center pixel at (50,50) - var badge = new LayoutBadge(50, 50, 20, BadgeShape.FilledCircle, null); - var layout = new LayoutTree(200, 100, [badge]); - var options = new RenderOptions(Themes.Light); - - // Act - using var bmp = RenderToBitmap(layout, options); - - // Assert: badge center is stroke-colored - var strokeColor = ParseHex(Themes.Light.StrokeColor); - var actual = bmp.GetPixel(50, 50); - Assert.True(ColorNear(strokeColor, actual, tolerance: 10), $"Expected stroke {strokeColor} ≈ {actual}"); - } - - /// - /// Render a LayoutLine with an OpenWithCrossbar target arrowhead produces a non-empty - /// output stream beginning with the PNG signature bytes, confirming that the - /// open-with-crossbar arrowhead style renders without error. - /// - [Fact] - public void PngRenderer_Render_DrawArrowhead_OpenWithCrossbar_ProducesNonEmptyOutput() - { - // Arrange: a line with OpenWithCrossbar arrowhead at the target - var renderer = new PngRenderer(); - var line = new LayoutLine( - [new Point2D(10, 50), new Point2D(190, 50)], - EndMarkerStyle.None, - EndMarkerStyle.HollowTriangleCrossbar, - LineStyle.Solid, - null); - var layout = new LayoutTree(200, 100, [line]); - var options = new RenderOptions(Themes.Light); - using var output = new MemoryStream(); - - // Act - renderer.Render(layout, options, output); - - // Assert: output is a non-empty PNG stream - Assert.True(output.Length > 4); - output.Position = 0; - var header = new byte[4]; - _ = output.Read(header, 0, 4); - Assert.Equal(0x89, header[0]); - Assert.Equal(0x50, header[1]); - Assert.Equal(0x4E, header[2]); - Assert.Equal(0x47, header[3]); - } - - /// - /// Render a tree whose labels contain XML-special characters (< > & " ') - /// completes without throwing and produces a valid PNG, confirming the raster path treats - /// label text as literal glyphs rather than markup. - /// - [Fact] - public void PngRenderer_Render_LabelWithXmlSpecialCharacters_ProducesValidPng() - { - // Arrange: a tree whose box label and standalone label both contain XML-special characters. - const string special = "A < B & C > D \" E ' F"; - var renderer = new PngRenderer(); - var box = new LayoutBox(10, 10, 200, 60, special, 0, BoxShape.Rectangle, [], []); - var label = new LayoutLabel(20, 40, 200, special, TextAlign.Left, FontWeight.Regular, FontStyle.Normal, 12.0); - var layout = new LayoutTree(300, 200, [box, label]); - var options = new RenderOptions(Themes.Light); - using var output = new MemoryStream(); - - // Act: render the tree — must not throw on the special characters. - renderer.Render(layout, options, output); - - // Assert: a valid, non-empty PNG was produced. - Assert.True(output.Length > 4); - output.Position = 0; - var header = new byte[4]; - _ = output.Read(header, 0, 4); - Assert.Equal(0x89, header[0]); - Assert.Equal(0x50, header[1]); - Assert.Equal(0x4E, header[2]); - Assert.Equal(0x47, header[3]); - } - - /// - /// Render a moderately deeply-nested box tree (50 nesting levels) completes without a - /// stack overflow and produces a valid PNG, confirming the recursive renderer is robust at - /// realistic nesting depths. - /// - [Fact] - public void PngRenderer_Render_DeeplyNestedBoxes_DoesNotStackOverflow() - { - // Arrange: a chain of 50 nested boxes built from the innermost leaf outward. - const int depth = 50; - var renderer = new PngRenderer(); - LayoutNode node = new LayoutBox(0, 0, 10, 10, "leaf", depth, BoxShape.Rectangle, [], []); - for (var d = depth - 1; d >= 0; d--) - { - node = new LayoutBox(0, 0, 10 + d, 10 + d, $"n{d}", d, BoxShape.Rectangle, [], [node]); - } - - var layout = new LayoutTree(200, 200, [node]); - var options = new RenderOptions(Themes.Light); - using var output = new MemoryStream(); - - // Act: render — the recursive descent must complete without overflowing the stack. - renderer.Render(layout, options, output); - - // Assert: a valid, non-empty PNG was produced. - Assert.True(output.Length > 4); - output.Position = 0; - var header = new byte[4]; - _ = output.Read(header, 0, 4); - Assert.Equal(0x89, header[0]); - Assert.Equal(0x50, header[1]); - Assert.Equal(0x4E, header[2]); - Assert.Equal(0x47, header[3]); - } -} diff --git a/test/DemaConsulting.SysML2Tools.Svg.Tests/DemaConsulting.SysML2Tools.Svg.Tests.csproj b/test/DemaConsulting.SysML2Tools.Svg.Tests/DemaConsulting.SysML2Tools.Svg.Tests.csproj deleted file mode 100644 index ec3c9a53..00000000 --- a/test/DemaConsulting.SysML2Tools.Svg.Tests/DemaConsulting.SysML2Tools.Svg.Tests.csproj +++ /dev/null @@ -1,64 +0,0 @@ - - - - - Exe - net8.0;net9.0;net10.0 - latest - enable - enable - - false - true - true - - - true - true - true - latest - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - - diff --git a/test/DemaConsulting.SysML2Tools.Svg.Tests/SvgEndMarkerTests.cs b/test/DemaConsulting.SysML2Tools.Svg.Tests/SvgEndMarkerTests.cs deleted file mode 100644 index 8f2f3f6e..00000000 --- a/test/DemaConsulting.SysML2Tools.Svg.Tests/SvgEndMarkerTests.cs +++ /dev/null @@ -1,115 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Layout; -using DemaConsulting.SysML2Tools.Rendering; -using DemaConsulting.SysML2Tools.Svg; - -namespace DemaConsulting.SysML2Tools.Svg.Tests; - -/// -/// Tests for the SVG line-end (connector decoration) markers: open chevron is drawn OPEN, the -/// closed shapes stay closed, and every marker dimension is derived from -/// (so SVG and PNG share one size source). -/// -public sealed class SvgEndMarkerTests -{ - private static string RenderLine(EndMarkerStyle source, EndMarkerStyle target) - { - var renderer = new SvgRenderer(); - var line = new LayoutLine( - [new Point2D(10, 10), new Point2D(90, 10)], - source, - target, - LineStyle.Solid, - null); - var layout = new LayoutTree(200, 100, [line]); - var options = new RenderOptions(Themes.Light); - using var output = new MemoryStream(); - renderer.Render(layout, options, output); - output.Position = 0; - return new StreamReader(output).ReadToEnd(); - } - - /// The open-chevron marker is defined as an OPEN <polyline>, not a closed polygon. - [Fact] - public void OpenChevron_IsDefinedAsPolyline() - { - var svg = RenderLine(EndMarkerStyle.None, EndMarkerStyle.OpenChevron); - - // The marker definition immediately following the open-chevron id must be a polyline (open), - // never a polygon (closed). - var markerIndex = svg.IndexOf("id=\"line-end-open-chevron\"", StringComparison.Ordinal); - Assert.True(markerIndex >= 0, "Expected the open-chevron marker definition to be present."); - - var markerEnd = svg.IndexOf("", markerIndex, StringComparison.Ordinal); - var markerBody = svg[markerIndex..markerEnd]; - Assert.Contains("The hollow-triangle marker stays a CLOSED <polygon>.

    B9Btn)Z?`CHNM{cMh;+ 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

  • - [Fact] - public void HollowTriangle_IsDefinedAsClosedPolygon() - { - var svg = RenderLine(EndMarkerStyle.None, EndMarkerStyle.HollowTriangle); - - var markerIndex = svg.IndexOf("id=\"line-end-hollow-triangle\"", StringComparison.Ordinal); - Assert.True(markerIndex >= 0, "Expected the hollow-triangle marker definition to be present."); - - var markerEnd = svg.IndexOf("", markerIndex, StringComparison.Ordinal); - var markerBody = svg[markerIndex..markerEnd]; - Assert.Contains(" - /// The triangle marker box dimensions are exactly the canonical - /// values (10 x 7, refX 9), proving the SVG markers derive from the single source. - ///
    - [Fact] - public void TriangleMarker_DimensionsDeriveFromNotationMetrics() - { - var svg = RenderLine(EndMarkerStyle.None, EndMarkerStyle.HollowTriangle); - - var expected = - $"markerWidth=\"{Num(NotationMetrics.EndMarkerLength)}\" " + - $"markerHeight=\"{Num(NotationMetrics.EndMarkerWidth)}\" " + - $"refX=\"{Num(NotationMetrics.EndMarkerRefX)}\" " + - $"refY=\"{Num(NotationMetrics.EndMarkerHalfWidth)}\""; - Assert.Contains(expected, svg, StringComparison.Ordinal); - - // The polygon points are the box mapping of the shared triangle vertices. - Assert.Contains("points=\"0 0, 10 3.5, 0 7\"", svg, StringComparison.Ordinal); - } - - /// - /// The diamond marker box dimensions are exactly the canonical - /// values (14 x 8, refX 13), and its points are the shared diamond vertices. - /// - [Fact] - public void DiamondMarker_DimensionsDeriveFromNotationMetrics() - { - var svg = RenderLine(EndMarkerStyle.None, EndMarkerStyle.HollowDiamond); - - var expected = - $"markerWidth=\"{Num(NotationMetrics.DiamondLength)}\" " + - $"markerHeight=\"{Num(NotationMetrics.DiamondWidth)}\" " + - $"refX=\"{Num(NotationMetrics.DiamondRefX)}\" " + - $"refY=\"{Num(NotationMetrics.DiamondHalfWidth)}\""; - Assert.Contains(expected, svg, StringComparison.Ordinal); - Assert.Contains("points=\"1 4, 7 0, 13 4, 7 8\"", svg, StringComparison.Ordinal); - } - - /// An open-chevron line references the open-chevron marker via marker-end. - [Fact] - public void OpenChevronLine_ReferencesOpenChevronMarker() - { - var svg = RenderLine(EndMarkerStyle.None, EndMarkerStyle.OpenChevron); - Assert.Contains("marker-end=\"url(#line-end-open-chevron)\"", svg, StringComparison.Ordinal); - } - - private static string Num(double value) => - Math.Round(value, 6).ToString(System.Globalization.CultureInfo.InvariantCulture); -} diff --git a/test/DemaConsulting.SysML2Tools.Svg.Tests/SvgRendererTests.cs b/test/DemaConsulting.SysML2Tools.Svg.Tests/SvgRendererTests.cs deleted file mode 100644 index 4765c16f..00000000 --- a/test/DemaConsulting.SysML2Tools.Svg.Tests/SvgRendererTests.cs +++ /dev/null @@ -1,559 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Layout; -using DemaConsulting.SysML2Tools.Rendering; -using DemaConsulting.SysML2Tools.Svg; - -namespace DemaConsulting.SysML2Tools.Svg.Tests; - -/// -/// Tests for the SVG renderer. -/// -public sealed class SvgRendererTests -{ - /// - /// Render with an empty LayoutTree produces a non-empty output stream whose content - /// contains the SVG root element, confirming basic SVG document generation. - /// - [Fact] - public void SvgRenderer_Render_EmptyTree_ProducesSvgDocument() - { - // Arrange: a renderer with an empty LayoutTree and default options - var renderer = new SvgRenderer(); - var layout = new LayoutTree(400, 300, []); - var options = new RenderOptions(Themes.Light); - using var output = new MemoryStream(); - - // Act: render the empty tree - renderer.Render(layout, options, output); - - // Assert: output is non-empty and contains the SVG root element - Assert.True(output.Length > 0); - output.Position = 0; - var svgText = new StreamReader(output).ReadToEnd(); - Assert.Contains("", svgText, StringComparison.Ordinal); - } - - /// - /// Render with a LayoutTree containing one LayoutBox produces SVG output that - /// contains a rect element, confirming that boxes are translated to SVG rectangles. - /// - [Fact] - public void SvgRenderer_Render_SingleBox_ProducesRectElement() - { - // Arrange: a renderer with a tree containing one LayoutBox - var renderer = new SvgRenderer(); - var box = new LayoutBox(10, 10, 100, 50, "MyBox", 0, BoxShape.Rectangle, [], []); - var layout = new LayoutTree(200, 100, [box]); - var options = new RenderOptions(Themes.Light); - using var output = new MemoryStream(); - - // Act: render the tree with one box - renderer.Render(layout, options, output); - - // Assert: output contains a rect element - output.Position = 0; - var svgText = new StreamReader(output).ReadToEnd(); - Assert.Contains(" - /// Render with a LayoutTree containing one LayoutLabel produces SVG output that - /// contains a text element, confirming that labels are translated to SVG text nodes. - /// - [Fact] - public void SvgRenderer_Render_SingleLabel_ProducesTextElement() - { - // Arrange: a renderer with a tree containing one LayoutLabel - var renderer = new SvgRenderer(); - var label = new LayoutLabel(50, 75, 200, "Hello World", TextAlign.Center, FontWeight.Regular, FontStyle.Normal, 12.0); - var layout = new LayoutTree(200, 100, [label]); - var options = new RenderOptions(Themes.Light); - using var output = new MemoryStream(); - - // Act: render the tree with one label - renderer.Render(layout, options, output); - - // Assert: output contains a text element - output.Position = 0; - var svgText = new StreamReader(output).ReadToEnd(); - Assert.Contains(" - /// Render with a LayoutTree containing one LayoutLine produces SVG output that - /// contains a path element, confirming that lines are translated to SVG paths. - /// - [Fact] - public void SvgRenderer_Render_SingleLine_ProducesPathElement() - { - // Arrange: a renderer with a tree containing one LayoutLine - var renderer = new SvgRenderer(); - var line = new LayoutLine( - [new Point2D(10, 10), new Point2D(90, 90)], - EndMarkerStyle.None, - EndMarkerStyle.HollowTriangle, - LineStyle.Solid, - null); - var layout = new LayoutTree(200, 100, [line]); - var options = new RenderOptions(Themes.Light); - using var output = new MemoryStream(); - - // Act: render the tree with one line - renderer.Render(layout, options, output); - - // Assert: output contains a path element - output.Position = 0; - var svgText = new StreamReader(output).ReadToEnd(); - Assert.Contains(" - /// Render a LayoutLine with 3 waypoints and a positive LineCornerRadius theme - /// produces SVG output containing an arc command (" A ") in the path data, - /// confirming that corner rounding generates arc segments. - /// - [Fact] - public void SvgRenderer_Render_SingleLine_WithCornerRadius_ProducesArcInPath() - { - // Arrange: a line with an interior bend that triggers arc generation - var renderer = new SvgRenderer(); - var line = new LayoutLine( - [new Point2D(10, 10), new Point2D(10, 50), new Point2D(90, 50)], - EndMarkerStyle.None, - EndMarkerStyle.None, - LineStyle.Solid, - null); - var layout = new LayoutTree(200, 100, [line]); - var options = new RenderOptions(Themes.Light); // LineCornerRadius = 4.0 - using var output = new MemoryStream(); - - // Act - renderer.Render(layout, options, output); - - // Assert: arc command is present in path data - output.Position = 0; - var svgText = new StreamReader(output).ReadToEnd(); - Assert.Contains(" A ", svgText, StringComparison.Ordinal); - } - - /// - /// Render a dashed LayoutLine produces SVG output containing the stroke-dasharray - /// attribute, confirming that dashed line style is mapped to SVG dash patterns. - /// - [Fact] - public void SvgRenderer_Render_SingleLine_Dashed_ProducesDashArray() - { - // Arrange: a dashed line - var renderer = new SvgRenderer(); - var line = new LayoutLine( - [new Point2D(10, 10), new Point2D(90, 10)], - EndMarkerStyle.None, - EndMarkerStyle.None, - LineStyle.Dashed, - null); - var layout = new LayoutTree(200, 100, [line]); - var options = new RenderOptions(Themes.Light); - using var output = new MemoryStream(); - - // Act - renderer.Render(layout, options, output); - - // Assert - output.Position = 0; - var svgText = new StreamReader(output).ReadToEnd(); - Assert.Contains("stroke-dasharray", svgText, StringComparison.Ordinal); - } - - /// - /// Render a LayoutLine with an Open target arrowhead produces SVG output containing - /// a marker-end attribute, confirming arrowhead markers are referenced correctly. - /// - [Fact] - public void SvgRenderer_Render_SingleLine_WithOpenArrowhead_ProducesMarkerEnd() - { - // Arrange: a line with Open arrowhead at the target - var renderer = new SvgRenderer(); - var line = new LayoutLine( - [new Point2D(10, 10), new Point2D(90, 10)], - EndMarkerStyle.None, - EndMarkerStyle.HollowTriangle, - LineStyle.Solid, - null); - var layout = new LayoutTree(200, 100, [line]); - var options = new RenderOptions(Themes.Light); - using var output = new MemoryStream(); - - // Act - renderer.Render(layout, options, output); - - // Assert - output.Position = 0; - var svgText = new StreamReader(output).ReadToEnd(); - Assert.Contains("marker-end", svgText, StringComparison.Ordinal); - } - - /// - /// Render a LayoutLine with a Diamond source arrowhead produces SVG output containing - /// the line-end-hollow-diamond marker id, confirming diamond markers are defined and referenced. - /// - [Fact] - public void SvgRenderer_Render_SingleLine_WithDiamondArrowhead_ProducesDiamondMarker() - { - // Arrange: a line with Diamond arrowhead at the source - var renderer = new SvgRenderer(); - var line = new LayoutLine( - [new Point2D(10, 10), new Point2D(90, 10)], - EndMarkerStyle.HollowDiamond, - EndMarkerStyle.None, - LineStyle.Solid, - null); - var layout = new LayoutTree(200, 100, [line]); - var options = new RenderOptions(Themes.Light); - using var output = new MemoryStream(); - - // Act - renderer.Render(layout, options, output); - - // Assert - output.Position = 0; - var svgText = new StreamReader(output).ReadToEnd(); - Assert.Contains("line-end-hollow-diamond", svgText, StringComparison.Ordinal); - } - - /// - /// Render a LayoutBox with a LayoutCompartment produces SVG output containing a - /// line element (compartment divider) and compartment row text, confirming that - /// compartment rendering is complete. - /// - [Fact] - public void SvgRenderer_Render_BoxWithCompartment_ProducesLineAndText() - { - // Arrange: a box with one compartment that has a body row - var renderer = new SvgRenderer(); - var compartment = new LayoutCompartment(null, ["+ radius : Real"]); - var box = new LayoutBox(10, 10, 150, 80, "MyBlock", 0, BoxShape.Rectangle, [compartment], []); - var layout = new LayoutTree(200, 120, [box]); - var options = new RenderOptions(Themes.Light); - using var output = new MemoryStream(); - - // Act - renderer.Render(layout, options, output); - - // Assert: divider line and compartment row text are both present - output.Position = 0; - var svgText = new StreamReader(output).ReadToEnd(); - Assert.Contains(" - /// Render a LayoutBox with RoundedRectangle shape produces SVG output containing an - /// rx attribute, confirming that rounded corners are applied via the rx/ry attributes. - /// - [Fact] - public void SvgRenderer_Render_BoxRoundedRectangle_ProducesRxAttribute() - { - // Arrange: a rounded-rectangle box - var renderer = new SvgRenderer(); - var box = new LayoutBox(10, 10, 100, 50, "Rounded", 0, BoxShape.RoundedRectangle, [], []); - var layout = new LayoutTree(200, 100, [box]); - var options = new RenderOptions(Themes.Light); // LineCornerRadius = 4.0 - using var output = new MemoryStream(); - - // Act - renderer.Render(layout, options, output); - - // Assert - output.Position = 0; - var svgText = new StreamReader(output).ReadToEnd(); - Assert.Contains("rx=\"", svgText, StringComparison.Ordinal); - } - - /// - /// Render a LayoutPort produces SVG output containing a rect element, - /// confirming that ports are rendered as filled squares. - /// - [Fact] - public void SvgRenderer_Render_SinglePort_ProducesRect() - { - // Arrange: a port on the right side - var renderer = new SvgRenderer(); - var port = new LayoutPort(100, 50, PortSide.Right, "p1"); - var layout = new LayoutTree(200, 100, [port]); - var options = new RenderOptions(Themes.Light); - using var output = new MemoryStream(); - - // Act - renderer.Render(layout, options, output); - - // Assert - output.Position = 0; - var svgText = new StreamReader(output).ReadToEnd(); - Assert.Contains(" - /// Render a LayoutBadge with FilledCircle shape produces SVG output containing a - /// circle element, confirming that filled-circle badges are rendered as SVG circles. - /// - [Fact] - public void SvgRenderer_Render_SingleBadge_FilledCircle_ProducesCircle() - { - // Arrange: a filled-circle badge - var renderer = new SvgRenderer(); - var badge = new LayoutBadge(50, 50, 12, BadgeShape.FilledCircle, "I"); - var layout = new LayoutTree(200, 100, [badge]); - var options = new RenderOptions(Themes.Light); - using var output = new MemoryStream(); - - // Act - renderer.Render(layout, options, output); - - // Assert - output.Position = 0; - var svgText = new StreamReader(output).ReadToEnd(); - Assert.Contains(" - /// Render a LayoutBand produces SVG output containing a rect element, - /// confirming that swim-lane bands are rendered as rectangles. - /// - [Fact] - public void SvgRenderer_Render_SingleBand_ProducesRect() - { - // Arrange: a horizontal swim-lane band - var renderer = new SvgRenderer(); - var band = new LayoutBand(10, 10, 300, 100, BandOrientation.Horizontal, "Lane A", []); - var layout = new LayoutTree(400, 200, [band]); - var options = new RenderOptions(Themes.Light); - using var output = new MemoryStream(); - - // Act - renderer.Render(layout, options, output); - - // Assert - output.Position = 0; - var svgText = new StreamReader(output).ReadToEnd(); - Assert.Contains(" - /// Render a LayoutLifeline produces SVG output containing both a rect element - /// (the header box) and a line element (the dashed stem), confirming that both - /// components of a lifeline are rendered. - /// - [Fact] - public void SvgRenderer_Render_SingleLifeline_ProducesRectAndLine() - { - // Arrange: a lifeline with a header box and a stem - var renderer = new SvgRenderer(); - var lifeline = new LayoutLifeline(100, 10, 300, ":Actor", 80, 30); - var layout = new LayoutTree(300, 400, [lifeline]); - var options = new RenderOptions(Themes.Light); - using var output = new MemoryStream(); - - // Act - renderer.Render(layout, options, output); - - // Assert - output.Position = 0; - var svgText = new StreamReader(output).ReadToEnd(); - Assert.Contains(" - /// Render a LayoutActivation produces SVG output containing a rect element, - /// confirming that activation bars are rendered as narrow rectangles. - /// - [Fact] - public void SvgRenderer_Render_SingleActivation_ProducesRect() - { - // Arrange: a narrow activation bar - var renderer = new SvgRenderer(); - var activation = new LayoutActivation(100, 50, 200); - var layout = new LayoutTree(300, 400, [activation]); - var options = new RenderOptions(Themes.Light); - using var output = new MemoryStream(); - - // Act - renderer.Render(layout, options, output); - - // Assert - output.Position = 0; - var svgText = new StreamReader(output).ReadToEnd(); - Assert.Contains(" - /// Render a LayoutGrid produces SVG output containing at least one rect element, - /// confirming that grid cells are rendered as bordered rectangles. - /// - [Fact] - public void SvgRenderer_Render_SingleGrid_ProducesRects() - { - // Arrange: a 1x2 grid with one header and one body row - var renderer = new SvgRenderer(); - var headerRow = new LayoutGridRow(true, [new LayoutGridCell(100, 24, "Name", TextAlign.Left, 1)]); - var bodyRow = new LayoutGridRow(false, [new LayoutGridCell(100, 24, "Alice", TextAlign.Left, 1)]); - var grid = new LayoutGrid(10, 10, [headerRow, bodyRow]); - var layout = new LayoutTree(200, 100, [grid]); - var options = new RenderOptions(Themes.Light); - using var output = new MemoryStream(); - - // Act - renderer.Render(layout, options, output); - - // Assert - output.Position = 0; - var svgText = new StreamReader(output).ReadToEnd(); - Assert.Contains(" - /// Render a LayoutLabel with FontWeight.Bold produces SVG output containing - /// font-weight="bold", confirming that bold labels apply the bold font weight attribute. - /// - [Fact] - public void SvgRenderer_Render_LabelWithBold_ProducesBoldAttribute() - { - // Arrange: a label with bold weight - var renderer = new SvgRenderer(); - var label = new LayoutLabel(50, 50, 200, "Bold Text", TextAlign.Left, FontWeight.Bold, FontStyle.Normal, 14.0); - var layout = new LayoutTree(300, 100, [label]); - var options = new RenderOptions(Themes.Light); - using var output = new MemoryStream(); - - // Act - renderer.Render(layout, options, output); - - // Assert - output.Position = 0; - var svgText = new StreamReader(output).ReadToEnd(); - Assert.Contains("font-weight=\"bold\"", svgText, StringComparison.Ordinal); - } - - /// - /// Render a LayoutLabel with FontStyle.Italic produces SVG output containing - /// font-style="italic", confirming that italic labels apply the italic font style attribute. - /// - [Fact] - public void SvgRenderer_Render_LabelWithItalic_ProducesItalicAttribute() - { - // Arrange: a label with italic style - var renderer = new SvgRenderer(); - var label = new LayoutLabel(50, 50, 200, "Italic Text", TextAlign.Left, FontWeight.Regular, FontStyle.Italic, 14.0); - var layout = new LayoutTree(300, 100, [label]); - var options = new RenderOptions(Themes.Light); - using var output = new MemoryStream(); - - // Act - renderer.Render(layout, options, output); - - // Assert - output.Position = 0; - var svgText = new StreamReader(output).ReadToEnd(); - Assert.Contains("font-style=\"italic\"", svgText, StringComparison.Ordinal); - } - - /// - /// Render a LayoutLine with a non-null MidpointLabel produces SVG output containing - /// a text element, confirming that midpoint labels are rendered over the line. - /// - [Fact] - public void SvgRenderer_Render_LineWithMidpointLabel_ProducesTextElement() - { - // Arrange: a line with a midpoint label - var renderer = new SvgRenderer(); - var line = new LayoutLine( - [new Point2D(10, 50), new Point2D(190, 50)], - EndMarkerStyle.None, - EndMarkerStyle.None, - LineStyle.Solid, - "uses"); - var layout = new LayoutTree(200, 100, [line]); - var options = new RenderOptions(Themes.Light); - using var output = new MemoryStream(); - - // Act - renderer.Render(layout, options, output); - - // Assert - output.Position = 0; - var svgText = new StreamReader(output).ReadToEnd(); - Assert.Contains(" - /// Render a LayoutLine with an OpenWithCrossbar target arrowhead produces SVG output - /// containing the line-end-hollow-triangle-crossbar marker id, confirming the open-crossbar marker - /// is defined in the defs block and referenced by the path element. - /// - [Fact] - public void SvgRenderer_Render_SingleLine_WithOpenCrossbarArrowhead_ProducesOpenCrossbarMarker() - { - // Arrange: a line with OpenWithCrossbar arrowhead at the target - var renderer = new SvgRenderer(); - var line = new LayoutLine( - [new Point2D(10, 10), new Point2D(90, 10)], - EndMarkerStyle.None, - EndMarkerStyle.HollowTriangleCrossbar, - LineStyle.Solid, - null); - var layout = new LayoutTree(200, 100, [line]); - var options = new RenderOptions(Themes.Light); - using var output = new MemoryStream(); - - // Act - renderer.Render(layout, options, output); - - // Assert - output.Position = 0; - var svgText = new StreamReader(output).ReadToEnd(); - Assert.Contains("line-end-hollow-triangle-crossbar", svgText, StringComparison.Ordinal); - } - - /// - /// Render a tree whose box label and standalone label both contain XML-special characters - /// (< > & " ') produces well-formed SVG in which the reserved markup - /// characters are escaped, confirming that label text can never break the SVG document. - /// - [Fact] - public void SvgRenderer_Render_LabelWithXmlSpecialCharacters_ProducesWellFormedEscapedSvg() - { - // Arrange: a tree whose box label and standalone label both contain XML-special characters. - const string special = "A < B & C > D \" E ' F"; - var renderer = new SvgRenderer(); - var box = new LayoutBox(10, 10, 200, 60, special, 0, BoxShape.Rectangle, [], []); - var label = new LayoutLabel(20, 40, 200, special, TextAlign.Left, FontWeight.Regular, FontStyle.Normal, 12.0); - var layout = new LayoutTree(300, 200, [box, label]); - var options = new RenderOptions(Themes.Light); - using var output = new MemoryStream(); - - // Act: render the tree. - renderer.Render(layout, options, output); - - // Assert: the output parses as well-formed XML and the reserved characters are escaped. - output.Position = 0; - var svgText = new StreamReader(output).ReadToEnd(); - var document = System.Xml.Linq.XDocument.Parse(svgText); // throws if the SVG is not well-formed - Assert.Contains("<", svgText, StringComparison.Ordinal); - Assert.Contains(">", svgText, StringComparison.Ordinal); - Assert.Contains("&", svgText, StringComparison.Ordinal); - - // Assert: after parsing, a text element's content round-trips back to the original label, - // proving the special characters were escaped rather than emitted raw. - var textValues = document.Descendants() - .Where(e => e.Name.LocalName == "text") - .Select(e => e.Value) - .ToList(); - Assert.Contains(textValues, v => v.Contains(special, StringComparison.Ordinal)); - } -} diff --git a/test/DemaConsulting.SysML2Tools.Tests/DemaConsulting.SysML2Tools.Tests.csproj b/test/DemaConsulting.SysML2Tools.Tests/DemaConsulting.SysML2Tools.Tests.csproj index 03c1080f..f25989f0 100644 --- a/test/DemaConsulting.SysML2Tools.Tests/DemaConsulting.SysML2Tools.Tests.csproj +++ b/test/DemaConsulting.SysML2Tools.Tests/DemaConsulting.SysML2Tools.Tests.csproj @@ -56,8 +56,8 @@ - - + +
    diff --git a/test/DemaConsulting.SysML2Tools.Tests/Layout/ActionFlowViewLayoutStrategyTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Layout/ActionFlowViewLayoutStrategyTests.cs index e08475fe..a3c2bfdd 100644 --- a/test/DemaConsulting.SysML2Tools.Tests/Layout/ActionFlowViewLayoutStrategyTests.cs +++ b/test/DemaConsulting.SysML2Tools.Tests/Layout/ActionFlowViewLayoutStrategyTests.cs @@ -2,7 +2,8 @@ // Copyright (c) DemaConsulting. All rights reserved. // -using DemaConsulting.SysML2Tools.Layout; +using DemaConsulting.Rendering; +using DemaConsulting.Rendering.Abstractions; using DemaConsulting.SysML2Tools.Layout.Internal; using DemaConsulting.SysML2Tools.Rendering; using DemaConsulting.SysML2Tools.Semantic; diff --git a/test/DemaConsulting.SysML2Tools.Tests/Layout/BoxMetricsTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Layout/BoxMetricsTests.cs deleted file mode 100644 index 5924da4a..00000000 --- a/test/DemaConsulting.SysML2Tools.Tests/Layout/BoxMetricsTests.cs +++ /dev/null @@ -1,75 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Layout; -using DemaConsulting.SysML2Tools.Rendering; - -namespace DemaConsulting.SysML2Tools.Tests.Layout; - -/// -/// Tests for , the shared box title-area and folder-tab height -/// formulas that keep space reserved by the layout strategies equal to space drawn by the -/// renderers. Values are asserted against the Light theme's font sizes and label padding. -/// -public sealed class BoxMetricsTests -{ - /// The folder-tab height is the body font size plus two label paddings. - [Fact] - public void BoxMetrics_FolderTabHeight_DerivesFromThemeBodyFontAndPadding() - { - // Arrange: the Light theme (FontSizeBody 12, LabelPadding 6). - var theme = Themes.Light; - - // Act - var height = BoxMetrics.FolderTabHeight(theme); - - // Assert: body font size plus two label paddings (12 + 2*6 = 24). - Assert.Equal(theme.FontSizeBody + (2.0 * theme.LabelPadding), height); - Assert.Equal(24.0, height); - } - - /// A box with neither a name label nor a keyword reserves no title area. - [Fact] - public void BoxMetrics_TitleAreaHeight_NoLabelNoKeyword_IsZero() - { - // Arrange - var theme = Themes.Light; - - // Act - var height = BoxMetrics.TitleAreaHeight(theme, hasLabel: false, hasKeyword: false); - - // Assert - Assert.Equal(0.0, height); - } - - /// A labelled box reserves padding plus one title line. - [Fact] - public void BoxMetrics_TitleAreaHeight_LabelOnly_ReservesTitleLine() - { - // Arrange - var theme = Themes.Light; - - // Act - var height = BoxMetrics.TitleAreaHeight(theme, hasLabel: true, hasKeyword: false); - - // Assert: leading padding + (title font + trailing padding). - Assert.Equal(theme.LabelPadding + theme.FontSizeTitle + theme.LabelPadding, height); - } - - /// A box with a keyword and a name reserves padding plus both lines. - [Fact] - public void BoxMetrics_TitleAreaHeight_LabelAndKeyword_ReservesBothLines() - { - // Arrange - var theme = Themes.Light; - - // Act - var height = BoxMetrics.TitleAreaHeight(theme, hasLabel: true, hasKeyword: true); - - // Assert: leading padding + keyword line + name line, each followed by padding. - Assert.Equal( - theme.LabelPadding + theme.FontSizeBody + theme.LabelPadding + theme.FontSizeTitle + theme.LabelPadding, - height); - } -} diff --git a/test/DemaConsulting.SysML2Tools.Tests/Layout/BrowserAndGridViewLayoutStrategyTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Layout/BrowserAndGridViewLayoutStrategyTests.cs index 8cf2ef37..3ecb2e31 100644 --- a/test/DemaConsulting.SysML2Tools.Tests/Layout/BrowserAndGridViewLayoutStrategyTests.cs +++ b/test/DemaConsulting.SysML2Tools.Tests/Layout/BrowserAndGridViewLayoutStrategyTests.cs @@ -2,7 +2,8 @@ // Copyright (c) DemaConsulting. All rights reserved. // -using DemaConsulting.SysML2Tools.Layout; +using DemaConsulting.Rendering; +using DemaConsulting.Rendering.Abstractions; using DemaConsulting.SysML2Tools.Layout.Internal; using DemaConsulting.SysML2Tools.Rendering; using DemaConsulting.SysML2Tools.Semantic; diff --git a/test/DemaConsulting.SysML2Tools.Tests/Layout/ConnectorLabelPlacerTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Layout/ConnectorLabelPlacerTests.cs deleted file mode 100644 index 1d9553c5..00000000 --- a/test/DemaConsulting.SysML2Tools.Tests/Layout/ConnectorLabelPlacerTests.cs +++ /dev/null @@ -1,77 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Layout; - -namespace DemaConsulting.SysML2Tools.Tests.Layout; - -/// -/// Tests for . -/// -public sealed class ConnectorLabelPlacerTests -{ - /// A line without a label is omitted from the result. - [Fact] - public void Place_LineWithoutLabel_IsOmitted() - { - var line = new LayoutLine( - [new Point2D(0, 0), new Point2D(100, 0)], - EndMarkerStyle.None, - EndMarkerStyle.FilledArrow, - LineStyle.Solid, - MidpointLabel: null); - - var result = ConnectorLabelPlacer.Place([line], fontSize: 12); - - Assert.Empty(result); - } - - /// A single labelled line is placed at the midpoint of its longest segment. - [Fact] - public void Place_SingleLine_UsesLongestSegmentMidpoint() - { - // A short vertical stub then a long horizontal run: the label should land on the long run. - var line = new LayoutLine( - [new Point2D(0, 0), new Point2D(0, 10), new Point2D(200, 10)], - EndMarkerStyle.None, - EndMarkerStyle.FilledArrow, - LineStyle.Solid, - MidpointLabel: "[guard]"); - - var result = ConnectorLabelPlacer.Place([line], fontSize: 12); - - var (x, y) = result[line]; - Assert.Equal(100, x, precision: 3); - Assert.Equal(10, y, precision: 3); - } - - /// Two labels whose preferred positions coincide are separated so they do not overlap. - [Fact] - public void Place_CollidingLabels_AreSeparated() - { - // Two lines whose longest-segment midpoints are the same point. - var a = new LayoutLine( - [new Point2D(0, 0), new Point2D(200, 0)], - EndMarkerStyle.None, - EndMarkerStyle.FilledArrow, - LineStyle.Solid, - MidpointLabel: "[atFloor]"); - var b = new LayoutLine( - [new Point2D(0, 0), new Point2D(200, 0)], - EndMarkerStyle.None, - EndMarkerStyle.FilledArrow, - LineStyle.Solid, - MidpointLabel: "[timeout]"); - - var result = ConnectorLabelPlacer.Place([a, b], fontSize: 12); - - var posA = result[a]; - var posB = result[b]; - - // The first keeps the preferred midpoint; the second is nudged away vertically. - Assert.Equal(100, posA.X, precision: 3); - Assert.Equal(0, posA.Y, precision: 3); - Assert.NotEqual(posB.Y, posA.Y, precision: 3); - } -} diff --git a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/ChannelRouterTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/ChannelRouterTests.cs deleted file mode 100644 index 2ac3cf9a..00000000 --- a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/ChannelRouterTests.cs +++ /dev/null @@ -1,314 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Layout; -using DemaConsulting.SysML2Tools.Layout.Engine; - -namespace DemaConsulting.SysML2Tools.Tests.Layout.Engine; - -/// -/// Tests for orthogonal edge routing. -/// -public sealed class ChannelRouterTests -{ - /// - /// A route with no obstacles still produces a valid orthogonal path from source to target. - /// - [Fact] - public void Route_NoObstacles_ProducesOrthogonalPath() - { - // Act: route between two diagonal points with no obstacles - var path = ChannelRouter.Route(new Point2D(0, 0), new Point2D(100, 80), [], clearance: 10); - - // Assert: path starts at source, ends at target, and every segment is axis-aligned - AssertEndpoints(path, new Point2D(0, 0), new Point2D(100, 80)); - AssertAllSegmentsOrthogonal(path); - } - - /// - /// With an obstacle directly between source and target, the route avoids the obstacle interior. - /// - [Fact] - public void Route_ObstacleBetween_RoutesAround() - { - // Arrange: an obstacle squarely between the horizontal line from source to target - var source = new Point2D(0, 50); - var target = new Point2D(200, 50); - var obstacles = new[] { new Rect(80, 0, 40, 100) }; - - // Act - var path = ChannelRouter.Route(source, target, obstacles, clearance: 10); - - // Assert: valid orthogonal path that does not cross the obstacle interior - AssertEndpoints(path, source, target); - AssertAllSegmentsOrthogonal(path); - AssertNoSegmentCrossesObstacle(path, obstacles); - } - - /// - /// With multiple staggered obstacles, the route remains orthogonal and obstacle-free. - /// - [Fact] - public void Route_MultipleObstacles_RemainsValid() - { - // Arrange: several obstacles forming a partial maze between source and target - var source = new Point2D(0, 0); - var target = new Point2D(300, 200); - var obstacles = new[] - { - new Rect(60, -20, 40, 160), - new Rect(160, 60, 40, 200), - new Rect(220, 0, 40, 120), - }; - - // Act - var path = ChannelRouter.Route(source, target, obstacles, clearance: 12); - - // Assert - AssertEndpoints(path, source, target); - AssertAllSegmentsOrthogonal(path); - AssertNoSegmentCrossesObstacle(path, obstacles); - } - - /// - /// Horizontally aligned endpoints with no obstacle produce a single straight segment. - /// - [Fact] - public void Route_AlignedEndpoints_ProducesStraightLine() - { - // Act: source and target share a Y coordinate with no obstacles - var path = ChannelRouter.Route(new Point2D(0, 30), new Point2D(150, 30), [], clearance: 10); - - // Assert: a simple two-point straight segment - Assert.Equal(2, path.Count); - AssertEndpoints(path, new Point2D(0, 30), new Point2D(150, 30)); - } - - /// - /// When a source side is given, the route leaves the source with a perpendicular stub: the - /// first segment runs in the side's outward direction. - /// - [Fact] - public void Route_WithSourceSide_LeavesPerpendicular() - { - // Arrange: source on the right side of its box, target up and to the right - var source = new Point2D(100, 100); - var target = new Point2D(200, 20); - - // Act: the source anchor is on the Right side, so the first move must go right (+x) - var path = ChannelRouter.Route(source, target, [], clearance: 10, sourceSide: PortSide.Right); - - // Assert: first segment is horizontal and heads to the right (outward from the Right side) - Assert.True(path.Count >= 2); - Assert.Equal(source.X, path[0].X, 6); - Assert.Equal(source.Y, path[0].Y, 6); - Assert.Equal(path[0].Y, path[1].Y, 6); // horizontal first segment - Assert.True(path[1].X > path[0].X, "First segment should leave the Right side going right."); - AssertAllSegmentsOrthogonal(path); - } - - /// - /// When a target side is given, the route enters the target with a perpendicular stub: the - /// last segment runs into the side's inward direction. - /// - [Fact] - public void Route_WithTargetSide_EntersPerpendicular() - { - // Arrange: target on the top side of its box, source below-left - var source = new Point2D(20, 200); - var target = new Point2D(150, 100); - - // Act: the target anchor is on the Top side, so the last move must arrive going down (+y) - var path = ChannelRouter.Route(source, target, [], clearance: 10, targetSide: PortSide.Top); - - // Assert: last segment is vertical and arrives from above (entering the Top side) - Assert.Equal(target.X, path[^1].X, 6); - Assert.Equal(target.Y, path[^1].Y, 6); - Assert.Equal(path[^1].X, path[^2].X, 6); // vertical last segment - Assert.True(path[^2].Y < path[^1].Y, "Last segment should enter the Top side from above."); - AssertAllSegmentsOrthogonal(path); - } - - /// - /// A clean route (no blocking obstacle) reports it did not cross via RouteWithStatus. - /// - [Fact] - public void RouteWithStatus_NoBlockingObstacle_ReportsNotCrossed() - { - // Act: route around a single obstacle that a channel exists past - var result = ChannelRouter.RouteWithStatus( - new Point2D(0, 50), new Point2D(200, 50), [new Rect(80, 0, 40, 100)], clearance: 10); - - // Assert: a valid orthogonal route was found, so Crossed is false - Assert.False(result.Crossed); - AssertAllSegmentsOrthogonal(result.Waypoints); - } - - /// - /// An obstacle squarely between the endpoints is routed around (not crossed), demonstrating - /// the clearance-retry robustness. - /// - [Fact] - public void RouteWithStatus_ObstacleBetween_RoutesAroundWithoutCrossing() - { - // Arrange: an obstacle blocking the straight path but with room to route around - var obstacles = new[] { new Rect(40, 40, 40, 40) }; - - // Act - var result = ChannelRouter.RouteWithStatus( - new Point2D(0, 60), new Point2D(120, 60), obstacles, clearance: 8); - - // Assert: routed cleanly (no crossing) and no segment passes through the obstacle interior - Assert.False(result.Crossed); - AssertNoSegmentCrossesObstacle(result.Waypoints, obstacles); - } - - /// - /// When the target lies inside an obstacle (no obstacle-free approach exists), the router - /// reports that it had to cross. - /// - [Fact] - public void RouteWithStatus_TargetEnclosedByObstacle_ReportsCrossed() - { - // Arrange: an obstacle that fully encloses the target point - var obstacles = new[] { new Rect(50, 0, 200, 100) }; - - // Act: target (100, 50) is strictly inside the obstacle - var result = ChannelRouter.RouteWithStatus( - new Point2D(0, 50), new Point2D(100, 50), obstacles, clearance: 10); - - // Assert: no clean path exists, so Crossed is reported true - Assert.True(result.Crossed); - } - - /// - /// A highway cost band makes one detour cheaper, so the router prefers routing through the band - /// rather than the equal-length alternative on the opposite side of the obstacle. - /// - [Fact] - public void RouteWithStatus_HighwayBand_PrefersBandedDetour() - { - // Arrange: an obstacle blocks the straight line; a cheaper band lies on the +y (downward) side - var source = new Point2D(0, 0); - var target = new Point2D(200, 0); - var obstacles = new[] { new Rect(80, -30, 40, 60) }; - var bands = new[] { new CostBand(IsHorizontal: true, Start: 40, End: 80, Multiplier: 0.6) }; - - // Act: route with the discounted band biasing the detour - var result = ChannelRouter.RouteWithStatus(source, target, obstacles, clearance: 10, costBands: bands); - - // Assert: the route dips downward into the cheaper band instead of detouring up - Assert.False(result.Crossed); - Assert.Contains(result.Waypoints, p => p.Y > 0); - } - - /// - /// A clean route keeps the requested clearance from obstacles it passes, rather than grazing - /// their edges. - /// - [Fact] - public void RouteWithStatus_CleanRoute_KeepsClearanceFromObstacles() - { - // Arrange: source sits just to the right of an obstacle; a straight drop would graze it. - var obstacle = new Rect(0, 40, 60, 80); - var obstacles = new[] { obstacle }; - - // Act: route from above-right of the obstacle to below it. - var result = ChannelRouter.RouteWithStatus( - new Point2D(62, 0), new Point2D(30, 200), obstacles, clearance: 10); - - // Assert: routed cleanly and every segment stays at least (nearly) the clearance away. - Assert.False(result.Crossed); - for (var i = 0; i < result.Waypoints.Count - 1; i++) - { - Assert.True( - SegmentDistanceToRect(result.Waypoints[i], result.Waypoints[i + 1], obstacle) > 10.0 - 1e-6, - $"Segment {i} runs closer than the clearance to the obstacle."); - } - } - - /// - /// Asserts that the path begins at the expected source and ends at the expected target. - /// - private static void AssertEndpoints(IReadOnlyList path, Point2D source, Point2D target) - { - Assert.True(path.Count >= 2); - Assert.Equal(source.X, path[0].X, 6); - Assert.Equal(source.Y, path[0].Y, 6); - Assert.Equal(target.X, path[^1].X, 6); - Assert.Equal(target.Y, path[^1].Y, 6); - } - - /// - /// Asserts that every consecutive pair of waypoints forms a horizontal or vertical segment. - /// - private static void AssertAllSegmentsOrthogonal(IReadOnlyList path) - { - for (var i = 0; i < path.Count - 1; i++) - { - var a = path[i]; - var b = path[i + 1]; - var horizontal = Math.Abs(a.Y - b.Y) < 1e-6; - var vertical = Math.Abs(a.X - b.X) < 1e-6; - Assert.True(horizontal || vertical, - $"Segment {i} from ({a.X},{a.Y}) to ({b.X},{b.Y}) is not orthogonal."); - } - } - - /// - /// Asserts that no segment of the path passes through the interior of any obstacle. - /// - private static void AssertNoSegmentCrossesObstacle(IReadOnlyList path, IReadOnlyList obstacles) - { - for (var i = 0; i < path.Count - 1; i++) - { - var a = path[i]; - var b = path[i + 1]; - foreach (var r in obstacles) - { - Assert.False(SegmentCrossesRect(a, b, r), - $"Segment {i} from ({a.X},{a.Y}) to ({b.X},{b.Y}) crosses obstacle."); - } - } - } - - /// - /// Returns true when the axis-aligned segment passes through the strict interior of the rect. - /// - private static bool SegmentCrossesRect(Point2D a, Point2D b, Rect r) - { - if (Math.Abs(a.Y - b.Y) < 1e-6) - { - // Horizontal segment - var y = a.Y; - var xa = Math.Min(a.X, b.X); - var xb = Math.Max(a.X, b.X); - return r.Y < y && y < r.Y + r.Height && - Math.Max(xa, r.X) < Math.Min(xb, r.X + r.Width); - } - - // Vertical segment - var x = a.X; - var ya = Math.Min(a.Y, b.Y); - var yb = Math.Max(a.Y, b.Y); - return r.X < x && x < r.X + r.Width && - Math.Max(ya, r.Y) < Math.Min(yb, r.Y + r.Height); - } - - /// - /// Returns the Euclidean distance from an axis-aligned segment to an axis-aligned rectangle - /// (0 when they intersect). - /// - private static double SegmentDistanceToRect(Point2D a, Point2D b, Rect r) - { - var xlo = Math.Min(a.X, b.X); - var xhi = Math.Max(a.X, b.X); - var ylo = Math.Min(a.Y, b.Y); - var yhi = Math.Max(a.Y, b.Y); - - var dx = Math.Max(0.0, Math.Max(r.X - xhi, xlo - (r.X + r.Width))); - var dy = Math.Max(0.0, Math.Max(r.Y - yhi, ylo - (r.Y + r.Height))); - return Math.Sqrt((dx * dx) + (dy * dy)); - } -} diff --git a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/ContainmentPackerTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/ContainmentPackerTests.cs deleted file mode 100644 index 61f910c3..00000000 --- a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/ContainmentPackerTests.cs +++ /dev/null @@ -1,172 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Layout.Engine; - -namespace DemaConsulting.SysML2Tools.Tests.Layout.Engine; - -/// -/// Tests for shelf bin-packing. -/// -public sealed class ContainmentPackerTests -{ - /// - /// Packing an empty list returns a region consisting only of padding and no rectangles. - /// - [Fact] - public void Pack_EmptyList_ReturnsPaddingOnlyRegion() - { - // Act: pack no items with padding 10 - var result = ContainmentPacker.Pack([], maxContentWidth: 100, horizontalGap: 5, verticalGap: 5, padding: 10); - - // Assert: region is 2*padding on each axis with no rectangles - Assert.Empty(result.Rects); - Assert.Equal(20.0, result.Width); - Assert.Equal(20.0, result.Height); - } - - /// - /// A single item is positioned at the padding origin and the region fits it exactly. - /// - [Fact] - public void Pack_SingleItem_PositionsAtPaddingOrigin() - { - // Arrange: one 40x20 item - var items = new[] { new PackItem(40, 20) }; - - // Act - var result = ContainmentPacker.Pack(items, maxContentWidth: 200, horizontalGap: 5, verticalGap: 5, padding: 10); - - // Assert: positioned at (10, 10); region = item + 2*padding - Assert.Single(result.Rects); - Assert.Equal(10.0, result.Rects[0].X); - Assert.Equal(10.0, result.Rects[0].Y); - Assert.Equal(60.0, result.Width); - Assert.Equal(40.0, result.Height); - } - - /// - /// Items that fit within the max content width are placed on a single row sharing a Y. - /// - [Fact] - public void Pack_ItemsFitInRow_ShareSameRow() - { - // Arrange: three 30-wide items; max content width 200 fits all in one row - var items = new[] { new PackItem(30, 20), new PackItem(30, 20), new PackItem(30, 20) }; - - // Act - var result = ContainmentPacker.Pack(items, maxContentWidth: 200, horizontalGap: 5, verticalGap: 5, padding: 10); - - // Assert: all three share the same top Y (single row) - Assert.Equal(result.Rects[0].Y, result.Rects[1].Y); - Assert.Equal(result.Rects[1].Y, result.Rects[2].Y); - - // And X positions increase left-to-right with the horizontal gap - Assert.Equal(10.0, result.Rects[0].X); - Assert.Equal(45.0, result.Rects[1].X); - Assert.Equal(80.0, result.Rects[2].X); - } - - /// - /// Items exceeding the max content width wrap to a new row positioned below the first. - /// - [Fact] - public void Pack_ItemsExceedWidth_WrapToNewRow() - { - // Arrange: three 80-wide items; max content width 200 fits only two per row - var items = new[] { new PackItem(80, 20), new PackItem(80, 20), new PackItem(80, 20) }; - - // Act - var result = ContainmentPacker.Pack(items, maxContentWidth: 200, horizontalGap: 5, verticalGap: 5, padding: 10); - - // Assert: first two on row 0, third wraps to row 1 with a greater Y - Assert.Equal(result.Rects[0].Y, result.Rects[1].Y); - Assert.True(result.Rects[2].Y > result.Rects[0].Y); - - // Third item starts a new row at the left padding origin - Assert.Equal(10.0, result.Rects[2].X); - } - - /// - /// For a mixed-size set, no two packed rectangles overlap. - /// - [Fact] - public void Pack_MixedSizes_ProducesNoOverlaps() - { - // Arrange: a varied mix of sizes that forces multiple rows - var items = new[] - { - new PackItem(60, 30), new PackItem(120, 20), new PackItem(40, 50), - new PackItem(90, 25), new PackItem(70, 40), new PackItem(50, 30), - new PackItem(110, 35), new PackItem(30, 20), - }; - - // Act - var result = ContainmentPacker.Pack(items, maxContentWidth: 250, horizontalGap: 8, verticalGap: 8, padding: 12); - - // Assert: every pair of rectangles is disjoint - for (var i = 0; i < result.Rects.Count; i++) - { - for (var j = i + 1; j < result.Rects.Count; j++) - { - Assert.False(Overlaps(result.Rects[i], result.Rects[j]), - $"Rectangles {i} and {j} overlap."); - } - } - } - - /// - /// Every packed rectangle lies fully within the reported region bounds. - /// - [Fact] - public void Pack_MixedSizes_AllRectsWithinBounds() - { - // Arrange: a varied mix of sizes - var items = new[] - { - new PackItem(60, 30), new PackItem(120, 20), new PackItem(40, 50), - new PackItem(90, 25), new PackItem(70, 40), - }; - - // Act - var result = ContainmentPacker.Pack(items, maxContentWidth: 200, horizontalGap: 8, verticalGap: 8, padding: 12); - - // Assert: each rectangle is contained within [0, Width] x [0, Height] - foreach (var r in result.Rects) - { - Assert.True(r.X >= 0); - Assert.True(r.Y >= 0); - Assert.True(r.X + r.Width <= result.Width + 1e-9); - Assert.True(r.Y + r.Height <= result.Height + 1e-9); - } - } - - /// - /// An item wider than the content width is placed alone and the region widens to fit it. - /// - [Fact] - public void Pack_ItemWiderThanContentWidth_PlacedAloneAndRegionWidens() - { - // Arrange: a 300-wide item with only 100 content width available - var items = new[] { new PackItem(50, 20), new PackItem(300, 20) }; - - // Act - var result = ContainmentPacker.Pack(items, maxContentWidth: 100, horizontalGap: 5, verticalGap: 5, padding: 10); - - // Assert: the oversized item wrapped to its own row and the region widened to contain it - Assert.True(result.Rects[1].Y > result.Rects[0].Y); - Assert.True(result.Width >= 320.0); - } - - /// - /// Determines whether two rectangles overlap with a positive-area intersection. - /// - private static bool Overlaps(PackedRect a, PackedRect b) - { - return a.X < b.X + b.Width && - b.X < a.X + a.Width && - a.Y < b.Y + b.Height && - b.Y < a.Y + a.Height; - } -} diff --git a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/InterconnectionLayoutEngineTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/InterconnectionLayoutEngineTests.cs deleted file mode 100644 index ad574609..00000000 --- a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/InterconnectionLayoutEngineTests.cs +++ /dev/null @@ -1,172 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Layout.Engine; - -namespace DemaConsulting.SysML2Tools.Tests.Layout.Engine; - -/// -/// Tests for covering longest-path layering, -/// dummy-node routing for long edges, non-overlapping placement, and connector waypoints. -/// -public sealed class InterconnectionLayoutEngineTests -{ - /// - /// A simple directed chain A(0)→B(1)→C(2) produces three monotonically increasing - /// layer indices: 0, 1, 2. Longest-path layering assigns each node to the length - /// of the longest path from any source. - /// - [Fact] - public void Place_LinearChain_MonotonicLayerAssignment() - { - var nodes = new List { new(60, 40), new(60, 40), new(60, 40) }; - var edges = new List { new(0, 1), new(1, 2) }; - - var result = InterconnectionLayoutEngine.Place(nodes, edges); - - Assert.Equal(0, result.NodeLayers[0]); - Assert.Equal(1, result.NodeLayers[1]); - Assert.Equal(2, result.NodeLayers[2]); - } - - /// - /// A span-1 edge between two equal-height nodes produces exactly two waypoints - /// (a straight horizontal path): source-right-port and target-left-port. - /// The Brandes-Köpf algorithm aligns the two nodes' ports at the same Y so no - /// bend points are needed. - /// - [Fact] - public void Place_SingleEdge_ProducesStraightTwoWaypointPath() - { - var nodes = new List { new(60, 40), new(60, 40) }; - var edges = new List { new(0, 1) }; - - var result = InterconnectionLayoutEngine.Place(nodes, edges); - - Assert.Single(result.ConnectorWaypoints); - Assert.Equal(2, result.ConnectorWaypoints[0].Count); - } - - /// - /// The rect count always equals the number of input nodes — long edges use dummy-node - /// routing through intermediate layer gaps, not additional real boxes. - /// A diamond topology with an extra 0→3 long edge produces exactly four rects and - /// five waypoint lists. - /// - [Fact] - public void Place_LongEdge_RectCountEqualsInputNodeCount() - { - // 0→1→3 and 0→2→3 place: 0 at layer 0, 1/2 at layer 1, 3 at layer 2. - // Adding 0→3 creates a span-2 long edge routed via a dummy node. - var nodes = new List - { - new(80, 50), - new(80, 50), - new(80, 50), - new(80, 50), - }; - var edges = new List - { - new(0, 1), - new(0, 2), - new(1, 3), - new(2, 3), - new(0, 3), // span-2: one dummy node in layer 1 - }; - - var result = InterconnectionLayoutEngine.Place(nodes, edges); - - Assert.Equal(4, result.Rects.Count); - Assert.Equal(5, result.ConnectorWaypoints.Count); - } - - /// - /// A long edge (span > 1) is routed via dummy nodes in intermediate layers. - /// A span-3 edge uses two dummies, producing at least four waypoints, all within - /// the diagram bounds. - /// - [Fact] - public void Place_LongEdge_RoutesViaDummyNodesWithinBounds() - { - // Chain 0→1→2→3 sets layers 0,1,2,3; adding 0→3 spans 3 layers. - var nodes = Enumerable.Repeat(new LayerNode(80, 50), 4).ToList(); - var edges = new List - { - new(0, 1), - new(1, 2), - new(2, 3), - new(0, 3), // span-3: two dummy nodes in layers 1 and 2 - }; - - var result = InterconnectionLayoutEngine.Place(nodes, edges); - - var longEdgeWp = result.ConnectorWaypoints[3]; - - // A span-3 long edge has 3 sub-edges, each contributing 0–2 bend points. - // Minimum total: 2 (source port + target port); at least 4 when any sub-edge is non-straight. - Assert.True(longEdgeWp.Count >= 4, $"Expected at least 4 waypoints for a span-3 long edge, got {longEdgeWp.Count}."); - - // All waypoints must lie within the diagram bounds. - foreach (var wp in longEdgeWp) - { - Assert.InRange(wp.X, 0.0, result.TotalWidth); - Assert.InRange(wp.Y, 0.0, result.TotalHeight); - } - } - - /// - /// The Workstation topology (7 parts, 8 connections) produces the exact layer - /// assignments that longest-path layering guarantees and all seven rects are - /// non-overlapping. - /// - [Fact] - public void Place_WorkstationTopology_CorrectLayersAndNoOverlap() - { - // Part order matches SysML file: cpu=0 memory=1 graphics=2 storage=3 psu=4 network=5 board=6 - var nodes = Enumerable.Repeat(new LayerNode(130, 60), 7).ToList(); - var edges = new List - { - new(6, 0), // board → cpu - new(6, 1), // board → memory - new(6, 2), // board → graphics - new(6, 3), // board → storage - new(6, 5), // board → network - new(4, 6), // psu → board - new(4, 2), // psu → graphics - new(0, 1), // cpu → memory - }; - - var result = InterconnectionLayoutEngine.Place(nodes, edges); - - // Longest-path layers. - Assert.Equal(0, result.NodeLayers[4]); // psu: no incoming - Assert.Equal(1, result.NodeLayers[6]); // board: psu → board - Assert.Equal(2, result.NodeLayers[0]); // cpu: board → cpu - Assert.Equal(2, result.NodeLayers[2]); // graphics: max(psu→2, board→2) = 2 - Assert.Equal(2, result.NodeLayers[3]); // storage: board → storage - Assert.Equal(2, result.NodeLayers[5]); // network: board → network - Assert.Equal(3, result.NodeLayers[1]); // memory: max(board→2+1, cpu→2+1) = 3 - - // Output counts. - Assert.Equal(7, result.Rects.Count); - Assert.Equal(8, result.ConnectorWaypoints.Count); - - // No two rects overlap. - for (var i = 0; i < result.Rects.Count; i++) - { - for (var j = i + 1; j < result.Rects.Count; j++) - { - Assert.False( - Overlaps(result.Rects[i], result.Rects[j]), - $"Rects {i} and {j} overlap: {result.Rects[i]} / {result.Rects[j]}"); - } - } - } - - private static bool Overlaps(Rect a, Rect b) => - a.X < b.X + b.Width && - b.X < a.X + a.Width && - a.Y < b.Y + b.Height && - b.Y < a.Y + a.Height; -} diff --git a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/AxisTransformTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/AxisTransformTests.cs deleted file mode 100644 index b4f15206..00000000 --- a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/AxisTransformTests.cs +++ /dev/null @@ -1,195 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Layout; -using DemaConsulting.SysML2Tools.Layout.Engine; -using DemaConsulting.SysML2Tools.Layout.Engine.Layered; - -namespace DemaConsulting.SysML2Tools.Tests.Layout.Engine.Layered; - -/// -/// Tests for covering the left-to-right identity behavior and the -/// coordinate mapping, port-face emergence, and waypoint orthogonality for all four layout -/// directions. -/// -public sealed class AxisTransformTests -{ - private const double Tolerance = 1e-6; - private const double NodeWidth = 60.0; - private const double NodeHeight = 40.0; - - /// - /// With the left-to-right direction, the transform is an identity: the placed coordinates - /// are unchanged after it runs. - /// - [Fact] - public void AxisTransform_Apply_RightDirection_LeavesCoordinatesUnchanged() - { - // Arrange: place a chain (left-to-right) up to but not including the axis transform. - var nodes = new List { new(60, 40), new(60, 40), new(60, 40) }; - var edges = new List { new(0, 1), new(1, 2) }; - var graph = new LayeredGraph(nodes, edges, LayoutDirection.Right); - new CycleBreaker().Apply(graph); - new LayerAssigner().Apply(graph); - new LongEdgeSplitter().Apply(graph); - new CrossingMinimizer().Apply(graph); - new BrandesKopfPlacer().Apply(graph); - new PortDistributor().Apply(graph); - new OrthogonalRouter().Apply(graph); - new LongEdgeJoiner().Apply(graph); - - var beforeX = (double[])graph.AugX.Clone(); - var beforeY = (double[])graph.AugY.Clone(); - - // Act: apply the identity transform. - new AxisTransform().Apply(graph); - - // Assert: coordinates are unchanged. - Assert.Equal(beforeX, graph.AugX); - Assert.Equal(beforeY, graph.AugY); - } - - /// - /// RIGHT places the target in a later layer to the right of the source; the source exits its - /// EAST face and the target enters its WEST face. - /// - [Fact] - public void AxisTransform_Apply_Right_PlacesTargetEastWithCorrectFaces() - { - var graph = PlaceChain(LayoutDirection.Right); - - // Coordinate mapping: target sits to the right of the source. - Assert.True(graph.AugX[1] > graph.AugX[0]); - - // Port faces: source on its EAST (right) face, target on its WEST (left) face. - var (source, target) = EndpointsOf(graph, 0); - Assert.Equal(Right(graph, 0), source.X, Tolerance); - Assert.Equal(Left(graph, 1), target.X, Tolerance); - } - - /// - /// DOWN places the target in a later layer below the source; the source exits its SOUTH face - /// and the target enters its NORTH face. - /// - [Fact] - public void AxisTransform_Apply_Down_PlacesTargetSouthWithCorrectFaces() - { - var graph = PlaceChain(LayoutDirection.Down); - - // Coordinate mapping: target sits below the source. - Assert.True(graph.AugY[1] > graph.AugY[0]); - - // Port faces: source on its SOUTH (bottom) face, target on its NORTH (top) face. - var (source, target) = EndpointsOf(graph, 0); - Assert.Equal(Bottom(graph, 0), source.Y, Tolerance); - Assert.Equal(Top(graph, 1), target.Y, Tolerance); - } - - /// - /// LEFT places the target in a later layer to the left of the source; the source exits its - /// WEST face and the target enters its EAST face. - /// - [Fact] - public void AxisTransform_Apply_Left_PlacesTargetWestWithCorrectFaces() - { - var graph = PlaceChain(LayoutDirection.Left); - - // Coordinate mapping: target sits to the left of the source. - Assert.True(graph.AugX[1] < graph.AugX[0]); - - // Port faces: source on its WEST (left) face, target on its EAST (right) face. - var (source, target) = EndpointsOf(graph, 0); - Assert.Equal(Left(graph, 0), source.X, Tolerance); - Assert.Equal(Right(graph, 1), target.X, Tolerance); - } - - /// - /// UP places the target in a later layer above the source; the source exits its NORTH face - /// and the target enters its SOUTH face. - /// - [Fact] - public void AxisTransform_Apply_Up_PlacesTargetNorthWithCorrectFaces() - { - var graph = PlaceChain(LayoutDirection.Up); - - // Coordinate mapping: target sits above the source. - Assert.True(graph.AugY[1] < graph.AugY[0]); - - // Port faces: source on its NORTH (top) face, target on its SOUTH (bottom) face. - var (source, target) = EndpointsOf(graph, 0); - Assert.Equal(Top(graph, 0), source.Y, Tolerance); - Assert.Equal(Bottom(graph, 1), target.Y, Tolerance); - } - - /// The routed waypoints remain orthogonal after a RIGHT transform. - [Fact] - public void AxisTransform_Apply_Right_ProducesOrthogonalWaypoints() => - AssertWaypointsOrthogonal(LayoutDirection.Right); - - /// The routed waypoints remain orthogonal after a DOWN transform. - [Fact] - public void AxisTransform_Apply_Down_ProducesOrthogonalWaypoints() => - AssertWaypointsOrthogonal(LayoutDirection.Down); - - /// The routed waypoints remain orthogonal after a LEFT transform. - [Fact] - public void AxisTransform_Apply_Left_ProducesOrthogonalWaypoints() => - AssertWaypointsOrthogonal(LayoutDirection.Left); - - /// The routed waypoints remain orthogonal after an UP transform. - [Fact] - public void AxisTransform_Apply_Up_ProducesOrthogonalWaypoints() => - AssertWaypointsOrthogonal(LayoutDirection.Up); - - /// - /// Asserts every consecutive segment of the routed polyline is axis-aligned for the given - /// direction. - /// - /// The layout direction under test. - private static void AssertWaypointsOrthogonal(LayoutDirection direction) - { - var graph = PlaceChain(direction); - - var polyline = graph.Waypoints[0]; - for (var i = 0; i + 1 < polyline.Count; i++) - { - var dx = Math.Abs(polyline[i + 1].X - polyline[i].X); - var dy = Math.Abs(polyline[i + 1].Y - polyline[i].Y); - Assert.True( - dx < Tolerance || dy < Tolerance, - $"Segment {i} is not axis-aligned for {direction}: dx={dx}, dy={dy}."); - } - } - - /// Runs the full default pipeline for a two-node chain in the given direction. - private static LayeredGraph PlaceChain(LayoutDirection direction) - { - var nodes = new List { new(NodeWidth, NodeHeight), new(NodeWidth, NodeHeight) }; - var edges = new List { new(0, 1) }; - var graph = new LayeredGraph(nodes, edges, direction); - var pipeline = LayeredLayoutPipeline.Builder() - .Direction(direction) - .Hierarchy(HierarchyHandling.Flat) - .AddDefaultStages() - .Build(); - pipeline.Run(graph); - return graph; - } - - /// Returns the first (source) and last (target) waypoint of the given edge. - private static (Point2D Source, Point2D Target) EndpointsOf(LayeredGraph graph, int edge) - { - var polyline = graph.Waypoints[edge]; - return (polyline[0], polyline[^1]); - } - - // Node screen rects are always the intrinsic node size drawn at the transformed top-left. - private static double Left(LayeredGraph graph, int node) => graph.AugX[node]; - - private static double Right(LayeredGraph graph, int node) => graph.AugX[node] + NodeWidth; - - private static double Top(LayeredGraph graph, int node) => graph.AugY[node]; - - private static double Bottom(LayeredGraph graph, int node) => graph.AugY[node] + NodeHeight; -} diff --git a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/BrandesKopfPlacerTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/BrandesKopfPlacerTests.cs deleted file mode 100644 index f5e5a80a..00000000 --- a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/BrandesKopfPlacerTests.cs +++ /dev/null @@ -1,95 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Layout.Engine; -using DemaConsulting.SysML2Tools.Layout.Engine.Layered; - -namespace DemaConsulting.SysML2Tools.Tests.Layout.Engine.Layered; - -/// -/// Tests for covering assignment of finite coordinate arrays -/// and left-to-right column placement in layer order. -/// -public sealed class BrandesKopfPlacerTests -{ - /// - /// A chain (0->1->2) receives a finite X and Y for every augmented node and per-column - /// arrays sized to the number of layers. - /// - [Fact] - public void BrandesKopfPlacer_Apply_ChainGraph_AssignsCoordinateArrays() - { - // Arrange / Act: place a three-node chain. - var graph = BuildPlacedGraph( - new List { new(60, 40), new(60, 40), new(60, 40) }, - new List { new(0, 1), new(1, 2) }); - - // Assert: coordinate arrays are sized correctly and finite. - Assert.Equal(graph.AugNodes.Count, graph.AugX.Length); - Assert.Equal(graph.AugNodes.Count, graph.AugY.Length); - Assert.Equal(graph.Groups.Count, graph.ColumnX.Length); - Assert.Equal(graph.Groups.Count, graph.MaxColWidth.Length); - Assert.All(graph.AugX, x => Assert.True(double.IsFinite(x))); - Assert.All(graph.AugY, y => Assert.True(double.IsFinite(y))); - } - - /// - /// Layer columns are placed left to right, so each column's left edge is strictly greater - /// than the previous column's left edge. - /// - [Fact] - public void BrandesKopfPlacer_Apply_ColumnsAreLeftToRightInLayerOrder() - { - // Arrange / Act: place a three-node chain (three layers). - var graph = BuildPlacedGraph( - new List { new(60, 40), new(60, 40), new(60, 40) }, - new List { new(0, 1), new(1, 2) }); - - // Assert: column left edges strictly increase. - for (var l = 1; l < graph.ColumnX.Length; l++) - { - Assert.True( - graph.ColumnX[l] > graph.ColumnX[l - 1], - $"Column {l} left edge {graph.ColumnX[l]} is not right of column {l - 1} ({graph.ColumnX[l - 1]})."); - } - } - - /// - /// A symmetric fork (0->1, 0->2) places the source vertically centered between its two - /// targets, proving the four-pass balanced median placement rather than a naive single-pass - /// (e.g. top-aligned) placement, which would leave the source level with the first target. - /// - [Fact] - public void BrandesKopfPlacer_Apply_SymmetricFork_CentersSourceBetweenTargets() - { - // Arrange / Act: one source fanning out to two equal-size targets in the next layer. - var graph = BuildPlacedGraph( - new List { new(60, 40), new(60, 40), new(60, 40) }, - new List { new(0, 1), new(0, 2) }); - - // The two targets occupy layer 1; the source occupies layer 0. - var sourceY = graph.AugY[0]; - var targetMidpoint = (graph.AugY[1] + graph.AugY[2]) / 2.0; - - // Assert: the balanced placement centers the source between its two targets, and the two - // targets are genuinely separated (so the centering is a non-trivial result). - Assert.NotEqual(graph.AugY[1], graph.AugY[2]); - Assert.Equal(targetMidpoint, sourceY, 3); - } - - /// Runs the stages up to and including placement and returns the graph. - /// Input nodes. - /// Input edges. - /// The graph after the Brandes-Köpf placement stage. - private static LayeredGraph BuildPlacedGraph(List nodes, List edges) - { - var graph = new LayeredGraph(nodes, edges, LayoutDirection.Right); - new CycleBreaker().Apply(graph); - new LayerAssigner().Apply(graph); - new LongEdgeSplitter().Apply(graph); - new CrossingMinimizer().Apply(graph); - new BrandesKopfPlacer().Apply(graph); - return graph; - } -} diff --git a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/ComponentPackerTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/ComponentPackerTests.cs deleted file mode 100644 index 07e5aac6..00000000 --- a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/ComponentPackerTests.cs +++ /dev/null @@ -1,348 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Layout; -using DemaConsulting.SysML2Tools.Layout.Engine; -using DemaConsulting.SysML2Tools.Layout.Engine.Layered; - -namespace DemaConsulting.SysML2Tools.Tests.Layout.Engine.Layered; - -/// -/// Tests for covering connected-component detection, non-overlapping -/// packing of disconnected components, the single-component pass-through, the empty/null guards, -/// deterministic ordering, and translation of edge waypoints with their owning component. -/// -public sealed class ComponentPackerTests -{ - /// Logical pixel size used for every test node. - private const double NodeWidth = 60.0; - - /// Logical pixel height used for every test node. - private const double NodeHeight = 40.0; - - /// - /// A connected core (chain 0->1->2) plus a disconnected node keeps the core as one - /// component: the core's internal arrangement matches laying the core out on its own. - /// - [Fact] - public void ComponentPacker_Apply_ConnectedCore_StaysOneComponent() - { - // Arrange: a connected chain {0,1,2} and an isolated node 3. - var nodes = new List { new(NodeWidth, NodeHeight), new(NodeWidth, NodeHeight), new(NodeWidth, NodeHeight), new(NodeWidth, NodeHeight) }; - var edges = new List { new(0, 1), new(1, 2) }; - var graph = new LayeredGraph(nodes, edges, LayoutDirection.Right); - - // Act: pack the disconnected graph. - ComponentPacker.WithDefaultStages().Apply(graph); - - // Reference: lay the connected core out on its own and normalize to its bounding box. - var coreNodes = new List { new(NodeWidth, NodeHeight), new(NodeWidth, NodeHeight), new(NodeWidth, NodeHeight) }; - var coreEdges = new List { new(0, 1), new(1, 2) }; - var core = RunDefaultStages(coreNodes, coreEdges); - var coreMinX = new[] { core.AugX[0], core.AugX[1], core.AugX[2] }.Min(); - var coreMinY = new[] { core.AugY[0], core.AugY[1], core.AugY[2] }.Min(); - - // The packed core is component 0 (offset 0,0), so its coordinates are already normalized. - for (var i = 0; i < 3; i++) - { - Assert.Equal(core.AugX[i] - coreMinX, graph.AugX[i], 6); - Assert.Equal(core.AugY[i] - coreMinY, graph.AugY[i], 6); - } - } - - /// - /// Three disconnected nodes become three components placed in distinct, non-overlapping boxes. - /// - [Fact] - public void ComponentPacker_Apply_DisconnectedSingletons_PackSeparately() - { - // Arrange: three isolated nodes, no edges. - var nodes = new List { new(NodeWidth, NodeHeight), new(NodeWidth, NodeHeight), new(NodeWidth, NodeHeight) }; - var graph = new LayeredGraph(nodes, [], LayoutDirection.Right); - - // Act. - ComponentPacker.WithDefaultStages().Apply(graph); - - // Assert: no two node boxes overlap. - for (var a = 0; a < nodes.Count; a++) - { - for (var b = a + 1; b < nodes.Count; b++) - { - Assert.False( - BoxesOverlap(graph, a, b), - $"nodes {a} and {b} should not overlap"); - } - } - } - - /// - /// A single connected component is a transparent pass-through: the packed output equals the - /// output of running the same inner stages directly on the graph. - /// - [Fact] - public void ComponentPacker_Apply_SingleComponent_EqualsDefaultPipeline() - { - // Arrange: a diamond (one connected component). - var nodes = new List { new(NodeWidth, NodeHeight), new(NodeWidth, NodeHeight), new(NodeWidth, NodeHeight), new(NodeWidth, NodeHeight) }; - var edges = new List { new(0, 1), new(0, 2), new(1, 3), new(2, 3) }; - - var packed = new LayeredGraph(CloneNodes(nodes), CloneEdges(edges), LayoutDirection.Right); - var reference = RunDefaultStages(CloneNodes(nodes), CloneEdges(edges)); - - // Act. - ComponentPacker.WithDefaultStages().Apply(packed); - - // Assert: node coordinates and routed waypoints match the default pipeline exactly. - for (var i = 0; i < nodes.Count; i++) - { - Assert.Equal(reference.AugX[i], packed.AugX[i]); - Assert.Equal(reference.AugY[i], packed.AugY[i]); - } - - Assert.Equal(reference.Waypoints.Count, packed.Waypoints.Count); - for (var k = 0; k < reference.Waypoints.Count; k++) - { - Assert.Equal(reference.Waypoints[k].Count, packed.Waypoints[k].Count); - for (var p = 0; p < reference.Waypoints[k].Count; p++) - { - Assert.Equal(reference.Waypoints[k][p].X, packed.Waypoints[k][p].X); - Assert.Equal(reference.Waypoints[k][p].Y, packed.Waypoints[k][p].Y); - } - } - } - - /// An empty graph is laid out as a no-op without throwing. - [Fact] - public void ComponentPacker_Apply_EmptyGraph_IsNoOp() - { - // Arrange: a graph with no nodes or edges. - var graph = new LayeredGraph([], [], LayoutDirection.Right); - - // Act. - ComponentPacker.WithDefaultStages().Apply(graph); - - // Assert: nothing was produced. - Assert.Empty(graph.AugX); - Assert.Empty(graph.AugY); - Assert.Empty(graph.Waypoints); - } - - /// A null graph throws . - [Fact] - public void ComponentPacker_Apply_NullGraph_Throws() - { - Assert.Throws(() => ComponentPacker.WithDefaultStages().Apply(null!)); - } - - /// - /// Repeated layouts of the same disconnected graph produce identical coordinates, confirming a - /// deterministic component order. - /// - [Fact] - public void ComponentPacker_Apply_ComponentOrder_IsDeterministic() - { - // Arrange: two components — an edge {0,1} and an isolated node 2. - static LayeredGraph Build() - { - var nodes = new List { new(NodeWidth, NodeHeight), new(NodeWidth, NodeHeight), new(NodeWidth, NodeHeight) }; - var edges = new List { new(0, 1) }; - return new LayeredGraph(nodes, edges, LayoutDirection.Right); - } - - var first = Build(); - var second = Build(); - - // Act. - ComponentPacker.WithDefaultStages().Apply(first); - ComponentPacker.WithDefaultStages().Apply(second); - - // Assert: identical placements. - for (var i = 0; i < 3; i++) - { - Assert.Equal(first.AugX[i], second.AugX[i]); - Assert.Equal(first.AugY[i], second.AugY[i]); - } - } - - /// - /// Each edge's routed waypoints are translated with its component so the endpoints stay on the - /// boxes of the offset component, not at the local origin. - /// - [Fact] - public void ComponentPacker_Apply_Waypoints_TranslatedWithComponent() - { - // Arrange: two components, each with one internal edge: {0->1} and {2->3}. - var nodes = new List { new(NodeWidth, NodeHeight), new(NodeWidth, NodeHeight), new(NodeWidth, NodeHeight), new(NodeWidth, NodeHeight) }; - var edges = new List { new(0, 1), new(2, 3) }; - var graph = new LayeredGraph(nodes, edges, LayoutDirection.Right); - - // Act. - ComponentPacker.WithDefaultStages().Apply(graph); - - // Assert: every edge's first/last waypoint lies on its source/target box (within tolerance). - const double eps = 3.0; - AssertWaypointOnBox(graph, edge: 0, point: 0, node: 0, eps); - AssertWaypointOnBox(graph, edge: 0, point: -1, node: 1, eps); - AssertWaypointOnBox(graph, edge: 1, point: 0, node: 2, eps); - AssertWaypointOnBox(graph, edge: 1, point: -1, node: 3, eps); - } - - /// - /// A single connected component containing a parallel edge and a self-loop lays out without - /// throwing. The pipeline drops the self-loop and de-duplicates the parallel pair, so the - /// produced Waypoints are per-acyclic-edge and index-aligned with - /// — the same contract as the default pipeline — and every input edge resolves by its endpoints. - /// - [Fact] - public void ComponentPacker_Apply_SingleComponent_ParallelAndSelfEdges_ProducesAlignedWaypoints() - { - // Arrange: one connected component {0,1,2} with a parallel 0->1 pair, a 1->1 self-loop, and 1->2. - var nodes = new List { new(NodeWidth, NodeHeight), new(NodeWidth, NodeHeight), new(NodeWidth, NodeHeight) }; - var edges = new List { new(0, 1), new(0, 1), new(1, 1), new(1, 2) }; - var graph = new LayeredGraph(nodes, edges, LayoutDirection.Right); - - // Act: must not throw despite the parallel pair and self-loop. - ComponentPacker.WithDefaultStages().Apply(graph); - - // Assert: Waypoints are index-aligned with the acyclic edge set (the routing contract). - Assert.Equal(graph.Acyclic.Count, graph.Waypoints.Count); - - // Assert: the self-loop is dropped and the parallel pair collapses to a single acyclic edge. - Assert.DoesNotContain(graph.Acyclic, e => e.Source == e.Target); - Assert.Equal(2, graph.Acyclic.Count); - Assert.Contains(graph.Acyclic, e => e.Source == 0 && e.Target == 1); - Assert.Contains(graph.Acyclic, e => e.Source == 1 && e.Target == 2); - - // Assert: every non-self input edge (including the duplicate) resolves to a routed polyline whose - // endpoints lie on the correct boxes. - var routed = BuildRouted(graph); - const double eps = 3.0; - AssertEndpointsOnBoxes(graph, routed[(0, 1)], 0, 1, eps); - AssertEndpointsOnBoxes(graph, routed[(1, 2)], 1, 2, eps); - } - - /// - /// Two connected components, each containing a parallel edge and a self-loop, lay out without - /// throwing (the multi-component merge path). The merged graph exposes one Waypoint per acyclic - /// edge, index-aligned with , and each edge's polyline is - /// translated onto its own component's (offset) boxes. - /// - [Fact] - public void ComponentPacker_Apply_MultiComponent_ParallelAndSelfEdges_MergesAlignedWaypoints() - { - // Arrange: components {0,1} and {2,3}, each with a parallel pair and a self-loop. - var nodes = new List { new(NodeWidth, NodeHeight), new(NodeWidth, NodeHeight), new(NodeWidth, NodeHeight), new(NodeWidth, NodeHeight) }; - var edges = new List { new(0, 1), new(0, 1), new(0, 0), new(2, 3), new(2, 3), new(3, 3) }; - var graph = new LayeredGraph(nodes, edges, LayoutDirection.Right); - - // Act: must not throw despite parallel pairs and self-loops spanning two components. - ComponentPacker.WithDefaultStages().Apply(graph); - - // Assert: Waypoints are index-aligned with the acyclic edge set (same contract as single-component). - Assert.Equal(graph.Acyclic.Count, graph.Waypoints.Count); - - // Assert: self-loops dropped, parallel pairs collapsed — one acyclic edge per component. - Assert.DoesNotContain(graph.Acyclic, e => e.Source == e.Target); - Assert.Equal(2, graph.Acyclic.Count); - Assert.Contains(graph.Acyclic, e => e.Source == 0 && e.Target == 1); - Assert.Contains(graph.Acyclic, e => e.Source == 2 && e.Target == 3); - - // Assert: each edge's polyline endpoints lie on its own component's (offset) boxes. - var routed = BuildRouted(graph); - const double eps = 3.0; - AssertEndpointsOnBoxes(graph, routed[(0, 1)], 0, 1, eps); - AssertEndpointsOnBoxes(graph, routed[(2, 3)], 2, 3, eps); - } - - /// Builds a (source, target) to polyline lookup over a graph's acyclic edge set. - /// The laid-out graph. - /// A dictionary keyed by each acyclic edge's endpoints. - private static Dictionary<(int Source, int Target), IReadOnlyList> BuildRouted(LayeredGraph graph) - { - var routed = new Dictionary<(int Source, int Target), IReadOnlyList>(); - for (var k = 0; k < graph.Acyclic.Count; k++) - { - routed[(graph.Acyclic[k].Source, graph.Acyclic[k].Target)] = graph.Waypoints[k]; - } - - return routed; - } - - /// Asserts that a polyline's first/last waypoints lie on its source/target boxes. - /// The laid-out graph. - /// The routed polyline. - /// Source node index. - /// Target node index. - /// Tolerance in logical pixels. - private static void AssertEndpointsOnBoxes(LayeredGraph graph, IReadOnlyList waypoints, int source, int target, double eps) - { - var first = waypoints[0]; - var last = waypoints[^1]; - Assert.InRange(first.X, graph.AugX[source] - eps, graph.AugX[source] + graph.Nodes[source].Width + eps); - Assert.InRange(first.Y, graph.AugY[source] - eps, graph.AugY[source] + graph.Nodes[source].Height + eps); - Assert.InRange(last.X, graph.AugX[target] - eps, graph.AugX[target] + graph.Nodes[target].Width + eps); - Assert.InRange(last.Y, graph.AugY[target] - eps, graph.AugY[target] + graph.Nodes[target].Height + eps); - } - - /// Runs the default ELK-layered stage sequence directly on a fresh graph. - /// Input nodes. - /// Input edges. - /// The graph after the full default stage sequence. - private static LayeredGraph RunDefaultStages(List nodes, List edges) - { - var graph = new LayeredGraph(nodes, edges, LayoutDirection.Right); - new CycleBreaker().Apply(graph); - new LayerAssigner().Apply(graph); - new LongEdgeSplitter().Apply(graph); - new CrossingMinimizer().Apply(graph); - new BrandesKopfPlacer().Apply(graph); - new PortDistributor().Apply(graph); - new OrthogonalRouter().Apply(graph); - new LongEdgeJoiner().Apply(graph); - new AxisTransform().Apply(graph); - return graph; - } - - /// Returns a fresh copy of a node list. - /// Nodes to copy. - /// A new list with the same node values. - private static List CloneNodes(List nodes) => [.. nodes]; - - /// Returns a fresh copy of an edge list. - /// Edges to copy. - /// A new list with the same edge values. - private static List CloneEdges(List edges) => [.. edges]; - - /// Determines whether the boxes of two real nodes overlap. - /// The laid-out graph. - /// First node index. - /// Second node index. - /// when the two boxes intersect. - private static bool BoxesOverlap(LayeredGraph graph, int a, int b) - { - var ax = graph.AugX[a]; - var ay = graph.AugY[a]; - var bx = graph.AugX[b]; - var by = graph.AugY[b]; - var overlapX = ax < bx + graph.Nodes[b].Width && bx < ax + graph.Nodes[a].Width; - var overlapY = ay < by + graph.Nodes[b].Height && by < ay + graph.Nodes[a].Height; - return overlapX && overlapY; - } - - /// Asserts that a given waypoint of an edge lies on a node's box, within a tolerance. - /// The laid-out graph. - /// Edge index (original edge order). - /// Waypoint index; a negative value counts from the end. - /// The node whose box the waypoint should lie on. - /// Tolerance in logical pixels. - private static void AssertWaypointOnBox(LayeredGraph graph, int edge, int point, int node, double eps) - { - var waypoints = graph.Waypoints[edge]; - var p = point < 0 ? waypoints[waypoints.Count + point] : waypoints[point]; - var x = graph.AugX[node]; - var y = graph.AugY[node]; - Assert.InRange(p.X, x - eps, x + graph.Nodes[node].Width + eps); - Assert.InRange(p.Y, y - eps, y + graph.Nodes[node].Height + eps); - } -} diff --git a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/CrossingMinimizerTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/CrossingMinimizerTests.cs deleted file mode 100644 index 62b9d9d2..00000000 --- a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/CrossingMinimizerTests.cs +++ /dev/null @@ -1,164 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Layout.Engine; -using DemaConsulting.SysML2Tools.Layout.Engine.Layered; - -namespace DemaConsulting.SysML2Tools.Tests.Layout.Engine.Layered; - -/// -/// Tests for covering grouping of augmented nodes by layer and -/// that the grouping partitions every augmented node exactly once. -/// -public sealed class CrossingMinimizerTests -{ - /// - /// A diamond (0->1, 0->2, 1->3, 2->3) yields three layer groups holding the - /// source, the two branches, and the join, with per-layer counts 1, 2, 1. - /// - [Fact] - public void CrossingMinimizer_Apply_TwoLayerGraph_GroupsNodesByLayer() - { - // Arrange: a four-node diamond. - var nodes = new List { new(60, 40), new(60, 40), new(60, 40), new(60, 40) }; - var edges = new List { new(0, 1), new(0, 2), new(1, 3), new(2, 3) }; - var graph = BuildGroupedGraph(nodes, edges); - - // Assert: three layers with counts 1, 2, 1. - Assert.Equal(3, graph.Groups.Count); - Assert.Single(graph.Groups[0]); - Assert.Equal(2, graph.Groups[1].Count); - Assert.Single(graph.Groups[2]); - } - - /// - /// The groups partition every augmented node (including the dummy nodes of a long edge) - /// exactly once. - /// - [Fact] - public void CrossingMinimizer_Apply_AllAugmentedNodesAppearInGroups() - { - // Arrange: a chain plus a span-three edge (introduces two dummy nodes). - var nodes = new List { new(60, 40), new(60, 40), new(60, 40), new(60, 40) }; - var edges = new List { new(0, 1), new(1, 2), new(2, 3), new(0, 3) }; - var graph = BuildGroupedGraph(nodes, edges); - - // Act: collect every index that appears across all layer groups. - var indices = graph.Groups.SelectMany(g => g).OrderBy(i => i).ToList(); - - // Assert: the groups contain exactly the indices 0..AugNodes.Count-1, each once. - Assert.Equal(graph.AugNodes.Count, indices.Count); - Assert.Equal(Enumerable.Range(0, graph.AugNodes.Count), indices); - } - - /// - /// A two-layer ordering whose natural (index) order crosses every edge is reordered by the - /// barycenter sweep so that the total number of edge crossings strictly decreases. - /// - [Fact] - public void CrossingMinimizer_Apply_CrossingProneOrdering_ReducesCrossings() - { - // Arrange: two layers wired in fully-reversed order (0->5, 1->4, 2->3) so that the - // natural index order crosses every pair of edges. - var nodes = new List - { - new(60, 40), new(60, 40), new(60, 40), new(60, 40), new(60, 40), new(60, 40), - }; - var edges = new List { new(0, 5), new(1, 4), new(2, 3) }; - var graph = new LayeredGraph(nodes, edges, LayoutDirection.Right); - new CycleBreaker().Apply(graph); - new LayerAssigner().Apply(graph); - new LongEdgeSplitter().Apply(graph); - - // Baseline crossing count for the natural (index-order) layer grouping. - var initialGroups = GroupByLayerInIndexOrder(graph.AugNodes); - var before = CountCrossings(initialGroups, graph.AugEdges, graph.AugNodes); - - // Act: run the barycenter crossing-minimization sweep. - new CrossingMinimizer().Apply(graph); - - // Assert: the sweep strictly reduces the number of edge crossings. - var after = CountCrossings(graph.Groups, graph.AugEdges, graph.AugNodes); - Assert.True(before > 0, "the natural ordering should contain crossings to reduce"); - Assert.True(after < before, $"expected fewer crossings after ordering (before={before}, after={after})"); - } - - /// Groups augmented-node indices by layer, preserving the natural index order. - /// The augmented nodes. - /// One ordered index list per layer, in ascending node-index order. - private static List> GroupByLayerInIndexOrder(List augNodes) - { - var maxLayer = augNodes.Max(a => a.Layer); - var groups = new List>(); - for (var l = 0; l <= maxLayer; l++) - { - groups.Add([]); - } - - for (var i = 0; i < augNodes.Count; i++) - { - groups[augNodes[i].Layer].Add(i); - } - - return groups; - } - - /// - /// Counts the total number of edge crossings implied by the given per-layer orderings. - /// - /// The per-layer ordered index lists. - /// The augmented sub-edges (each spanning one layer). - /// The augmented nodes (for layer lookup). - /// The number of crossing edge pairs. - private static int CountCrossings(List> groups, List augEdges, List augNodes) - { - var pos = new Dictionary(); - foreach (var group in groups) - { - for (var i = 0; i < group.Count; i++) - { - pos[group[i]] = i; - } - } - - var crossings = 0; - for (var a = 0; a < augEdges.Count; a++) - { - for (var b = a + 1; b < augEdges.Count; b++) - { - var e1 = augEdges[a]; - var e2 = augEdges[b]; - - // Only edges leaving the same layer can cross in the corridor between two layers. - if (augNodes[e1.Source].Layer != augNodes[e2.Source].Layer) - { - continue; - } - - int u1 = pos[e1.Source], v1 = pos[e1.Target]; - int u2 = pos[e2.Source], v2 = pos[e2.Target]; - if ((u1 < u2 && v1 > v2) || (u1 > u2 && v1 < v2)) - { - crossings++; - } - } - } - - return crossings; - } - - /// Runs the stages up to and including crossing minimization and returns the graph. - /// Input nodes. - /// Input edges. - /// The graph after the crossing-minimization stage. - private static LayeredGraph BuildGroupedGraph(List nodes, List edges) - { - var graph = new LayeredGraph(nodes, edges, LayoutDirection.Right); - new CycleBreaker().Apply(graph); - new LayerAssigner().Apply(graph); - new LongEdgeSplitter().Apply(graph); - new CrossingMinimizer().Apply(graph); - return graph; - } -} diff --git a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/CycleBreakerTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/CycleBreakerTests.cs deleted file mode 100644 index cb2b3710..00000000 --- a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/CycleBreakerTests.cs +++ /dev/null @@ -1,100 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Layout.Engine; -using DemaConsulting.SysML2Tools.Layout.Engine.Layered; - -namespace DemaConsulting.SysML2Tools.Tests.Layout.Engine.Layered; - -/// -/// Tests for covering production of an acyclic edge set from a -/// cyclic graph and removal of self-loops and duplicate edges. -/// -public sealed class CycleBreakerTests -{ - /// - /// A three-node cycle (0->1->2->0) is broken into an edge set with no directed - /// cycle, while keeping all three connections represented. - /// - [Fact] - public void CycleBreaker_Apply_GraphWithCycle_ProducesAcyclicEdgeSet() - { - // Arrange: a tight three-node cycle. - var nodes = new List { new(60, 40), new(60, 40), new(60, 40) }; - var edges = new List { new(0, 1), new(1, 2), new(2, 0) }; - var graph = new LayeredGraph(nodes, edges, LayoutDirection.Right); - - // Act: break cycles. - new CycleBreaker().Apply(graph); - - // Assert: all three connections survive and the result is acyclic. - Assert.Equal(3, graph.Acyclic.Count); - Assert.True(IsAcyclic(graph.N, graph.Acyclic), "Resulting edge set still contains a cycle."); - } - - /// - /// Self-loops are dropped and duplicate source-target pairs are collapsed, so the acyclic - /// set contains each distinct connection once and no self-loop. - /// - [Fact] - public void CycleBreaker_Apply_SelfLoopsAndDuplicates_AreRemoved() - { - // Arrange: a self-loop on node 0, a duplicated 0->1 edge, and a 1->2 edge. - var nodes = new List { new(60, 40), new(60, 40), new(60, 40) }; - var edges = new List { new(0, 0), new(0, 1), new(0, 1), new(1, 2) }; - var graph = new LayeredGraph(nodes, edges, LayoutDirection.Right); - - // Act: break cycles. - new CycleBreaker().Apply(graph); - - // Assert: only the two distinct, non-self connections remain. - Assert.Equal(2, graph.Acyclic.Count); - Assert.DoesNotContain(graph.Acyclic, e => e.Source == e.Target); - } - - /// Returns true when the edge set induces no directed cycle (Kahn's algorithm). - /// Number of nodes. - /// Directed edges to test. - /// true if the edges form a directed acyclic graph; otherwise false. - private static bool IsAcyclic(int n, IReadOnlyList edges) - { - var inDegree = new int[n]; - var outgoing = new List[n]; - for (var i = 0; i < n; i++) - { - outgoing[i] = []; - } - - foreach (var e in edges) - { - outgoing[e.Source].Add(e.Target); - inDegree[e.Target]++; - } - - var queue = new Queue(); - for (var i = 0; i < n; i++) - { - if (inDegree[i] == 0) - { - queue.Enqueue(i); - } - } - - var processed = 0; - while (queue.Count > 0) - { - var u = queue.Dequeue(); - processed++; - foreach (var v in outgoing[u]) - { - if (--inDegree[v] == 0) - { - queue.Enqueue(v); - } - } - } - - return processed == n; - } -} diff --git a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LayerAssignerTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LayerAssignerTests.cs deleted file mode 100644 index dd25cd85..00000000 --- a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LayerAssignerTests.cs +++ /dev/null @@ -1,60 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Layout.Engine; -using DemaConsulting.SysML2Tools.Layout.Engine.Layered; - -namespace DemaConsulting.SysML2Tools.Tests.Layout.Engine.Layered; - -/// -/// Tests for covering monotonic layer assignment along a chain and -/// longest-path layer assignment for a diamond graph. -/// -public sealed class LayerAssignerTests -{ - /// - /// A linear chain (0->1->2) receives strictly increasing, contiguous layer - /// indices 0, 1, 2. - /// - [Fact] - public void LayerAssigner_Apply_LinearChain_AssignsMonotonicLayers() - { - // Arrange: a three-node chain. - var nodes = new List { new(60, 40), new(60, 40), new(60, 40) }; - var edges = new List { new(0, 1), new(1, 2) }; - var graph = new LayeredGraph(nodes, edges, LayoutDirection.Right); - - // Act: break cycles, then assign layers. - new CycleBreaker().Apply(graph); - new LayerAssigner().Apply(graph); - - // Assert: contiguous, strictly increasing layers along the chain. - Assert.Equal(0, graph.NodeLayers[0]); - Assert.Equal(1, graph.NodeLayers[1]); - Assert.Equal(2, graph.NodeLayers[2]); - } - - /// - /// A diamond (0->1, 0->2, 1->3, 2->3) places the source at layer 0, both - /// branches at layer 1, and the join at the longest-path layer 2. - /// - [Fact] - public void LayerAssigner_Apply_DiamondGraph_AssignsLongestPathLayers() - { - // Arrange: a four-node diamond. - var nodes = new List { new(60, 40), new(60, 40), new(60, 40), new(60, 40) }; - var edges = new List { new(0, 1), new(0, 2), new(1, 3), new(2, 3) }; - var graph = new LayeredGraph(nodes, edges, LayoutDirection.Right); - - // Act: break cycles, then assign layers. - new CycleBreaker().Apply(graph); - new LayerAssigner().Apply(graph); - - // Assert: source at 0, branches at 1, join at the longest-path layer 2. - Assert.Equal(0, graph.NodeLayers[0]); - Assert.Equal(1, graph.NodeLayers[1]); - Assert.Equal(1, graph.NodeLayers[2]); - Assert.Equal(2, graph.NodeLayers[3]); - } -} diff --git a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LayeredGraphTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LayeredGraphTests.cs deleted file mode 100644 index 6a29b659..00000000 --- a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LayeredGraphTests.cs +++ /dev/null @@ -1,64 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Layout.Engine; -using DemaConsulting.SysML2Tools.Layout.Engine.Layered; - -namespace DemaConsulting.SysML2Tools.Tests.Layout.Engine.Layered; - -/// -/// Tests for covering null-argument validation and that the -/// supplied nodes, edges, direction, and node count are preserved. -/// -public sealed class LayeredGraphTests -{ - /// - /// Constructing a graph with a null node list throws . - /// - [Fact] - public void LayeredGraph_Constructor_NullNodes_ThrowsArgumentNullException() - { - // Arrange: a valid edge list but a null node list. - var edges = new List(); - - // Act / Assert: construction rejects the null node list. - Assert.Throws( - () => new LayeredGraph(null!, edges, LayoutDirection.Right)); - } - - /// - /// Constructing a graph with a null edge list throws . - /// - [Fact] - public void LayeredGraph_Constructor_NullEdges_ThrowsArgumentNullException() - { - // Arrange: a valid node list but a null edge list. - var nodes = new List { new(60, 40) }; - - // Act / Assert: construction rejects the null edge list. - Assert.Throws( - () => new LayeredGraph(nodes, null!, LayoutDirection.Right)); - } - - /// - /// Construction preserves the supplied nodes, edges, and direction and reports the - /// input node count. - /// - [Fact] - public void LayeredGraph_Constructor_ValidInput_StoresNodesEdgesDirectionAndCount() - { - // Arrange: three nodes and two edges. - var nodes = new List { new(60, 40), new(60, 40), new(60, 40) }; - var edges = new List { new(0, 1), new(1, 2) }; - - // Act: construct the shared graph state. - var graph = new LayeredGraph(nodes, edges, LayoutDirection.Right); - - // Assert: the inputs are preserved unchanged. - Assert.Same(nodes, graph.Nodes); - Assert.Same(edges, graph.Edges); - Assert.Equal(LayoutDirection.Right, graph.Direction); - Assert.Equal(3, graph.N); - } -} diff --git a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LayeredLayoutPipelineTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LayeredLayoutPipelineTests.cs deleted file mode 100644 index ac71be52..00000000 --- a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LayeredLayoutPipelineTests.cs +++ /dev/null @@ -1,81 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Layout.Engine; -using DemaConsulting.SysML2Tools.Layout.Engine.Layered; - -namespace DemaConsulting.SysML2Tools.Tests.Layout.Engine.Layered; - -/// -/// Tests for covering default-stage assembly and -/// execution, rejection of recursive hierarchy handling, and null-argument validation. -/// -public sealed class LayeredLayoutPipelineTests -{ - /// - /// The default pipeline runs over a three-node chain without throwing and produces one - /// connector waypoint list per input edge. - /// - [Fact] - public void LayeredLayoutPipeline_RunDefaultStages_ChainGraph_PopulatesWaypointsWithoutThrowing() - { - // Arrange: a 0->1->2 chain and a default pipeline. - var nodes = new List { new(60, 40), new(60, 40), new(60, 40) }; - var edges = new List { new(0, 1), new(1, 2) }; - var graph = new LayeredGraph(nodes, edges, LayoutDirection.Right); - var pipeline = LayeredLayoutPipeline.Builder() - .Direction(LayoutDirection.Right) - .Hierarchy(HierarchyHandling.Flat) - .AddDefaultStages() - .Build(); - - // Act: run the full pipeline. - pipeline.Run(graph); - - // Assert: one waypoint list was produced per edge. - Assert.Equal(edges.Count, graph.Waypoints.Count); - } - - /// - /// Building a pipeline with recursive hierarchy handling throws - /// because the mode is not yet implemented. - /// - [Fact] - public void LayeredLayoutPipeline_Build_RecursiveHierarchy_ThrowsNotSupportedException() - { - // Arrange: a builder configured for recursive hierarchy handling. - var builder = LayeredLayoutPipeline.Builder() - .Hierarchy(HierarchyHandling.Recursive) - .AddDefaultStages(); - - // Act / Assert: building rejects the unsupported mode. - Assert.Throws(() => builder.Build()); - } - - /// - /// Adding a null stage to the builder throws . - /// - [Fact] - public void LayeredLayoutPipeline_AddStage_NullStage_ThrowsArgumentNullException() - { - // Arrange: a fresh builder. - var builder = LayeredLayoutPipeline.Builder(); - - // Act / Assert: a null stage is rejected. - Assert.Throws(() => builder.AddStage(null!)); - } - - /// - /// Running a pipeline with a null graph throws . - /// - [Fact] - public void LayeredLayoutPipeline_Run_NullGraph_ThrowsArgumentNullException() - { - // Arrange: a built default pipeline. - var pipeline = LayeredLayoutPipeline.Builder().AddDefaultStages().Build(); - - // Act / Assert: running with a null graph is rejected. - Assert.Throws(() => pipeline.Run(null!)); - } -} diff --git a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LayeredPipelineEquivalenceTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LayeredPipelineEquivalenceTests.cs deleted file mode 100644 index bd9713ed..00000000 --- a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LayeredPipelineEquivalenceTests.cs +++ /dev/null @@ -1,238 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Layout; -using DemaConsulting.SysML2Tools.Layout.Engine; - -namespace DemaConsulting.SysML2Tools.Tests.Layout.Engine.Layered; - -/// -/// Behavior-preservation gate for the layered-pipeline refactor. Feeds many graphs through -/// both the legacy monolithic engine () -/// and the refactored façade and asserts that every -/// field of the resulting LayerResult is bit-for-bit identical: rectangles, total -/// dimensions, node layers, and every connector waypoint. No numeric tolerance is allowed. -/// -public sealed class LayeredPipelineEquivalenceTests -{ - /// - /// The pipeline reproduces the legacy engine exactly across two thousand pseudo-randomly - /// generated graphs spanning empty, disconnected, cyclic, parallel-edge, self-loop, and - /// long-edge topologies with varied node sizes. - /// - [Fact] - public void Pipeline_MatchesLegacyOracle_OnRandomGraphs() - { - for (var seed = 0; seed < 2000; seed++) - { - var (nodes, edges) = BuildRandomGraph(seed); - AssertEquivalent($"random seed {seed}", nodes, edges); - } - } - - /// An empty graph produces identical (degenerate) results from both engines. - [Fact] - public void Pipeline_MatchesLegacyOracle_OnEmptyGraph() - { - AssertEquivalent("empty", [], []); - } - - /// - /// A drone-interconnect-style graph (seven heterogeneously sized parts with a mix of - /// short and long edges) produces identical results from both engines. - /// - [Fact] - public void Pipeline_MatchesLegacyOracle_OnDroneLikeGraph() - { - var nodes = new List - { - new(150, 54), // airframe - new(150, 54), // battery - new(230, 94), // controller - new(150, 54), // gps - new(150, 54), // imu - new(153, 54), // motors - new(209, 54), // propellers - }; - var edges = new List - { - new(2, 0), - new(2, 1), - new(2, 3), - new(2, 4), - new(2, 5), - new(5, 6), - new(0, 6), - }; - - AssertEquivalent("drone-like", nodes, edges); - } - - /// - /// A larger workstation-interconnect-style graph (twelve parts, multiple layers, a long - /// edge spanning three layers, and a back edge) produces identical results. - /// - [Fact] - public void Pipeline_MatchesLegacyOracle_OnWorkstationLikeGraph() - { - var nodes = new List(); - for (var i = 0; i < 12; i++) - { - nodes.Add(new LayerNode(120 + (i % 4 * 30), 50 + (i % 3 * 20))); - } - - var edges = new List - { - new(0, 1), - new(0, 2), - new(1, 3), - new(2, 3), - new(3, 4), - new(3, 5), - new(4, 6), - new(5, 7), - new(6, 8), - new(7, 8), - new(0, 8), // long edge spanning several layers - new(8, 0), // back edge (cycle) - new(9, 3), - new(10, 4), - new(11, 5), - }; - - AssertEquivalent("workstation-like", nodes, edges); - } - - /// - /// Canonical named topologies (chain, diamond, long edge, self loop, parallel edges, - /// disconnected components, and a tight cycle) each produce identical results. - /// - /// A human-readable name for the topology, used in failure messages. - [Theory] - [InlineData("chain")] - [InlineData("diamond")] - [InlineData("longedge")] - [InlineData("selfloop")] - [InlineData("parallel")] - [InlineData("disconnected")] - [InlineData("cycle")] - public void Pipeline_MatchesLegacyOracle_OnNamedTopologies(string name) - { - var (nodes, edges) = name switch - { - "chain" => (Sizes(3), Edges((0, 1), (1, 2))), - "diamond" => (Sizes(4), Edges((0, 1), (0, 2), (1, 3), (2, 3))), - "longedge" => (Sizes(4), Edges((0, 1), (1, 2), (2, 3), (0, 3))), - "selfloop" => (Sizes(3), Edges((0, 0), (0, 1), (1, 2))), - "parallel" => (Sizes(2), Edges((0, 1), (0, 1), (0, 1))), - "disconnected" => (Sizes(6), Edges((0, 1), (2, 3), (4, 5))), - "cycle" => (Sizes(3), Edges((0, 1), (1, 2), (2, 0))), - _ => (Sizes(0), Edges()), - }; - - AssertEquivalent(name, nodes, edges); - } - - /// Builds a list of uniformly sized nodes. - private static List Sizes(int count) - { - var nodes = new List(count); - for (var i = 0; i < count; i++) - { - nodes.Add(new LayerNode(60, 40)); - } - - return nodes; - } - - /// Builds an edge list from source/target index pairs. - private static List Edges(params (int Source, int Target)[] pairs) - { - var edges = new List(pairs.Length); - foreach (var (s, t) in pairs) - { - edges.Add(new LayerEdge(s, t)); - } - - return edges; - } - - /// - /// Deterministically builds a pseudo-random graph for the given seed, exercising varied - /// node counts and sizes plus arbitrary edges (including self loops, parallel edges, - /// cycles, and multi-layer spans). - /// - private static (List Nodes, List Edges) BuildRandomGraph(int seed) - { - var rng = new Random(seed); - var n = rng.Next(0, 16); - - var nodes = new List(n); - for (var i = 0; i < n; i++) - { - nodes.Add(new LayerNode(rng.Next(40, 240), rng.Next(30, 120))); - } - - var edges = new List(); - if (n > 0) - { - var m = rng.Next(0, (n * 2) + 1); - for (var e = 0; e < m; e++) - { - edges.Add(new LayerEdge(rng.Next(0, n), rng.Next(0, n))); - } - } - - return (nodes, edges); - } - - /// - /// Runs both engines on the same input and asserts bit-for-bit equality of every field - /// of the resulting LayerResult. - /// - private static void AssertEquivalent(string context, List nodes, List edges) - { - var expected = LegacyInterconnectionLayoutEngineOracle.Place(nodes, edges); - var actual = InterconnectionLayoutEngine.Place(nodes, edges); - - AssertExact($"{context}: TotalWidth", expected.TotalWidth, actual.TotalWidth); - AssertExact($"{context}: TotalHeight", expected.TotalHeight, actual.TotalHeight); - - Assert.Equal(expected.Rects.Count, actual.Rects.Count); - for (var i = 0; i < expected.Rects.Count; i++) - { - AssertExact($"{context}: Rects[{i}].X", expected.Rects[i].X, actual.Rects[i].X); - AssertExact($"{context}: Rects[{i}].Y", expected.Rects[i].Y, actual.Rects[i].Y); - AssertExact($"{context}: Rects[{i}].Width", expected.Rects[i].Width, actual.Rects[i].Width); - AssertExact($"{context}: Rects[{i}].Height", expected.Rects[i].Height, actual.Rects[i].Height); - } - - Assert.Equal(expected.NodeLayers.Count, actual.NodeLayers.Count); - for (var i = 0; i < expected.NodeLayers.Count; i++) - { - Assert.Equal(expected.NodeLayers[i], actual.NodeLayers[i]); - } - - Assert.Equal(expected.ConnectorWaypoints.Count, actual.ConnectorWaypoints.Count); - for (var e = 0; e < expected.ConnectorWaypoints.Count; e++) - { - var ew = expected.ConnectorWaypoints[e]; - var aw = actual.ConnectorWaypoints[e]; - Assert.Equal(ew.Count, aw.Count); - for (var w = 0; w < ew.Count; w++) - { - AssertExact($"{context}: Waypoint[{e}][{w}].X", ew[w].X, aw[w].X); - AssertExact($"{context}: Waypoint[{e}][{w}].Y", ew[w].Y, aw[w].Y); - } - } - } - - /// Asserts that two doubles are identical at the bit level (no tolerance). - private static void AssertExact(string context, double expected, double actual) - { - Assert.True( - BitConverter.DoubleToInt64Bits(expected) == BitConverter.DoubleToInt64Bits(actual), - $"{context}: expected {expected:R} but got {actual:R}"); - } -} diff --git a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LegacyInterconnectionLayoutEngineOracle.cs b/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LegacyInterconnectionLayoutEngineOracle.cs deleted file mode 100644 index c1f22fb8..00000000 --- a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LegacyInterconnectionLayoutEngineOracle.cs +++ /dev/null @@ -1,1617 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Layout; -using DemaConsulting.SysML2Tools.Layout.Engine; - -namespace DemaConsulting.SysML2Tools.Tests.Layout.Engine.Layered; - -/// -/// Frozen, byte-for-byte copy of the pre-refactor monolithic interconnection layout engine. -/// Retained only as the behavior oracle for the layered-pipeline equivalence tests; the product -/// engine is now a thin façade over the pipeline, and -/// this copy proves the refactor preserves its output exactly. -/// -internal static class LegacyInterconnectionLayoutEngineOracle -{ - /// Vertical gap between adjacent nodes stacked within the same layer. - private const double NodeSpacing = 30.0; - - /// Minimum corridor width (node-node spacing) between adjacent columns. - private const double CorridorMinWidth = 70.0; - - /// Slot-to-slot spacing within a corridor (ELK edgeEdgeSpacing). - private const double EdgeSpacing = 16.0; - - /// Clearance from corridor edge to the nearest routing slot (ELK edgeNodeSpacing). - private const double ConnectorClearance = 10.0; - - /// Uniform padding added around the placed content. - private const double Padding = 20.0; - - /// Number of Barycenter ordering sweeps (down + up = one round). - private const int BarycentricSweeps = 4; - - /// Tolerance for treating a segment as straight (no bend points needed). - private const double StraightTolerance = 1e-6; - - // ── Augmented-graph types ──────────────────────────────────────────────── - - /// A node in the augmented Sugiyama graph (real part box or long-edge dummy). - private sealed record AugNode(double Width, double Height, int Layer, bool IsDummy = false); - - /// A sub-edge in the augmented graph after long-edge splitting. - private readonly record struct AugEdge(int Source, int Target, int OrigEdgeIndex); - - // ── Routing types ──────────────────────────────────────────────────────── - - /// - /// A routing segment: one sub-edge crossing a single corridor, carrying its ELK port - /// coordinates and the slot assigned by topological numbering. - /// - private sealed class Segment - { - public int AugEdgeIndex; - - /// Y coordinate of the EAST (source-layer) port (ELK incomingConnectionCoordinates). - public double SourceY; - - /// Y coordinate of the WEST (target-layer) port (ELK outgoingConnectionCoordinates). - public double TargetY; - - /// Min of SourceY and TargetY, used for ELK crossing-count computation. - public double Lo; - - /// Max of SourceY and TargetY, used for ELK crossing-count computation. - public double Hi; - - /// Assigned routing slot (column offset within corridor). Set by topological numbering. - public int RoutingSlot; - - /// Remaining in-degree during topological BFS; initialised from Incoming.Count. - public int InWeight; - - - /// Dependencies for which this segment must precede the target. - public List Outgoing { get; } = []; - - /// Dependencies for which a predecessor must precede this segment. - public List Incoming { get; } = []; - } - - /// - /// A directed dependency between two routing segments: the source segment prefers - /// to occupy a lower slot than the target segment (ELK HyperEdgeSegmentDependency). - /// - private sealed class SegDep - { - public Segment Source { get; } - public Segment Target { get; } - public int Weight { get; } - - public SegDep(Segment src, Segment tgt, int weight) - { - Source = src; - Target = tgt; - Weight = weight; - src.Outgoing.Add(this); - tgt.Incoming.Add(this); - } - - /// Removes this dependency from both endpoints' adjacency lists. - public void Remove() - { - Source.Outgoing.Remove(this); - Target.Incoming.Remove(this); - } - } - - // ── Public entry point ─────────────────────────────────────────────────── - - /// - /// Computes a full Sugiyama layered placement and ELK-style slot routing for the given nodes - /// and directed edges, returning box positions and orthogonal connector waypoints. - /// - /// Input nodes to place, in caller order. - /// Directed edges between nodes (by index). - /// Placement result with rects, layer assignments, and connector waypoints. - public static LayerResult Place( - IReadOnlyList nodes, - IReadOnlyList edges) - { - ArgumentNullException.ThrowIfNull(nodes); - ArgumentNullException.ThrowIfNull(edges); - - var n = nodes.Count; - if (n == 0) - { - return new LayerResult([], 2.0 * Padding, 2.0 * Padding, [], []); - } - - // Phase 1: make the graph acyclic and assign longest-path layers. - var acyclic = BreakCycles(n, edges); - var nodeLayers = AssignLayers(n, acyclic); - - // Phase 1.5: insert one dummy node per intermediate layer on each long edge. - var (augNodes, augEdges) = InsertLongEdgeDummies(n, nodes, nodeLayers, acyclic); - - // Phase 2: Barycenter ordering on the augmented graph. - var groups = GroupByLayerAug(augNodes); - OrderLayersAug(groups, augNodes.Count, augEdges); - - // Phase 3: coordinate assignment (stacking + corridor widths). - var (augX, augY, columnX, maxColWidth) = AssignCoordinatesAug(augNodes, groups, augEdges); - - // Phase 4: port distribution + ELK slot routing. - var waypoints = BuildRoutesAug(n, nodes, augNodes, augEdges, acyclic, augX, augY, columnX, maxColWidth); - - // Assemble result. - var rects = new Rect[n]; - for (var i = 0; i < n; i++) - { - rects[i] = new Rect(augX[i], augY[i], nodes[i].Width, nodes[i].Height); - } - - var lastLayer = columnX.Length - 1; - var totalWidth = columnX[lastLayer] + maxColWidth[lastLayer] + Padding; - var totalHeight = Padding; - for (var i = 0; i < n; i++) - { - totalHeight = Math.Max(totalHeight, augY[i] + nodes[i].Height + Padding); - } - - return new LayerResult(rects, totalWidth, totalHeight, nodeLayers, waypoints); - } - - // ── Phase 1: Cycle breaking ────────────────────────────────────────────── - - /// - /// Returns the edge set with cycle-causing back edges reversed, using DFS to classify any - /// edge to a node still on the recursion stack as a back edge. - /// - private static List BreakCycles(int n, IReadOnlyList edges) - { - var adjacency = new List[n]; - for (var i = 0; i < n; i++) - { - adjacency[i] = []; - } - - foreach (var e in edges) - { - if (e.Source != e.Target) - { - adjacency[e.Source].Add(e.Target); - } - } - - var visited = new bool[n]; - var onStack = new bool[n]; - var backEdges = new HashSet<(int, int)>(); - - void Dfs(int u) - { - visited[u] = true; - onStack[u] = true; - foreach (var v in adjacency[u]) - { - if (onStack[v]) - { - backEdges.Add((u, v)); - } - else if (!visited[v]) - { - Dfs(v); - } - } - - // S4143: standard DFS coloring — onStack[u] is read by recursive calls between the - // true/false assignments; the analyzer cannot see across the recursion. -#pragma warning disable S4143 - onStack[u] = false; -#pragma warning restore S4143 - } - - for (var i = 0; i < n; i++) - { - if (!visited[i]) - { - Dfs(i); - } - } - - var result = new List(); - var seen = new HashSet<(int, int)>(); - foreach (var e in edges) - { - if (e.Source == e.Target) - { - continue; - } - - var (from, to) = backEdges.Contains((e.Source, e.Target)) - ? (e.Target, e.Source) - : (e.Source, e.Target); - - if (from != to && seen.Add((from, to))) - { - result.Add(new LayerEdge(from, to)); - } - } - - return result; - } - - // ── Phase 1: Longest-path layer assignment ─────────────────────────────── - - /// - /// Assigns each node to a layer equal to the length of its longest incoming path - /// (sources at layer 0, sinks at the maximum layer). - /// - private static int[] AssignLayers(int n, List edges) - { - var outgoing = new List[n]; - var inDegree = new int[n]; - for (var i = 0; i < n; i++) - { - outgoing[i] = []; - } - - foreach (var e in edges) - { - outgoing[e.Source].Add(e.Target); - inDegree[e.Target]++; - } - - var layer = new int[n]; - var queue = new Queue(); - for (var i = 0; i < n; i++) - { - if (inDegree[i] == 0) - { - queue.Enqueue(i); - } - } - - var remaining = (int[])inDegree.Clone(); - while (queue.Count > 0) - { - var u = queue.Dequeue(); - foreach (var v in outgoing[u]) - { - layer[v] = Math.Max(layer[v], layer[u] + 1); - if (--remaining[v] == 0) - { - queue.Enqueue(v); - } - } - } - - return layer; - } - - // ── Phase 1.5: Long-edge dummy insertion (ELK LongEdgeSplitter) ────────── - - /// - /// Splits every edge spanning more than one layer into a chain of unit-span sub-edges by - /// inserting one zero-size dummy node at each intermediate layer, following - /// ELK's LongEdgeSplitter phase. - /// - private static (List AugNodes, List AugEdges) InsertLongEdgeDummies( - int n, - IReadOnlyList nodes, - int[] nodeLayers, - List acyclic) - { - var augNodes = new List(n + acyclic.Count); - for (var i = 0; i < n; i++) - { - augNodes.Add(new AugNode(nodes[i].Width, nodes[i].Height, nodeLayers[i])); - } - - var augEdges = new List(acyclic.Count * 2); - for (var e = 0; e < acyclic.Count; e++) - { - var edge = acyclic[e]; - var span = nodeLayers[edge.Target] - nodeLayers[edge.Source]; - - if (span <= 0) - { - continue; - } - - if (span == 1) - { - augEdges.Add(new AugEdge(edge.Source, edge.Target, e)); - } - else - { - // Chain: src → d1 → d2 → … → tgt with one dummy per intermediate layer. - var prev = edge.Source; - for (var l = nodeLayers[edge.Source] + 1; l < nodeLayers[edge.Target]; l++) - { - var dIdx = augNodes.Count; - augNodes.Add(new AugNode(0.0, 0.0, l, IsDummy: true)); - augEdges.Add(new AugEdge(prev, dIdx, e)); - prev = dIdx; - } - - augEdges.Add(new AugEdge(prev, edge.Target, e)); - } - } - - return (augNodes, augEdges); - } - - // ── Phase 2: Barycenter ordering on augmented graph ────────────────────── - - /// Groups augmented-node indices by layer. - private static List> GroupByLayerAug(List augNodes) - { - var maxLayer = augNodes.Max(a => a.Layer); - var groups = new List>(maxLayer + 1); - for (var l = 0; l <= maxLayer; l++) - { - groups.Add([]); - } - - for (var i = 0; i < augNodes.Count; i++) - { - groups[augNodes[i].Layer].Add(i); - } - - return groups; - } - - /// - /// Runs Barycenter sweeps over the augmented graph - /// (real nodes and dummies) to reduce edge crossings. - /// - private static void OrderLayersAug(List> groups, int numAug, List augEdges) - { - var leftNeighbors = new List[numAug]; - var rightNeighbors = new List[numAug]; - for (var i = 0; i < numAug; i++) - { - leftNeighbors[i] = []; - rightNeighbors[i] = []; - } - - foreach (var ae in augEdges) - { - rightNeighbors[ae.Source].Add(ae.Target); - leftNeighbors[ae.Target].Add(ae.Source); - } - - for (var sweep = 0; sweep < BarycentricSweeps; sweep++) - { - if (sweep % 2 == 0) - { - for (var l = 1; l < groups.Count; l++) - { - SortByBarycenter(groups[l], groups[l - 1], leftNeighbors); - } - } - else - { - for (var l = groups.Count - 2; l >= 0; l--) - { - SortByBarycenter(groups[l], groups[l + 1], rightNeighbors); - } - } - } - } - - /// - /// Sorts by the average position of each node's neighbors in - /// ; nodes without neighbors keep their current relative order. - /// - private static void SortByBarycenter(List layer, List adjacentLayer, List[] neighbors) - { - var position = new Dictionary(); - for (var i = 0; i < adjacentLayer.Count; i++) - { - position[adjacentLayer[i]] = i; - } - - var keyed = new List<(int Node, double Key, int Original)>(layer.Count); - for (var i = 0; i < layer.Count; i++) - { - var node = layer[i]; - var ns = neighbors[node].Where(position.ContainsKey).ToList(); - var key = ns.Count > 0 ? ns.Average(x => position[x]) : i; - keyed.Add((node, key, i)); - } - - keyed.Sort((a, b) => - { - var c = a.Key.CompareTo(b.Key); - return c != 0 ? c : a.Original.CompareTo(b.Original); - }); - - for (var i = 0; i < layer.Count; i++) - { - layer[i] = keyed[i].Node; - } - } - - // ── Phase 3: Coordinate assignment (BK Y-placement + ELK placeNodesHorizontally) ────── - - /// - /// Assigns absolute X and Y coordinates to all augmented nodes. - /// - /// - /// - /// Y assignment follows the Brandes-Köpf (BK) four-layout balanced algorithm - /// (BKNodePlacer + BKAligner + BKCompactor): four independent - /// vertical alignments (DOWN/UP × RIGHT/LEFT) are compacted and their per-node medians - /// averaged to produce port-aligned, crossing-minimized vertical positions. - /// - /// - /// X assignment follows ELK's LGraphUtil.placeNodesHorizontally: dummies are placed at - /// the horizontal center of their column; real nodes are left-aligned to their column start. - /// Corridor widths are derived from sub-edge counts per corridor. - /// - /// - private static (double[] AugX, double[] AugY, double[] ColumnX, double[] MaxColWidth) AssignCoordinatesAug( - List augNodes, - List> groups, - List augEdges) - { - var layerCount = groups.Count; - var numAug = augNodes.Count; - - // Maximum real-node width per layer (dummies have width 0). - var maxColWidth = new double[layerCount]; - for (var i = 0; i < numAug; i++) - { - if (!augNodes[i].IsDummy) - { - maxColWidth[augNodes[i].Layer] = Math.Max(maxColWidth[augNodes[i].Layer], augNodes[i].Width); - } - } - - // Sub-edges per corridor: one sub-edge per augEdge, keyed on source layer. - var corridorEdgeCounts = new int[Math.Max(1, layerCount - 1)]; - foreach (var ae in augEdges) - { - var l = augNodes[ae.Source].Layer; - if (l >= 0 && l < corridorEdgeCounts.Length) - { - corridorEdgeCounts[l]++; - } - } - - // Column X positions. Corridor width: ELK routingWidth = 2*edgeNodeSpacing + (n-1)*edgeEdgeSpacing. - var columnX = new double[layerCount]; - columnX[0] = Padding; - for (var l = 1; l < layerCount; l++) - { - var cnt = corridorEdgeCounts[l - 1]; - var corridorWidth = cnt > 0 - ? Math.Max(CorridorMinWidth, (2.0 * ConnectorClearance) + ((cnt - 1) * EdgeSpacing)) - : CorridorMinWidth; - columnX[l] = columnX[l - 1] + maxColWidth[l - 1] + corridorWidth; - } - - // Assign X coordinates: dummies are centered in their column; real nodes left-align. - var augX = new double[numAug]; - for (var l = 0; l < layerCount; l++) - { - var colCenterX = columnX[l] + (maxColWidth[l] / 2.0); - foreach (var ni in groups[l]) - { - augX[ni] = augNodes[ni].IsDummy ? colCenterX : columnX[l]; - } - } - - // Assign Y coordinates using the Brandes-Köpf balanced four-layout algorithm. - var augY = BkAssignYCoordinates(augNodes, groups, augEdges); - - return (augX, augY, columnX, maxColWidth); - } - - // ── Phase 3 helpers: Brandes-Köpf Y-coordinate assignment ──────────────── - - /// - /// Assigns Y coordinates to all augmented nodes using the four-layout Brandes-Köpf - /// balanced algorithm, producing port-aligned vertical positions. - /// - /// - /// - /// Runs four independent (vDown × hRight) alignment-and-compaction pipelines, one for - /// each combination of vertical scan direction (DOWN = top-to-bottom, UP = bottom-to-top) - /// and horizontal scan direction (RIGHT = layer 0 → max, LEFT = layer max → 0). The - /// per-node average of the two middle values of the four results gives the final balanced - /// position. Padding is added once at the end. - /// - /// - /// Corresponds to ELK's BKNodePlacer orchestrating BKAligner and BKCompactor. - /// - /// - private static double[] BkAssignYCoordinates( - List augNodes, - List> groups, - List augEdges) - { - var numAug = augNodes.Count; - - // Step 0: precompute port positions, layer positions, and neighbor-edge lists. - BkPreprocess( - augNodes, groups, augEdges, - out var posInLayer, - out var srcRelPortY, - out var tgtRelPortY, - out var leftNeighborEdges, - out var rightNeighborEdges); - - // Step 1: mark type-1 conflicts (non-inner segments crossing inner segments). - var markedEdges = BkMarkConflicts(augNodes, groups, augEdges, posInLayer, leftNeighborEdges); - - // Steps 2–4: compute four independent (vDown × hRight) layouts. - var layouts = new double[4][]; - for (var d = 0; d < 4; d++) - { - // d=0: DOWN+RIGHT, d=1: UP+RIGHT, d=2: DOWN+LEFT, d=3: UP+LEFT. - var vDown = d % 2 == 0; - var hRight = d < 2; - - // Step 2: vertical alignment — builds block chains along the scan direction. - BkVerticalAlignment( - augNodes, groups, augEdges, posInLayer, - leftNeighborEdges, rightNeighborEdges, - markedEdges, vDown, hRight, - out var root, out var align); - - // Step 3: inside-block shift — adjusts nodes within each block to align ports. - var innerShift = BkInsideBlockShift( - augNodes, augEdges, root, align, - srcRelPortY, tgtRelPortY, hRight, - rightNeighborEdges, leftNeighborEdges); - - // Step 4: horizontal compaction — assigns absolute Y to each block root. - var blockY = BkHorizontalCompaction(augNodes, groups, root, align, innerShift, posInLayer, vDown); - - // Compute absolute Y for every node in this layout. - var y = new double[numAug]; - for (var i = 0; i < numAug; i++) - { - y[i] = blockY[root[i]] + innerShift[i]; - } - - layouts[d] = y; - } - - // Step 5: normalize each layout and return the balanced (median average) result. - return BkBalancedLayout(layouts, numAug); - } - - /// - /// Precomputes the lookup tables required by all four Brandes-Köpf layout passes: - /// per-node layer position, relative port Y offsets, and sorted neighbor-edge lists. - /// - /// - /// - /// Port positions follow ELK's BKAligner preprocessing convention: a dummy node - /// contributes relative port Y = 0 (the wire passes straight through); a real node - /// distributes its ports evenly between insets, or - /// at the midpoint when it has only one port on that face. - /// - /// - /// [v] lists augmented-edge indices whose target is v, - /// sorted ascending by the source node's position within its layer — used for RIGHT-direction - /// alignment. [v] lists augmented-edge indices whose - /// source is v, sorted ascending by the target node's position — used for LEFT-direction - /// alignment. Both lists are stable-sorted by edge index as a tiebreaker. - /// - /// - private static void BkPreprocess( - List augNodes, - List> groups, - List augEdges, - out int[] posInLayer, - out double[] srcRelPortY, - out double[] tgtRelPortY, - out List[] leftNeighborEdges, - out List[] rightNeighborEdges) - { - var numAug = augNodes.Count; - var numEdges = augEdges.Count; - - // Position of each node within its layer group (0-based index in groups[layer]). - posInLayer = new int[numAug]; - for (var l = 0; l < groups.Count; l++) - { - for (var k = 0; k < groups[l].Count; k++) - { - posInLayer[groups[l][k]] = k; - } - } - - // Collect outgoing/incoming edge indices per node for port computation. - // Capture posInLayer in a local so it can be used inside lambda expressions - // (C# prohibits capturing out parameters directly in lambdas — CS1628). - var posLayer = posInLayer; - var outEdges = new List[numAug]; - var inEdges = new List[numAug]; - for (var i = 0; i < numAug; i++) - { - outEdges[i] = []; - inEdges[i] = []; - } - - for (var ei = 0; ei < numEdges; ei++) - { - outEdges[augEdges[ei].Source].Add(ei); - inEdges[augEdges[ei].Target].Add(ei); - } - - // srcRelPortY[e]: Y of the source (EAST) port relative to source node's top-left. - // Dummy nodes pass the wire through at Y = 0 relative to their own position. - srcRelPortY = new double[numEdges]; - for (var ni = 0; ni < numAug; ni++) - { - var edges = outEdges[ni]; - if (edges.Count == 0) - { - continue; - } - - if (augNodes[ni].IsDummy) - { - foreach (var ei in edges) - { - srcRelPortY[ei] = 0.0; - } - } - else - { - // Sort by target's position in its layer, then edge index for stability. - var sorted = edges - .OrderBy(ei => posLayer[augEdges[ei].Target]) - .ThenBy(ei => ei) - .ToList(); - var portCount = sorted.Count; - for (var k = 0; k < portCount; k++) - { - srcRelPortY[sorted[k]] = portCount == 1 - ? augNodes[ni].Height / 2.0 - : ConnectorClearance + (k * (augNodes[ni].Height - (2.0 * ConnectorClearance)) / (portCount - 1)); - } - } - } - - // tgtRelPortY[e]: Y of the target (WEST) port relative to target node's top-left. - tgtRelPortY = new double[numEdges]; - for (var ni = 0; ni < numAug; ni++) - { - var edges = inEdges[ni]; - if (edges.Count == 0) - { - continue; - } - - if (augNodes[ni].IsDummy) - { - foreach (var ei in edges) - { - tgtRelPortY[ei] = 0.0; - } - } - else - { - // Sort by source's position in its layer, then edge index for stability. - var sorted = edges - .OrderBy(ei => posLayer[augEdges[ei].Source]) - .ThenBy(ei => ei) - .ToList(); - var portCount = sorted.Count; - for (var k = 0; k < portCount; k++) - { - tgtRelPortY[sorted[k]] = portCount == 1 - ? augNodes[ni].Height / 2.0 - : ConnectorClearance + (k * (augNodes[ni].Height - (2.0 * ConnectorClearance)) / (portCount - 1)); - } - } - } - - // leftNeighborEdges[v]: edges whose Target == v, sorted by source posInLayer. - leftNeighborEdges = new List[numAug]; - for (var i = 0; i < numAug; i++) - { - leftNeighborEdges[i] = []; - } - - for (var ei = 0; ei < numEdges; ei++) - { - leftNeighborEdges[augEdges[ei].Target].Add(ei); - } - - for (var i = 0; i < numAug; i++) - { - leftNeighborEdges[i].Sort((a, b) => - { - var c = posLayer[augEdges[a].Source].CompareTo(posLayer[augEdges[b].Source]); - return c != 0 ? c : a.CompareTo(b); - }); - } - - // rightNeighborEdges[v]: edges whose Source == v, sorted by target posInLayer. - rightNeighborEdges = new List[numAug]; - for (var i = 0; i < numAug; i++) - { - rightNeighborEdges[i] = []; - } - - for (var ei = 0; ei < numEdges; ei++) - { - rightNeighborEdges[augEdges[ei].Source].Add(ei); - } - - for (var i = 0; i < numAug; i++) - { - rightNeighborEdges[i].Sort((a, b) => - { - var c = posLayer[augEdges[a].Target].CompareTo(posLayer[augEdges[b].Target]); - return c != 0 ? c : a.CompareTo(b); - }); - } - } - - /// - /// Returns true when is incident to an inner segment — a sub-edge - /// where both endpoints are dummy nodes, forming part of a long-edge chain. - /// - /// - /// An inner segment has both endpoints as dummy nodes. The check inspects v's - /// lowest-positioned left neighbor (leftNeighborEdges[v][0]). Used by type-1 conflict - /// detection to identify nodes that anchor inner segments across layer boundaries. - /// - private static bool IsIncidentToInnerSegment( - int v, - List augNodes, - List augEdges, - List[] leftNeighborEdges) - => augNodes[v].IsDummy - && leftNeighborEdges[v].Count > 0 - && augNodes[augEdges[leftNeighborEdges[v][0]].Source].IsDummy; - - /// - /// Marks augmented edges that participate in type-1 conflicts: a non-inner segment - /// (at least one real-node endpoint) that crosses an inner segment (both endpoints - /// are dummy nodes from a long-edge chain). - /// - /// - /// Implements ELK's markConflicts procedure from BKNodePlacer. For each pair of - /// adjacent middle layers (i, i+1), the algorithm tracks the permitted source-position - /// range [k0, k1] established by each inner segment and marks any non-inner segment - /// whose source falls outside that range. Marked edges are excluded from vertical - /// alignment to preserve the topology of inner segments. - /// - private static HashSet BkMarkConflicts( - List augNodes, - List> groups, - List augEdges, - int[] posInLayer, - List[] leftNeighborEdges) - { - var markedEdges = new HashSet(); - var maxLayer = groups.Count - 1; - - // Examine middle layers: i is the source side, i+1 is the target side. - for (var i = 1; i < maxLayer; i++) - { - var leftLayerSize = groups[i].Count; - var rightLayer = groups[i + 1]; - - // k0: lower bound of the permitted source-position range for the current batch. - var k0 = 0; - - // l: left cursor into the right layer (start of the current batch). - var l = 0; - - for (var l1 = 0; l1 < rightLayer.Count; l1++) - { - var v = rightLayer[l1]; - var incident = IsIncidentToInnerSegment(v, augNodes, augEdges, leftNeighborEdges); - - // Flush the batch at the last node or at each inner-segment anchor. - if (l1 != rightLayer.Count - 1 && !incident) - { - continue; - } - - // k1: upper bound of the permitted source-position range for this batch. - var k1 = leftLayerSize - 1; - if (incident) - { - var innerEdge = leftNeighborEdges[v][0]; - k1 = posInLayer[augEdges[innerEdge].Source]; - } - - // Mark non-inner segments in the batch whose sources are out of range. - while (l <= l1) - { - var vl = rightLayer[l]; - if (!IsIncidentToInnerSegment(vl, augNodes, augEdges, leftNeighborEdges)) - { - foreach (var edgeIdx in leftNeighborEdges[vl]) - { - var k = posInLayer[augEdges[edgeIdx].Source]; - if (k < k0 || k > k1) - { - markedEdges.Add(edgeIdx); - } - } - } - - l++; - } - - k0 = k1; - } - } - - return markedEdges; - } - - /// - /// Performs vertical alignment for one Brandes-Köpf layout direction, building the - /// circular block-chain structure that groups co-aligned nodes into blocks. - /// - /// - /// - /// Implements ELK's BKAligner.verticalAlignment. Each node v is aligned with the - /// median neighbor in the previous (RIGHT) or next (LEFT) layer that is still - /// unaligned (align[v] == v) and whose layer-position satisfies the monotone - /// constraint r. The monotone constraint prevents crossings between aligned pairs. - /// - /// - /// On output, [i] identifies the block root for every node i, - /// and [i] is the next node in the circular chain - /// (root → n1 → n2 → … → root). - /// - /// - private static void BkVerticalAlignment( - List augNodes, - List> groups, - List augEdges, - int[] posInLayer, - List[] leftNeighborEdges, - List[] rightNeighborEdges, - HashSet markedEdges, - bool vDown, - bool hRight, - out int[] root, - out int[] align) - { - var numAug = augNodes.Count; - var maxLayer = groups.Count - 1; - - // Every node starts as its own singleton block. - root = new int[numAug]; - align = new int[numAug]; - for (var i = 0; i < numAug; i++) - { - root[i] = i; - align[i] = i; - } - - // Layer iteration order: RIGHT scans forward (0..maxLayer); LEFT scans in reverse. - var layerStart = hRight ? 0 : maxLayer; - var layerEnd = hRight ? maxLayer : 0; - var layerStep = hRight ? 1 : -1; - - for (var l = layerStart; hRight ? l <= layerEnd : l >= layerEnd; l += layerStep) - { - var layer = groups[l]; - - // r: monotone position constraint; tracks the last aligned neighbor's position. - var r = vDown ? -1 : int.MaxValue; - - // Node iteration order: DOWN scans forward (0..N-1); UP scans in reverse. - var nodeStart = vDown ? 0 : layer.Count - 1; - var nodeEnd = vDown ? layer.Count - 1 : 0; - var nodeStep = vDown ? 1 : -1; - - for (var ni = nodeStart; vDown ? ni <= nodeEnd : ni >= nodeEnd; ni += nodeStep) - { - var v = layer[ni]; - var neighbors = hRight ? leftNeighborEdges[v] : rightNeighborEdges[v]; - var d = neighbors.Count; - if (d == 0) - { - continue; - } - - // Median index range for this node's neighbor list. - var low = (int)Math.Floor((d + 1) / 2.0) - 1; - var high = (int)Math.Ceiling((d + 1) / 2.0) - 1; - - // Try median neighbors in vdir order; stop as soon as v is aligned. - var mStart = vDown ? low : high; - var mEnd = vDown ? high : low; - var mStep = vDown ? 1 : -1; - - for (var m = mStart; vDown ? m <= mEnd : m >= mEnd; m += mStep) - { - // Stop iterating once v has been aligned with a neighbor. - if (align[v] != v) - { - break; - } - - var edgeIdx = neighbors[m]; - var uIdx = hRight ? augEdges[edgeIdx].Source : augEdges[edgeIdx].Target; - - if (markedEdges.Contains(edgeIdx)) - { - continue; - } - - var pos = posInLayer[uIdx]; - if (vDown ? r < pos : r > pos) - { - // Extend the block chain: insert v between uIdx and the current root. - align[uIdx] = v; - root[v] = root[uIdx]; - align[v] = root[v]; - r = pos; - } - } - } - } - } - - /// - /// Computes the inside-block shift for each node: the vertical offset relative to its - /// block root that makes the connecting ports co-linear within the block. - /// - /// - /// - /// Implements ELK's BKAligner.insideBlockShift. For each block root, walks the circular - /// align chain accumulating port-position differences between consecutive nodes. The - /// accumulated shifts are then normalized so the topmost node in the block has - /// innerShift = 0, making blockY the absolute Y of the block's highest point. - /// - /// - /// For hdir=RIGHT the edge between consecutive chain nodes goes source → target (earlier - /// layer to later layer), so portDiff = srcRelPortY − tgtRelPortY. For hdir=LEFT the - /// direction reverses, so portDiff = tgtRelPortY − srcRelPortY. - /// - /// - private static double[] BkInsideBlockShift( - List augNodes, - List augEdges, - int[] root, - int[] align, - double[] srcRelPortY, - double[] tgtRelPortY, - bool hRight, - List[] rightNeighborEdges, - List[] leftNeighborEdges) - { - var numAug = augNodes.Count; - var innerShift = new double[numAug]; - - // Process each block identified by its root node. - for (var r = 0; r < numAug; r++) - { - if (root[r] != r) - { - continue; - } - - // Walk the circular chain accumulating port-difference shifts. - var spaceAbove = 0.0; - var spaceBelow = augNodes[r].Height; - - var current = r; - var next = align[r]; - while (next != r) - { - // Locate the augmented edge that links consecutive block-chain nodes. - // For RIGHT: edge current → next (earlier → later layer). - // For LEFT: edge next → current (earlier → later layer, chain walks backward). - var edgeIdx = hRight - ? BkFindEdge(rightNeighborEdges[current], augEdges, next, findByTarget: true) - : BkFindEdge(leftNeighborEdges[current], augEdges, next, findByTarget: false); - - // Port alignment: accumulate the source-minus-target port offset. - var portDiff = hRight - ? srcRelPortY[edgeIdx] - tgtRelPortY[edgeIdx] - : tgtRelPortY[edgeIdx] - srcRelPortY[edgeIdx]; - - innerShift[next] = innerShift[current] + portDiff; - spaceAbove = Math.Max(spaceAbove, -innerShift[next]); - spaceBelow = Math.Max(spaceBelow, innerShift[next] + augNodes[next].Height); - - current = next; - next = align[current]; - } - - // Normalize: add spaceAbove to all shifts so the topmost node is at offset 0. - if (spaceAbove > 0.0) - { - var node = r; - do - { - innerShift[node] += spaceAbove; - node = align[node]; - } - while (node != r); - } - } - - return innerShift; - } - - /// - /// Finds the augmented edge in that connects to - /// , searching by target when - /// is true, or by source otherwise. - /// - /// - /// Used by to locate the edge that links consecutive - /// nodes in a block chain. Because block chains are built strictly along real augmented - /// edges, the edge is always present; returning −1 would indicate a logic error in the - /// vertical-alignment phase. - /// - private static int BkFindEdge( - List edgeList, - List augEdges, - int matchNode, - bool findByTarget) - { - foreach (var ei in edgeList) - { - if ((findByTarget ? augEdges[ei].Target : augEdges[ei].Source) == matchNode) - { - return ei; - } - } - - return -1; // Should not occur: block chains are always built along real edges. - } - - /// - /// Assigns an absolute Y coordinate (blockY) to each block root by compacting blocks - /// in the vertical direction, respecting per-node heights and gaps. - /// - /// - /// - /// Implements ELK's BKCompactor.horizontalCompaction / placeBlock. For vdir=DOWN, - /// blocks are packed top-to-bottom starting at Y = 0, constrained from above by the - /// node immediately above each chain member in its layer. For vdir=UP, blocks are - /// packed bottom-to-top starting at Y = 0, constrained from below (yielding negative - /// values that are normalized in ). - /// - /// - /// The local PlaceBlock function places a block root's Y coordinate by recursively - /// ensuring every constraining block is placed first (memoized via a NaN sentinel). - /// - /// - private static double[] BkHorizontalCompaction( - List augNodes, - List> groups, - int[] root, - int[] align, - double[] innerShift, - int[] posInLayer, - bool vDown) - { - var maxLayer = groups.Count - 1; - var blockY = new double[augNodes.Count]; - Array.Fill(blockY, double.NaN); - - // Recursively place a block root, memoized by the NaN-unplaced sentinel. - void PlaceBlock(int v) - { - if (!double.IsNaN(blockY[v])) - { - return; - } - - blockY[v] = 0.0; - - // Enforce separation constraints for every node in this block's chain. - var current = v; - do - { - var layer = augNodes[current].Layer; - var idx = posInLayer[current]; - var layerNodes = groups[layer]; - - if (vDown) - { - // DOWN: constrain from above — current must be below the node at idx−1. - if (idx > 0) - { - var above = layerNodes[idx - 1]; - var aboveRoot = root[above]; - PlaceBlock(aboveRoot); - - var requiredY = blockY[aboveRoot] - + innerShift[above] - + augNodes[above].Height - + NodeSpacing - - innerShift[current]; - blockY[v] = Math.Max(blockY[v], requiredY); - } - } - else - { - // UP: constrain from below — current must be above the node at idx+1. - if (idx < layerNodes.Count - 1) - { - var below = layerNodes[idx + 1]; - var belowRoot = root[below]; - PlaceBlock(belowRoot); - - var requiredY = blockY[belowRoot] - + innerShift[below] - - NodeSpacing - - augNodes[current].Height - - innerShift[current]; - blockY[v] = Math.Min(blockY[v], requiredY); - } - } - - current = align[current]; - } - while (current != v); - } - - // Trigger placement for all block roots in vdir processing order. - var layerStart = vDown ? 0 : maxLayer; - var layerEnd = vDown ? maxLayer : 0; - var layerStep = vDown ? 1 : -1; - - for (var l = layerStart; vDown ? l <= layerEnd : l >= layerEnd; l += layerStep) - { - var layer = groups[l]; - var nodeStart = vDown ? 0 : layer.Count - 1; - var nodeEnd = vDown ? layer.Count - 1 : 0; - var nodeStep = vDown ? 1 : -1; - - for (var ni = nodeStart; vDown ? ni <= nodeEnd : ni >= nodeEnd; ni += nodeStep) - { - var v = layer[ni]; - if (root[v] == v) - { - PlaceBlock(v); - } - } - } - - return blockY; - } - - /// - /// Normalizes four independent Brandes-Köpf layouts (each shifted so its minimum Y = 0) - /// and returns the per-node average of the two middle values, giving the balanced result. - /// - /// - /// Implements ELK's BKNodePlacer balanced-layout combination. Each of the four layouts - /// has a distinct direction bias (DOWN/UP × RIGHT/LEFT); the median average cancels - /// those biases while preserving the port-alignment constraints of each individual - /// layout. is added once so all returned coordinates are absolute. - /// - private static double[] BkBalancedLayout(double[][] layouts, int numAug) - { - // Normalize each layout: shift so the minimum absolute Y across all nodes is 0. - foreach (var y in layouts) - { - var minY = y.Min(); - for (var i = 0; i < numAug; i++) - { - y[i] -= minY; - } - } - - // For each node, sort the four Y values and average the two middle ones. - var finalY = new double[numAug]; - for (var i = 0; i < numAug; i++) - { - var ys = new[] { layouts[0][i], layouts[1][i], layouts[2][i], layouts[3][i] }; - Array.Sort(ys); - finalY[i] = ((ys[1] + ys[2]) / 2.0) + Padding; - } - - return finalY; - } - - // ── Phase 4: Port distribution + ELK slot routing ──────────────────────── - - /// - /// Distributes ports on each box face and routes all corridors using ELK's - /// OrthogonalRoutingGenerator slot algorithm. - /// - private static IReadOnlyList> BuildRoutesAug( - int n, - IReadOnlyList nodes, - List augNodes, - List augEdges, - List acyclic, - double[] augX, - double[] augY, - double[] columnX, - double[] maxColWidth) - { - var numAugEdges = augEdges.Count; - var numOrigEdges = acyclic.Count; - - // Port Y values: augPortYSrc[i] = source (right face) Y; augPortYTgt[i] = target (left face) Y. - var augPortYSrc = new double[numAugEdges]; - var augPortYTgt = new double[numAugEdges]; - - // Distribute outgoing (source-side) ports on each real node's right face. - var outByNode = new Dictionary>(); - for (var ei = 0; ei < numAugEdges; ei++) - { - var src = augEdges[ei].Source; - if (!outByNode.TryGetValue(src, out var list)) - { - list = []; - outByNode[src] = list; - } - - list.Add(ei); - } - - foreach (var (ni, edgeList) in outByNode) - { - if (augNodes[ni].IsDummy) - { - // Dummies pass the wire straight through at their own Y. - foreach (var ei in edgeList) - { - augPortYSrc[ei] = augY[ni]; - } - } - else - { - // Sort by target Y center, then edge index for stability. - var sorted = edgeList - .OrderBy(ei => augY[augEdges[ei].Target] + (augNodes[augEdges[ei].Target].Height / 2.0)) - .ThenBy(ei => ei) - .ToList(); - DistributePorts(sorted, augY[ni], nodes[ni].Height, augPortYSrc); - } - } - - // Distribute incoming (target-side) ports on each real node's left face. - var inByNode = new Dictionary>(); - for (var ei = 0; ei < numAugEdges; ei++) - { - var tgt = augEdges[ei].Target; - if (!inByNode.TryGetValue(tgt, out var list)) - { - list = []; - inByNode[tgt] = list; - } - - list.Add(ei); - } - - foreach (var (ni, edgeList) in inByNode) - { - if (augNodes[ni].IsDummy) - { - foreach (var ei in edgeList) - { - augPortYTgt[ei] = augY[ni]; - } - } - else - { - var sorted = edgeList - .OrderBy(ei => augY[augEdges[ei].Source] + (augNodes[augEdges[ei].Source].Height / 2.0)) - .ThenBy(ei => ei) - .ToList(); - DistributePorts(sorted, augY[ni], nodes[ni < n ? ni : 0].Height, augPortYTgt); - } - } - - // Route each corridor using ELK's slot algorithm. - var layerCount = columnX.Length; - var augBendPoints = new List[numAugEdges]; - for (var ei = 0; ei < numAugEdges; ei++) - { - augBendPoints[ei] = []; - } - - for (var l = 0; l + 1 < layerCount; l++) - { - // Collect sub-edges whose source is in layer l. - var corridorEdges = augEdges - .Select((ae, i) => (ae, i)) - .Where(x => augNodes[x.ae.Source].Layer == l) - .ToList(); - - if (corridorEdges.Count == 0) - { - continue; - } - - // First slot starts one ConnectorClearance past the right edge of the source column. - var startPos = columnX[l] + maxColWidth[l] + ConnectorClearance; - - // Build routing segments. - var segments = corridorEdges - .Select(x => - { - var srcY = augPortYSrc[x.i]; - var tgtY = augPortYTgt[x.i]; - return new Segment - { - AugEdgeIndex = x.i, - SourceY = srcY, - TargetY = tgtY, - Lo = Math.Min(srcY, tgtY), - Hi = Math.Max(srcY, tgtY), - }; - }) - .ToList(); - - // Build crossing-based dependencies between segment pairs (ELK countCrossings). - for (var i = 0; i < segments.Count - 1; i++) - { - for (var j = i + 1; j < segments.Count; j++) - { - CreateDependency(segments[i], segments[j]); - } - } - - // Break cycles in the dependency graph by removing back edges. - BreakSegmentCycles(segments); - - // Assign routing slots via topological BFS (ELK topologicalNumbering). - TopologicalNumbering(segments); - - // Emit bend points: ELK WestToEastRoutingStrategy.calculateBendPoints. - foreach (var seg in segments) - { - if (Math.Abs(seg.SourceY - seg.TargetY) < StraightTolerance) - { - // Straight edge: no bend points, no slot consumed. - continue; - } - - var segX = startPos + (seg.RoutingSlot * EdgeSpacing); - augBendPoints[seg.AugEdgeIndex] = - [ - new Point2D(segX, seg.SourceY), - new Point2D(segX, seg.TargetY), - ]; - } - } - - // Assemble per-original-edge waypoints from sub-edge bend points (ELK LongEdgeJoiner). - var subEdgesByOrig = new List[numOrigEdges]; - for (var ei = 0; ei < numOrigEdges; ei++) - { - subEdgesByOrig[ei] = []; - } - - for (var ei = 0; ei < numAugEdges; ei++) - { - subEdgesByOrig[augEdges[ei].OrigEdgeIndex].Add(ei); - } - - // Sub-edges must be in source-to-target layer order for concatenation. - for (var ei = 0; ei < numOrigEdges; ei++) - { - subEdgesByOrig[ei].Sort((a, b) => - augNodes[augEdges[a].Source].Layer.CompareTo(augNodes[augEdges[b].Source].Layer)); - } - - var result = new IReadOnlyList[numOrigEdges]; - for (var origIdx = 0; origIdx < numOrigEdges; origIdx++) - { - var subEdges = subEdgesByOrig[origIdx]; - if (subEdges.Count == 0) - { - result[origIdx] = []; - continue; - } - - var firstSubEdge = augEdges[subEdges[0]]; - var lastSubEdge = augEdges[subEdges[^1]]; - - var srcNodeIdx = firstSubEdge.Source; - var tgtNodeIdx = lastSubEdge.Target; - - var srcRight = augX[srcNodeIdx] + augNodes[srcNodeIdx].Width; - var tgtLeft = augX[tgtNodeIdx]; - var srcPortY = augPortYSrc[subEdges[0]]; - var tgtPortY = augPortYTgt[subEdges[^1]]; - - var wps = new List - { - new(srcRight, srcPortY), - }; - - foreach (var subEdgeIdx in subEdges) - { - wps.AddRange(augBendPoints[subEdgeIdx]); - } - - wps.Add(new Point2D(tgtLeft, tgtPortY)); - result[origIdx] = wps; - } - - return result; - } - - // ── ELK OrthogonalRoutingGenerator: dependency creation ────────────────── - - /// - /// Creates a directed dependency between two segments based on ELK's crossing-count heuristic - /// (countCrossings): the segment whose left placement causes fewer crossings becomes the - /// source (lower slot) of the dependency. - /// - /// - /// For 1:1 edges each segment has exactly one EAST port (SourceY, ELK incomingConnectionCoordinates) - /// and one WEST port (TargetY, ELK outgoingConnectionCoordinates). The crossing count is computed - /// per ELK's countCrossings(posis, start, end): number of positions in posis that fall - /// within [start, end]. - /// - private static void CreateDependency(Segment s1, Segment s2) - { - // crossings1: cost of placing s1 LEFT of s2. - // outgoing(s1)=[s1.TargetY] ∩ [s2.Lo, s2.Hi] → does s1's exit cross s2's extent? - // incoming(s2)=[s2.SourceY] ∩ [s1.Lo, s1.Hi] → does s2's entry fall inside s1's extent? - var c1 = CountCrossings(s1.TargetY, s2.Lo, s2.Hi) - + CountCrossings(s2.SourceY, s1.Lo, s1.Hi); - - // crossings2: cost of placing s2 LEFT of s1. - // outgoing(s2)=[s2.TargetY] ∩ [s1.Lo, s1.Hi] - // incoming(s1)=[s1.SourceY] ∩ [s2.Lo, s2.Hi] - var c2 = CountCrossings(s2.TargetY, s1.Lo, s1.Hi) - + CountCrossings(s1.SourceY, s2.Lo, s2.Hi); - - if (c1 < c2) - { - // s1 prefers to be left of s2. - _ = new SegDep(s1, s2, c2 - c1); - } - else if (c2 < c1) - { - // s2 prefers to be left of s1. - _ = new SegDep(s2, s1, c1 - c2); - } - else if (c1 > 0) - { - // Equal non-zero crossings: unavoidable conflict — pick s1 left (deterministic tie-break). - _ = new SegDep(s1, s2, 0); - } - - // c1 == c2 == 0: both orderings cross-free; no dependency needed. - } - - /// - /// Returns 1 if falls within [, - /// ], 0 otherwise. Implements ELK's single-position - /// countCrossings. - /// - private static int CountCrossings(double pos, double lo, double hi) - => (pos >= lo && pos <= hi) ? 1 : 0; - - // ── ELK OrthogonalRoutingGenerator: cycle breaking ─────────────────────── - - /// - /// Detects and removes back edges in the dependency graph using DFS coloring, following - /// ELK's breakNonCriticalCycles. Removing a back edge accepts one additional crossing - /// in exchange for an acyclic ordering. - /// - private static void BreakSegmentCycles(List segments) - { - // 0 = unvisited, 1 = on stack (gray), 2 = done (black). - var color = new Dictionary(); - - void Dfs(Segment s) - { - color[s] = 1; - - // Snapshot the list before iterating to allow safe removal. - foreach (var dep in s.Outgoing.ToList()) - { - var t = dep.Target; - if (!color.TryGetValue(t, out var c)) - { - color[t] = 0; - Dfs(t); - } - else if (c == 1) - { - // Back edge detected: remove it to break the cycle. - dep.Remove(); - } - } - - // S4143: standard DFS coloring across recursion boundary. -#pragma warning disable S4143 - color[s] = 2; -#pragma warning restore S4143 - } - - foreach (var s in segments.Where(s => !color.ContainsKey(s))) - { - color[s] = 0; - Dfs(s); - } - } - - // ── ELK OrthogonalRoutingGenerator: topological numbering ──────────────── - - /// - /// Assigns routing slots to segments by topological BFS, implementing ELK's - /// topologicalNumbering. Each segment's slot equals the maximum predecessor slot - /// plus one (Kahn's algorithm on the dependency DAG). - /// - private static void TopologicalNumbering(List segments) - { - // Reset weights from the current (post-cycle-breaking) dependency graph. - foreach (var s in segments) - { - s.InWeight = s.Incoming.Count; - s.RoutingSlot = 0; - } - - var sources = segments.Where(s => s.InWeight == 0).ToList(); - - while (sources.Count > 0) - { - var node = sources[0]; - sources.RemoveAt(0); - - foreach (var tgt in node.Outgoing.Select(dep => dep.Target)) - { - tgt.RoutingSlot = Math.Max(tgt.RoutingSlot, node.RoutingSlot + 1); - tgt.InWeight--; - if (tgt.InWeight == 0) - { - sources.Add(tgt); - } - } - } - - // Any segments unreachable due to remaining cycles (should not occur after cycle-breaking) - // keep slot 0 and will be routed at the first available position. - } - - // ── Port distribution ───────────────────────────────────────────────────── - - /// - /// Evenly distributes port Y positions along a node face, with - /// inset from the top and bottom edges. - /// - private static void DistributePorts( - IReadOnlyList sortedEdgeIndices, - double nodeTop, - double nodeHeight, - double[] portY) - { - var count = sortedEdgeIndices.Count; - for (var k = 0; k < count; k++) - { - double y; - if (count == 1) - { - y = nodeTop + (nodeHeight / 2.0); - } - else - { - var usable = nodeHeight - (2.0 * ConnectorClearance); - y = nodeTop + ConnectorClearance + (k * usable / (count - 1)); - } - - portY[sortedEdgeIndices[k]] = Math.Clamp( - y, - nodeTop + ConnectorClearance, - nodeTop + nodeHeight - ConnectorClearance); - } - } -} diff --git a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LongEdgeJoinerTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LongEdgeJoinerTests.cs deleted file mode 100644 index 53a3172e..00000000 --- a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LongEdgeJoinerTests.cs +++ /dev/null @@ -1,81 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Layout.Engine; -using DemaConsulting.SysML2Tools.Layout.Engine.Layered; - -namespace DemaConsulting.SysML2Tools.Tests.Layout.Engine.Layered; - -/// -/// Tests for covering production of one polyline per original edge -/// and concatenation of a long edge's sub-edge bend points. -/// -public sealed class LongEdgeJoinerTests -{ - /// - /// A single short edge yields one waypoint polyline of exactly two points (its source and - /// target ports, with no bends). - /// - [Fact] - public void LongEdgeJoiner_Apply_SingleEdge_ProducesWaypointsPerOriginalEdge() - { - // Arrange / Act: join a single 0->1 edge. - var graph = BuildJoinedGraph( - new List { new(60, 40), new(60, 40) }, - new List { new(0, 1) }); - - // Assert: one polyline of two points. - Assert.Single(graph.Waypoints); - Assert.Equal(2, graph.Waypoints[0].Count); - } - - /// - /// A span-three edge's polyline begins at the source's right face and ends at the target's - /// left face, and its point count equals its sub-edges' bend points plus the two endpoints. - /// - [Fact] - public void LongEdgeJoiner_Apply_LongEdge_ConcatenatesSubEdgeBendPoints() - { - // Arrange: a chain plus a span-three edge 0->3 (original edge index 3). - var nodes = new List { new(60, 40), new(60, 40), new(60, 40), new(60, 40) }; - var graph = BuildJoinedGraph(nodes, new List { new(0, 1), new(1, 2), new(2, 3), new(0, 3) }); - - const int origIdx = 3; - var polyline = graph.Waypoints[origIdx]; - - // Sub-edge bend points that make up the long edge. - var bendTotal = 0; - for (var ei = 0; ei < graph.AugEdges.Count; ei++) - { - if (graph.AugEdges[ei].OrigEdgeIndex == origIdx) - { - bendTotal += graph.AugBendPoints[ei].Count; - } - } - - // Assert: one polyline per original edge, anchored to the boxes, count = endpoints + bends. - Assert.Equal(4, graph.Waypoints.Count); - Assert.Equal(graph.AugX[0] + nodes[0].Width, polyline[0].X); - Assert.Equal(graph.AugX[3], polyline[^1].X); - Assert.Equal(bendTotal + 2, polyline.Count); - } - - /// Runs the stages up to and including long-edge joining and returns the graph. - /// Input nodes. - /// Input edges. - /// The graph after the long-edge-joining stage. - private static LayeredGraph BuildJoinedGraph(List nodes, List edges) - { - var graph = new LayeredGraph(nodes, edges, LayoutDirection.Right); - new CycleBreaker().Apply(graph); - new LayerAssigner().Apply(graph); - new LongEdgeSplitter().Apply(graph); - new CrossingMinimizer().Apply(graph); - new BrandesKopfPlacer().Apply(graph); - new PortDistributor().Apply(graph); - new OrthogonalRouter().Apply(graph); - new LongEdgeJoiner().Apply(graph); - return graph; - } -} diff --git a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LongEdgeSplitterTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LongEdgeSplitterTests.cs deleted file mode 100644 index c70bfa81..00000000 --- a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LongEdgeSplitterTests.cs +++ /dev/null @@ -1,59 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Layout.Engine; -using DemaConsulting.SysML2Tools.Layout.Engine.Layered; - -namespace DemaConsulting.SysML2Tools.Tests.Layout.Engine.Layered; - -/// -/// Tests for covering that unit-span edges add no dummy nodes -/// and that a long edge inserts one dummy node per intermediate layer. -/// -public sealed class LongEdgeSplitterTests -{ - /// - /// A chain of unit-span edges (0->1->2) produces an augmented node list equal in - /// count to the input node list, with no dummy nodes. - /// - [Fact] - public void LongEdgeSplitter_Apply_SpanOneEdge_AddsNoDummyNodes() - { - // Arrange: a three-node chain (all edges span one layer). - var nodes = new List { new(60, 40), new(60, 40), new(60, 40) }; - var edges = new List { new(0, 1), new(1, 2) }; - var graph = new LayeredGraph(nodes, edges, LayoutDirection.Right); - - // Act: run the prerequisite stages, then split long edges. - new CycleBreaker().Apply(graph); - new LayerAssigner().Apply(graph); - new LongEdgeSplitter().Apply(graph); - - // Assert: no dummy nodes were added. - Assert.Equal(graph.N, graph.AugNodes.Count); - Assert.DoesNotContain(graph.AugNodes, a => a.IsDummy); - } - - /// - /// A span-three edge (0->3 over the chain 0->1->2->3) is split with one dummy - /// node in each of the two intermediate layers. - /// - [Fact] - public void LongEdgeSplitter_Apply_LongEdge_InsertsDummyNodesPerIntermediateLayer() - { - // Arrange: a chain plus a span-three edge 0->3. - var nodes = new List { new(60, 40), new(60, 40), new(60, 40), new(60, 40) }; - var edges = new List { new(0, 1), new(1, 2), new(2, 3), new(0, 3) }; - var graph = new LayeredGraph(nodes, edges, LayoutDirection.Right); - - // Act: run the prerequisite stages, then split long edges. - new CycleBreaker().Apply(graph); - new LayerAssigner().Apply(graph); - new LongEdgeSplitter().Apply(graph); - - // Assert: exactly two dummy nodes were inserted (layers 1 and 2). - Assert.Equal(graph.N + 2, graph.AugNodes.Count); - Assert.Equal(2, graph.AugNodes.Count(a => a.IsDummy)); - } -} diff --git a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/OrthogonalRouterBackEdgeTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/OrthogonalRouterBackEdgeTests.cs deleted file mode 100644 index 935f96db..00000000 --- a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/OrthogonalRouterBackEdgeTests.cs +++ /dev/null @@ -1,319 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Layout; -using DemaConsulting.SysML2Tools.Layout.Engine; -using DemaConsulting.SysML2Tools.Layout.Engine.Layered; -using DemaConsulting.SysML2Tools.Rendering; - -using static DemaConsulting.SysML2Tools.Layout.Engine.Layered.LayeredLayoutMetrics; - -namespace DemaConsulting.SysML2Tools.Tests.Layout.Engine.Layered; - -/// -/// Tests for the reversed (back) edge entry-approach clamp in , -/// driven by the parameter. A reversed edge is -/// stored flipped, so the consumer draws the end marker on the augmented-source face of the first -/// sub-edge; the clamp guarantees that final straight approach is at least -/// long so the marker reads as a clean -/// perpendicular entry. The clamp uses Math.Max, so at the default approach (equal to -/// ) it is a provable no-op and forward and -/// acyclic geometry stay byte-identical to the original engine. -/// -public sealed class OrthogonalRouterBackEdgeTests -{ - /// - /// At the default approach the clamp is a no-op: every edge in a cyclic graph (forward and - /// reversed alike) is byte-for-byte identical to the true-original reference engine. - /// - [Fact] - public void OrthogonalRouter_DefaultApproach_IsByteIdenticalToLegacy() - { - var nodes = new List - { - new(120, 50), new(150, 60), new(130, 40), new(140, 70), new(110, 55), - }; - var edges = new List - { - new(0, 1), new(1, 2), new(2, 3), new(3, 4), new(4, 0), - }; - - // The product engine uses the default BackEdgeEntryApproach (== ConnectorClearance), so it - // must reproduce the unmodified reference engine exactly, reversed edges included. - var expected = LegacyInterconnectionLayoutEngineOracle.Place(nodes, edges).ConnectorWaypoints; - var actual = InterconnectionLayoutEngine.Place(nodes, edges).ConnectorWaypoints; - - Assert.Equal(expected.Count, actual.Count); - for (var e = 0; e < expected.Count; e++) - { - AssertWaypointsBitIdentical($"edge {e}", expected[e], actual[e]); - } - } - - /// - /// Raising pushes every reversed edge's first - /// (marker-side) straight segment outward to at least the requested approach — longer than the - /// default — so a longer end decoration always sits on a clean straight leg. - /// - [Fact] - public void OrthogonalRouter_CustomApproach_PushesEntryStubOutward() - { - // Arrange: a five-node cycle forces a surviving reversed (long) edge. - var nodes = new List - { - new(120, 50), new(150, 60), new(130, 40), new(140, 70), new(110, 55), - }; - var edges = new List - { - new(0, 1), new(1, 2), new(2, 3), new(3, 4), new(4, 0), - }; - - const double customApproach = 40.0; - Assert.True(customApproach > ConnectorClearance, "Test requires a custom approach above the default."); - - // Act: route once at the default approach and once at the larger custom approach. - var defaultGraph = BuildJoinedGraph(nodes, edges, ConnectorClearance); - var customGraph = BuildJoinedGraph(nodes, edges, customApproach); - - // Assert: every reversed bent edge clears the custom threshold, and at least one such edge is - // strictly farther out than at the default (proving the parameter actually moved geometry). - var reversedBendCount = 0; - var movedCount = 0; - for (var e = 0; e < customGraph.Acyclic.Count; e++) - { - if (!customGraph.AcyclicReversed[e]) - { - continue; - } - - var customWaypoints = customGraph.Waypoints[e]; - var defaultWaypoints = defaultGraph.Waypoints[e]; - - // A bent edge has interior waypoints; the first segment is the marker-side stub. - if (customWaypoints.Count < 3) - { - continue; - } - - reversedBendCount++; - var customFirst = Math.Abs(customWaypoints[1].X - customWaypoints[0].X); - Assert.True( - customFirst >= customApproach, - $"Reversed edge {e} entry approach {customFirst:R} < custom approach {customApproach:R}."); - - if (defaultWaypoints.Count >= 3) - { - var defaultFirst = Math.Abs(defaultWaypoints[1].X - defaultWaypoints[0].X); - if (customFirst > defaultFirst) - { - movedCount++; - } - } - } - - Assert.True(reversedBendCount > 0, "Expected at least one reversed edge with a routing bend."); - Assert.True(movedCount > 0, "Expected the custom approach to push at least one reversed stub outward."); - } - - /// - /// At the default approach every reversed edge that bends still produces a first - /// (marker-side) straight segment at least - /// long — the original engine's behavior, preserved. - /// - [Fact] - public void OrthogonalRouter_ReversedEdge_DefaultApproachClearsClearance() - { - var nodes = new List - { - new(120, 50), new(150, 60), new(130, 40), new(140, 70), new(110, 55), - }; - var edges = new List - { - new(0, 1), new(1, 2), new(2, 3), new(3, 4), new(4, 0), - }; - var graph = BuildJoinedGraph(nodes, edges, ConnectorClearance); - - var reversedBendCount = 0; - for (var e = 0; e < graph.Acyclic.Count; e++) - { - if (!graph.AcyclicReversed[e]) - { - continue; - } - - var waypoints = graph.Waypoints[e]; - if (waypoints.Count < 3) - { - continue; - } - - reversedBendCount++; - var firstSegment = Math.Abs(waypoints[1].X - waypoints[0].X); - Assert.True( - firstSegment >= ConnectorClearance, - $"Reversed edge {e} entry approach {firstSegment:R} < ConnectorClearance {ConnectorClearance:R}."); - } - - Assert.True(reversedBendCount > 0, "Expected at least one reversed edge with a routing bend."); - } - - /// - /// In a cyclic graph, every forward (non-reversed) edge's waypoints stay byte-for-byte - /// identical to the reference engine — the clamp never touches forward geometry. - /// - [Fact] - public void OrthogonalRouter_ForwardEdges_GeometryUnchanged() - { - var nodes = new List - { - new(120, 50), new(150, 60), new(130, 40), new(140, 70), new(110, 55), - }; - var edges = new List - { - new(0, 1), new(1, 2), new(2, 3), new(3, 4), new(4, 0), - }; - - var reversed = ReversedFlags(nodes, edges); - var expected = LegacyInterconnectionLayoutEngineOracle.Place(nodes, edges).ConnectorWaypoints; - var actual = InterconnectionLayoutEngine.Place(nodes, edges).ConnectorWaypoints; - - Assert.Equal(expected.Count, actual.Count); - var forwardChecked = 0; - for (var e = 0; e < reversed.Length; e++) - { - if (reversed[e]) - { - continue; - } - - forwardChecked++; - AssertWaypointsBitIdentical($"forward edge {e}", expected[e], actual[e]); - } - - Assert.True(forwardChecked > 0, "Expected at least one forward edge in the cyclic graph."); - } - - /// - /// An acyclic graph has no reversed edges, so the clamp is a no-op: the reversed flags are - /// all false and every waypoint is byte-for-byte identical to the reference engine. - /// - [Fact] - public void OrthogonalRouter_AcyclicGraph_NoApproachChange() - { - var nodes = new List - { - new(120, 50), new(150, 60), new(130, 40), new(140, 70), - }; - var edges = new List - { - new(0, 1), new(0, 2), new(1, 3), new(2, 3), new(0, 3), - }; - - var reversed = ReversedFlags(nodes, edges); - Assert.All(reversed, flag => Assert.False(flag)); - - var expected = LegacyInterconnectionLayoutEngineOracle.Place(nodes, edges).ConnectorWaypoints; - var actual = InterconnectionLayoutEngine.Place(nodes, edges).ConnectorWaypoints; - - Assert.Equal(expected.Count, actual.Count); - for (var e = 0; e < expected.Count; e++) - { - AssertWaypointsBitIdentical($"acyclic edge {e}", expected[e], actual[e]); - } - } - - /// - /// Decoration-aware approach: when the back-edge entry approach is derived exactly as the - /// state-transition view derives it — the longest end-marker along-line length plus the corner - /// radius plus the clean-leg margin — every reversed bent edge presents a final straight leg at - /// least as long as the open-chevron decoration, so the rounded corner never intrudes the marker. - /// - [Fact] - public void OrthogonalRouter_DecorationAwareApproach_ClearsMarkerAlongLength() - { - var nodes = new List - { - new(120, 50), new(150, 60), new(130, 40), new(140, 70), new(110, 55), - }; - var edges = new List - { - new(0, 1), new(1, 2), new(2, 3), new(3, 4), new(4, 0), - }; - - // Derive the approach exactly as StateTransitionViewLayoutStrategy does for its end markers. - var theme = Themes.Light; - var markerAlongLength = NotationMetrics.AlongLineLength(EndMarkerStyle.OpenChevron); - var approach = markerAlongLength + theme.LineCornerRadius + theme.CleanLegMargin; - - var graph = BuildJoinedGraph(nodes, edges, approach); - - var reversedBendCount = 0; - for (var e = 0; e < graph.Acyclic.Count; e++) - { - if (!graph.AcyclicReversed[e]) - { - continue; - } - - var waypoints = graph.Waypoints[e]; - if (waypoints.Count < 3) - { - continue; - } - - reversedBendCount++; - var firstSegment = Math.Abs(waypoints[1].X - waypoints[0].X); - Assert.True( - firstSegment >= markerAlongLength, - $"Reversed edge {e} clean leg {firstSegment:R} < marker along length {markerAlongLength:R}."); - } - - Assert.True(reversedBendCount > 0, "Expected at least one reversed edge with a routing bend."); - } - - /// - /// Runs the pipeline stages up to and including long-edge joining at the requested back-edge - /// entry approach and returns the graph. - /// - private static LayeredGraph BuildJoinedGraph(List nodes, List edges, double approach) - { - var graph = new LayeredGraph(nodes, edges, LayoutDirection.Right) - { - BackEdgeEntryApproach = approach, - }; - new CycleBreaker().Apply(graph); - new LayerAssigner().Apply(graph); - new LongEdgeSplitter().Apply(graph); - new CrossingMinimizer().Apply(graph); - new BrandesKopfPlacer().Apply(graph); - new PortDistributor().Apply(graph); - new OrthogonalRouter().Apply(graph); - new LongEdgeJoiner().Apply(graph); - return graph; - } - - /// Computes the reversed-edge flags (parallel to the acyclic edge set) for an input. - private static bool[] ReversedFlags(List nodes, List edges) - { - var graph = new LayeredGraph(nodes, edges, LayoutDirection.Right); - new CycleBreaker().Apply(graph); - return graph.AcyclicReversed; - } - - /// Asserts two waypoint polylines are bit-for-bit identical (no tolerance). - private static void AssertWaypointsBitIdentical( - string context, - IReadOnlyList expected, - IReadOnlyList actual) - { - Assert.Equal(expected.Count, actual.Count); - for (var w = 0; w < expected.Count; w++) - { - Assert.True( - BitConverter.DoubleToInt64Bits(expected[w].X) == BitConverter.DoubleToInt64Bits(actual[w].X) - && BitConverter.DoubleToInt64Bits(expected[w].Y) == BitConverter.DoubleToInt64Bits(actual[w].Y), - $"{context}: waypoint {w} differs (expected ({expected[w].X:R},{expected[w].Y:R}), actual ({actual[w].X:R},{actual[w].Y:R}))."); - } - } -} diff --git a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/OrthogonalRouterTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/OrthogonalRouterTests.cs deleted file mode 100644 index 62b79a77..00000000 --- a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/OrthogonalRouterTests.cs +++ /dev/null @@ -1,68 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Layout.Engine; -using DemaConsulting.SysML2Tools.Layout.Engine.Layered; - -namespace DemaConsulting.SysML2Tools.Tests.Layout.Engine.Layered; - -/// -/// Tests for covering that an aligned edge produces no bend -/// points and that every bend list is empty or a two-point vertical segment. -/// -public sealed class OrthogonalRouterTests -{ - /// - /// A single edge between two equal-height nodes is routed straight, so it produces no bend - /// points (its ports are aligned by the placer). - /// - [Fact] - public void OrthogonalRouter_Apply_StraightEdge_ProducesNoBendPoints() - { - // Arrange / Act: route a single 0->1 edge. - var graph = BuildRoutedGraph( - new List { new(60, 40), new(60, 40) }, - new List { new(0, 1) }); - - // Assert: the single sub-edge has no bend points. - Assert.Single(graph.AugBendPoints); - Assert.Empty(graph.AugBendPoints[0]); - } - - /// - /// Every sub-edge's bend list is either empty (a straight run) or exactly two points that - /// share an X coordinate (a vertical routing segment). - /// - [Fact] - public void OrthogonalRouter_Apply_EveryBendListIsEmptyOrVerticalSegment() - { - // Arrange / Act: route a four-node diamond. - var graph = BuildRoutedGraph( - new List { new(60, 40), new(60, 40), new(60, 40), new(60, 40) }, - new List { new(0, 1), new(0, 2), new(1, 3), new(2, 3) }); - - // Assert: each bend list is empty or a vertical two-point segment. - Assert.All(graph.AugBendPoints, bend => - Assert.True( - bend.Count == 0 || (bend.Count == 2 && Math.Abs(bend[0].X - bend[1].X) < 1e-9), - $"Unexpected bend geometry with {bend.Count} points.")); - } - - /// Runs the stages up to and including orthogonal routing and returns the graph. - /// Input nodes. - /// Input edges. - /// The graph after the orthogonal-routing stage. - private static LayeredGraph BuildRoutedGraph(List nodes, List edges) - { - var graph = new LayeredGraph(nodes, edges, LayoutDirection.Right); - new CycleBreaker().Apply(graph); - new LayerAssigner().Apply(graph); - new LongEdgeSplitter().Apply(graph); - new CrossingMinimizer().Apply(graph); - new BrandesKopfPlacer().Apply(graph); - new PortDistributor().Apply(graph); - new OrthogonalRouter().Apply(graph); - return graph; - } -} diff --git a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/PortDistributorTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/PortDistributorTests.cs deleted file mode 100644 index daea6e36..00000000 --- a/test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/PortDistributorTests.cs +++ /dev/null @@ -1,67 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Layout.Engine; -using DemaConsulting.SysML2Tools.Layout.Engine.Layered; - -namespace DemaConsulting.SysML2Tools.Tests.Layout.Engine.Layered; - -/// -/// Tests for covering that ports lie within node faces and that a -/// source and target port Y is recorded for every augmented sub-edge. -/// -public sealed class PortDistributorTests -{ - /// - /// A single edge's source and target ports lie within the faces of their respective nodes. - /// - [Fact] - public void PortDistributor_Apply_SingleEdge_PortsLieWithinNodeFaces() - { - // Arrange / Act: distribute ports for a single 0->1 edge. - var nodes = new List { new(60, 40), new(60, 40) }; - var graph = BuildPortedGraph(nodes, new List { new(0, 1) }); - - var src = graph.AugEdges[0].Source; - var tgt = graph.AugEdges[0].Target; - - // Assert: the source port is on the source node's face and the target port on the target's. - Assert.InRange(graph.AugPortYSrc[0], graph.AugY[src], graph.AugY[src] + nodes[src].Height); - Assert.InRange(graph.AugPortYTgt[0], graph.AugY[tgt], graph.AugY[tgt] + nodes[tgt].Height); - } - - /// - /// A diamond graph yields one source port Y and one target port Y per augmented sub-edge, - /// each a finite value. - /// - [Fact] - public void PortDistributor_Apply_AssignsPortYForEverySubEdge() - { - // Arrange / Act: distribute ports for a four-node diamond. - var nodes = new List { new(60, 40), new(60, 40), new(60, 40), new(60, 40) }; - var graph = BuildPortedGraph(nodes, new List { new(0, 1), new(0, 2), new(1, 3), new(2, 3) }); - - // Assert: one source and one target port per sub-edge. - Assert.Equal(graph.AugEdges.Count, graph.AugPortYSrc.Length); - Assert.Equal(graph.AugEdges.Count, graph.AugPortYTgt.Length); - Assert.All(graph.AugPortYSrc, y => Assert.True(double.IsFinite(y))); - Assert.All(graph.AugPortYTgt, y => Assert.True(double.IsFinite(y))); - } - - /// Runs the stages up to and including port distribution and returns the graph. - /// Input nodes. - /// Input edges. - /// The graph after the port-distribution stage. - private static LayeredGraph BuildPortedGraph(List nodes, List edges) - { - var graph = new LayeredGraph(nodes, edges, LayoutDirection.Right); - new CycleBreaker().Apply(graph); - new LayerAssigner().Apply(graph); - new LongEdgeSplitter().Apply(graph); - new CrossingMinimizer().Apply(graph); - new BrandesKopfPlacer().Apply(graph); - new PortDistributor().Apply(graph); - return graph; - } -} diff --git a/test/DemaConsulting.SysML2Tools.Tests/Layout/GeneralViewLayoutStrategyTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Layout/GeneralViewLayoutStrategyTests.cs index 934441ad..56a4539a 100644 --- a/test/DemaConsulting.SysML2Tools.Tests/Layout/GeneralViewLayoutStrategyTests.cs +++ b/test/DemaConsulting.SysML2Tools.Tests/Layout/GeneralViewLayoutStrategyTests.cs @@ -2,7 +2,8 @@ // Copyright (c) DemaConsulting. All rights reserved. // -using DemaConsulting.SysML2Tools.Layout; +using DemaConsulting.Rendering; +using DemaConsulting.Rendering.Abstractions; using DemaConsulting.SysML2Tools.Layout.Internal; using DemaConsulting.SysML2Tools.Rendering; using DemaConsulting.SysML2Tools.Semantic; diff --git a/test/DemaConsulting.SysML2Tools.Tests/Layout/InterconnectionViewLayoutStrategyTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Layout/InterconnectionViewLayoutStrategyTests.cs index b016a652..9e2463db 100644 --- a/test/DemaConsulting.SysML2Tools.Tests/Layout/InterconnectionViewLayoutStrategyTests.cs +++ b/test/DemaConsulting.SysML2Tools.Tests/Layout/InterconnectionViewLayoutStrategyTests.cs @@ -2,7 +2,8 @@ // Copyright (c) DemaConsulting. All rights reserved. // -using DemaConsulting.SysML2Tools.Layout; +using DemaConsulting.Rendering; +using DemaConsulting.Rendering.Abstractions; using DemaConsulting.SysML2Tools.Layout.Internal; using DemaConsulting.SysML2Tools.Rendering; using DemaConsulting.SysML2Tools.Semantic; diff --git a/test/DemaConsulting.SysML2Tools.Tests/Layout/LayoutTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Layout/LayoutTests.cs deleted file mode 100644 index e4c2071b..00000000 --- a/test/DemaConsulting.SysML2Tools.Tests/Layout/LayoutTests.cs +++ /dev/null @@ -1,328 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Layout; - -namespace DemaConsulting.SysML2Tools.Tests.Layout; - -/// -/// Tests for Layout subsystem node types. -/// -public sealed class LayoutTests -{ - /// - /// A LayoutTree constructed with explicit dimensions and a non-empty Nodes list stores - /// all three constructor arguments without modification. - /// - [Fact] - public void LayoutTree_Construction_StoresWidthHeightNodes() - { - // Arrange: a minimal LayoutBox as the single top-level node - var node = new LayoutBox(0, 0, 10, 10, null, 0, BoxShape.Rectangle, [], []); - - // Act: construct the tree with explicit canvas dimensions - var tree = new LayoutTree(800.0, 600.0, [node]); - - // Assert: all three properties equal the supplied values - Assert.Equal(800.0, tree.Width); - Assert.Equal(600.0, tree.Height); - Assert.Single(tree.Nodes); - Assert.Same(node, tree.Nodes[0]); - } - - /// - /// A LayoutBox constructed with all nine parameters set to non-default values stores - /// each property exactly as supplied. - /// - [Fact] - public void LayoutBox_Construction_StoresAllFields() - { - // Arrange: a compartment and a child node - var compartment = new LayoutCompartment("Attributes", ["radius : Real"]); - var child = new LayoutPort(15, 25, PortSide.Top, "p"); - - // Act: construct a LayoutBox with all nine parameters non-default - var box = new LayoutBox( - X: 10.0, - Y: 20.0, - Width: 200.0, - Height: 100.0, - Label: "MyBlock", - Depth: 2, - Shape: BoxShape.RoundedRectangle, - Compartments: [compartment], - Children: [child]); - - // Assert: all nine properties equal the supplied values - Assert.Equal(10.0, box.X); - Assert.Equal(20.0, box.Y); - Assert.Equal(200.0, box.Width); - Assert.Equal(100.0, box.Height); - Assert.Equal("MyBlock", box.Label); - Assert.Equal(2, box.Depth); - Assert.Equal(BoxShape.RoundedRectangle, box.Shape); - Assert.Single(box.Compartments); - Assert.Same(compartment, box.Compartments[0]); - Assert.Single(box.Children); - Assert.Same(child, box.Children[0]); - } - - /// - /// LayoutBox.Depth is stored as an integer with the supplied value, confirming the - /// depth-not-color invariant: no color property is present on the node. - /// - [Fact] - public void LayoutBox_Depth_IsInteger() - { - // Arrange / Act: construct a LayoutBox with Depth = 3 - var box = new LayoutBox(0, 0, 50, 50, null, 3, BoxShape.Rectangle, [], []); - - // Assert: Depth is stored as int with value 3 - Assert.IsType(box.Depth); - Assert.Equal(3, box.Depth); - } - - /// - /// A LayoutBox constructed with explicit X and Y values stores those values without - /// applying any coordinate transform, confirming absolute-coordinate invariant. - /// - [Fact] - public void LayoutBox_Coordinates_AreAbsolute() - { - // Arrange / Act: construct a box at an arbitrary absolute position - var box = new LayoutBox(100.0, 200.0, 50, 50, null, 0, BoxShape.Rectangle, [], []); - - // Assert: X and Y are stored without offset - Assert.Equal(100.0, box.X); - Assert.Equal(200.0, box.Y); - } - - /// - /// LayoutBox.Children can contain heterogeneous LayoutNode instances of different - /// concrete types, retrievable in insertion order. - /// - [Fact] - public void LayoutBox_Children_ContainsNestedNodes() - { - // Arrange: one LayoutPort and one nested LayoutBox as children - var port = new LayoutPort(10, 10, PortSide.Left, null); - var nested = new LayoutBox(5, 5, 20, 20, null, 1, BoxShape.Rectangle, [], []); - - // Act: construct the parent box with both children - var parent = new LayoutBox(0, 0, 100, 100, null, 0, BoxShape.Rectangle, [], [port, nested]); - - // Assert: both child nodes are retrievable in insertion order - Assert.Equal(2, parent.Children.Count); - Assert.Same(port, parent.Children[0]); - Assert.Same(nested, parent.Children[1]); - } - - /// - /// A LayoutPort constructed with all four parameters stores each property as supplied, - /// confirming that ports carry sufficient information for absolute positioning. - /// - [Fact] - public void LayoutPort_Construction_StoresAllFields() - { - // Arrange / Act: construct a port with all four parameters set - var port = new LayoutPort(250.0, 150.0, PortSide.Right, "myPort"); - - // Assert: all four properties equal the supplied values - Assert.Equal(250.0, port.CentreX); - Assert.Equal(150.0, port.CentreY); - Assert.Equal(PortSide.Right, port.Side); - Assert.Equal("myPort", port.Label); - } - - /// - /// A LayoutPort constructed with explicit CentreX and CentreY stores those values - /// without offset, confirming the absolute-coordinate invariant. - /// - [Fact] - public void LayoutPort_Coordinates_AreAbsolute() - { - // Arrange / Act: construct a port at explicit absolute coordinates - var port = new LayoutPort(250.0, 150.0, PortSide.Top, null); - - // Assert: coordinates are stored without transformation - Assert.Equal(250.0, port.CentreX); - Assert.Equal(150.0, port.CentreY); - } - - /// - /// A LayoutLine constructed with all five parameters set stores each property as - /// supplied, including the full waypoints list, arrowhead styles, line style, and label. - /// - [Fact] - public void LayoutLine_Construction_StoresAllFields() - { - // Arrange: a two-element waypoints list and a midpoint label - var p1 = new Point2D(10.0, 20.0); - var p2 = new Point2D(200.0, 300.0); - - // Act: construct a LayoutLine with all five parameters non-default - var line = new LayoutLine( - [p1, p2], - EndMarkerStyle.HollowTriangle, - EndMarkerStyle.FilledArrow, - LineStyle.Dashed, - "myLabel"); - - // Assert: all five properties equal the supplied values - Assert.Equal(2, line.Waypoints.Count); - Assert.Same(p1, line.Waypoints[0]); - Assert.Same(p2, line.Waypoints[1]); - Assert.Equal(EndMarkerStyle.HollowTriangle, line.SourceEnd); - Assert.Equal(EndMarkerStyle.FilledArrow, line.TargetEnd); - Assert.Equal(LineStyle.Dashed, line.LineStyle); - Assert.Equal("myLabel", line.MidpointLabel); - } - - /// - /// A LayoutLine constructed with explicit waypoints stores those waypoints with their - /// supplied X and Y values intact, confirming that routing produces absolute coordinates. - /// - [Fact] - public void LayoutLine_Waypoints_AreAbsolute() - { - // Arrange: two waypoints at known absolute positions - var p1 = new Point2D(10.0, 20.0); - var p2 = new Point2D(200.0, 300.0); - - // Act: construct the line with these waypoints - var line = new LayoutLine([p1, p2], EndMarkerStyle.None, EndMarkerStyle.None, LineStyle.Solid, null); - - // Assert: both waypoints retain their supplied X and Y values - Assert.Equal(10.0, line.Waypoints[0].X); - Assert.Equal(20.0, line.Waypoints[0].Y); - Assert.Equal(200.0, line.Waypoints[1].X); - Assert.Equal(300.0, line.Waypoints[1].Y); - } - - /// - /// A LayoutLabel constructed with all eight parameters stores each property as supplied. - /// - [Fact] - public void LayoutLabel_Construction_StoresAllFields() - { - // Arrange / Act: construct a label with all eight parameters non-default - var label = new LayoutLabel(50.0, 75.0, 200.0, "Hello World", TextAlign.Center, FontWeight.Regular, FontStyle.Normal, 12.0); - - // Assert: all eight properties equal the supplied values - Assert.Equal(50.0, label.X); - Assert.Equal(75.0, label.Y); - Assert.Equal(200.0, label.MaxWidth); - Assert.Equal("Hello World", label.Text); - Assert.Equal(TextAlign.Center, label.Align); - Assert.Equal(FontWeight.Regular, label.Weight); - Assert.Equal(FontStyle.Normal, label.Style); - Assert.Equal(12.0, label.FontSize); - } - - /// - /// A LayoutBadge constructed with all five parameters stores each property as supplied. - /// - [Fact] - public void LayoutBadge_Construction_StoresAllFields() - { - // Arrange / Act: construct a badge with all five parameters set - var badge = new LayoutBadge(30.0, 40.0, 12.0, BadgeShape.FilledCircle, "initial"); - - // Assert: all five properties equal the supplied values - Assert.Equal(30.0, badge.CentreX); - Assert.Equal(40.0, badge.CentreY); - Assert.Equal(12.0, badge.Size); - Assert.Equal(BadgeShape.FilledCircle, badge.Shape); - Assert.Equal("initial", badge.Label); - } - - /// - /// A LayoutBand constructed with all seven parameters stores each property as supplied. - /// - [Fact] - public void LayoutBand_Construction_StoresAllFields() - { - // Arrange: a child node for the band - var child = new LayoutBox(5, 5, 10, 10, null, 0, BoxShape.Rectangle, [], []); - - // Act: construct a band with all seven parameters set - var band = new LayoutBand(10.0, 20.0, 400.0, 200.0, BandOrientation.Horizontal, "Lane 1", [child]); - - // Assert: all seven properties equal the supplied values - Assert.Equal(10.0, band.X); - Assert.Equal(20.0, band.Y); - Assert.Equal(400.0, band.Width); - Assert.Equal(200.0, band.Height); - Assert.Equal(BandOrientation.Horizontal, band.Orientation); - Assert.Equal("Lane 1", band.Label); - Assert.Single(band.Children); - Assert.Same(child, band.Children[0]); - } - - /// - /// A LayoutLifeline constructed with all six parameters stores each property as supplied. - /// - [Fact] - public void LayoutLifeline_Construction_StoresAllFields() - { - // Arrange / Act: construct a lifeline with all six parameters set - var lifeline = new LayoutLifeline(150.0, 10.0, 500.0, ":Actor", 80.0, 40.0); - - // Assert: all six properties equal the supplied values - Assert.Equal(150.0, lifeline.CentreX); - Assert.Equal(10.0, lifeline.TopY); - Assert.Equal(500.0, lifeline.BottomY); - Assert.Equal(":Actor", lifeline.Label); - Assert.Equal(80.0, lifeline.HeaderWidth); - Assert.Equal(40.0, lifeline.HeaderHeight); - } - - /// - /// A LayoutActivation constructed with CentreX, TopY, and BottomY stores all three - /// properties as supplied. - /// - [Fact] - public void LayoutActivation_Construction_StoresAllFields() - { - // Arrange / Act: construct an activation bar with explicit coordinates - var activation = new LayoutActivation(150.0, 100.0, 250.0); - - // Assert: all three properties equal the supplied values - Assert.Equal(150.0, activation.CentreX); - Assert.Equal(100.0, activation.TopY); - Assert.Equal(250.0, activation.BottomY); - } - - /// - /// A LayoutGrid constructed with X, Y, and a Rows list stores all fields as supplied, - /// including LayoutGridRow.IsHeader and the LayoutGridCell values. - /// - [Fact] - public void LayoutGrid_Construction_StoresAllFields() - { - // Arrange: one header row containing one cell - var cell = new LayoutGridCell(80.0, 24.0, "Name", TextAlign.Left, 1); - var row = new LayoutGridRow(IsHeader: true, Cells: [cell]); - - // Act: construct the grid at an explicit absolute position - var grid = new LayoutGrid(X: 50.0, Y: 100.0, Rows: [row]); - - // Assert: grid-level properties - Assert.Equal(50.0, grid.X); - Assert.Equal(100.0, grid.Y); - Assert.Single(grid.Rows); - - // Assert: row-level properties - Assert.True(grid.Rows[0].IsHeader); - Assert.Single(grid.Rows[0].Cells); - - // Assert: cell-level properties - var storedCell = grid.Rows[0].Cells[0]; - Assert.Equal(80.0, storedCell.Width); - Assert.Equal(24.0, storedCell.Height); - Assert.Equal("Name", storedCell.Text); - Assert.Equal(TextAlign.Left, storedCell.Align); - Assert.Equal(1, storedCell.ColSpan); - } -} diff --git a/test/DemaConsulting.SysML2Tools.Tests/Layout/SequenceViewLayoutStrategyTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Layout/SequenceViewLayoutStrategyTests.cs index fee1dd29..be08e85b 100644 --- a/test/DemaConsulting.SysML2Tools.Tests/Layout/SequenceViewLayoutStrategyTests.cs +++ b/test/DemaConsulting.SysML2Tools.Tests/Layout/SequenceViewLayoutStrategyTests.cs @@ -2,7 +2,8 @@ // Copyright (c) DemaConsulting. All rights reserved. // -using DemaConsulting.SysML2Tools.Layout; +using DemaConsulting.Rendering; +using DemaConsulting.Rendering.Abstractions; using DemaConsulting.SysML2Tools.Layout.Internal; using DemaConsulting.SysML2Tools.Rendering; using DemaConsulting.SysML2Tools.Semantic; diff --git a/test/DemaConsulting.SysML2Tools.Tests/Layout/StateTransitionViewLayoutStrategyTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Layout/StateTransitionViewLayoutStrategyTests.cs index 7b16461c..07bb86cd 100644 --- a/test/DemaConsulting.SysML2Tools.Tests/Layout/StateTransitionViewLayoutStrategyTests.cs +++ b/test/DemaConsulting.SysML2Tools.Tests/Layout/StateTransitionViewLayoutStrategyTests.cs @@ -2,7 +2,8 @@ // Copyright (c) DemaConsulting. All rights reserved. // -using DemaConsulting.SysML2Tools.Layout; +using DemaConsulting.Rendering; +using DemaConsulting.Rendering.Abstractions; using DemaConsulting.SysML2Tools.Layout.Internal; using DemaConsulting.SysML2Tools.Rendering; using DemaConsulting.SysML2Tools.Semantic; diff --git a/test/DemaConsulting.SysML2Tools.Tests/Rendering/NotationMetricsTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Rendering/NotationMetricsTests.cs deleted file mode 100644 index abcaa76d..00000000 --- a/test/DemaConsulting.SysML2Tools.Tests/Rendering/NotationMetricsTests.cs +++ /dev/null @@ -1,214 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using System.Linq; -using DemaConsulting.SysML2Tools.Layout; -using DemaConsulting.SysML2Tools.Rendering; - -namespace DemaConsulting.SysML2Tools.Tests.Rendering; - -/// -/// Tests for , the single home for intrinsic notation geometry. -/// These tests pin the canonical values and prove every end-marker shape is a documented -/// derivation of named metrics (no geometry literal appears twice in the rendering path). -/// -public sealed class NotationMetricsTests -{ - /// The triangle-family canonical values match the historical SVG marker (10x7, refX 9). - [Fact] - public void TriangleFamily_HasCanonicalValues() - { - // Assert: the triangle-family primitives match the historical SVG marker. - Assert.Equal(10.0, NotationMetrics.EndMarkerLength); - Assert.Equal(7.0, NotationMetrics.EndMarkerWidth); - Assert.Equal(9.0, NotationMetrics.EndMarkerRefX); - Assert.Equal(3.5, NotationMetrics.EndMarkerHalfWidth); - - // The apex overshoots the endpoint by markerLength - refX = 1. - Assert.Equal(1.0, NotationMetrics.EndMarkerTipOvershoot); - } - - /// The diamond canonical values match the historical SVG marker (14x8, refX 13). - [Fact] - public void Diamond_HasCanonicalValues() - { - // Assert: the diamond primitives match the historical SVG marker. - Assert.Equal(14.0, NotationMetrics.DiamondLength); - Assert.Equal(8.0, NotationMetrics.DiamondWidth); - Assert.Equal(13.0, NotationMetrics.DiamondRefX); - Assert.Equal(4.0, NotationMetrics.DiamondHalfWidth); - Assert.Equal(7.0, NotationMetrics.DiamondMidX); - Assert.Equal(1.0, NotationMetrics.DiamondNearX); - } - - /// Circle and bar canonical values match the historical SVG markers (r4 / 4x12). - [Fact] - public void CircleAndBar_HaveCanonicalValues() - { - // Assert: the circle and bar primitives match the historical SVG markers. - Assert.Equal(4.0, NotationMetrics.CircleRadius); - Assert.Equal(10.0, NotationMetrics.CircleMarkerBox); - Assert.Equal(5.0, NotationMetrics.CircleCenter); - Assert.Equal(9.0, NotationMetrics.CircleRefX); - - Assert.Equal(4.0, NotationMetrics.BarAlong); - Assert.Equal(12.0, NotationMetrics.BarAcross); - Assert.Equal(2.0, NotationMetrics.BarHalfAlong); - Assert.Equal(6.0, NotationMetrics.BarHalf); - } - - /// The crossbar position is the documented fraction of the marker length (0.7 x 10 = 7). - [Fact] - public void Crossbar_IsDerivedFraction() - { - // Assert: the crossbar sits at the documented fraction of the marker length. - Assert.Equal(0.7, NotationMetrics.CrossbarFraction); - Assert.Equal(7.0, Math.Round(NotationMetrics.CrossbarX, 6)); - } - - /// - /// The triangle vertices map to the historical SVG marker-box points - /// 0 0, 10 3.5, 0 7 using boxX = refX - Along, boxY = refY + Across. - /// - [Fact] - public void TriangleVertices_ReproduceSvgBoxPoints() - { - // Arrange: the shared triangle vertices in tip-relative units. - var vertices = NotationMetrics.TriangleVertices(); - - // Act: map them back to SVG marker-box coordinates. - var box = MapToBox(vertices, NotationMetrics.EndMarkerRefX, NotationMetrics.EndMarkerHalfWidth); - - // Assert: they reproduce the historical marker-box points. - Assert.Equal("0 0, 10 3.5, 0 7", box); - } - - /// - /// The diamond vertices map to the historical SVG marker-box points 1 4, 7 0, 13 4, 7 8. - /// - [Fact] - public void DiamondVertices_ReproduceSvgBoxPoints() - { - // Arrange: the shared diamond vertices in tip-relative units. - var vertices = NotationMetrics.DiamondVertices(); - - // Act: map them back to SVG marker-box coordinates. - var box = MapToBox(vertices, NotationMetrics.DiamondRefX, NotationMetrics.DiamondHalfWidth); - - // Assert: they reproduce the historical marker-box points. - Assert.Equal("1 4, 7 0, 13 4, 7 8", box); - } - - /// The diamond far point lands exactly on the line endpoint (Along == 0). - [Fact] - public void DiamondVertices_FarPoint_LandsOnEndpoint() - { - // Arrange: the shared diamond vertices. - var vertices = NotationMetrics.DiamondVertices(); - - // Assert: one vertex sits exactly on the line endpoint (Along == Across == 0). - Assert.Contains(vertices, v => Math.Abs(v.Along) < 1e-9 && Math.Abs(v.Across) < 1e-9); - } - - /// The triangle apex overshoots the endpoint (negative Along) by the documented amount. - [Fact] - public void TriangleVertices_Apex_OvershootsEndpoint() - { - // Arrange: the shared triangle vertices; the apex is the middle vertex. - var vertices = NotationMetrics.TriangleVertices(); - var apex = vertices[1]; - - // Assert: the apex overshoots the endpoint by the documented amount. - Assert.Equal(-NotationMetrics.EndMarkerTipOvershoot, apex.Along); - Assert.Equal(0.0, apex.Across); - } - - /// Each end-marker style reports the documented along-line length. - [Theory] - [InlineData(EndMarkerStyle.None, 0.0)] - [InlineData(EndMarkerStyle.OpenChevron, 10.0)] - [InlineData(EndMarkerStyle.HollowTriangle, 10.0)] - [InlineData(EndMarkerStyle.HollowTriangleCrossbar, 10.0)] - [InlineData(EndMarkerStyle.FilledArrow, 10.0)] - [InlineData(EndMarkerStyle.HollowDiamond, 14.0)] - [InlineData(EndMarkerStyle.FilledDiamond, 14.0)] - [InlineData(EndMarkerStyle.Circle, 10.0)] - [InlineData(EndMarkerStyle.Bar, 4.0)] - public void AlongLineLength_MatchesMarkerBox(EndMarkerStyle style, double expected) - { - // Assert: each marker style reports its documented along-line length. - Assert.Equal(expected, NotationMetrics.AlongLineLength(style)); - } - - /// The rounded-rectangle radius is the theme corner radius scaled by the documented factor. - [Fact] - public void RoundedRectRadius_IsThemeRadiusTimesFactor() - { - // Arrange: a theme providing the base line-corner radius. - var theme = Themes.Light; - - // Assert: the rounded-rectangle radius is the theme radius scaled by the documented factor. - Assert.Equal(2.0, NotationMetrics.RoundedRectCornerFactor); - Assert.Equal(theme.LineCornerRadius * 2.0, NotationMetrics.RoundedRectRadius(theme)); - } - - /// The label-background extent is symmetric about the documented inset. - [Fact] - public void LabelBackground_ExtentMatchesInset() - { - // Assert: the label-background extent is symmetric about the documented inset. - Assert.Equal(0.05, NotationMetrics.LabelBgInset); - Assert.Equal(1.1, NotationMetrics.LabelBgExtent); - } - - /// The port square is a full side length of twice the documented half-size (4 → 8). - [Fact] - public void Port_SizeIsTwiceHalfSize() - { - // Assert: the full port side length is twice the half-size. - Assert.Equal(4.0, NotationMetrics.PortHalfSize); - Assert.Equal(8.0, NotationMetrics.PortSize); - Assert.Equal(NotationMetrics.PortHalfSize * 2.0, NotationMetrics.PortSize); - } - - /// The folder-tab constants pin the documented max-width fraction, min width, and label factor. - [Fact] - public void FolderTab_HasDocumentedConstants() - { - // Assert: the folder-tab sizing constants match their documented values. - Assert.Equal(0.45, NotationMetrics.FolderTabMaxWidthFraction); - Assert.Equal(60.0, NotationMetrics.FolderTabMinWidth); - Assert.Equal(0.55, NotationMetrics.FolderLabelCharWidthFactor); - } - - /// The note dog-ear fold constants pin the documented fraction and maximum size. - [Fact] - public void NoteFold_HasDocumentedConstants() - { - // Assert: the note-fold constants match their documented values. - Assert.Equal(0.25, NotationMetrics.NoteFoldFraction); - Assert.Equal(16.0, NotationMetrics.NoteFoldMaxSize); - } - - /// The badge fraction constants pin the bullseye inner radius (1/3) and bar half-length (0.8) fractions. - [Fact] - public void BadgeFractions_HaveDocumentedValues() - { - // Assert: the badge fractions match their documented values. - Assert.Equal(1.0 / 3.0, NotationMetrics.BadgeBullseyeInnerFraction); - Assert.Equal(0.8, NotationMetrics.BadgeBarLengthFraction); - } - - /// Maps tip-relative vertices to an SVG-style marker-box points string. - private static string MapToBox(IReadOnlyList vertices, double refAlong, double refAcross) - { - return string.Join( - ", ", - vertices.Select(v => $"{Num(refAlong - v.Along)} {Num(refAcross + v.Across)}")); - } - - /// Formats a coordinate exactly as the renderers do (rounded, invariant culture). - private static string Num(double value) => - Math.Round(value, 6).ToString(System.Globalization.CultureInfo.InvariantCulture); -} diff --git a/test/DemaConsulting.SysML2Tools.Tests/Rendering/RenderIntegrationTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Rendering/RenderIntegrationTests.cs index 5ae566ac..793d4d6c 100644 --- a/test/DemaConsulting.SysML2Tools.Tests/Rendering/RenderIntegrationTests.cs +++ b/test/DemaConsulting.SysML2Tools.Tests/Rendering/RenderIntegrationTests.cs @@ -2,11 +2,12 @@ // Copyright (c) DemaConsulting. All rights reserved. // -using DemaConsulting.SysML2Tools.Png; +using DemaConsulting.Rendering.Abstractions; +using DemaConsulting.Rendering.Skia; +using DemaConsulting.Rendering.Svg; using DemaConsulting.SysML2Tools.Rendering; using DemaConsulting.SysML2Tools.Semantic; using DemaConsulting.SysML2Tools.Stdlib; -using DemaConsulting.SysML2Tools.Svg; namespace DemaConsulting.SysML2Tools.Tests.Rendering; diff --git a/test/DemaConsulting.SysML2Tools.Tests/Rendering/RenderingTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Rendering/RenderingTests.cs index 5c01f4ff..1d86269a 100644 --- a/test/DemaConsulting.SysML2Tools.Tests/Rendering/RenderingTests.cs +++ b/test/DemaConsulting.SysML2Tools.Tests/Rendering/RenderingTests.cs @@ -2,11 +2,12 @@ // Copyright (c) DemaConsulting. All rights reserved. // -using DemaConsulting.SysML2Tools.Layout; -using DemaConsulting.SysML2Tools.Png; +using DemaConsulting.Rendering; +using DemaConsulting.Rendering.Abstractions; +using DemaConsulting.Rendering.Skia; +using DemaConsulting.Rendering.Svg; using DemaConsulting.SysML2Tools.Rendering; using DemaConsulting.SysML2Tools.Semantic; -using DemaConsulting.SysML2Tools.Svg; namespace DemaConsulting.SysML2Tools.Tests.Rendering; diff --git a/test/DemaConsulting.SysML2Tools.Tests/Rendering/ThemeTests.cs b/test/DemaConsulting.SysML2Tools.Tests/Rendering/ThemeTests.cs deleted file mode 100644 index 5d814fc5..00000000 --- a/test/DemaConsulting.SysML2Tools.Tests/Rendering/ThemeTests.cs +++ /dev/null @@ -1,39 +0,0 @@ -// -// Copyright (c) DemaConsulting. All rights reserved. -// - -using DemaConsulting.SysML2Tools.Rendering; - -namespace DemaConsulting.SysML2Tools.Tests.Rendering; - -/// -/// Tests for connector geometry fields and the approach-zone helper. -/// -public sealed class ThemeTests -{ - /// The approach zone sums the stub, bend radius, and supplied clearance. - [Fact] - public void ConnectorApproachZone_SumsStubBendAndClearance() - { - // Arrange: Light theme has ConnectorStub 8 and BendRadius 4 - var theme = Themes.Light; - - // Act - var zone = theme.ConnectorApproachZone(connectorClearance: 10.0); - - // Assert: 8 + 4 + 10 - Assert.Equal(22.0, zone, 6); - } - - /// Light and Dark themes carry the same connector geometry; Print is tighter. - [Fact] - public void Themes_HaveExpectedConnectorGeometry() - { - Assert.Equal(8.0, Themes.Light.ConnectorStub, 6); - Assert.Equal(4.0, Themes.Light.BendRadius, 6); - Assert.Equal(8.0, Themes.Dark.ConnectorStub, 6); - Assert.Equal(4.0, Themes.Dark.BendRadius, 6); - Assert.Equal(6.0, Themes.Print.ConnectorStub, 6); - Assert.Equal(0.0, Themes.Print.BendRadius, 6); - } -} From 3ae5092694b3576425a9fdb89176e4793ca94c53 Mon Sep 17 00:00:00 2001 From: Malcolm Nixon Date: Thu, 2 Jul 2026 19:24:10 -0400 Subject: [PATCH 2/5] Update compliance docs for DemaConsulting.Rendering adoption Remove the requirements, design, and verification artifacts for the layout IR, layout engines, shared metrics, rendering contracts, theme, and the Svg/Png systems that were deleted from the codebase and now come from the DemaConsulting.Rendering packages. Add the packages as a DemaConsulting.Rendering OTS item (requirements + verification, each linked to real passing SysML2Tools tests) and document the new LayeredPlacement adapter unit. Rewire requirements.yaml, .reviewmark.yaml, the design/verification introductions, and the document assembly definitions. lint.ps1 passes (reqstream, reviewmark, versionmark, yamllint, cspell, markdownlint, dotnet format). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .reviewmark.yaml | 471 +----------------- docs/design/definition.yaml | 32 +- docs/design/introduction.md | 97 ++-- docs/design/sysml2-tools-core.md | 20 +- docs/design/sysml2-tools-core/layout.md | 71 ++- .../sysml2-tools-core/layout/box-metrics.md | 49 -- .../layout/connector-label-placer.md | 53 -- .../design/sysml2-tools-core/layout/engine.md | 42 -- .../layout/engine/channel-router.md | 69 --- .../layout/engine/containment-packer.md | 57 --- .../engine/interconnection-layout-engine.md | 83 --- .../layout/engine/layered.md | 61 --- .../layout/engine/layered/axis-transform.md | 46 -- .../engine/layered/brandes-kopf-placer.md | 67 --- .../layout/engine/layered/component-packer.md | 45 -- .../engine/layered/crossing-minimizer.md | 61 --- .../layout/engine/layered/cycle-breaker.md | 32 -- .../layout/engine/layered/layer-assigner.md | 29 -- .../layout/engine/layered/layered-graph.md | 39 -- .../engine/layered/layered-layout-pipeline.md | 50 -- .../layout/engine/layered/long-edge-joiner.md | 32 -- .../engine/layered/long-edge-splitter.md | 31 -- .../engine/layered/orthogonal-router.md | 51 -- .../layout/engine/layered/port-distributor.md | 31 -- .../sysml2-tools-core/layout/internal.md | 26 +- .../action-flow-view-layout-strategy.md | 52 +- .../internal/browser-view-layout-strategy.md | 12 +- .../internal/general-view-layout-strategy.md | 52 +- .../internal/grid-view-layout-strategy.md | 9 +- .../interconnection-view-layout-strategy.md | 45 +- .../layout/internal/layered-placement.md | 65 +++ .../layout/internal/layout-warnings.md | 3 +- .../internal/sequence-view-layout-strategy.md | 11 +- .../state-transition-view-layout-strategy.md | 70 ++- .../sysml2-tools-core/layout/layout-tree.md | 59 --- docs/design/sysml2-tools-core/rendering.md | 25 +- .../sysml2-tools-core/rendering/internal.md | 7 +- .../rendering/notation-metrics.md | 68 --- .../rendering/rendering-contracts.md | 69 --- .../sysml2-tools-core/rendering/theme.md | 60 --- docs/design/sysml2-tools-png.md | 225 --------- docs/design/sysml2-tools-png/png-renderer.md | 42 -- docs/design/sysml2-tools-svg.md | 220 -------- docs/design/sysml2-tools-svg/svg-renderer.md | 41 -- docs/design/sysml2-tools-tool/render.md | 6 +- docs/reqstream/ots/dema-rendering.yaml | 101 ++++ docs/reqstream/sysml2-tools-core/layout.yaml | 181 ++----- .../sysml2-tools-core/layout/box-metrics.yaml | 35 -- .../layout/connector-label-placer.yaml | 41 -- .../sysml2-tools-core/layout/engine.yaml | 45 -- .../layout/engine/channel-router.yaml | 77 --- .../layout/engine/containment-packer.yaml | 81 --- .../engine/interconnection-layout-engine.yaml | 67 --- .../layout/engine/layered.yaml | 61 --- .../layout/engine/layered/axis-transform.yaml | 62 --- .../engine/layered/brandes-kopf-placer.yaml | 43 -- .../engine/layered/component-packer.yaml | 72 --- .../engine/layered/crossing-minimizer.yaml | 34 -- .../layout/engine/layered/cycle-breaker.yaml | 31 -- .../layout/engine/layered/layer-assigner.yaml | 32 -- .../layout/engine/layered/layered-graph.yaml | 31 -- .../layered/layered-layout-pipeline.yaml | 43 -- .../engine/layered/long-edge-joiner.yaml | 32 -- .../engine/layered/long-edge-splitter.yaml | 31 -- .../engine/layered/orthogonal-router.yaml | 55 -- .../engine/layered/port-distributor.yaml | 31 -- .../general-view-layout-strategy.yaml | 7 +- .../layout/internal/layered-placement.yaml | 85 ++++ .../sysml2-tools-core/layout/layout-tree.yaml | 59 --- .../sysml2-tools-core/rendering.yaml | 19 +- .../rendering/notation-metrics.yaml | 80 --- .../rendering/rendering-contracts.yaml | 74 --- .../sysml2-tools-core/rendering/theme.yaml | 33 -- docs/reqstream/sysml2-tools-png.yaml | 31 -- .../sysml2-tools-png/png-renderer.yaml | 95 ---- docs/reqstream/sysml2-tools-svg.yaml | 31 -- .../sysml2-tools-svg/svg-renderer.yaml | 105 ---- docs/verification/definition.yaml | 33 +- docs/verification/introduction.md | 2 - docs/verification/ots.md | 2 + docs/verification/ots/dema-rendering.md | 165 ++++++ docs/verification/sysml2-tools-core/layout.md | 107 ++-- .../sysml2-tools-core/layout/box-metrics.md | 27 - .../layout/connector-label-placer.md | 27 - .../sysml2-tools-core/layout/engine.md | 35 -- .../layout/engine/channel-router.md | 40 -- .../layout/engine/containment-packer.md | 38 -- .../engine/interconnection-layout-engine.md | 35 -- .../layout/engine/layered.md | 34 -- .../layout/engine/layered/axis-transform.md | 37 -- .../engine/layered/brandes-kopf-placer.md | 28 -- .../layout/engine/layered/component-packer.md | 37 -- .../engine/layered/crossing-minimizer.md | 27 - .../layout/engine/layered/cycle-breaker.md | 27 - .../layout/engine/layered/layer-assigner.md | 27 - .../layout/engine/layered/layered-graph.md | 27 - .../engine/layered/layered-layout-pipeline.md | 31 -- .../layout/engine/layered/long-edge-joiner.md | 28 -- .../engine/layered/long-edge-splitter.md | 27 - .../engine/layered/orthogonal-router.md | 49 -- .../layout/engine/layered/port-distributor.md | 27 - .../sysml2-tools-core/layout/internal.md | 2 +- .../action-flow-view-layout-strategy.md | 2 +- .../internal/general-view-layout-strategy.md | 8 +- .../interconnection-view-layout-strategy.md | 2 +- .../layout/internal/layered-placement.md | 43 ++ .../state-transition-view-layout-strategy.md | 2 +- .../sysml2-tools-core/layout/layout-tree.md | 40 -- .../sysml2-tools-core/rendering.md | 14 +- .../rendering/notation-metrics.md | 37 -- .../rendering/rendering-contracts.md | 41 -- .../sysml2-tools-core/rendering/theme.md | 26 - docs/verification/sysml2-tools-png.md | 48 -- .../sysml2-tools-png/png-renderer.md | 52 -- docs/verification/sysml2-tools-svg.md | 57 --- .../sysml2-tools-svg/svg-renderer.md | 60 --- requirements.yaml | 29 +- 117 files changed, 816 insertions(+), 5155 deletions(-) delete mode 100644 docs/design/sysml2-tools-core/layout/box-metrics.md delete mode 100644 docs/design/sysml2-tools-core/layout/connector-label-placer.md delete mode 100644 docs/design/sysml2-tools-core/layout/engine.md delete mode 100644 docs/design/sysml2-tools-core/layout/engine/channel-router.md delete mode 100644 docs/design/sysml2-tools-core/layout/engine/containment-packer.md delete mode 100644 docs/design/sysml2-tools-core/layout/engine/interconnection-layout-engine.md delete mode 100644 docs/design/sysml2-tools-core/layout/engine/layered.md delete mode 100644 docs/design/sysml2-tools-core/layout/engine/layered/axis-transform.md delete mode 100644 docs/design/sysml2-tools-core/layout/engine/layered/brandes-kopf-placer.md delete mode 100644 docs/design/sysml2-tools-core/layout/engine/layered/component-packer.md delete mode 100644 docs/design/sysml2-tools-core/layout/engine/layered/crossing-minimizer.md delete mode 100644 docs/design/sysml2-tools-core/layout/engine/layered/cycle-breaker.md delete mode 100644 docs/design/sysml2-tools-core/layout/engine/layered/layer-assigner.md delete mode 100644 docs/design/sysml2-tools-core/layout/engine/layered/layered-graph.md delete mode 100644 docs/design/sysml2-tools-core/layout/engine/layered/layered-layout-pipeline.md delete mode 100644 docs/design/sysml2-tools-core/layout/engine/layered/long-edge-joiner.md delete mode 100644 docs/design/sysml2-tools-core/layout/engine/layered/long-edge-splitter.md delete mode 100644 docs/design/sysml2-tools-core/layout/engine/layered/orthogonal-router.md delete mode 100644 docs/design/sysml2-tools-core/layout/engine/layered/port-distributor.md create mode 100644 docs/design/sysml2-tools-core/layout/internal/layered-placement.md delete mode 100644 docs/design/sysml2-tools-core/layout/layout-tree.md delete mode 100644 docs/design/sysml2-tools-core/rendering/notation-metrics.md delete mode 100644 docs/design/sysml2-tools-core/rendering/rendering-contracts.md delete mode 100644 docs/design/sysml2-tools-core/rendering/theme.md delete mode 100644 docs/design/sysml2-tools-png.md delete mode 100644 docs/design/sysml2-tools-png/png-renderer.md delete mode 100644 docs/design/sysml2-tools-svg.md delete mode 100644 docs/design/sysml2-tools-svg/svg-renderer.md create mode 100644 docs/reqstream/ots/dema-rendering.yaml delete mode 100644 docs/reqstream/sysml2-tools-core/layout/box-metrics.yaml delete mode 100644 docs/reqstream/sysml2-tools-core/layout/connector-label-placer.yaml delete mode 100644 docs/reqstream/sysml2-tools-core/layout/engine.yaml delete mode 100644 docs/reqstream/sysml2-tools-core/layout/engine/channel-router.yaml delete mode 100644 docs/reqstream/sysml2-tools-core/layout/engine/containment-packer.yaml delete mode 100644 docs/reqstream/sysml2-tools-core/layout/engine/interconnection-layout-engine.yaml delete mode 100644 docs/reqstream/sysml2-tools-core/layout/engine/layered.yaml delete mode 100644 docs/reqstream/sysml2-tools-core/layout/engine/layered/axis-transform.yaml delete mode 100644 docs/reqstream/sysml2-tools-core/layout/engine/layered/brandes-kopf-placer.yaml delete mode 100644 docs/reqstream/sysml2-tools-core/layout/engine/layered/component-packer.yaml delete mode 100644 docs/reqstream/sysml2-tools-core/layout/engine/layered/crossing-minimizer.yaml delete mode 100644 docs/reqstream/sysml2-tools-core/layout/engine/layered/cycle-breaker.yaml delete mode 100644 docs/reqstream/sysml2-tools-core/layout/engine/layered/layer-assigner.yaml delete mode 100644 docs/reqstream/sysml2-tools-core/layout/engine/layered/layered-graph.yaml delete mode 100644 docs/reqstream/sysml2-tools-core/layout/engine/layered/layered-layout-pipeline.yaml delete mode 100644 docs/reqstream/sysml2-tools-core/layout/engine/layered/long-edge-joiner.yaml delete mode 100644 docs/reqstream/sysml2-tools-core/layout/engine/layered/long-edge-splitter.yaml delete mode 100644 docs/reqstream/sysml2-tools-core/layout/engine/layered/orthogonal-router.yaml delete mode 100644 docs/reqstream/sysml2-tools-core/layout/engine/layered/port-distributor.yaml create mode 100644 docs/reqstream/sysml2-tools-core/layout/internal/layered-placement.yaml delete mode 100644 docs/reqstream/sysml2-tools-core/layout/layout-tree.yaml delete mode 100644 docs/reqstream/sysml2-tools-core/rendering/notation-metrics.yaml delete mode 100644 docs/reqstream/sysml2-tools-core/rendering/rendering-contracts.yaml delete mode 100644 docs/reqstream/sysml2-tools-core/rendering/theme.yaml delete mode 100644 docs/reqstream/sysml2-tools-png.yaml delete mode 100644 docs/reqstream/sysml2-tools-png/png-renderer.yaml delete mode 100644 docs/reqstream/sysml2-tools-svg.yaml delete mode 100644 docs/reqstream/sysml2-tools-svg/svg-renderer.yaml create mode 100644 docs/verification/ots/dema-rendering.md delete mode 100644 docs/verification/sysml2-tools-core/layout/box-metrics.md delete mode 100644 docs/verification/sysml2-tools-core/layout/connector-label-placer.md delete mode 100644 docs/verification/sysml2-tools-core/layout/engine.md delete mode 100644 docs/verification/sysml2-tools-core/layout/engine/channel-router.md delete mode 100644 docs/verification/sysml2-tools-core/layout/engine/containment-packer.md delete mode 100644 docs/verification/sysml2-tools-core/layout/engine/interconnection-layout-engine.md delete mode 100644 docs/verification/sysml2-tools-core/layout/engine/layered.md delete mode 100644 docs/verification/sysml2-tools-core/layout/engine/layered/axis-transform.md delete mode 100644 docs/verification/sysml2-tools-core/layout/engine/layered/brandes-kopf-placer.md delete mode 100644 docs/verification/sysml2-tools-core/layout/engine/layered/component-packer.md delete mode 100644 docs/verification/sysml2-tools-core/layout/engine/layered/crossing-minimizer.md delete mode 100644 docs/verification/sysml2-tools-core/layout/engine/layered/cycle-breaker.md delete mode 100644 docs/verification/sysml2-tools-core/layout/engine/layered/layer-assigner.md delete mode 100644 docs/verification/sysml2-tools-core/layout/engine/layered/layered-graph.md delete mode 100644 docs/verification/sysml2-tools-core/layout/engine/layered/layered-layout-pipeline.md delete mode 100644 docs/verification/sysml2-tools-core/layout/engine/layered/long-edge-joiner.md delete mode 100644 docs/verification/sysml2-tools-core/layout/engine/layered/long-edge-splitter.md delete mode 100644 docs/verification/sysml2-tools-core/layout/engine/layered/orthogonal-router.md delete mode 100644 docs/verification/sysml2-tools-core/layout/engine/layered/port-distributor.md create mode 100644 docs/verification/sysml2-tools-core/layout/internal/layered-placement.md delete mode 100644 docs/verification/sysml2-tools-core/layout/layout-tree.md delete mode 100644 docs/verification/sysml2-tools-core/rendering/notation-metrics.md delete mode 100644 docs/verification/sysml2-tools-core/rendering/rendering-contracts.md delete mode 100644 docs/verification/sysml2-tools-core/rendering/theme.md delete mode 100644 docs/verification/sysml2-tools-png.md delete mode 100644 docs/verification/sysml2-tools-png/png-renderer.md delete mode 100644 docs/verification/sysml2-tools-svg.md delete mode 100644 docs/verification/sysml2-tools-svg/svg-renderer.md diff --git a/.reviewmark.yaml b/.reviewmark.yaml index c56211d3..8926e2e2 100644 --- a/.reviewmark.yaml +++ b/.reviewmark.yaml @@ -459,260 +459,6 @@ reviews: - "docs/verification/sysml2-tools-core.md" - "docs/verification/sysml2-tools-core/rendering.md" - # === Layout Engine subsystem and units (rendering subsystem implementation reviews) === - - id: SysML2Tools-Core-Layout-Engine - title: Review that DemaConsulting.SysML2Tools Layout Engine Subsystem is Consistent and Complete - context: - - docs/design/sysml2-tools-core.md - - docs/reqstream/sysml2-tools-core.yaml - paths: - - "docs/reqstream/sysml2-tools-core/layout/engine.yaml" - - "docs/design/sysml2-tools-core/layout/engine.md" - - "docs/verification/sysml2-tools-core/layout/engine.md" - - - id: SysML2Tools-Core-Layout-Engine-ChannelRouter - title: Review that DemaConsulting.SysML2Tools Layout Engine ChannelRouter Implementation is Correct - context: - - docs/design/sysml2-tools-core.md - - docs/reqstream/sysml2-tools-core.yaml - - docs/design/sysml2-tools-core/layout.md - - docs/design/sysml2-tools-core/layout/engine.md - paths: - - "docs/reqstream/sysml2-tools-core/layout/engine/channel-router.yaml" - - "docs/design/sysml2-tools-core/layout/engine/channel-router.md" - - "docs/verification/sysml2-tools-core/layout/engine/channel-router.md" - - "src/DemaConsulting.SysML2Tools.Core/Layout/Engine/ChannelRouter.cs" - - "test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/ChannelRouterTests.cs" - - - id: SysML2Tools-Core-Layout-Engine-ContainmentPacker - title: Review that DemaConsulting.SysML2Tools Layout Engine ContainmentPacker Implementation is Correct - context: - - docs/design/sysml2-tools-core.md - - docs/reqstream/sysml2-tools-core.yaml - - docs/design/sysml2-tools-core/layout.md - - docs/design/sysml2-tools-core/layout/engine.md - paths: - - "docs/reqstream/sysml2-tools-core/layout/engine/containment-packer.yaml" - - "docs/design/sysml2-tools-core/layout/engine/containment-packer.md" - - "docs/verification/sysml2-tools-core/layout/engine/containment-packer.md" - - "src/DemaConsulting.SysML2Tools.Core/Layout/Engine/ContainmentPacker.cs" - - "test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/ContainmentPackerTests.cs" - - - id: SysML2Tools-Core-Layout-Engine-InterconnectionLayoutEngine - title: Review that DemaConsulting.SysML2Tools Layout Engine InterconnectionLayoutEngine Implementation is Correct - context: - - docs/design/sysml2-tools-core.md - - docs/reqstream/sysml2-tools-core.yaml - - docs/design/sysml2-tools-core/layout.md - - docs/design/sysml2-tools-core/layout/engine.md - paths: - - "docs/reqstream/sysml2-tools-core/layout/engine/interconnection-layout-engine.yaml" - - "docs/design/sysml2-tools-core/layout/engine/interconnection-layout-engine.md" - - "docs/verification/sysml2-tools-core/layout/engine/interconnection-layout-engine.md" - - "src/DemaConsulting.SysML2Tools.Core/Layout/Engine/InterconnectionLayoutEngine.cs" - - "src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Rect.cs" - - "test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/InterconnectionLayoutEngineTests.cs" - - # === Layout Engine Layered subsystem and units (ELK-style layered pipeline) === - - id: SysML2Tools-Core-Layout-Engine-Layered - title: Review that DemaConsulting.SysML2Tools Layout Engine Layered Satisfies Subsystem Requirements - context: - - docs/design/sysml2-tools-core.md - - docs/reqstream/sysml2-tools-core.yaml - - docs/design/sysml2-tools-core/layout.md - - docs/design/sysml2-tools-core/layout/engine.md - paths: - - "docs/reqstream/sysml2-tools-core/layout/engine/layered.yaml" - - "docs/design/sysml2-tools-core/layout/engine/layered.md" - - "docs/verification/sysml2-tools-core/layout/engine/layered.md" - - "test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LayeredPipelineEquivalenceTests.cs" - - "test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LegacyInterconnectionLayoutEngineOracle.cs" - - - id: SysML2Tools-Core-Layout-Engine-Layered-LayeredGraph - title: Review that DemaConsulting.SysML2Tools Layout Engine Layered LayeredGraph Implementation is Correct - context: - - docs/design/sysml2-tools-core.md - - docs/reqstream/sysml2-tools-core.yaml - - docs/design/sysml2-tools-core/layout.md - - docs/design/sysml2-tools-core/layout/engine.md - - docs/design/sysml2-tools-core/layout/engine/layered.md - paths: - - "docs/reqstream/sysml2-tools-core/layout/engine/layered/layered-graph.yaml" - - "docs/design/sysml2-tools-core/layout/engine/layered/layered-graph.md" - - "docs/verification/sysml2-tools-core/layout/engine/layered/layered-graph.md" - - "src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LayeredGraph.cs" - - "test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LayeredGraphTests.cs" - - - id: SysML2Tools-Core-Layout-Engine-Layered-LayeredLayoutPipeline - title: Review that DemaConsulting.SysML2Tools Layout Engine Layered LayeredLayoutPipeline Implementation is Correct - context: - - docs/design/sysml2-tools-core.md - - docs/reqstream/sysml2-tools-core.yaml - - docs/design/sysml2-tools-core/layout.md - - docs/design/sysml2-tools-core/layout/engine.md - - docs/design/sysml2-tools-core/layout/engine/layered.md - paths: - - "docs/reqstream/sysml2-tools-core/layout/engine/layered/layered-layout-pipeline.yaml" - - "docs/design/sysml2-tools-core/layout/engine/layered/layered-layout-pipeline.md" - - "docs/verification/sysml2-tools-core/layout/engine/layered/layered-layout-pipeline.md" - - "src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LayeredLayoutPipeline.cs" - - "src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/ILayoutStage.cs" - - "src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LayoutDirection.cs" - - "src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/HierarchyHandling.cs" - - "src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LayeredLayoutMetrics.cs" - - "test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LayeredLayoutPipelineTests.cs" - - - id: SysML2Tools-Core-Layout-Engine-Layered-CycleBreaker - title: Review that DemaConsulting.SysML2Tools Layout Engine Layered CycleBreaker Implementation is Correct - context: - - docs/design/sysml2-tools-core.md - - docs/reqstream/sysml2-tools-core.yaml - - docs/design/sysml2-tools-core/layout.md - - docs/design/sysml2-tools-core/layout/engine.md - - docs/design/sysml2-tools-core/layout/engine/layered.md - paths: - - "docs/reqstream/sysml2-tools-core/layout/engine/layered/cycle-breaker.yaml" - - "docs/design/sysml2-tools-core/layout/engine/layered/cycle-breaker.md" - - "docs/verification/sysml2-tools-core/layout/engine/layered/cycle-breaker.md" - - "src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/CycleBreaker.cs" - - "test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/CycleBreakerTests.cs" - - - id: SysML2Tools-Core-Layout-Engine-Layered-LayerAssigner - title: Review that DemaConsulting.SysML2Tools Layout Engine Layered LayerAssigner Implementation is Correct - context: - - docs/design/sysml2-tools-core.md - - docs/reqstream/sysml2-tools-core.yaml - - docs/design/sysml2-tools-core/layout.md - - docs/design/sysml2-tools-core/layout/engine.md - - docs/design/sysml2-tools-core/layout/engine/layered.md - paths: - - "docs/reqstream/sysml2-tools-core/layout/engine/layered/layer-assigner.yaml" - - "docs/design/sysml2-tools-core/layout/engine/layered/layer-assigner.md" - - "docs/verification/sysml2-tools-core/layout/engine/layered/layer-assigner.md" - - "src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LayerAssigner.cs" - - "test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LayerAssignerTests.cs" - - - id: SysML2Tools-Core-Layout-Engine-Layered-LongEdgeSplitter - title: Review that DemaConsulting.SysML2Tools Layout Engine Layered LongEdgeSplitter Implementation is Correct - context: - - docs/design/sysml2-tools-core.md - - docs/reqstream/sysml2-tools-core.yaml - - docs/design/sysml2-tools-core/layout.md - - docs/design/sysml2-tools-core/layout/engine.md - - docs/design/sysml2-tools-core/layout/engine/layered.md - paths: - - "docs/reqstream/sysml2-tools-core/layout/engine/layered/long-edge-splitter.yaml" - - "docs/design/sysml2-tools-core/layout/engine/layered/long-edge-splitter.md" - - "docs/verification/sysml2-tools-core/layout/engine/layered/long-edge-splitter.md" - - "src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LongEdgeSplitter.cs" - - "test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LongEdgeSplitterTests.cs" - - - id: SysML2Tools-Core-Layout-Engine-Layered-CrossingMinimizer - title: Review that DemaConsulting.SysML2Tools Layout Engine Layered CrossingMinimizer Implementation is Correct - context: - - docs/design/sysml2-tools-core.md - - docs/reqstream/sysml2-tools-core.yaml - - docs/design/sysml2-tools-core/layout.md - - docs/design/sysml2-tools-core/layout/engine.md - - docs/design/sysml2-tools-core/layout/engine/layered.md - paths: - - "docs/reqstream/sysml2-tools-core/layout/engine/layered/crossing-minimizer.yaml" - - "docs/design/sysml2-tools-core/layout/engine/layered/crossing-minimizer.md" - - "docs/verification/sysml2-tools-core/layout/engine/layered/crossing-minimizer.md" - - "src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/CrossingMinimizer.cs" - - "test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/CrossingMinimizerTests.cs" - - - id: SysML2Tools-Core-Layout-Engine-Layered-BrandesKopfPlacer - title: Review that DemaConsulting.SysML2Tools Layout Engine Layered BrandesKopfPlacer Implementation is Correct - context: - - docs/design/sysml2-tools-core.md - - docs/reqstream/sysml2-tools-core.yaml - - docs/design/sysml2-tools-core/layout.md - - docs/design/sysml2-tools-core/layout/engine.md - - docs/design/sysml2-tools-core/layout/engine/layered.md - paths: - - "docs/reqstream/sysml2-tools-core/layout/engine/layered/brandes-kopf-placer.yaml" - - "docs/design/sysml2-tools-core/layout/engine/layered/brandes-kopf-placer.md" - - "docs/verification/sysml2-tools-core/layout/engine/layered/brandes-kopf-placer.md" - - "src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/BrandesKopfPlacer.cs" - - "test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/BrandesKopfPlacerTests.cs" - - - id: SysML2Tools-Core-Layout-Engine-Layered-PortDistributor - title: Review that DemaConsulting.SysML2Tools Layout Engine Layered PortDistributor Implementation is Correct - context: - - docs/design/sysml2-tools-core.md - - docs/reqstream/sysml2-tools-core.yaml - - docs/design/sysml2-tools-core/layout.md - - docs/design/sysml2-tools-core/layout/engine.md - - docs/design/sysml2-tools-core/layout/engine/layered.md - paths: - - "docs/reqstream/sysml2-tools-core/layout/engine/layered/port-distributor.yaml" - - "docs/design/sysml2-tools-core/layout/engine/layered/port-distributor.md" - - "docs/verification/sysml2-tools-core/layout/engine/layered/port-distributor.md" - - "src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/PortDistributor.cs" - - "test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/PortDistributorTests.cs" - - - id: SysML2Tools-Core-Layout-Engine-Layered-OrthogonalRouter - title: Review that DemaConsulting.SysML2Tools Layout Engine Layered OrthogonalRouter Implementation is Correct - context: - - docs/design/sysml2-tools-core.md - - docs/reqstream/sysml2-tools-core.yaml - - docs/design/sysml2-tools-core/layout.md - - docs/design/sysml2-tools-core/layout/engine.md - - docs/design/sysml2-tools-core/layout/engine/layered.md - paths: - - "docs/reqstream/sysml2-tools-core/layout/engine/layered/orthogonal-router.yaml" - - "docs/design/sysml2-tools-core/layout/engine/layered/orthogonal-router.md" - - "docs/verification/sysml2-tools-core/layout/engine/layered/orthogonal-router.md" - - "src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/OrthogonalRouter.cs" - - "test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/OrthogonalRouterTests.cs" - - "test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/OrthogonalRouterBackEdgeTests.cs" - - - id: SysML2Tools-Core-Layout-Engine-Layered-LongEdgeJoiner - title: Review that DemaConsulting.SysML2Tools Layout Engine Layered LongEdgeJoiner Implementation is Correct - context: - - docs/design/sysml2-tools-core.md - - docs/reqstream/sysml2-tools-core.yaml - - docs/design/sysml2-tools-core/layout.md - - docs/design/sysml2-tools-core/layout/engine.md - - docs/design/sysml2-tools-core/layout/engine/layered.md - paths: - - "docs/reqstream/sysml2-tools-core/layout/engine/layered/long-edge-joiner.yaml" - - "docs/design/sysml2-tools-core/layout/engine/layered/long-edge-joiner.md" - - "docs/verification/sysml2-tools-core/layout/engine/layered/long-edge-joiner.md" - - "src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/LongEdgeJoiner.cs" - - "test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/LongEdgeJoinerTests.cs" - - - id: SysML2Tools-Core-Layout-Engine-Layered-AxisTransform - title: Review that DemaConsulting.SysML2Tools Layout Engine Layered AxisTransform Implementation is Correct - context: - - docs/design/sysml2-tools-core.md - - docs/reqstream/sysml2-tools-core.yaml - - docs/design/sysml2-tools-core/layout.md - - docs/design/sysml2-tools-core/layout/engine.md - - docs/design/sysml2-tools-core/layout/engine/layered.md - paths: - - "docs/reqstream/sysml2-tools-core/layout/engine/layered/axis-transform.yaml" - - "docs/design/sysml2-tools-core/layout/engine/layered/axis-transform.md" - - "docs/verification/sysml2-tools-core/layout/engine/layered/axis-transform.md" - - "src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/AxisTransform.cs" - - "test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/AxisTransformTests.cs" - - - id: SysML2Tools-Core-Layout-Engine-Layered-ComponentPacker - title: Review that DemaConsulting.SysML2Tools Layout Engine Layered ComponentPacker Implementation is Correct - context: - - docs/design/sysml2-tools-core.md - - docs/reqstream/sysml2-tools-core.yaml - - docs/design/sysml2-tools-core/layout.md - - docs/design/sysml2-tools-core/layout/engine.md - - docs/design/sysml2-tools-core/layout/engine/layered.md - paths: - - "docs/reqstream/sysml2-tools-core/layout/engine/layered/component-packer.yaml" - - "docs/design/sysml2-tools-core/layout/engine/layered/component-packer.md" - - "docs/verification/sysml2-tools-core/layout/engine/layered/component-packer.md" - - "src/DemaConsulting.SysML2Tools.Core/Layout/Engine/Layered/ComponentPacker.cs" - - "test/DemaConsulting.SysML2Tools.Tests/Layout/Engine/Layered/ComponentPackerTests.cs" - # === Layout Internal subsystem and view-strategy units === - id: SysML2Tools-Core-Layout-Internal title: Review that DemaConsulting.SysML2Tools Layout Internal Subsystem is Consistent and Complete @@ -845,81 +591,6 @@ reviews: - "src/DemaConsulting.SysML2Tools.Core/Layout/Internal/LayoutWarnings.cs" - "test/DemaConsulting.SysML2Tools.Tests/Layout/LayoutWarningsTests.cs" - - id: SysML2Tools-Core-Layout-ConnectorLabelPlacer - title: Review that DemaConsulting.SysML2Tools Layout ConnectorLabelPlacer Implementation is Correct - context: - - docs/design/sysml2-tools-core.md - - docs/reqstream/sysml2-tools-core.yaml - - docs/design/sysml2-tools-core/layout.md - paths: - - "docs/reqstream/sysml2-tools-core/layout/connector-label-placer.yaml" - - "docs/design/sysml2-tools-core/layout/connector-label-placer.md" - - "docs/verification/sysml2-tools-core/layout/connector-label-placer.md" - - "src/DemaConsulting.SysML2Tools.Core/Layout/ConnectorLabelPlacer.cs" - - "test/DemaConsulting.SysML2Tools.Tests/Layout/ConnectorLabelPlacerTests.cs" - - - id: SysML2Tools-Core-Layout-BoxMetrics - title: Review that DemaConsulting.SysML2Tools Layout BoxMetrics Implementation is Correct - context: - - docs/design/sysml2-tools-core.md - - docs/reqstream/sysml2-tools-core.yaml - - docs/design/sysml2-tools-core/layout.md - paths: - - "docs/reqstream/sysml2-tools-core/layout/box-metrics.yaml" - - "docs/design/sysml2-tools-core/layout/box-metrics.md" - - "docs/verification/sysml2-tools-core/layout/box-metrics.md" - - "src/DemaConsulting.SysML2Tools.Core/Layout/BoxMetrics.cs" - - "test/DemaConsulting.SysML2Tools.Tests/Layout/BoxMetricsTests.cs" - - - id: SysML2Tools-Core-Layout-LayoutTree - title: Review that DemaConsulting.SysML2Tools Layout LayoutTree Implementation is Correct - context: - - docs/design/sysml2-tools-core.md - - docs/reqstream/sysml2-tools-core.yaml - - docs/design/sysml2-tools-core/layout.md - paths: - - "docs/reqstream/sysml2-tools-core/layout/layout-tree.yaml" - - "docs/design/sysml2-tools-core/layout/layout-tree.md" - - "docs/verification/sysml2-tools-core/layout/layout-tree.md" - - "src/DemaConsulting.SysML2Tools.Core/Layout/LayoutTree.cs" - - "src/DemaConsulting.SysML2Tools.Core/Layout/LayoutNode.cs" - - "src/DemaConsulting.SysML2Tools.Core/Layout/LayoutBox.cs" - - "src/DemaConsulting.SysML2Tools.Core/Layout/LayoutPort.cs" - - "src/DemaConsulting.SysML2Tools.Core/Layout/LayoutLine.cs" - - "src/DemaConsulting.SysML2Tools.Core/Layout/LayoutLabel.cs" - - "src/DemaConsulting.SysML2Tools.Core/Layout/LayoutBadge.cs" - - "src/DemaConsulting.SysML2Tools.Core/Layout/LayoutBand.cs" - - "src/DemaConsulting.SysML2Tools.Core/Layout/LayoutGrid.cs" - - "src/DemaConsulting.SysML2Tools.Core/Layout/LayoutLifeline.cs" - - "test/DemaConsulting.SysML2Tools.Tests/Layout/LayoutTests.cs" - - # === Rendering direct units (promoted from grouped subsystem content) === - - id: SysML2Tools-Core-Rendering-NotationMetrics - title: Review that DemaConsulting.SysML2Tools Rendering NotationMetrics Implementation is Correct - context: - - docs/design/sysml2-tools-core.md - - docs/reqstream/sysml2-tools-core.yaml - - docs/design/sysml2-tools-core/rendering.md - paths: - - "docs/reqstream/sysml2-tools-core/rendering/notation-metrics.yaml" - - "docs/design/sysml2-tools-core/rendering/notation-metrics.md" - - "docs/verification/sysml2-tools-core/rendering/notation-metrics.md" - - "src/DemaConsulting.SysML2Tools.Core/Rendering/NotationMetrics.cs" - - "test/DemaConsulting.SysML2Tools.Tests/Rendering/NotationMetricsTests.cs" - - - id: SysML2Tools-Core-Rendering-Theme - title: Review that DemaConsulting.SysML2Tools Rendering Theme Implementation is Correct - context: - - docs/design/sysml2-tools-core.md - - docs/reqstream/sysml2-tools-core.yaml - - docs/design/sysml2-tools-core/rendering.md - paths: - - "docs/reqstream/sysml2-tools-core/rendering/theme.yaml" - - "docs/design/sysml2-tools-core/rendering/theme.md" - - "docs/verification/sysml2-tools-core/rendering/theme.md" - - "src/DemaConsulting.SysML2Tools.Core/Rendering/Theme.cs" - - "test/DemaConsulting.SysML2Tools.Tests/Rendering/ThemeTests.cs" - - id: SysML2Tools-Core-Rendering-DiagramRenderer title: Review that DemaConsulting.SysML2Tools Rendering DiagramRenderer Implementation is Correct context: @@ -933,20 +604,18 @@ reviews: - "src/DemaConsulting.SysML2Tools.Core/Rendering/DiagramRenderer.cs" - "test/DemaConsulting.SysML2Tools.Tests/Rendering/RenderIntegrationTests.cs" - - id: SysML2Tools-Core-Rendering-RenderingContracts - title: Review that DemaConsulting.SysML2Tools Rendering RenderingContracts Implementation is Correct + # Covers the SysML-coupled rendering contract and helper code that stays in the core library + # after the SysML-agnostic contracts (IRenderer, RenderOptions, RenderOutput, Theme) moved to + # the DemaConsulting.Rendering.Abstractions package: the ILayoutStrategy/ViewContext strategy + # contract and the StdlibFilter helper, verified by the Rendering unit tests. + - id: SysML2Tools-Core-Rendering-Contracts + title: Review that DemaConsulting.SysML2Tools Rendering Contract and Filter Implementation is Correct context: - docs/design/sysml2-tools-core.md - docs/reqstream/sysml2-tools-core.yaml - docs/design/sysml2-tools-core/rendering.md paths: - - "docs/reqstream/sysml2-tools-core/rendering/rendering-contracts.yaml" - - "docs/design/sysml2-tools-core/rendering/rendering-contracts.md" - - "docs/verification/sysml2-tools-core/rendering/rendering-contracts.md" - - "src/DemaConsulting.SysML2Tools.Core/Rendering/IRenderer.cs" - "src/DemaConsulting.SysML2Tools.Core/Rendering/ILayoutStrategy.cs" - - "src/DemaConsulting.SysML2Tools.Core/Rendering/RenderOptions.cs" - - "src/DemaConsulting.SysML2Tools.Core/Rendering/RenderOutput.cs" - "src/DemaConsulting.SysML2Tools.Core/Rendering/Internal/StdlibFilter.cs" - "test/DemaConsulting.SysML2Tools.Tests/Rendering/RenderingTests.cs" @@ -975,114 +644,6 @@ reviews: - "src/DemaConsulting.SysML2Tools.Core/Rendering/Internal/DiagramTypeRouter.cs" - "test/DemaConsulting.SysML2Tools.Tests/Rendering/DiagramTypeRouterTests.cs" - # SysML2Tools SVG Renderer - - id: SysML2Tools-Svg-Architecture - title: Review that DemaConsulting.SysML2Tools.Svg Architecture Satisfies Requirements - context: - - README.md - - "docs/user_guide/**/*.md" - paths: - - "docs/reqstream/sysml2-tools-svg.yaml" - - "docs/design/introduction.md" - - "docs/design/sysml2-tools-svg.md" - - "docs/verification/introduction.md" - - "docs/verification/sysml2-tools-svg.md" - - - id: SysML2Tools-Svg-Design - title: Review that DemaConsulting.SysML2Tools.Svg Design is Consistent and Complete - context: - - docs/reqstream/sysml2-tools-svg.yaml - paths: - - "docs/design/introduction.md" - - "docs/design/sysml2-tools-svg.md" - - "docs/design/sysml2-tools-svg/**/*.md" - - "docs/design/ots.md" - - - id: SysML2Tools-Svg-Verification - title: Review that DemaConsulting.SysML2Tools.Svg Verification is Consistent and Complete - context: - - docs/reqstream/sysml2-tools-svg.yaml - paths: - - "docs/verification/introduction.md" - - "docs/verification/sysml2-tools-svg.md" - - "docs/verification/sysml2-tools-svg/**/*.md" - - "docs/verification/ots.md" - - - id: SysML2Tools-Svg-AllRequirements - title: Review that All DemaConsulting.SysML2Tools.Svg Requirements are Complete - context: - - docs/design/sysml2-tools-svg.md - - docs/reqstream/sysml2-tools-svg.yaml - paths: - - "docs/reqstream/sysml2-tools-svg/**/*.yaml" - - - id: SysML2Tools-Svg-SvgRenderer - title: Review that DemaConsulting.SysML2Tools.Svg SvgRenderer Implementation is Correct - context: - - docs/design/sysml2-tools-svg.md - - docs/reqstream/sysml2-tools-svg.yaml - paths: - - "docs/reqstream/sysml2-tools-svg/svg-renderer.yaml" - - "docs/design/sysml2-tools-svg/svg-renderer.md" - - "docs/verification/sysml2-tools-svg/svg-renderer.md" - - "src/DemaConsulting.SysML2Tools.Svg/SvgRenderer.cs" - - "test/DemaConsulting.SysML2Tools.Svg.Tests/SvgRendererTests.cs" - - "test/DemaConsulting.SysML2Tools.Svg.Tests/SvgEndMarkerTests.cs" - - # SysML2Tools PNG Renderer - - id: SysML2Tools-Png-Architecture - title: Review that DemaConsulting.SysML2Tools.Png Architecture Satisfies Requirements - context: - - README.md - - "docs/user_guide/**/*.md" - paths: - - "docs/reqstream/sysml2-tools-png.yaml" - - "docs/design/introduction.md" - - "docs/design/sysml2-tools-png.md" - - "docs/verification/introduction.md" - - "docs/verification/sysml2-tools-png.md" - - - id: SysML2Tools-Png-Design - title: Review that DemaConsulting.SysML2Tools.Png Design is Consistent and Complete - context: - - docs/reqstream/sysml2-tools-png.yaml - paths: - - "docs/design/introduction.md" - - "docs/design/sysml2-tools-png.md" - - "docs/design/sysml2-tools-png/**/*.md" - - "docs/design/ots.md" - - - id: SysML2Tools-Png-Verification - title: Review that DemaConsulting.SysML2Tools.Png Verification is Consistent and Complete - context: - - docs/reqstream/sysml2-tools-png.yaml - paths: - - "docs/verification/introduction.md" - - "docs/verification/sysml2-tools-png.md" - - "docs/verification/sysml2-tools-png/**/*.md" - - "docs/verification/ots.md" - - - id: SysML2Tools-Png-AllRequirements - title: Review that All DemaConsulting.SysML2Tools.Png Requirements are Complete - context: - - docs/design/sysml2-tools-png.md - - docs/reqstream/sysml2-tools-png.yaml - paths: - - "docs/reqstream/sysml2-tools-png/**/*.yaml" - - - id: SysML2Tools-Png-PngRenderer - title: Review that DemaConsulting.SysML2Tools.Png PngRenderer Implementation is Correct - context: - - docs/design/sysml2-tools-png.md - - docs/reqstream/sysml2-tools-png.yaml - paths: - - "docs/reqstream/sysml2-tools-png/png-renderer.yaml" - - "docs/design/sysml2-tools-png/png-renderer.md" - - "docs/verification/sysml2-tools-png/png-renderer.md" - - "src/DemaConsulting.SysML2Tools.Png/PngRenderer.cs" - - "test/DemaConsulting.SysML2Tools.Png.Tests/PngRendererTests.cs" - - "test/DemaConsulting.SysML2Tools.Png.Tests/PngEndMarkerTests.cs" - - id: OTS-Verification title: Review of OTS software verification evidence paths: @@ -1284,3 +845,23 @@ reviews: - "docs/reqstream/ots/antlr4.yaml" - "docs/design/ots/antlr4.md" - "docs/verification/ots/antlr4.md" + + - id: SysML2Tools-Core-Layout-Internal-LayeredPlacement + title: Review that DemaConsulting.SysML2Tools Layout Internal LayeredPlacement Implementation is Correct + context: + - docs/design/sysml2-tools-core.md + - docs/reqstream/sysml2-tools-core.yaml + - docs/design/sysml2-tools-core/layout.md + - docs/design/sysml2-tools-core/layout/internal.md + paths: + - "docs/reqstream/sysml2-tools-core/layout/internal/layered-placement.yaml" + - "docs/design/sysml2-tools-core/layout/internal/layered-placement.md" + - "docs/verification/sysml2-tools-core/layout/internal/layered-placement.md" + - "src/DemaConsulting.SysML2Tools.Core/Layout/Internal/LayeredPlacement.cs" + - "test/DemaConsulting.SysML2Tools.Tests/Layout/ActionFlowViewLayoutStrategyTests.cs" + + - id: OTS-DemaRendering + title: Review of DemaConsulting.Rendering OTS verification evidence + paths: + - "docs/reqstream/ots/dema-rendering.yaml" + - "docs/verification/ots/dema-rendering.md" diff --git a/docs/design/definition.yaml b/docs/design/definition.yaml index 600d8f19..fc512b67 100644 --- a/docs/design/definition.yaml +++ b/docs/design/definition.yaml @@ -8,14 +8,10 @@ resource-path: - docs/design/sysml2-tools-language/semantic/internal - docs/design/sysml2-tools-core - docs/design/sysml2-tools-core/layout - - docs/design/sysml2-tools-core/layout/engine - - docs/design/sysml2-tools-core/layout/engine/layered - docs/design/sysml2-tools-core/layout/internal - docs/design/sysml2-tools-core/rendering - docs/design/sysml2-tools-core/rendering/internal - docs/design/sysml2-tools-stdlib - - docs/design/sysml2-tools-svg - - docs/design/sysml2-tools-png - docs/design/sysml2-tools-tool - docs/design/sysml2-tools-tool/cli - docs/design/sysml2-tools-tool/lint @@ -45,26 +41,6 @@ input-files: - docs/design/sysml2-tools-stdlib/stdlib-provider.md - docs/design/sysml2-tools-core.md - docs/design/sysml2-tools-core/layout.md - - docs/design/sysml2-tools-core/layout/box-metrics.md - - docs/design/sysml2-tools-core/layout/layout-tree.md - - docs/design/sysml2-tools-core/layout/connector-label-placer.md - - docs/design/sysml2-tools-core/layout/engine.md - - docs/design/sysml2-tools-core/layout/engine/channel-router.md - - docs/design/sysml2-tools-core/layout/engine/containment-packer.md - - docs/design/sysml2-tools-core/layout/engine/interconnection-layout-engine.md - - docs/design/sysml2-tools-core/layout/engine/layered.md - - docs/design/sysml2-tools-core/layout/engine/layered/layered-graph.md - - docs/design/sysml2-tools-core/layout/engine/layered/layered-layout-pipeline.md - - docs/design/sysml2-tools-core/layout/engine/layered/cycle-breaker.md - - docs/design/sysml2-tools-core/layout/engine/layered/layer-assigner.md - - docs/design/sysml2-tools-core/layout/engine/layered/long-edge-splitter.md - - docs/design/sysml2-tools-core/layout/engine/layered/crossing-minimizer.md - - docs/design/sysml2-tools-core/layout/engine/layered/brandes-kopf-placer.md - - docs/design/sysml2-tools-core/layout/engine/layered/port-distributor.md - - docs/design/sysml2-tools-core/layout/engine/layered/orthogonal-router.md - - docs/design/sysml2-tools-core/layout/engine/layered/long-edge-joiner.md - - docs/design/sysml2-tools-core/layout/engine/layered/axis-transform.md - - docs/design/sysml2-tools-core/layout/engine/layered/component-packer.md - docs/design/sysml2-tools-core/layout/internal.md - docs/design/sysml2-tools-core/layout/internal/general-view-layout-strategy.md - docs/design/sysml2-tools-core/layout/internal/interconnection-view-layout-strategy.md @@ -74,17 +50,11 @@ input-files: - docs/design/sysml2-tools-core/layout/internal/grid-view-layout-strategy.md - docs/design/sysml2-tools-core/layout/internal/browser-view-layout-strategy.md - docs/design/sysml2-tools-core/layout/internal/layout-warnings.md + - docs/design/sysml2-tools-core/layout/internal/layered-placement.md - docs/design/sysml2-tools-core/rendering.md - - docs/design/sysml2-tools-core/rendering/notation-metrics.md - - docs/design/sysml2-tools-core/rendering/theme.md - docs/design/sysml2-tools-core/rendering/diagram-renderer.md - - docs/design/sysml2-tools-core/rendering/rendering-contracts.md - docs/design/sysml2-tools-core/rendering/internal.md - docs/design/sysml2-tools-core/rendering/internal/diagram-type-router.md - - docs/design/sysml2-tools-svg.md - - docs/design/sysml2-tools-svg/svg-renderer.md - - docs/design/sysml2-tools-png.md - - docs/design/sysml2-tools-png/png-renderer.md - docs/design/sysml2-tools-tool.md - docs/design/sysml2-tools-tool/program.md - docs/design/sysml2-tools-tool/cli.md diff --git a/docs/design/introduction.md b/docs/design/introduction.md index 75071a9c..936d7696 100644 --- a/docs/design/introduction.md +++ b/docs/design/introduction.md @@ -60,64 +60,34 @@ system, subsystem, and unit levels: - **StdlibGen** (Build-time tool) — console tool that parses stdlib source files and writes stdlib.bin (build-time tooling; excluded from the software-items requirements/design/verification tree — see _Scope_) - **Program** (Unit) — entry point: parses stdlib, runs resolution, serializes to stdlib.bin -- **DemaConsulting.SysML2Tools** (System) — core library: layout, rendering interfaces, and DiagramRenderer - - **Layout** (Subsystem) — LayoutTree intermediate representation (node types covering all SysML - diagram elements), reusable layout engines, and per-view layout strategies - - **LayoutTree** (Unit) — grouped data-model unit: the ten immutable `LayoutTree` record source - files (`LayoutTree`, `LayoutNode`, `LayoutBox`, `LayoutPort`, `LayoutLine`, `LayoutLabel`, - `LayoutBadge`, `LayoutBand`, `LayoutGrid`, `LayoutLifeline`) that form the intermediate - representation consumed by every renderer - - **Engine** (Subsystem) — reusable, model-independent geometric layout engines - - **ChannelRouter** (Unit) — orthogonal connector routing with obstacle avoidance and clearance - - **ContainmentPacker** (Unit) — packs sized boxes within a bounded container region - - **InterconnectionLayoutEngine** (Unit) — façade that assembles and runs the layered - pipeline for the interconnection view, preserving its public placement API - - **Layered** (Subsystem) — reusable, ELK-style layered layout pipeline of single-responsibility stages - - **LayeredGraph** (Unit) — mutable shared state threaded through the pipeline stages - - **LayeredLayoutPipeline** (Unit) — builds and runs an ordered sequence of layout stages - - **CycleBreaker** (Unit) — reverses back edges to produce an acyclic edge set - - **LayerAssigner** (Unit) — assigns nodes to layers by longest-path ranking - - **LongEdgeSplitter** (Unit) — inserts dummy nodes so every edge spans one layer - - **CrossingMinimizer** (Unit) — orders nodes within layers to reduce edge crossings - - **BrandesKopfPlacer** (Unit) — assigns node coordinates with the Brandes-Köpf algorithm - - **PortDistributor** (Unit) — distributes edge ports along node faces - - **OrthogonalRouter** (Unit) — routes edges as orthogonal segments between layers - - **LongEdgeJoiner** (Unit) — rejoins split sub-edges into original edge polylines - - **AxisTransform** (Unit) — maps pipeline coordinates to the requested layout direction - - **ComponentPacker** (Unit) — lays out each connected component independently and packs them without overlap +- **DemaConsulting.SysML2Tools** (System) — core library: layout strategies, rendering + orchestration, and the SysML-coupled rendering pipeline + - **Layout** (Subsystem) — maps the SysML semantic model onto the off-the-shelf `LayoutTree` + intermediate representation and delegates geometric placement and routing to the off-the-shelf + `DemaConsulting.Rendering.Layout` layered algorithm - **Internal** (Subsystem) — per-view layout strategies - - **GeneralViewLayoutStrategy** (Unit) — general view: package-grouped definitions placed by the - layered pipeline with orthogonal specialization and membership edges + - **GeneralViewLayoutStrategy** (Unit) — general view: package-grouped definitions placed by + the layered algorithm with orthogonal specialization and membership edges - **InterconnectionViewLayoutStrategy** (Unit) — internal structure: nested parts, ports, connectors - **StateTransitionViewLayoutStrategy** (Unit) — state machine: states and guarded transitions - placed top-to-bottom by the layered pipeline (DOWN direction) with orthogonal transitions + placed top-to-bottom by the layered algorithm (DOWN direction) with orthogonal transitions - **ActionFlowViewLayoutStrategy** (Unit) — action flow with start/done markers, placed - top-to-bottom by the layered pipeline (DOWN direction) with orthogonal successions + top-to-bottom by the layered algorithm (DOWN direction) with orthogonal successions - **SequenceViewLayoutStrategy** (Unit) — lifelines and ordered messages - **GridViewLayoutStrategy** (Unit) — specialization/relationship matrix - **BrowserViewLayoutStrategy** (Unit) — indented membership tree - **LayoutWarnings** (Unit) — builder for layout diagnostic warning messages - - **ConnectorLabelPlacer** (Unit) — collision-aware placement of connector midpoint labels - - **BoxMetrics** (Unit) — shared box title-area and folder-tab height formulas used by both the - layout strategies and the renderers - - **Rendering** (Subsystem) — rendering pipeline: the `IRenderer`/`ILayoutStrategy` interfaces, - `Theme`, `RenderOptions`, `RenderOutput`, the `DiagramRenderer` orchestrator, and the - `StdlibFilter` helper that excludes standard-library elements from diagrams - - **NotationMetrics** (Unit) — single home for intrinsic, theme-independent notation geometry - (end-marker, port, folder-tab, badge, and label-background metrics) shared by both renderers - - **Theme** (Unit) — immutable visual-configuration record and the built-in `Themes` provider + - **LayeredPlacement** (Unit) — thin helper that adapts the off-the-shelf + `DemaConsulting.Rendering.Layout` layered algorithm, returning placed rectangles and routed + polylines to the strategies + - **Rendering** (Subsystem) — rendering pipeline: consumes the off-the-shelf `IRenderer`, `Theme`, + `RenderOptions`, and `RenderOutput` contracts from `DemaConsulting.Rendering.Abstractions` and + retains the SysML-coupled `ILayoutStrategy`/`ViewContext` contract, the `DiagramRenderer` + orchestrator, and the `StdlibFilter` helper that excludes standard-library elements from diagrams - **DiagramRenderer** (Unit) — high-level rendering orchestrator: for each view, builds a `LayoutTree` via an `ILayoutStrategy` and renders it via an `IRenderer` - - **RenderingContracts** (Unit) — grouped contracts unit: the `IRenderer` and `ILayoutStrategy` - interfaces, the `RenderOptions` and `RenderOutput` records, and the `StdlibFilter` helper - **Internal** (Subsystem) — internal rendering implementation - **DiagramTypeRouter** (Unit) — selects a layout strategy from a view's resolved kind -- **DemaConsulting.SysML2Tools.Svg** (System) — SVG renderer: renders `LayoutTree` to - SVG output with zero external dependencies - - **SvgRenderer** (Unit) — translates a `LayoutTree` to a self-contained SVG 1.1 document -- **DemaConsulting.SysML2Tools.Png** (System) — PNG renderer: renders `LayoutTree` to - PNG output using SkiaSharp - - **PngRenderer** (Unit) — rasterizes a `LayoutTree` to a PNG image using SkiaSharp - **DemaConsulting.SysML2Tools.Tool** (System) — dotnet tool: thin CLI wrapper and orchestration - **Program** (Unit) — entry point and execution orchestrator @@ -136,6 +106,8 @@ system, subsystem, and unit levels: - ANTLR4 (OTS) — ANTLR4 runtime (Antlr4.Runtime.Standard) - BuildMark (OTS) — build-notes documentation tool +- DemaConsulting.Rendering (OTS) — SysML-agnostic layout intermediate representation, layered + layout algorithm, and SVG/PNG renderers - FileAssert (OTS) — document assertion tool - Pandoc (OTS) — Markdown-to-HTML conversion tool - ReqStream (OTS) — requirements traceability tool @@ -165,11 +137,9 @@ reviewers an explicit navigation aid from design to code: - **DemaConsulting.SysML2Tools.Stdlib/** — stdlib library - **Stdlib/** — SysML v2 standard library source files (EPL-2.0; see Stdlib/README.md) - **DemaConsulting.SysML2Tools.Core/** — core library - - **Layout/** — LayoutTree intermediate representation - - **Internal/** — internal layout implementation (GeneralViewLayoutStrategy) - - **Rendering/** — rendering interfaces and theme - - **DemaConsulting.SysML2Tools.Svg/** — SVG renderer - - **DemaConsulting.SysML2Tools.Png/** — PNG renderer + - **Layout/** — layout strategies mapping the model to the off-the-shelf `LayoutTree` + - **Internal/** — per-view layout strategies and the `LayeredPlacement` helper + - **Rendering/** — SysML-coupled rendering pipeline (`ILayoutStrategy`, `DiagramRenderer`) - **DemaConsulting.SysML2Tools.Tool/** — dotnet tool CLI wrapper - **Cli/** — command-line interface subsystem - **Lint/** — lint command subsystem @@ -180,8 +150,6 @@ reviewers an explicit navigation aid from design to code: - **sysml2-tools-language.md** — language library design - **sysml2-tools-stdlib.md** — stdlib library design - **sysml2-tools-core/** — core library unit/subsystem design - - **sysml2-tools-svg.md** — SVG renderer design - - **sysml2-tools-png.md** — PNG renderer design - **sysml2-tools-tool/** — DemaConsulting.SysML2Tools.Tool unit/subsystem design - **cli/** — Cli subsystem design - **lint/** — Lint subsystem design @@ -216,8 +184,6 @@ The four top-level systems map to these kebab-case folder names: | `DemaConsulting.SysML2Tools.Language` | `sysml2-tools-language` | | `DemaConsulting.SysML2Tools.Stdlib` | `sysml2-tools-stdlib` | | `DemaConsulting.SysML2Tools` | `sysml2-tools-core` | -| `DemaConsulting.SysML2Tools.Svg` | `sysml2-tools-svg` | -| `DemaConsulting.SysML2Tools.Png` | `sysml2-tools-png` | | `DemaConsulting.SysML2Tools.Tool` | `sysml2-tools-tool` | OTS items have integration/usage design documentation parallel to system folders: @@ -240,9 +206,9 @@ Review-sets: defined in `.reviewmark.yaml` | Test results output | `DemaConsulting.TestResults` | — | | Unit testing | xUnit v3 | Apache 2.0 | -No ImageSharp dependency. SkiaSharp is chosen over ImageSharp to avoid the Six Labors -Split License, which would impose licensing obligations on library consumers embedding -`DemaConsulting.SysML2Tools.Png` in commercial products. +No ImageSharp dependency. The off-the-shelf `DemaConsulting.Rendering.Skia` PNG renderer uses +SkiaSharp, chosen over ImageSharp to avoid the Six Labors Split License, which would impose +licensing obligations on library consumers embedding the renderer in commercial products. ## Architectural Decisions @@ -283,12 +249,11 @@ to handle custom viewpoints that specialize stdlib viewpoints. human-readable message. The `lint` command makes this output useful for AI-assisted model authoring loops. -**Layout engines are independent and reusable.** Non-trivial layout algorithms -(`ContainmentPacker`, `ChannelRouter`, `InterconnectionLayoutEngine`, and the -reusable `LayeredLayoutPipeline` and its stages) live in `Layout/Engine/` with no -dependency on the SysML semantic model. Each engine accepts plain geometric input -and returns computed geometry, making them independently testable and reusable across -multiple view strategies. See `ROADMAP.md` for the phased introduction of each engine. +**Geometric layout is off-the-shelf.** Non-trivial geometric layout algorithms (containment +packing, orthogonal connector routing, and the layered layout algorithm) are provided by the +off-the-shelf `DemaConsulting.Rendering.Layout` package with no dependency on the SysML semantic +model. The `LayeredPlacement` helper adapts that algorithm for the view strategies, accepting +plain geometric input and returning computed geometry. **Theme record is a compile-time constant in v1.** Loadable theme files are deferred to v2. The Theme record data structure is defined in v1 so that v2 loadable themes @@ -310,8 +275,8 @@ tests the integrated tool, not just unit-level components. SARIF output can be added as a formatting option on the existing infrastructure without any breaking changes. -**SkiaSharp native assets for library consumers.** Consumers referencing -`DemaConsulting.SysML2Tools.Png` must ensure the appropriate +**SkiaSharp native assets for library consumers.** Consumers referencing the off-the-shelf +`DemaConsulting.Rendering.Skia` PNG renderer must ensure the appropriate `SkiaSharp.NativeAssets.*` package is included in their publish output. This must be documented clearly in the package README. diff --git a/docs/design/sysml2-tools-core.md b/docs/design/sysml2-tools-core.md index d21ad460..da197cf4 100644 --- a/docs/design/sysml2-tools-core.md +++ b/docs/design/sysml2-tools-core.md @@ -7,11 +7,14 @@ for SysML v2 diagram generation. It depends on `DemaConsulting.SysML2Tools.Langu parsing and semantic analysis, and on `DemaConsulting.SysML2Tools.Stdlib` for the pre-compiled standard library. -Phase 3 introduces two subsystems: **Layout** and **Rendering**. The Layout subsystem defines -the `LayoutTree` intermediate representation consumed by renderers — nine immutable node record -types covering all SysML diagram elements. The Rendering subsystem defines the interfaces and -data types that form the rendering pipeline: `IRenderer`, `ILayoutStrategy`, `Theme`, -`RenderOptions`, `RenderOutput`, and `DiagramRenderer`. +The core library provides two subsystems: **Layout** and **Rendering**. The Layout subsystem +maps the SysML semantic model onto the `LayoutTree` intermediate representation — nine immutable +node record types covering all SysML diagram elements — which is provided off-the-shelf by the +`DemaConsulting.Rendering` package, and delegates geometric placement and routing to the +off-the-shelf `DemaConsulting.Rendering.Layout` layered algorithm. The Rendering subsystem +consumes the off-the-shelf rendering contracts (`IRenderer`, `Theme`, `RenderOptions`, +`RenderOutput`) from the `DemaConsulting.Rendering.Abstractions` package and retains the +SysML-coupled `ILayoutStrategy` and `DiagramRenderer` that drive the pipeline. ```mermaid flowchart TD @@ -88,9 +91,10 @@ N/A — not a safety-classified software item. `RenderOptions`. For each view declared in the workspace it constructs a `ViewContext` containing the view name and workspace reference. 2. `ILayoutStrategy.BuildLayout` is called with the `ViewContext` and `RenderOptions`. The - Layout subsystem produces a fully resolved `LayoutTree` via its layered layout pipeline, - placing every node at absolute coordinates and routing every connector as an orthogonal - polyline. The Rendering subsystem then renders that tree. + Layout subsystem produces a fully resolved `LayoutTree` by delegating geometric placement and + routing to the off-the-shelf `DemaConsulting.Rendering.Layout` layered algorithm (through the + `LayeredPlacement` helper), placing every node at absolute coordinates and routing every + connector as an orthogonal polyline. The Rendering subsystem then renders that tree. 3. `IRenderer.Render` is called with the `LayoutTree`, `RenderOptions`, and a fresh output `Stream`. The renderer reads each `LayoutNode` in the tree, translates it to output-format primitives, and writes bytes to the stream. diff --git a/docs/design/sysml2-tools-core/layout.md b/docs/design/sysml2-tools-core/layout.md index 6be828b8..31ae32fd 100644 --- a/docs/design/sysml2-tools-core/layout.md +++ b/docs/design/sysml2-tools-core/layout.md @@ -2,14 +2,15 @@ ### Overview -The Layout subsystem defines the intermediate representation consumed by all renderers. It -provides a tree of immutable records — collectively called a `LayoutTree` — that describes -the visual structure of one rendered diagram view. All spatial decisions (node placement, -line routing, compartment sizing) are made by an `ILayoutStrategy` before the tree is handed -to a renderer; the renderer only reads the tree and writes output. +The Layout subsystem maps the SysML semantic model onto the intermediate representation consumed +by all renderers. That intermediate representation — a tree of immutable records collectively +called a `LayoutTree` — is provided off-the-shelf by the `DemaConsulting.Rendering` package and +describes the visual structure of one rendered diagram view. All spatial decisions (node +placement, line routing, compartment sizing) are made by an `ILayoutStrategy` before the tree is +handed to a renderer; the renderer only reads the tree and writes output. -The Layout subsystem contains nine concrete node types, each a `sealed record` derived from -the abstract base `LayoutNode`: +The `LayoutTree` provided by the `DemaConsulting.Rendering` package exposes nine concrete node +types, each a `sealed record` derived from the abstract base `LayoutNode`: | Node type | Role | SysML diagram types | | --- | --- | --- | @@ -25,8 +26,9 @@ the abstract base `LayoutNode`: ### Interfaces -The Layout subsystem exposes only data types. No methods are defined; all construction is -performed by `ILayoutStrategy` implementations (see *Rendering Subsystem*). +The `LayoutTree` intermediate representation exposes only data types, provided by the +`DemaConsulting.Rendering` package. No methods are defined; all construction is performed by +`ILayoutStrategy` implementations (see *Rendering Subsystem*). ```mermaid flowchart TD @@ -143,8 +145,9 @@ flowchart TD ### Design -The Layout subsystem is a pure data model with no methods or algorithms. The design -decisions recorded here reflect constraints imposed during the Phase 3 vocabulary review. +The `LayoutTree` intermediate representation is a pure data model with no methods or algorithms, +now provided off-the-shelf by the `DemaConsulting.Rendering` package. The design decisions +recorded here document the properties of that representation that SysML2Tools relies on. 1. **Absolute coordinates.** All `X`, `Y`, `CentreX`, `CentreY`, `TopY`, `BottomY` fields store values in canvas space with the origin at the top-left corner. Renderers never @@ -174,44 +177,34 @@ decisions recorded here reflect constraints imposed during the Phase 3 vocabular ### Design Constraints -- All Layout types target net8.0, net9.0, and net10.0 with `enable`. -- No methods or behaviors are defined in the Layout subsystem data types; it is a data model only. -- `TextAlign` is declared in `LayoutLabel.cs` and reused by `LayoutGrid.cs`; both files - are in the same `DemaConsulting.SysML2Tools.Layout` namespace, so no cross-namespace - import is required. +- The `LayoutTree` types are provided by the `DemaConsulting.Rendering` package, which targets + net8.0, net9.0, and net10.0 with `enable`. +- No methods or behaviors are defined in the `LayoutTree` data types; it is a data model only. +- The view layout strategies and the `LayeredPlacement` helper are the SysML-coupled code that + remains in this subsystem; they consume the off-the-shelf data model and layered algorithm. ### Subsystem Structure -Beyond the `LayoutTree` data model described above, the Layout subsystem contains two -sub-subsystems and one helper unit, each documented in its own chapter: +Beyond the `LayoutTree` data model consumed from the `DemaConsulting.Rendering` package, the +Layout subsystem contains one sub-subsystem and one helper unit, each documented in its own +chapter: -- **Engine** — the reusable, model-independent geometric layout engines (`ChannelRouter`, - `ContainmentPacker`, `InterconnectionLayoutEngine`, and the reusable `LayeredLayoutPipeline` - provided by the nested `Layered` sub-subsystem). See the *Layout Engine Subsystem* chapter. - **Internal** — the per-view layout strategies that map the semantic model to a `LayoutTree` (general, interconnection, state transition, action flow, sequence, grid, and browser views), plus `LayoutWarnings`. See the *Layout Internal Subsystem* chapter. -- **ConnectorLabelPlacer** — collision-aware placement of connector midpoint labels. See its - own unit chapter. +- **LayeredPlacement** — a thin helper that adapts the off-the-shelf + `DemaConsulting.Rendering.Layout` layered algorithm, returning placed rectangles and routed + polylines to the strategies. See its own unit chapter. -The view strategies own the mapping from the SysML semantic model into geometric input, -invoke one or more engines to compute geometry, and assemble the resulting `LayoutTree`. The -engines themselves never reference the semantic model. +The view strategies own the mapping from the SysML semantic model into geometric input, invoke +`LayeredPlacement` (and thereby the off-the-shelf layered algorithm) to compute geometry, and +assemble the resulting `LayoutTree`. The off-the-shelf algorithm never references the semantic +model. ### Requirements Traceability | Requirement ID | Satisfied by | | --- | --- | -| SysML2Tools-Core-Layout-LayoutTree | `LayoutTree` record | -| SysML2Tools-Core-Layout-AbsoluteCoordinates | All coordinate fields; no transform logic | -| SysML2Tools-Core-Layout-LayoutBox | `LayoutBox` record with `Depth`, `Shape`, `Compartments`, `Children` | -| SysML2Tools-Core-Layout-DepthNotColor | `LayoutBox.Depth` int; no color field | -| SysML2Tools-Core-Layout-TreeStructure | `LayoutBox.Children` and `LayoutBand.Children` | -| SysML2Tools-Core-Layout-LayoutPort | `LayoutPort` record with `CentreX`, `CentreY`, `Side` | -| SysML2Tools-Core-Layout-LayoutLine | `LayoutLine` record with `Waypoints`, end markers, `LineStyle` | -| SysML2Tools-Core-Layout-LayoutLabel | `LayoutLabel` record | -| SysML2Tools-Core-Layout-LayoutBadge | `LayoutBadge` record | -| SysML2Tools-Core-Layout-LayoutBand | `LayoutBand` record | -| SysML2Tools-Core-Layout-LayoutLifeline | `LayoutLifeline` and `LayoutActivation` records | -| SysML2Tools-Core-Layout-LayoutGrid | `LayoutGrid`, `LayoutGridRow`, `LayoutGridCell` records | -| SysML2Tools-Core-Layout-PreRoutedLines | `LayoutLine.Waypoints`; routing in `ILayoutStrategy` | +| SysML2Tools-Core-Layout-LayoutTree | View strategies mapping the model to a `LayoutTree` | +| SysML2Tools-Core-Layout-DelegatedGeometry | `LayeredPlacement` over the off-the-shelf algorithm | +| SysML2Tools-Core-Layout-PreRoutedLines | `LayoutLine.Waypoints` resolved before rendering | diff --git a/docs/design/sysml2-tools-core/layout/box-metrics.md b/docs/design/sysml2-tools-core/layout/box-metrics.md deleted file mode 100644 index b261a5f8..00000000 --- a/docs/design/sysml2-tools-core/layout/box-metrics.md +++ /dev/null @@ -1,49 +0,0 @@ -### BoxMetrics - -#### Purpose - -`BoxMetrics` is the single home for the box title-area and folder-tab height formulas that are shared -by the layout strategies and the renderers. Because both sides derive reserved space and drawn space -from the same formulas, a box's title never collides with its nested children and a folder tab always -matches the space reserved above the box body. It is the layout-geometry peer of `NotationMetrics`. - -#### Data Model - -`BoxMetrics` is a static class with no instance state. Both methods take a `Theme` and return a -height in logical pixels. - -#### Key Methods - -##### `TitleAreaHeight(theme, hasLabel, hasKeyword)` - -Returns the vertical space reserved at the top of a box for the optional keyword line and the bold -name line. Returns `0.0` when the box has neither a label nor a keyword; otherwise it accumulates one -`LabelPadding`, then `FontSizeBody + LabelPadding` when a keyword is present, then -`FontSizeTitle + LabelPadding` when a label is present. - -##### `FolderTabHeight(theme)` - -Returns the height of the folder tab drawn at the top-left of a `BoxShape.Folder` box, computed as -`FontSizeBody + 2 * LabelPadding`. - -#### Error Handling - -Both methods are pure functions over the supplied `Theme` and boolean flags; they perform no -allocation and cannot fail for a non-null theme. - -#### Dependencies - -- `Theme` (Rendering subsystem) — supplies the font sizes and label padding. - -#### Callers - -The interconnection and other view layout strategies call `TitleAreaHeight` to reserve title space -above nested children; the SVG and PNG renderers call both methods to draw the title area and folder -tab into the reserved space. - -#### Requirements Traceability - -| Requirement ID | Satisfied by | -| --- | --- | -| SysML2Tools-Core-Layout-BoxMetrics-TitleAreaHeight | `TitleAreaHeight(Theme, bool, bool)` | -| SysML2Tools-Core-Layout-BoxMetrics-FolderTabHeight | `FolderTabHeight(Theme)` | diff --git a/docs/design/sysml2-tools-core/layout/connector-label-placer.md b/docs/design/sysml2-tools-core/layout/connector-label-placer.md deleted file mode 100644 index 8ce01be3..00000000 --- a/docs/design/sysml2-tools-core/layout/connector-label-placer.md +++ /dev/null @@ -1,53 +0,0 @@ -### ConnectorLabelPlacer - -#### Purpose - -`ConnectorLabelPlacer` computes non-overlapping screen positions for connector (midpoint) labels. -Its single responsibility is to assign each labelled line a label centre that reads as belonging to -that connector while keeping labels from colliding with one another. Both the SVG and PNG renderers -share this unit so their label layouts match. - -#### Data Model - -`ConnectorLabelPlacer` is a static class with no instance state. Inputs are the lines to place -labels for (in render order) and the body font size. It uses a private `Rect` value type for label -overlap tests. Output is a dictionary mapping each labelled `LayoutLine` to its chosen `(X, Y)` -label centre; lines without a label are absent from the dictionary. - -#### Key Methods - -##### `Place(lines, fontSize)` - -Iterates the lines in order, skipping any with no label or no waypoints. For each labelled line it -estimates the label box half-width and half-height from the text length and font size (plus a small -clearance gap), chooses a position via `ChoosePosition`, records the occupied box, and stores the -result. Processing lines in input order makes the result deterministic. - -##### `ChoosePosition(waypoints, halfWidth, halfHeight, placed)` - -Selects a label centre for one line: - -1. The segment midpoints are ordered by descending segment length, so the longest (most open) run is - preferred. -2. The first segment midpoint that does not overlap an already-placed label box is used. -3. If every segment midpoint collides, the label is nudged along the longest segment's perpendicular - in increasing steps (alternating sides) until a clear position is found. -4. If no clear position is found, the longest segment's midpoint is used as a fallback. - -A single-waypoint line places its label at that point. `Collides` performs the axis-aligned box -overlap test used throughout. - -#### Error Handling - -A null `lines` argument throws `ArgumentNullException`. Degenerate input never throws: lines with no -label or no waypoints are skipped, and a line whose labels cannot be separated falls back to its -longest-segment midpoint rather than failing. - -#### Dependencies - -- `LayoutLine` and `Point2D` (Layout subsystem). - -#### Callers - -The SVG and PNG renderers call `ConnectorLabelPlacer.Place` to position connector labels before -drawing them. diff --git a/docs/design/sysml2-tools-core/layout/engine.md b/docs/design/sysml2-tools-core/layout/engine.md deleted file mode 100644 index 5895811f..00000000 --- a/docs/design/sysml2-tools-core/layout/engine.md +++ /dev/null @@ -1,42 +0,0 @@ -### Layout Engine Subsystem - -#### Overview - -The Engine subsystem provides the reusable geometric layout engines used by the per-view -layout strategies. Each engine solves one well-defined placement or routing problem from -plain geometric input — box sizes, connection pairs, anchor points, and obstacle -rectangles — and returns computed geometry. No engine references the SysML semantic model, -so every engine is reusable across view strategies and testable in isolation. - -The subsystem contains the following units: - -| Unit | Responsibility | -| --- | --- | -| `ChannelRouter` | Routes an orthogonal connector between two anchors, avoiding obstacles | -| `InterconnectionLayoutEngine` | Façade that assembles and runs the layered pipeline for the interconnection view | -| `ContainmentPacker` | Packs sized boxes within a bounded container region | - -The subsystem also contains the nested **Layered** subsystem, which provides a reusable, -ELK-style layered layout pipeline composed of single-responsibility stages. The -`InterconnectionLayoutEngine` façade is a thin assembler over that pipeline. See the -*Layout Engine Layered Subsystem* chapter for its units and stage decomposition. - -#### Interfaces - -Each engine exposes a single static entry point that accepts plain geometric records -(sizes, edges, anchors, obstacle rectangles) and returns computed geometry (placed -rectangles, ordered waypoints, or port placements). The engines consume and produce the -geometric value types declared in the Layout subsystem (for example `Point2D` and the -internal `Rect`); they do not consume `SysmlNode` or any semantic type. - -#### Design - -The view strategies (see *Layout Internal Subsystem*) own the mapping from the semantic -model to geometric input and back. They call the engines to obtain geometry and then build -the `LayoutTree`. This separation keeps the engines small, single-purpose, and independently -verifiable. Layered views drive their geometry through the reusable `LayeredLayoutPipeline` -and its single-responsibility stages (packing connected components via `ComponentPacker` and -routing edges via the pipeline's `OrthogonalRouter`), while a strategy may combine additional -engines as needed (for example, `ContainmentPacker` for package-folder grouping and -`ChannelRouter` for cross-package connector fallback). The detailed algorithm of each engine is -described in its own unit chapter. diff --git a/docs/design/sysml2-tools-core/layout/engine/channel-router.md b/docs/design/sysml2-tools-core/layout/engine/channel-router.md deleted file mode 100644 index b9086349..00000000 --- a/docs/design/sysml2-tools-core/layout/engine/channel-router.md +++ /dev/null @@ -1,69 +0,0 @@ -#### ChannelRouter - -##### Purpose - -`ChannelRouter` routes a single orthogonal connector between a source anchor and a target -anchor, steering around obstacle rectangles and keeping a requested clearance. It is the -engine through which all routed connector quality (state transitions, action successions, -interconnection connectors, specialization edges) flows. - -##### Data Model - -`ChannelRouter` is a static class with no instance state. Inputs are the source and target -`Point2D` anchors, a list of obstacle `Rect`, a clearance distance, optional source and target -`PortSide` values, and an optional list of `CostBand` records. The result is a `RouteResult` -record carrying the ordered `Waypoints` and a `Crossed` flag. - -##### Key Methods - -###### `RouteWithStatus(source, target, obstacles, clearance, sourceSide?, targetSide?, costBands?)` - -Computes the route and reports whether it had to cross an obstacle. The algorithm is: - -1. **Perpendicular stubs.** When a side is supplied, the anchor is stepped off its edge by a - short stub so the connector leaves and enters boxes at right angles. Each stub length is - capped to half the gap to the opposing anchor along the step axis, so two stubs facing - each other across a narrow gap meet at the midline instead of overshooting (which would - produce a visible reversal at the end marker). -2. **Grid construction.** Candidate grid lines are built from the two endpoint coordinates - plus each obstacle's near and far edges offset outward by the current clearance. -3. **Clearance-retry ladder.** An A\*-style search runs over the grid at successively smaller - clearances — full, half, quarter, then zero. Segments are rejected when they pass within - the current clearance of an obstacle (the obstacles are inflated by the clearance and - tested with strict inequalities, so a segment exactly one clearance away is allowed). The - largest clearance that yields an obstacle-free path is used. At clearance zero, grid lines - sit on box edges and edge-hugging routes are permitted, so a clean path is found in almost - all cases. -4. **Crossing fallback.** Only when no obstacle-free path exists at any clearance (for example - an enclosed target) does the router fall back to a best-effort L-shape and set - `Crossed = true`. -5. **Finalize.** The original anchors are re-attached outside their stubs and the path is - simplified — collinear interior points are removed, but U-turns are preserved so a - perpendicular stub is never collapsed, and duplicate points are dropped. - -The turn penalty in the search biases toward routes with fewer bends, so connectors prefer -straight runs where the geometry allows. When cost bands are supplied, each segment's length is -scaled by the cheapest band covering its midpoint, so a 0.6 highway band attracts wires into shared -corridors; a null band list leaves cost neutral. - -###### `Route(...)` - -A thin wrapper that returns only the `Waypoints` of `RouteWithStatus`, for callers that do -not need the crossing status. - -##### Error Handling - -Null `source`, `target`, or `obstacles` arguments throw `ArgumentNullException`. Degenerate -geometry never throws: when no clean route exists the router returns a crossing route with -`Crossed = true` rather than failing, leaving the decision to surface a warning to the caller. - -##### Dependencies - -- `Point2D` and the internal `Rect` geometric value types (Layout subsystem). -- `PortSide` (Layout subsystem) for perpendicular-stub direction. - -##### Callers - -Every view strategy that draws connectors: `GeneralViewLayoutStrategy`, -`InterconnectionViewLayoutStrategy`, `StateTransitionViewLayoutStrategy`, and -`ActionFlowViewLayoutStrategy`. The `Crossed` flag feeds `LayoutWarnings`. diff --git a/docs/design/sysml2-tools-core/layout/engine/containment-packer.md b/docs/design/sysml2-tools-core/layout/engine/containment-packer.md deleted file mode 100644 index c525653c..00000000 --- a/docs/design/sysml2-tools-core/layout/engine/containment-packer.md +++ /dev/null @@ -1,57 +0,0 @@ -#### ContainmentPacker - -##### Purpose - -`ContainmentPacker` arranges a sequence of variable-size items into rows within a width budget. It -places items left to right, wraps to a new row when the next item would exceed the maximum content -width, and sizes the enclosing region to fit all items plus uniform outer padding. It is used to -pack child elements inside a containing box (for example, the parts inside a block) in a compact, -ordered grid. - -##### Data Model - -`ContainmentPacker` is a static class with no instance state. Inputs are a list of `PackItem` -records (each a `Width` and `Height`), a `maxContentWidth`, a `horizontalGap`, a `verticalGap`, and -a `padding`. The result is a `PackResult` record carrying the region `Width`, `Height`, and the -ordered list of `PackedRect` rectangles, one per input item in input order, each positioned -relative to the region origin `(0, 0)`. - -##### Key Methods - -###### `Pack(items, maxContentWidth, horizontalGap, verticalGap, padding)` - -Computes the packing. The algorithm is a single left-to-right shelf (row) pass: - -1. **Degenerate case.** An empty item list returns a region of `2 * padding` on each axis with no - rectangles. -2. **Row filling.** A horizontal cursor starts at the left padding offset. Each item is placed at - the current cursor and the cursor advances past the item plus `horizontalGap`. The row's height - tracks the tallest item placed so far. -3. **Wrapping.** Before placing an item that is not the first in its row, the packer checks whether - its right edge would exceed `padding + maxContentWidth`. If so, it drops to a new row below the - current one (advancing the row top by the current row height plus `verticalGap`), resets the - cursor to the left padding offset, and places the item there. Because the first-in-row item is - exempt from the check, an item wider than the content width is placed alone on its own row rather - than being dropped, and the region width grows to contain it. -4. **Region sizing.** The total width is the widest row's right edge plus padding; the total height - is the last row's bottom plus padding. Tracking the widest content right edge across all rows is - what lets an oversized item extend the region width. - -Input order is preserved, and the left-to-right, no-backtracking placement is what guarantees that -no two rectangles overlap and that every rectangle stays within the reported region. - -##### Error Handling - -A null `items` argument throws `ArgumentNullException`. An empty item list returns a padding-only -region. No other input causes a throw; an oversized item is handled by the first-in-row exemption -rather than by an error. - -##### Dependencies - -- `PackedRect` (Layout subsystem) — the placed-rectangle value type returned in the result. This - type is declared alongside `ContainmentPacker`. - -##### Callers - -View layout strategies that pack child elements inside a containing box, using the returned -rectangles to position children and the region size to size the container. diff --git a/docs/design/sysml2-tools-core/layout/engine/interconnection-layout-engine.md b/docs/design/sysml2-tools-core/layout/engine/interconnection-layout-engine.md deleted file mode 100644 index 3981f23f..00000000 --- a/docs/design/sysml2-tools-core/layout/engine/interconnection-layout-engine.md +++ /dev/null @@ -1,83 +0,0 @@ -#### InterconnectionLayoutEngine - -##### Purpose - -`InterconnectionLayoutEngine` places the nested part boxes of an Interconnection View and routes -all connector lines using a full Sugiyama-style pipeline, matching the ELK reference sandbox -output. It is now a thin **façade** that assembles and runs the reusable `LayeredLayoutPipeline` -(see the *Layout Engine Layered Subsystem*) with its default stage sequence, the **Right** layout -direction, and **flat** hierarchy handling. The public `Place` API and the `LayerResult` output are -unchanged — the façade produces byte-for-byte identical geometry to the previous monolithic -implementation, which is proven by a bit-exact equivalence test against a legacy oracle. The -pipeline replaced the earlier BFS-layered `LayeredPlacer`, eliminating same-layer connections and -connector clipping caused by incomplete layering and absent dummy-node support. - -##### Data Model - -`InterconnectionLayoutEngine` is a static class with no instance state. `Place` builds a -`LayeredGraph` from the inputs and runs it through a `LayeredLayoutPipeline` configured with the -default stages; the phases below describe the behavior realized by those stages. Input is a -`IReadOnlyList` (width and height per node) and a `IReadOnlyList` (directed -edges following SysML endpoint-A → endpoint-B order). The result is a `LayerResult` record -carrying one `Rect` per real node in input-index order, the bounding-box totals, a `NodeLayers` -list of longest-path layer indices, and a `ConnectorWaypoints` list of complete orthogonal -waypoints per edge. - -##### Key Methods - -###### `Place(nodes, edges)` - -Eight-phase algorithm: - -1. **Cycle breaking.** DFS back-edge detection reverses any edges that form cycles, producing a - directed acyclic graph. Self-loops and duplicate edges are dropped. - -2. **Longest-path layering.** A topological pass assigns each node a layer equal to the length of - the longest directed path from any source. Every edge goes from a strictly lower layer to a - strictly higher layer — no same-layer connections are possible. - -3. **Dummy-node insertion.** For each edge whose endpoint layers differ by more than one, zero-size - placeholder nodes are inserted at each intermediate layer. This forces the routing path through - the correct inter-layer corridors and prevents connector lines from clipping the boxes of - intermediate nodes. - -4. **Barycenter ordering.** Alternating left-to-right and right-to-left sweep passes sort nodes - within each layer by the mean position of their neighbors in the adjacent layer, reducing visual - edge crossings. - -5. **Coordinate assignment.** Column left-edge X positions are derived from corridor widths, which - scale with the number of augmented edges that cross each gap - (`max(70, clearance + count × 16 + clearance)`). Within each column, real nodes and dummy nodes - are stacked top-to-bottom with 30 px gaps; dummy nodes take zero vertical space. - -6. **Port distribution.** Outgoing connections are distributed evenly along the right face of each - real node, sorted by target center-Y; incoming connections are distributed along the left face, - sorted by source center-Y. Dummy nodes route at their center Y. - -7. **Slot assignment.** For each inter-layer corridor all crossing augmented edges are sorted by - mean port Y and assigned a unique vertical slot X: - `slotX[k] = corridorLeft + clearance + k × edgeSpacing`. Slot conflicts are impossible by - construction. - -8. **Waypoint stitching.** Each original edge is reconstructed from its augmented segment chain. - Every segment contributes a Z-path `[srcPort, slotX, slotX, tgtPort]`; consecutive segments - share the dummy node as a join point, producing a single orthogonal polyline per connection. - -##### Error Handling - -Null `nodes` or `edges` arguments throw `ArgumentNullException`. An empty `nodes` list returns a -minimal-size `LayerResult` with empty lists without performing any computation. Out-of-range edge -indices and self-loops are silently ignored. - -##### Dependencies - -- `LayeredLayoutPipeline` (Layout Engine Layered) — the reusable staged pipeline the façade - assembles and runs to compute the placement and routing. -- `Rect` (Layout Engine) — the geometric rectangle value type shared by all layout engines. -- `Point2D` (Layout) — the immutable 2-D point type used for connector waypoints. - -##### Callers - -`InterconnectionViewLayoutStrategy.BuildLayout` calls `Place` to obtain the `LayerResult`, applies -the container offset to `Rects` and `ConnectorWaypoints`, and emits `LayoutPort` and `LayoutLine` -nodes directly from the pre-computed waypoints. diff --git a/docs/design/sysml2-tools-core/layout/engine/layered.md b/docs/design/sysml2-tools-core/layout/engine/layered.md deleted file mode 100644 index 96a0b102..00000000 --- a/docs/design/sysml2-tools-core/layout/engine/layered.md +++ /dev/null @@ -1,61 +0,0 @@ -#### Layout Engine Layered Subsystem - -##### Overview - -The Layered subsystem is a reusable, composable layered-layout pipeline that reproduces ELK's -layered (Sugiyama-style) algorithm. It replaces the single monolithic placement method that the -interconnection engine previously contained with an ordered sequence of small, single-purpose -stages. Each stage reads the state produced by earlier stages and writes the state it owns, so the -pipeline can be extended, reordered, and unit-tested one stage at a time. - -The subsystem was produced by a behavior-preserving extraction: for every input it produces exactly -the same rectangles, totals, layer assignments, and connector waypoints as the previous -implementation, verified byte for byte by the pipeline-equivalence tests. - -The subsystem contains the following units: - -| Unit | Responsibility | -| --- | --- | -| `LayeredGraph` | Mutable shared state threaded through every stage | -| `LayeredLayoutPipeline` | Runs ordered stages via a fluent builder; hosts the stage interface, enums, and metrics | -| `CycleBreaker` | Reverses cycle-causing edges to produce an acyclic edge set | -| `LayerAssigner` | Assigns each node a longest-path layer index | -| `LongEdgeSplitter` | Splits multi-layer edges with one dummy node per intermediate layer | -| `CrossingMinimizer` | Orders nodes within each layer to reduce edge crossings | -| `BrandesKopfPlacer` | Assigns absolute X and Y coordinates to every augmented node | -| `PortDistributor` | Distributes connector ports along each box face | -| `OrthogonalRouter` | Assigns routing slots and emits orthogonal bend points per corridor | -| `LongEdgeJoiner` | Concatenates sub-edge bend points into one polyline per original edge | -| `AxisTransform` | Maps abstract along/cross coordinates onto screen coordinates | -| `ComponentPacker` | Lays out each connected component independently and packs them without overlap | - -##### Interfaces - -Each stage implements the `ILayoutStage` interface (`void Apply(LayeredGraph graph)`) and mutates -the shared `LayeredGraph` in place. A pipeline is assembled through the fluent -`LayeredLayoutPipeline.PipelineBuilder` (`Direction`, `Hierarchy`, `AddStage`, `AddDefaultStages`, -`Build`) and executed with `Run`. The default stage sequence is, in order: `CycleBreaker`, -`LayerAssigner`, `LongEdgeSplitter`, `CrossingMinimizer`, `BrandesKopfPlacer`, `PortDistributor`, -`OrthogonalRouter`, `LongEdgeJoiner`, and `AxisTransform`. `ComponentPacker` is an optional composite -stage that wraps an inner stage sequence: it is added explicitly by callers that lay out potentially -disconnected graphs (such as the General view), where it splits the graph into connected components, -runs the inner stages on each, and packs the results without overlap. All types are `internal` and -consume only the geometric value types of the Layout subsystem (`Point2D`, `Rect`) plus the internal -`LayerNode` and `LayerEdge` records; no stage references the SysML semantic model. - -##### Design - -The `LayeredLayoutMetrics` constants (spacing, clearances, padding, sweep count, tolerance) are -shared by every stage and are intentionally identical to the constants embedded in the previous -monolithic engine, so the pipeline reproduces the legacy output exactly. The deleted -`ReversedEdgeApproach` magic constant is replaced by the per-graph `LayeredGraph.BackEdgeEntryApproach` -parameter, which the `OrthogonalRouter` reads to size a reversed edge's final straight approach; it -defaults to `ConnectorClearance`, so the default pipeline stays byte-identical, while a -decoration-aware caller can raise it to clear an end marker's along-line length. The `LayoutDirection` -and `HierarchyHandling` enums select flow direction and nested-node handling. The left-to-right direction -is the abstract identity (its output is byte-identical to the original engine); the down, left, and up -directions are mapped by `AxisTransform`, which also normalizes the input node axes (swapping width and -height for the down/up directions) at the start of `Run` so layer spacing is driven by the correct -extent. Flat hierarchy handling is supported; the recursive mode is reserved and fails fast with a -clear error. The detailed algorithm of each stage is described in its own -unit chapter. diff --git a/docs/design/sysml2-tools-core/layout/engine/layered/axis-transform.md b/docs/design/sysml2-tools-core/layout/engine/layered/axis-transform.md deleted file mode 100644 index d9f4121e..00000000 --- a/docs/design/sysml2-tools-core/layout/engine/layered/axis-transform.md +++ /dev/null @@ -1,46 +0,0 @@ -##### AxisTransform - -###### Purpose - -`AxisTransform` is the final pipeline stage. It maps the abstract along/cross coordinates computed by -the earlier stages onto screen coordinates for the requested `LayoutDirection`, isolating all -direction handling to a single unit. - -###### Responsibilities - -The earlier stages always compute in the left-to-right-equivalent abstract axes (layer progression on -the +X axis, within-layer position on the +Y axis); a node's along-extent is its width and its -cross-extent its height. This stage converts those abstract coordinates into screen coordinates for -each direction: - -- **Right** is the abstract identity direction — coordinates are already in screen space, so the stage - performs no transformation and the pipeline output is byte-identical to the pre-direction baseline. -- **Down** is a pure transpose: along maps to screen Y and cross to screen X. A source point on the - abstract right face becomes the node's SOUTH face and a target point on the abstract left face - becomes the node's NORTH face, so the SOUTH-exit / NORTH-entry behaviour emerges from the mapping - without separate face logic. -- **Left** reflects the along-axis about its maximum (screen X = max − along); cross is unchanged. -- **Up** transposes and reflects the along-axis into screen Y. - -Mapping top-to-bottom or bottom-to-top additionally requires the along-axis to be driven by the node -*height* rather than its width, so a final coordinate remap alone is insufficient. The static -`NormalizeInputAxes` method swaps each input node's width and height for the down/up directions before -the stages run (a no-op for right/left, which keeps those outputs byte-identical); the pipeline calls -it at the start of `Run`. The instance `Apply` method then performs the final coordinate remap over the -augmented-node positions and every edge's waypoints. - -###### Inputs and Outputs - -- Reads: `LayeredGraph.Direction`, `AugNodes` (along-extents), `AugX`/`AugY`, and `Waypoints`. -- Writes: the remapped `AugX`/`AugY` and `Waypoints` (no-op for the right identity direction). - `NormalizeInputAxes` writes the swapped `Nodes` for the down/up directions. - -###### Error Handling - -A null graph throws `ArgumentNullException`. All four layout directions are supported. - -###### Dependencies - -- `LayeredGraph` (Layered) — the shared state whose direction, node sizes, positions, and waypoints - are read and (for non-right directions) rewritten; `SwapNodeAxes` is the input-normalization seam. -- `LayoutDirection` (Layered) — the requested flow direction. diff --git a/docs/design/sysml2-tools-core/layout/engine/layered/brandes-kopf-placer.md b/docs/design/sysml2-tools-core/layout/engine/layered/brandes-kopf-placer.md deleted file mode 100644 index a839f900..00000000 --- a/docs/design/sysml2-tools-core/layout/engine/layered/brandes-kopf-placer.md +++ /dev/null @@ -1,67 +0,0 @@ -##### BrandesKopfPlacer - -###### Purpose - -`BrandesKopfPlacer` is the fifth pipeline stage. It assigns absolute X and Y coordinates to every -augmented node, using ELK's horizontal placement for X and the Brandes-Köpf balanced four-layout -algorithm for Y. - -###### Responsibilities - -For X, the stage computes the maximum real-node width per layer and derives each column's left edge -from the previous column's left edge plus that column's width plus a corridor whose width scales with -the number of sub-edges crossing the gap. Real nodes are left-aligned to their column; dummy nodes -are centered in their column. For Y, it runs four independent vertical alignments (the two scan -directions crossed with the two horizontal directions), compacts each, and averages the two middle -results per node to produce port-aligned, crossing-minimized vertical positions, adding the uniform -padding once at the end. Columns are placed left to right in layer order, so each column's left edge -is strictly greater than the previous one's. - -###### Inputs and Outputs - -- Reads: `LayeredGraph.AugNodes`, `LayeredGraph.Groups`, `LayeredGraph.AugEdges`. -- Writes: `LayeredGraph.AugX`, `LayeredGraph.AugY`, `LayeredGraph.ColumnX`, `LayeredGraph.MaxColWidth`. - -###### Data Model - -`BrandesKopfPlacer` is stateless; it holds no fields and operates on the shared `LayeredGraph` -passed to `Apply`: - -- Reads: `LayeredGraph.AugNodes` (each node's `Width`, `IsDummy`, and `Layer`), `LayeredGraph.Groups` - (the per-layer ordering produced by `CrossingMinimizer`), and `LayeredGraph.AugEdges`. -- Writes: `LayeredGraph.AugX` and `LayeredGraph.AugY` (one absolute coordinate per augmented node), - `LayeredGraph.ColumnX` (the left edge of each layer column), and `LayeredGraph.MaxColWidth` (the - maximum real-node width per layer column). The coordinate arrays are sized to the augmented-node - count; the column arrays are sized to the layer count. - -###### Key Methods - -- `Apply(LayeredGraph graph)` — the `ILayoutStage` entry point. Rejects a null graph, computes the four - output arrays, and stores them on the graph. Precondition: `CrossingMinimizer` has populated `Groups`. - Postcondition: every augmented node has a finite X and Y and column left edges strictly increase in - layer order. -- `AssignCoordinatesAug` (private) — computes each column's maximum real-node width and corridor width, - derives the column left edges, then assigns X (real nodes left-aligned to their column, dummies - centered) and delegates Y to the Brandes-Köpf routine. -- `BkAssignYCoordinates` (private) — runs the four balanced vertical layouts (DOWN/UP × RIGHT/LEFT), - compacts each, and averages the two middle results per node. -- Supporting private helpers `BkPreprocess`, `BkMarkConflicts`, `BkVerticalAlignment`, - `BkHorizontalCompaction`, `BkInsideBlockShift`, and `BkBalancedLayout` implement the standard - Brandes-Köpf conflict-marking, alignment, compaction, and balancing phases. - -###### Error Handling - -A null graph throws `ArgumentNullException`. - -###### Dependencies - -- `LayeredGraph` (Layered) — the shared state read from and written to. -- `CrossingMinimizer` (Layered) — must run first to populate the ordered layer groups. -- `LayeredLayoutMetrics` (Layered) — supplies the spacing, clearance, and padding constants. - -###### Callers - -- `LayeredLayoutPipeline` (Layered) — adds `BrandesKopfPlacer` as the fifth stage, immediately after - `CrossingMinimizer`, when it assembles its ordered stage list. -- `ComponentPacker` (Layered) — constructs the same stage sequence, including `BrandesKopfPlacer`, to - lay out each connected component independently. diff --git a/docs/design/sysml2-tools-core/layout/engine/layered/component-packer.md b/docs/design/sysml2-tools-core/layout/engine/layered/component-packer.md deleted file mode 100644 index 296341bf..00000000 --- a/docs/design/sysml2-tools-core/layout/engine/layered/component-packer.md +++ /dev/null @@ -1,45 +0,0 @@ -##### ComponentPacker - -###### Purpose - -`ComponentPacker` is a composite pipeline stage that lays out a disconnected graph as a compact, -non-overlapping arrangement of its connected components. It is a clean-room re-implementation of the -documented behavior of ELK's `ComponentsProcessor`: split the graph into connected components, run -the wrapped inner stages on each component independently, then pack the laid-out components side by -side. - -###### Responsibilities - -The stage partitions the real nodes into connected components using union-find over the undirected -edge set, ignoring self-loops. When the graph forms a single component (including a fully connected -graph or a lone node), the stage is a transparent pass-through: it runs the wrapped inner stages -directly on the supplied graph so the output is byte-identical to running those stages without the -wrapper. When the graph is disconnected, it builds a sub-graph for each component (with a -local-to-original index remap), runs the inner stages on each, normalizes each component to its own -content bounding box, then assigns each component a shelf offset with a greedy row packer whose -target row width is the larger of the widest component and `sqrt(totalArea) * aspect`. Finally it -merges the placed coordinates, layer assignments, and routed edge waypoints back into the parent -graph in original node and edge index order, translating each component's waypoints by its assigned -offset. Component detection is deterministic — components are ordered by their lowest original node -index and nodes within a component by ascending original index — so renders are reproducible. - -###### Inputs and Outputs - -- Reads: `LayeredGraph.Nodes`, `LayeredGraph.Edges`, `LayeredGraph.Direction`. -- Writes: `LayeredGraph.AugX`, `LayeredGraph.AugY`, `LayeredGraph.NodeLayers`, `LayeredGraph.Waypoints` - (one polyline per original edge), for the multi-component case; for the single-component case the - wrapped inner stages write these fields directly. - -###### Error Handling - -A null graph throws `ArgumentNullException`. An empty graph (`LayeredGraph.N` == 0) is a no-op, -because the downstream stages cannot operate on an empty augmented graph. - -###### Dependencies - -- `LayeredGraph` (Layered) — the shared state read from and written to. -- `ILayoutStage` (Layered) — the inner stages wrapped and run per component. -- `LayeredLayoutMetrics` (Layered) — supplies the default packing spacing. -- The default inner stage sequence (`CycleBreaker`, `LayerAssigner`, `LongEdgeSplitter`, - `CrossingMinimizer`, `BrandesKopfPlacer`, `PortDistributor`, `OrthogonalRouter`, `LongEdgeJoiner`, - `AxisTransform`) when constructed via `WithDefaultStages`. diff --git a/docs/design/sysml2-tools-core/layout/engine/layered/crossing-minimizer.md b/docs/design/sysml2-tools-core/layout/engine/layered/crossing-minimizer.md deleted file mode 100644 index 62b03815..00000000 --- a/docs/design/sysml2-tools-core/layout/engine/layered/crossing-minimizer.md +++ /dev/null @@ -1,61 +0,0 @@ -##### CrossingMinimizer - -###### Purpose - -`CrossingMinimizer` is the fourth pipeline stage. It groups the augmented nodes by layer and orders -each layer to reduce edge crossings, following ELK's crossing-minimization phase using Barycenter -ordering. - -###### Responsibilities - -The stage first groups every augmented node index into one list per layer, indexed by the node's -assigned layer. It then runs a fixed number of Barycenter sweeps that alternate forward (left to -right) and backward (right to left). Each sweep sorts a layer by the average position of each node's -neighbors in the adjacent layer; nodes without a neighbor in that layer keep their current relative -order, and ties are broken by the prior order to keep the result deterministic. The grouping is a -partition of the augmented nodes: every node appears in exactly one layer group. - -###### Inputs and Outputs - -- Reads: `LayeredGraph.AugNodes`, `LayeredGraph.AugEdges`. -- Writes: `LayeredGraph.Groups` (augmented-node indices ordered within each layer). - -###### Data Model - -`CrossingMinimizer` is stateless; it holds no fields and operates entirely on the shared -`LayeredGraph` passed to `Apply`: - -- `LayeredGraph.AugNodes` (input) — the augmented node list, each node carrying its assigned `Layer`. -- `LayeredGraph.AugEdges` (input) — augmented edges (source/target indices) that each span one layer. -- `LayeredGraph.Groups` (output) — a `List>` with one inner list per layer, holding the - augmented-node indices in left-to-right order within that layer. The lists form a partition: every - augmented node index appears in exactly one group. - -###### Key Methods - -- `Apply(LayeredGraph graph)` — the `ILayoutStage` entry point. Rejects a null graph, builds - `graph.Groups` by grouping nodes by layer, then reorders each layer in place. Postcondition: - `graph.Groups` is populated and partitions every augmented node exactly once. -- `GroupByLayerAug` (private) — partitions the augmented-node indices into one list per layer index. -- `OrderLayersAug` (private) — precomputes each node's left and right neighbor lists once, then runs - `BarycentricSweeps` sweeps that alternate forward (left-to-right) and backward (right-to-left). -- `SortByBarycenter` (private) — sorts one layer by the average index of each node's neighbors in the - adjacent layer; nodes with no neighbor in that layer keep their relative order, and ties break by the - prior order so the result is deterministic. - -###### Error Handling - -A null graph throws `ArgumentNullException`. - -###### Dependencies - -- `LayeredGraph` (Layered) — the shared state read from and written to. -- `LongEdgeSplitter` (Layered) — must run first to populate the augmented graph. -- `LayeredLayoutMetrics` (Layered) — supplies the Barycenter sweep count. - -###### Callers - -- `LayeredLayoutPipeline` (Layered) — adds `CrossingMinimizer` as the fourth stage (after - `LongEdgeSplitter`, before `BrandesKopfPlacer`) when it assembles its ordered stage list. -- `ComponentPacker` (Layered) — constructs the same stage sequence, including `CrossingMinimizer`, to - lay out each connected component independently. diff --git a/docs/design/sysml2-tools-core/layout/engine/layered/cycle-breaker.md b/docs/design/sysml2-tools-core/layout/engine/layered/cycle-breaker.md deleted file mode 100644 index 9485fa1a..00000000 --- a/docs/design/sysml2-tools-core/layout/engine/layered/cycle-breaker.md +++ /dev/null @@ -1,32 +0,0 @@ -##### CycleBreaker - -###### Purpose - -`CycleBreaker` is the first pipeline stage. It makes the input graph acyclic by reversing the edges -that close cycles, following ELK's cycle-breaking phase, so that the layering stage can assume a -directed acyclic graph. - -###### Responsibilities - -The stage reads `Nodes` (for the count) and `Edges` from the shared graph and writes the cleaned, -acyclic edge list to `Acyclic`. It classifies edges with a depth-first search: any edge that targets -a node still on the recursion stack is a back edge and is reversed; all other edges keep their -orientation. While building the result it discards self-loops and collapses duplicate source-target -pairs, so the output contains each retained connection exactly once with no self-loop. Alongside -`Acyclic` it writes a parallel flag array `AcyclicReversed` (same index order) that records which -retained edges were produced by reversing a back edge, so later stages — notably `OrthogonalRouter` — -can give those edges a longer entry approach for their end marker. - -###### Inputs and Outputs - -- Reads: `LayeredGraph.Nodes` (count only), `LayeredGraph.Edges`. -- Writes: `LayeredGraph.Acyclic`, `LayeredGraph.AcyclicReversed` (parallel reversed-edge flags). - -###### Error Handling - -A null graph throws `ArgumentNullException`. An empty edge list yields an empty acyclic set. - -###### Dependencies - -- `LayeredGraph` (Layered) — the shared state read from and written to. -- `LayerEdge` (Layout Engine) — the directed-edge record produced in the acyclic set. diff --git a/docs/design/sysml2-tools-core/layout/engine/layered/layer-assigner.md b/docs/design/sysml2-tools-core/layout/engine/layered/layer-assigner.md deleted file mode 100644 index 485a0d93..00000000 --- a/docs/design/sysml2-tools-core/layout/engine/layered/layer-assigner.md +++ /dev/null @@ -1,29 +0,0 @@ -##### LayerAssigner - -###### Purpose - -`LayerAssigner` is the second pipeline stage. It assigns each node to a layer using longest-path -layering over the acyclic edge set, so that columns can be placed left to right with no same-layer -connection. - -###### Responsibilities - -The stage reads the acyclic edge set produced by `CycleBreaker` and assigns each node a layer equal -to the length of the longest directed path that reaches it. Nodes with no incoming edge are placed -at layer zero; every other node is placed one layer past the deepest of its predecessors. The pass -is a topological relaxation (Kahn's algorithm) that processes each node after all its predecessors, -guaranteeing that every edge runs from a strictly lower layer to a strictly higher layer. - -###### Inputs and Outputs - -- Reads: `LayeredGraph.Nodes` (count only), `LayeredGraph.Acyclic`. -- Writes: `LayeredGraph.NodeLayers` (one layer index per real node, in node order). - -###### Error Handling - -A null graph throws `ArgumentNullException`. A graph with no edges leaves every node at layer zero. - -###### Dependencies - -- `LayeredGraph` (Layered) — the shared state read from and written to. -- `CycleBreaker` (Layered) — must run first to populate the acyclic edge set. diff --git a/docs/design/sysml2-tools-core/layout/engine/layered/layered-graph.md b/docs/design/sysml2-tools-core/layout/engine/layered/layered-graph.md deleted file mode 100644 index 498ec4a5..00000000 --- a/docs/design/sysml2-tools-core/layout/engine/layered/layered-graph.md +++ /dev/null @@ -1,39 +0,0 @@ -##### LayeredGraph - -###### Purpose - -`LayeredGraph` is the mutable shared state threaded through every stage of the layered pipeline. It -replaces the ad-hoc local variables that the monolithic interconnection engine passed between its -private phase methods, while preserving exactly the same intermediate values (and therefore the same -floating-point results). - -###### Data Model - -The constructor takes the input nodes (`IReadOnlyList`), the directed input edges -(`IReadOnlyList`), and the requested `LayoutDirection`. It stores them on read-only -properties (`Nodes`, `Edges`, `Direction`) and records the real node count `N`. Every other field is -an initially empty, settable property owned by a later stage: `Acyclic` (cycle-broken edges), -`AcyclicReversed` (a flag per acyclic edge, in the same order, marking those produced by reversing a -back edge), `NodeLayers` (per-node layer index), `AugNodes` and `AugEdges` (the augmented graph after -long-edge splitting), `Groups` (augmented-node indices ordered by layer), `AugX`/`AugY` and `ColumnX`/ -`MaxColWidth` (coordinates), `AugPortYSrc`/`AugPortYTgt` and `AugBendPoints` (routing), and -`Waypoints` (the assembled per-edge polylines). One settable tuning parameter, -`BackEdgeEntryApproach`, controls the minimum final straight approach the `OrthogonalRouter` gives a -reversed (back) edge before its end marker; it defaults to `LayeredLayoutMetrics.ConnectorClearance`, -which reproduces the original engine byte-for-byte, and a decoration-aware caller raises it to clear -the end-marker along-line length. (It replaces the deleted `ReversedEdgeApproach` magic constant.) -The file also declares the internal `AugNode` record -(width, height, layer, dummy flag) and the `AugEdge` record struct (source, target, original edge -index). - -###### Error Handling - -A null `nodes` or `edges` argument throws `ArgumentNullException`. The fields owned by later stages -start as empty collections so that reading them before their producing stage runs yields an empty -result rather than a null reference. - -###### Dependencies - -- `LayerNode`, `LayerEdge` (Layout Engine) — the geometric input records. -- `LayoutDirection` (Layered) — the requested flow direction. -- `Point2D` (Layout) — the point type used for bend points and waypoints. diff --git a/docs/design/sysml2-tools-core/layout/engine/layered/layered-layout-pipeline.md b/docs/design/sysml2-tools-core/layout/engine/layered/layered-layout-pipeline.md deleted file mode 100644 index b44955ea..00000000 --- a/docs/design/sysml2-tools-core/layout/engine/layered/layered-layout-pipeline.md +++ /dev/null @@ -1,50 +0,0 @@ -##### LayeredLayoutPipeline - -###### Purpose - -`LayeredLayoutPipeline` is an ordered sequence of `ILayoutStage` instances that, when run, -transforms a `LayeredGraph` from raw nodes and edges into a fully placed and routed layout. It is the -assembly point of the layered subsystem and the only type a caller needs to build and execute the -ELK-style algorithm. This chapter also documents the small supporting types co-located with the -pipeline: the stage interface, the two configuration enums, and the shared metrics. - -###### Data Model - -A pipeline is immutable once built: it holds its `Direction`, its `Hierarchy` mode, and the ordered -stage array. It is constructed through the nested fluent `PipelineBuilder` returned by `Builder()`. -The builder exposes `Direction(LayoutDirection)`, `Hierarchy(HierarchyHandling)`, -`AddStage(ILayoutStage)`, `AddDefaultStages()`, and `Build()`. `AddDefaultStages` appends the nine -default stages in order: `CycleBreaker`, `LayerAssigner`, `LongEdgeSplitter`, `CrossingMinimizer`, -`BrandesKopfPlacer`, `PortDistributor`, `OrthogonalRouter`, `LongEdgeJoiner`, and `AxisTransform`. - -###### Key Methods - -`Run(LayeredGraph graph)` iterates the stages in order and calls `Apply` on each, mutating the graph -in place. `Build()` validates the configuration and returns the immutable pipeline. - -###### Supporting Types - -- `ILayoutStage` — the single composable phase interface, `void Apply(LayeredGraph graph)`. Stages - are stateless and may be shared across pipelines. -- `LayoutDirection` — enum `{ Right, Down, Left, Up }`. `Right` is the abstract identity direction; - the other values are reserved scaffolding handled by `AxisTransform`. -- `HierarchyHandling` — enum `{ Flat, Recursive }`. Only `Flat` is implemented; `Recursive` is - reserved for a later phase. -- `LayeredLayoutMetrics` — the shared spacing, clearance, padding, sweep-count, and tolerance - constants, intentionally identical to the constants used by the previous monolithic engine. - -###### Error Handling - -`Build()` throws `NotSupportedException` when recursive hierarchy handling is requested. -`AddStage` throws `ArgumentNullException` for a null stage, and `Run` throws `ArgumentNullException` -for a null graph. - -###### Dependencies - -- `LayeredGraph` (Layered) — the shared state mutated by `Run`. -- The nine default stage units (Layered) — appended by `AddDefaultStages`. - -###### Callers - -`InterconnectionLayoutEngine.Place` builds a default pipeline (right direction, flat hierarchy) and -runs it to obtain the placed coordinates and connector waypoints. diff --git a/docs/design/sysml2-tools-core/layout/engine/layered/long-edge-joiner.md b/docs/design/sysml2-tools-core/layout/engine/layered/long-edge-joiner.md deleted file mode 100644 index 199919bb..00000000 --- a/docs/design/sysml2-tools-core/layout/engine/layered/long-edge-joiner.md +++ /dev/null @@ -1,32 +0,0 @@ -##### LongEdgeJoiner - -###### Purpose - -`LongEdgeJoiner` is the eighth pipeline stage. It assembles the final per-original-edge orthogonal -waypoints by concatenating the bend points of each sub-edge, following ELK's long-edge joining phase. - -###### Responsibilities - -The stage groups the augmented sub-edges by the original edge they belong to and sorts each group -into source-to-target layer order. For each original edge it builds a polyline that starts at the -source node's right face (at the source port Y of the first sub-edge), appends the bend points of -every sub-edge in order, and ends at the target node's left face (at the target port Y of the last -sub-edge). An original edge with no surviving sub-edge yields an empty polyline. The result is one -waypoint list per original edge. - -###### Inputs and Outputs - -- Reads: `LayeredGraph.AugNodes`, `LayeredGraph.AugEdges`, `LayeredGraph.AugX`, - `LayeredGraph.AugPortYSrc`, `LayeredGraph.AugPortYTgt`, `LayeredGraph.AugBendPoints`, - `LayeredGraph.Acyclic` (count). -- Writes: `LayeredGraph.Waypoints` (one polyline per original edge). - -###### Error Handling - -A null graph throws `ArgumentNullException`. - -###### Dependencies - -- `LayeredGraph` (Layered) — the shared state read from and written to. -- `OrthogonalRouter` (Layered) — must run first to populate the sub-edge bend points. -- `Point2D` (Layout) — the waypoint type. diff --git a/docs/design/sysml2-tools-core/layout/engine/layered/long-edge-splitter.md b/docs/design/sysml2-tools-core/layout/engine/layered/long-edge-splitter.md deleted file mode 100644 index 8077e436..00000000 --- a/docs/design/sysml2-tools-core/layout/engine/layered/long-edge-splitter.md +++ /dev/null @@ -1,31 +0,0 @@ -##### LongEdgeSplitter - -###### Purpose - -`LongEdgeSplitter` is the third pipeline stage. It builds the augmented graph in which every edge -spans exactly one layer, following ELK's long-edge splitting phase, so that routing can treat each -inter-layer gap independently. - -###### Responsibilities - -The stage first copies each real node into an `AugNode` carrying its size and assigned layer. It then -walks the acyclic edges: a unit-span edge becomes a single `AugEdge`; an edge whose endpoints differ -by more than one layer is replaced by a chain `source → d1 → … → target`, inserting one zero-size -dummy `AugNode` at each intermediate layer and one `AugEdge` per chain link. Every sub-edge records -the index of the original edge it belongs to, so the routing result can later be reassembled per -original connection. - -###### Inputs and Outputs - -- Reads: `LayeredGraph.Nodes`, `LayeredGraph.NodeLayers`, `LayeredGraph.Acyclic`. -- Writes: `LayeredGraph.AugNodes`, `LayeredGraph.AugEdges`. - -###### Error Handling - -A null graph throws `ArgumentNullException`. A graph with only unit-span edges produces an augmented -node list equal in count to the input node list (no dummies). - -###### Dependencies - -- `LayeredGraph` (Layered) — the shared state read from and written to. -- `LayerAssigner` (Layered) — must run first to populate the node layers. diff --git a/docs/design/sysml2-tools-core/layout/engine/layered/orthogonal-router.md b/docs/design/sysml2-tools-core/layout/engine/layered/orthogonal-router.md deleted file mode 100644 index b39ea74c..00000000 --- a/docs/design/sysml2-tools-core/layout/engine/layered/orthogonal-router.md +++ /dev/null @@ -1,51 +0,0 @@ -##### OrthogonalRouter - -###### Purpose - -`OrthogonalRouter` is the seventh pipeline stage. It routes every inter-layer corridor with ELK's -orthogonal slot algorithm, producing the axis-aligned bend points for each augmented sub-edge. - -###### Responsibilities - -For each corridor (the gap between two adjacent layers) the stage collects the sub-edges whose source -lies in the left layer and turns each into a routing segment carrying its source and target port Y. -It builds crossing-based dependencies between segment pairs (the placement with fewer crossings wins), -breaks any cycles in those dependencies, and assigns each segment a routing slot by topological -numbering, so dependent segments occupy successively higher slots. A segment whose source and target -ports already share a Y is straight and consumes no slot and no bend points; any other segment emits -two bend points that form a vertical run at the slot's X, offset from the source column by the slot -index times the edge spacing. - -For a reversed (back) edge — one stored flipped by `CycleBreaker`, so the consumer draws the open -chevron end marker on the augmented-source face of the first sub-edge whose source is a real node -(not a long-edge dummy) — the wrap-around corridor is the connector's final straight approach into -its true target. At the default slot that approach is only one `ConnectorClearance` wide, shorter -than the end marker. The stage therefore clamps that sub-edge's bend X outward to guarantee a -minimum approach of `graph.BackEdgeEntryApproach`. That parameter defaults to -`LayeredLayoutMetrics.ConnectorClearance`, so the clamp is a byte-for-byte no-op unless a caller -raises it; a decoration-aware caller (the state-transition view) sets it to the end-marker -along-line length plus corner radius plus clean-leg margin. The clamp uses -`Math.Max`, so it only ever pushes the jog outward: forward edges, long-edge middle sub-edges, and -every acyclic graph are byte-identical to the unclamped output. Because the stage runs in abstract -RIGHT-equivalent coordinates that `AxisTransform` maps to the requested direction, the guarantee is -orientation-agnostic (it holds for RIGHT and DOWN flows alike). - -###### Inputs and Outputs - -- Reads: `LayeredGraph.AugNodes`, `LayeredGraph.AugEdges`, `LayeredGraph.ColumnX`, - `LayeredGraph.MaxColWidth`, `LayeredGraph.AugPortYSrc`, `LayeredGraph.AugPortYTgt`, - `LayeredGraph.AcyclicReversed` (to recognize reversed edges' end-marker-bearing sub-edge). -- Writes: `LayeredGraph.AugBendPoints` (zero or two bend points per sub-edge). - -###### Error Handling - -A null graph throws `ArgumentNullException`. - -###### Dependencies - -- `LayeredGraph` (Layered) — the shared state read from and written to, including the - `BackEdgeEntryApproach` parameter that sets the minimum entry stub for reversed edges. -- `PortDistributor` (Layered) — must run first to populate the port coordinates. -- `LayeredLayoutMetrics` (Layered) — supplies the edge spacing, clearance, straight tolerance, and - the `ConnectorClearance` default for `BackEdgeEntryApproach`. -- `Point2D` (Layout) — the bend-point type. diff --git a/docs/design/sysml2-tools-core/layout/engine/layered/port-distributor.md b/docs/design/sysml2-tools-core/layout/engine/layered/port-distributor.md deleted file mode 100644 index 132736d7..00000000 --- a/docs/design/sysml2-tools-core/layout/engine/layered/port-distributor.md +++ /dev/null @@ -1,31 +0,0 @@ -##### PortDistributor - -###### Purpose - -`PortDistributor` is the sixth pipeline stage. It distributes connector ports evenly along each box -face and records the source-side and target-side port Y coordinate for every augmented sub-edge. - -###### Responsibilities - -The stage groups sub-edges by their source node and by their target node. For each real node it -sorts the attached sub-edges by the opposite endpoint's center Y (then by edge index for stability) -and spreads their ports evenly along the relevant face — outgoing ports along the right face, incoming -ports along the left face — inset by a fixed clearance from the top and bottom edges, and clamped to -stay within the face. A single port on a face is placed at the face center. Dummy nodes pass their -wire straight through at their own Y. The result is two arrays, one source port Y and one target port -Y per sub-edge. - -###### Inputs and Outputs - -- Reads: `LayeredGraph.Nodes`, `LayeredGraph.AugNodes`, `LayeredGraph.AugEdges`, `LayeredGraph.AugY`. -- Writes: `LayeredGraph.AugPortYSrc`, `LayeredGraph.AugPortYTgt`. - -###### Error Handling - -A null graph throws `ArgumentNullException`. - -###### Dependencies - -- `LayeredGraph` (Layered) — the shared state read from and written to. -- `BrandesKopfPlacer` (Layered) — must run first to populate the node Y coordinates. -- `LayeredLayoutMetrics` (Layered) — supplies the connector clearance. diff --git a/docs/design/sysml2-tools-core/layout/internal.md b/docs/design/sysml2-tools-core/layout/internal.md index 363d94c4..592f8a8e 100644 --- a/docs/design/sysml2-tools-core/layout/internal.md +++ b/docs/design/sysml2-tools-core/layout/internal.md @@ -4,10 +4,9 @@ The Internal subsystem provides the per-view layout strategies — the implementations of `ILayoutStrategy` that turn the SysML semantic model into a `LayoutTree` for one diagram view. -Where the Engine subsystem solves geometric sub-problems from plain input, the Internal -strategies own the mapping from the semantic model to geometric input and back: they select -the relevant model elements, size and place the boxes, route the connectors, and assemble the -node tree the renderers consume. +The strategies own the mapping from the semantic model to geometric input and back: they +select the relevant model elements, size boxes, delegate geometry through `LayeredPlacement` +when a layered layout is needed, and assemble the node tree the renderers consume. The subsystem contains one strategy per supported view type: @@ -25,17 +24,16 @@ own chapter. #### Interfaces Each strategy exposes the single `ILayoutStrategy.BuildLayout(ViewContext, RenderOptions)` -method. It consumes the semantic workspace through `ViewContext` and the theme and render -options through `RenderOptions`, and returns a `LayoutTree`. The strategies are the only -consumers of both the semantic model and the geometric engines; the renderers see only the -returned tree. +method. It consumes the semantic workspace through `ViewContext`, consumes theme and render +options from `RenderOptions`, and returns a `LayoutTree` supplied by `DemaConsulting.Rendering`. +The renderers see only the returned tree. #### Design Each strategy follows the same shape: collect the relevant model elements (excluding -standard-library declarations), compute an intrinsic size for each box, delegate placement and -routing to the geometric engines of the Engine subsystem, and build the `LayoutNode` tree. When -a connector cannot be routed without crossing a box, the strategy records a layout warning -through `LayoutWarnings` rather than silently producing a misleading diagram. A view with no -relevant elements returns a minimal empty canvas. The detailed mapping and heuristics of each -strategy are described in its own unit chapter. +standard-library declarations), compute an intrinsic size for each box, use arithmetic placement +or delegate geometry through `LayeredPlacement`, and build the `LayoutNode` tree. When a +connector cannot be routed without crossing a box, the strategy records a layout warning through +`LayoutWarnings` rather than silently producing a misleading diagram. A view with no relevant +elements returns a minimal empty canvas. The detailed mapping and heuristics of each strategy are +described in its own unit chapter. diff --git a/docs/design/sysml2-tools-core/layout/internal/action-flow-view-layout-strategy.md b/docs/design/sysml2-tools-core/layout/internal/action-flow-view-layout-strategy.md index 9ce39cb2..e556e2db 100644 --- a/docs/design/sysml2-tools-core/layout/internal/action-flow-view-layout-strategy.md +++ b/docs/design/sysml2-tools-core/layout/internal/action-flow-view-layout-strategy.md @@ -3,9 +3,9 @@ ##### Purpose `ActionFlowViewLayoutStrategy` implements `ILayoutStrategy` to produce an Action Flow View -diagram. It renders action usages as rounded boxes placed top-to-bottom by the layered layout -pipeline, with a start marker entering the actions that have no predecessor, a done marker leaving -the actions that have no successor, and successions drawn as dashed downward flow arrows. +diagram. It renders action usages as rounded boxes placed top-to-bottom through `LayeredPlacement`, +with a start marker entering the actions that have no predecessor, a done marker leaving the actions +that have no successor, and successions drawn as dashed downward flow arrows. ##### Data Model @@ -36,25 +36,21 @@ indices, keeping only distinct, resolvable pairs. ###### Placement and routing -Action boxes are positioned by the `LayeredLayoutPipeline` built with `LayoutDirection.Down` and the -default stage sequence: each action becomes a node and each succession a directed edge, so the flow -reads top-to-bottom (a succession leaves its source on the SOUTH face and enters its target on the -NORTH face). The pipeline's cycle-breaking stage makes the (possibly cyclic) succession graph acyclic, -so the strategy does not need its own back-edge handling. The `LayeredGraph` is built with a -decoration-aware `BackEdgeEntryApproach` equal to the open-chevron end marker's along-line length -(`NotationMetrics.AlongLineLength(EndMarkerStyle.OpenChevron)`) plus `Theme.LineCornerRadius` plus -`Theme.CleanLegMargin`, so a reversed succession's final straight approach is long enough that the -renderer's rounded corner never intrudes into the end marker. After the run the placed coordinates are -read back from `AugX`/`AugY` and normalized so the content starts at a margin offset, reserving a -`MarkerBand` of empty space at the top (for the start marker) and at the bottom (for the done marker). -The canvas is sized to the full content extent — including the routed succession polylines, which can -bulge beyond the box columns — via `ContentExtent`. - -`AddSuccessionEdges` maps each succession to the orthogonal polyline the pipeline routed for it. -Because the cycle-breaking stage de-duplicates identical directed pairs and reverses back edges, -`LayeredGraph.Waypoints` is not 1:1 with the input successions; a lookup keyed by the routed -`(source, target)` pair recovers each polyline, and a succession whose routed edge was reversed reuses -that polyline in reverse so its open chevron end marker lands on the true target (`ResolveSuccessionPolyline`). +Action boxes are positioned by calling `LayeredPlacement.Place` with a top-to-bottom flow +direction: each action becomes a sized node and each succession a directed edge, so the flow reads +top-to-bottom. `LayeredPlacement` delegates to the off-the-shelf `DemaConsulting.Rendering.Layout` +layered algorithm, which returns placed rectangles for the actions and routed orthogonal polylines +for the successions. The strategy uses the open-chevron along-line length from `NotationMetrics` in +`DemaConsulting.Rendering.Abstractions`, plus `Theme.LineCornerRadius` and `Theme.CleanLegMargin`, so +any routed back edge has enough final +straight approach that the renderer's rounded corner never intrudes into the end marker. The placed +coordinates are normalized so the content starts at a margin offset, reserving a `MarkerBand` of +empty space at the top (for the start marker) and at the bottom (for the done marker). The canvas is +sized to the full content extent, including routed succession polylines that can bulge beyond the box +columns, via `ContentExtent`. + +`AddSuccessionEdges` maps each succession to the corresponding orthogonal polyline returned by +`LayeredPlacement`, preserving input-edge order and source-to-target orientation. Each succession is emitted as a dashed `LayoutLine` with an open chevron end marker (`EndMarkerStyle.OpenChevron`) at the target, matching SysML v2 succession notation. The method counts and returns the number of successions whose polyline crosses a non-endpoint action box (`CrossesNonEndpointBox` @@ -71,14 +67,16 @@ surfaced through `LayoutWarnings`. ##### Dependencies -- `ILayoutStrategy`, `ViewContext`, `RenderOptions`, `Theme` (Rendering subsystem) — the strategy contract and inputs. -- `LayeredLayoutPipeline`, `LayeredGraph`, `LayerNode`, `LayerEdge`, `LayoutDirection`, `HierarchyHandling`, - `BoxMetrics` (Layout Engine subsystem) — top-to-bottom placement and orthogonal routing. -- `NotationMetrics` (Rendering subsystem) — decoration-aware back-edge approach length. +- `ILayoutStrategy` and `ViewContext` (Rendering subsystem) — the strategy contract and view input. +- `RenderOptions`, `Theme`, `BoxMetrics`, and `NotationMetrics` + (`DemaConsulting.Rendering.Abstractions`) — render options, sizing, and decoration metrics. +- `LayeredPlacement` (Layout Internal subsystem) — top-to-bottom placement and orthogonal routing + through `DemaConsulting.Rendering.Layout`. - `StdlibFilter` (Rendering Internal subsystem) — standard-library exclusion. - `SysmlWorkspace`, `SysmlDefinitionNode`, `SysmlFeatureNode`, `SysmlTransitionNode` (Semantic subsystem) — model input. - `LayoutWarnings` (Layout Internal subsystem) — crossing-warning construction. -- The `LayoutTree`, `LayoutBox`, `LayoutBadge`, and `LayoutLine` data types (Layout subsystem). +- The `LayoutTree`, `LayoutBox`, `LayoutBadge`, and `LayoutLine` data types + (`DemaConsulting.Rendering`). ##### Callers diff --git a/docs/design/sysml2-tools-core/layout/internal/browser-view-layout-strategy.md b/docs/design/sysml2-tools-core/layout/internal/browser-view-layout-strategy.md index a727e197..87913f41 100644 --- a/docs/design/sysml2-tools-core/layout/internal/browser-view-layout-strategy.md +++ b/docs/design/sysml2-tools-core/layout/internal/browser-view-layout-strategy.md @@ -42,11 +42,13 @@ throw: the strategy returns an empty diagram rather than failing. ##### Dependencies -- `LayoutTree`, `LayoutBox`, `LayoutLine`, `Point2D`, `BoxShape`, `EndMarkerStyle`, `LineStyle` - (Layout subsystem). -- `ViewContext`, `RenderOptions`, `Theme` (Rendering subsystem). -- `SysmlWorkspace`, `SysmlNode`, `SysmlPackageNode`, `SysmlDefinitionNode`, `SysmlFeatureNode`, - `SysmlViewNode`, and `StdlibFilter` (Semantic subsystem). +- `LayoutTree`, `LayoutBox`, `LayoutLine`, `Point2D`, `BoxShape`, `EndMarkerStyle`, and + `LineStyle` (`DemaConsulting.Rendering`). +- `ViewContext` (Rendering subsystem) and `RenderOptions`, `Theme` + (`DemaConsulting.Rendering.Abstractions`). +- `SysmlWorkspace`, `SysmlNode`, `SysmlPackageNode`, `SysmlDefinitionNode`, `SysmlFeatureNode`, and + `SysmlViewNode` (Semantic subsystem). +- `StdlibFilter` (Rendering Internal subsystem) — standard-library exclusion. ##### Callers diff --git a/docs/design/sysml2-tools-core/layout/internal/general-view-layout-strategy.md b/docs/design/sysml2-tools-core/layout/internal/general-view-layout-strategy.md index 1c082ad2..823035bf 100644 --- a/docs/design/sysml2-tools-core/layout/internal/general-view-layout-strategy.md +++ b/docs/design/sysml2-tools-core/layout/internal/general-view-layout-strategy.md @@ -7,9 +7,9 @@ renders every user-defined definition (part, port, interface, requirement, actio a keyword-labelled box, groups the boxes that belong to a package inside a folder-shaped container, lists each definition's owned usages in compartments, and draws specialization, membership, and attribute-typing edges orthogonally between the boxes. Box placement and -intra-package edge routing are -delegated to the reusable layered pipeline (`LayeredLayoutPipeline` with a `ComponentPacker` stage), -so definitions and their relationships are arranged the same way as ELK's layered algorithm. +intra-package edge routing are delegated through `LayeredPlacement` to the off-the-shelf +`DemaConsulting.Rendering.Layout` layered algorithm, so definitions and their relationships are +arranged the same way as ELK's layered algorithm. ##### Data Model @@ -34,9 +34,8 @@ Entry point. Calls `CollectDefinitions` to gather user definitions; returns a mi `LayoutTree` when none are found. Otherwise groups the definitions by package with `GroupByPackage`, resolves the edge set into intra-package and cross-package edges with `BuildEdges`, places the package folders (and the frameless top-level block) across the canvas with `PlaceGroups`, then -appends the pipeline-routed intra-package edge lines and the `ChannelRouter`-routed cross-package -edge lines. The assembled `LayoutTree` carries no warnings; the layered pipeline always produces a -valid placement. +appends the routed intra-package and cross-package edge lines. The assembled `LayoutTree` carries no +warnings; delegated placement always produces valid geometry. ###### `CollectDefinitions(workspace, theme)` @@ -55,8 +54,8 @@ Top-level definitions (no package prefix) form a single frameless block laid out Resolves every specialization (subtype → supertype), structural membership (member-type → owner), and attribute-typing (owner → attribute-type) relationship into either an `IntraEdge` (both endpoints in -the same package group, laid out together by the layered pipeline) or a `CrossEdge` (endpoints in -different groups, routed around the folders). +the same package group, laid out together through `LayeredPlacement`) or a `CrossEdge` (endpoints +in different groups, routed between the placed folders). Specialization edges carry an open triangular end marker at the supertype; `part`/`port` memberships carry a filled diamond and `ref` memberships a hollow diamond at the owner; other memberships are not drawn. In addition, each `attribute` (or `enum`-typed attribute) feature whose type resolves to a @@ -74,46 +73,47 @@ contribute no edges. For each package group, calls `LayoutGroup` to lay out the group's definitions and intra-group edges, sizes the folder to the content bounding box plus its title area, and records a `BlockPlan`. When the depth limit forbids the nested level, a folder's contents are replaced with a single ellipsis -indicator. The blocks are then packed across the canvas with `ContainmentPacker` so that folders -never overlap, and `PlaceBlock` emits each block's nodes and edge lines at the packed offset. +indicator. The blocks are then positioned across the canvas so that folders never overlap, and +`PlaceBlock` emits each block's nodes and edge lines at the placed offset. ###### `LayoutGroup(items, intraEdges)` -Builds a `LayeredGraph` from the group's definitions (as `LayerNode`s) and intra-group edges (as -`LayerEdge`s), runs `LayeredLayoutPipeline` left-to-right (`Direction(Right)`, `Hierarchy(Flat)`) with -a `ComponentPacker` stage so disconnected definitions are packed beside the connected core, then reads -back each definition's top-left from `graph.AugX`/`AugY` and each edge polyline from `graph.Waypoints`, -normalized against the group's content bounding box. +Passes the group's definition sizes and intra-group edge pairs to `LayeredPlacement.Place` with a +left-to-right flow direction. The returned placed rectangles and edge polylines are normalized against +the group's content bounding box, with disconnected definitions packed beside the connected core by +the off-the-shelf layered algorithm. ###### `PlaceBlock(block, rect, …)` Emits the layout nodes for one placed block: a package folder with its child definition boxes, the frameless top-level definitions, or a truncated folder with an ellipsis indicator. Translates the -pipeline-routed intra-group edge polylines into absolute canvas coordinates — preserving each edge's +`LayeredPlacement` intra-group edge polylines into absolute canvas coordinates — preserving each edge's recorded end marker and line style (dashed for typing dependencies, solid otherwise) — and records each rendered definition's absolute placement for cross-package routing. ###### `RouteCrossEdges(crossEdges, placed)` -Routes the rare cross-package edges around the placed folders with `ChannelRouter`, cost-neutrally, -placing the recorded end marker at the target end with the recorded line style (dashed for typing -dependencies, solid otherwise). Edges touching a truncated (unrendered) definition are skipped. +Emits the rare cross-package edges between the placed folders, placing the recorded end marker at +the target end with the recorded line style (dashed for typing dependencies, solid otherwise). Edges +touching a truncated (unrendered) definition are skipped. ##### Error Handling Null `context` or `options` arguments throw `ArgumentNullException`. A workspace with no user -definitions is not an error: the method returns the minimal empty canvas. The layered pipeline always -produces a valid placement, so no crossing warnings are emitted. +definitions is not an error: the method returns the minimal empty canvas. Delegated placement +produces valid geometry, so no crossing warnings are emitted. ##### Dependencies -- `ILayoutStrategy`, `ViewContext`, `RenderOptions`, `Theme` (Rendering subsystem) — the strategy contract and inputs. -- `LayeredLayoutPipeline`, `ComponentPacker`, `LayerNode`, `LayerEdge`, `LayeredGraph` (Layout Engine - Layered subsystem) — box placement and intra-package edge routing. -- `ContainmentPacker` and `ChannelRouter` (Layout Engine subsystem) — folder packing and cross-package edge routing. +- `ILayoutStrategy` and `ViewContext` (Rendering subsystem) — the strategy contract and view input. +- `RenderOptions` and `Theme` (`DemaConsulting.Rendering.Abstractions`) — render options and sizing + inputs. +- `LayeredPlacement` (Layout Internal subsystem) — box placement and orthogonal routing through + `DemaConsulting.Rendering.Layout`. - `StdlibFilter` (Rendering Internal subsystem) — standard-library exclusion. - `SysmlWorkspace`, `SysmlDefinitionNode`, `SysmlFeatureNode` (Semantic subsystem) — model input. -- The `LayoutTree`, `LayoutBox`, `LayoutCompartment`, `LayoutLine`, and `Point2D` data types (Layout subsystem). +- The `LayoutTree`, `LayoutBox`, `LayoutCompartment`, `LayoutLine`, and `Point2D` data types + (`DemaConsulting.Rendering`). - `FeatureMembership` (private record) — carries the keyword and type reference of one owned feature. ##### Callers diff --git a/docs/design/sysml2-tools-core/layout/internal/grid-view-layout-strategy.md b/docs/design/sysml2-tools-core/layout/internal/grid-view-layout-strategy.md index ce44377f..ae5ec586 100644 --- a/docs/design/sysml2-tools-core/layout/internal/grid-view-layout-strategy.md +++ b/docs/design/sysml2-tools-core/layout/internal/grid-view-layout-strategy.md @@ -42,9 +42,12 @@ throw: the strategy returns an empty diagram rather than failing. ##### Dependencies -- `LayoutTree`, `LayoutGrid`, `LayoutGridRow`, `LayoutGridCell`, `TextAlign` (Layout subsystem). -- `ViewContext`, `RenderOptions`, `Theme` (Rendering subsystem). -- `SysmlWorkspace`, `SysmlDefinitionNode`, and `StdlibFilter` (Semantic subsystem). +- `LayoutTree`, `LayoutGrid`, `LayoutGridRow`, `LayoutGridCell`, and `TextAlign` + (`DemaConsulting.Rendering`). +- `ViewContext` (Rendering subsystem) and `RenderOptions`, `Theme` + (`DemaConsulting.Rendering.Abstractions`). +- `SysmlWorkspace` and `SysmlDefinitionNode` (Semantic subsystem). +- `StdlibFilter` (Rendering Internal subsystem) — standard-library exclusion. ##### Callers diff --git a/docs/design/sysml2-tools-core/layout/internal/interconnection-view-layout-strategy.md b/docs/design/sysml2-tools-core/layout/internal/interconnection-view-layout-strategy.md index ce8fdc85..60594b79 100644 --- a/docs/design/sysml2-tools-core/layout/internal/interconnection-view-layout-strategy.md +++ b/docs/design/sysml2-tools-core/layout/internal/interconnection-view-layout-strategy.md @@ -4,9 +4,9 @@ `InterconnectionViewLayoutStrategy` implements `ILayoutStrategy` to produce an Interconnection View diagram. It shows the internal structure of a single part definition: its nested part usages -as boxes placed by the layered engine, ports on the box boundaries for the incident connections, -and the connection usages routed as orthogonal connector lines between the ports, all enclosed by -a container box for the host definition. +as boxes placed through `LayeredPlacement`, ports on the box boundaries for the incident connections, +and the connection usages routed as orthogonal connector lines between the ports, all enclosed by a +container box for the host definition. ##### Data Model @@ -31,8 +31,8 @@ empty `LayoutTree` when no root or no parts are found. The strategy supports genuine two-level (and deeper) nested block diagrams using a **recursive bottom-up** scheme equivalent to ELK's `SEPARATE_CHILDREN` hierarchy mode: inner structure is laid -out first with the flat engine, and each container is then treated as an atomic fixed-size node by -its parent, which is laid out with the **same** flat engine. +out first through flat layered placement, and each container is then treated as an atomic fixed-size +node by its parent, which is laid out with the **same** flat placement. - **Container detection.** `BuildDefinitionIndex` builds a `Dictionary` of candidate containers — non-standard-library `part def`s that have at least one nested `part` @@ -61,13 +61,9 @@ its parent, which is laid out with the **same** flat engine. "name : Type" title, inside its border. Box `Depth` increases by one per level (the renderer indexes `DepthFillColors` by modulo, so any depth is safe). - **No-op invariant.** When no part is a container, every `PartItem.InnerContent` is `null`, - `MakePartBox` emits exactly the non-recursive leaf box with empty `Children`, and the engine + `MakePartBox` emits exactly the non-recursive leaf box with empty `Children`, and the placement call, offsets, ports, and lines are identical to the single-level layout — single-level output is byte-identical. -- **Reserved pipeline mode.** The `HierarchyHandling.Recursive` pipeline mode remains reserved and - intentionally **not wired**: recursion is driven here, at the strategy level, because container - detection is a semantic-model concern the model-independent layered engine deliberately cannot - see. - **Cross-boundary limitation.** Connection endpoints resolve to **parent-level** part indices via the head segment of the dotted reference, so a reference such as `connect psu to board.cpu` terminates on the `board` container boundary rather than routing to the inner `cpu` box. This is @@ -88,17 +84,13 @@ pairs. ###### Placement and routing -All placement and routing are delegated to `InterconnectionLayoutEngine.Place`, a thin façade -that assembles and runs the reusable `LayeredLayoutPipeline` (configured `RIGHT` with flat -hierarchy — `HierarchyHandling.Flat`). Nested-container recursion is driven at the strategy level -(see _Recursive nested layout_ above), not by the engine; each level calls the same flat engine. -The strategy passes the collected part boxes and resolved -connection pairs as plain geometric input; the engine returns placed rectangles and connector -waypoints. Within the pipeline, layers are assigned by `LayerAssigner`, node coordinates by -`BrandesKopfPlacer`, ports are distributed along box faces by `PortDistributor`, and connectors -are drawn as orthogonal segments by `OrthogonalRouter`, with `ComponentPacker` packing -disconnected components without overlap. The engine derives the total canvas extent from the -placed box and waypoint geometry. +Placement and routing are delegated to `LayeredPlacement.Place` with a left-to-right flow direction. +Nested-container recursion is driven at the strategy level (see _Recursive nested layout_ above); +each level calls the same flat placement helper. The strategy passes the collected part boxes and +resolved connection pairs as plain geometric input. `LayeredPlacement` delegates to the off-the-shelf +`DemaConsulting.Rendering.Layout` layered algorithm and returns placed rectangles and connector +waypoints, with disconnected components packed without overlap. The total canvas extent is derived +from the placed box and waypoint geometry. The strategy then shifts the placed content to sit inside the container box and extends the container so every connector waypoint is enclosed, without ever moving a box. @@ -112,12 +104,15 @@ Connectors that cannot be routed cleanly are still drawn; this strategy does not ##### Dependencies -- `ILayoutStrategy`, `ViewContext`, `RenderOptions`, `Theme` (Rendering subsystem) — the strategy contract and inputs. -- `InterconnectionLayoutEngine`, `BoxMetrics` - (Layout Engine subsystem) — the façade that runs the layered pipeline for placement, ports, and routing. +- `ILayoutStrategy` and `ViewContext` (Rendering subsystem) — the strategy contract and view input. +- `RenderOptions`, `Theme`, and `BoxMetrics` (`DemaConsulting.Rendering.Abstractions`) — render + options and sizing metrics. +- `LayeredPlacement` (Layout Internal subsystem) — placement and routing through + `DemaConsulting.Rendering.Layout`. - `StdlibFilter` (Rendering Internal subsystem) — standard-library exclusion. - `SysmlWorkspace`, `SysmlDefinitionNode`, `SysmlFeatureNode`, `SysmlConnectionNode` (Semantic subsystem) — model input. -- The `LayoutTree`, `LayoutBox`, `LayoutPort`, and `LayoutLine` data types (Layout subsystem). +- The `LayoutTree`, `LayoutBox`, `LayoutPort`, and `LayoutLine` data types + (`DemaConsulting.Rendering`). ##### Callers diff --git a/docs/design/sysml2-tools-core/layout/internal/layered-placement.md b/docs/design/sysml2-tools-core/layout/internal/layered-placement.md new file mode 100644 index 00000000..b9be4f1e --- /dev/null +++ b/docs/design/sysml2-tools-core/layout/internal/layered-placement.md @@ -0,0 +1,65 @@ +#### LayeredPlacement + +##### Purpose + +`LayeredPlacement` adapts the reusable "layered" layout algorithm bundled in the +`DemaConsulting.Rendering.Layout` off-the-shelf package to the SysML view layout strategies. Its +single responsibility is to accept plain sized nodes and directed edges from a strategy, run the +package's layered algorithm, and return the placed box rectangles together with the routed +connector polylines. It carries no SysML semantics: callers translate their model into sizes and +index pairs, and translate the returned geometry back onto their model by index. + +##### Data Model + +`LayeredPlacement` is a static class with no instance state. It exposes one nested immutable record: + +- `PlacedLayout` — the result of a placement, with: + - `Rects` — the placed box rectangles (`Rect`), one per input node, in input-node order. + - `EdgePolylines` — the routed orthogonal connector polylines (each a list of `Point2D`), one per + input edge, in input-edge order, already oriented source-to-target. + - `Width`, `Height` — the overall content extent in logical pixels. + +`Rect` and `Point2D` are geometric value types provided by the `DemaConsulting.Rendering` package. + +##### Key Methods + +###### `Place(nodes, edges, direction)` + +Places sized nodes and directed edges with the bundled layered algorithm: + +1. Validates that `nodes` and `edges` are non-null. +2. Builds a `LayoutGraph`, adding one `LayoutGraphNode` per input node (sized from the supplied + width and height, keyed by its ordinal index) and one edge per input edge (keyed by its ordinal + index) between the referenced graph nodes. +3. Sets the `CoreOptions.Direction` layout option to the requested `LayoutFlowDirection` and runs + `LayeredLayoutAlgorithm.Apply`, obtaining a laid-out `LayoutTree`. +4. Reads the tree's `LayoutBox` nodes into `Rects` (in emitted order, which mirrors input-node + order) and the tree's `LayoutLine` nodes into `EdgePolylines` (in emitted order, which mirrors + input-edge order). +5. Returns a `PlacedLayout` carrying the rectangles, polylines, and the tree's overall `Width` and + `Height`. + +The algorithm emits exactly one placed box per input node and exactly one routed connector per +input edge, preserving the caller's ordering, and reverses back edges internally so every returned +polyline runs source-to-target. + +##### Error Handling + +`Place` throws `ArgumentNullException` when `nodes` or `edges` is null. All other behavior is +delegated to the off-the-shelf layered algorithm; the helper adds no additional validation. + +##### Dependencies + +- `DemaConsulting.Rendering` (OTS) — the layout intermediate representation (`LayoutGraph`, + `LayoutGraphNode`, `LayoutTree`, `LayoutBox`, `LayoutLine`), the geometric value types (`Rect`, + `Point2D`), and the layout option system (`LayoutOptions`, `CoreOptions.Direction`). +- `DemaConsulting.Rendering.Layout` (OTS) — the `LayeredLayoutAlgorithm` that performs the actual + ELK-style layered placement and orthogonal connector routing. +- `System.Globalization.CultureInfo` — invariant-culture formatting of the node and edge keys. + +##### Callers + +The view layout strategies that arrange nodes with the layered algorithm call +`LayeredPlacement.Place`: `GeneralViewLayoutStrategy` and `InterconnectionViewLayoutStrategy` (with +a left-to-right direction), and `ActionFlowViewLayoutStrategy` and +`StateTransitionViewLayoutStrategy` (with a top-to-bottom direction). diff --git a/docs/design/sysml2-tools-core/layout/internal/layout-warnings.md b/docs/design/sysml2-tools-core/layout/internal/layout-warnings.md index ebbe5751..a1c04737 100644 --- a/docs/design/sysml2-tools-core/layout/internal/layout-warnings.md +++ b/docs/design/sysml2-tools-core/layout/internal/layout-warnings.md @@ -2,7 +2,8 @@ ##### Purpose -`LayoutWarnings` builds the non-fatal layout-quality warning messages surfaced on a `LayoutTree`. +`LayoutWarnings` builds the non-fatal layout-quality warning messages surfaced on a `LayoutTree` +from the `DemaConsulting.Rendering` package. Its single responsibility is to turn a count of connectors that had to cross a box into the human-readable warning text for a view. diff --git a/docs/design/sysml2-tools-core/layout/internal/sequence-view-layout-strategy.md b/docs/design/sysml2-tools-core/layout/internal/sequence-view-layout-strategy.md index 10d0c052..5979f6c9 100644 --- a/docs/design/sysml2-tools-core/layout/internal/sequence-view-layout-strategy.md +++ b/docs/design/sysml2-tools-core/layout/internal/sequence-view-layout-strategy.md @@ -47,11 +47,12 @@ not throw: the strategy returns an empty diagram rather than failing. ##### Dependencies -- `LayoutTree`, `LayoutLifeline`, `LayoutLine`, `Point2D`, `EndMarkerStyle`, `LineStyle` - (Layout subsystem). -- `ViewContext`, `RenderOptions`, `Theme` (Rendering subsystem). -- `SysmlWorkspace`, `SysmlDefinitionNode`, `SysmlConnectionNode`, and `StdlibFilter` - (Semantic subsystem). +- `LayoutTree`, `LayoutLifeline`, `LayoutLine`, `Point2D`, `EndMarkerStyle`, and `LineStyle` + (`DemaConsulting.Rendering`). +- `ViewContext` (Rendering subsystem) and `RenderOptions`, `Theme` + (`DemaConsulting.Rendering.Abstractions`). +- `SysmlWorkspace`, `SysmlDefinitionNode`, and `SysmlConnectionNode` (Semantic subsystem). +- `StdlibFilter` (Rendering Internal subsystem) — standard-library exclusion. ##### Callers diff --git a/docs/design/sysml2-tools-core/layout/internal/state-transition-view-layout-strategy.md b/docs/design/sysml2-tools-core/layout/internal/state-transition-view-layout-strategy.md index 0fe8fdca..2862db04 100644 --- a/docs/design/sysml2-tools-core/layout/internal/state-transition-view-layout-strategy.md +++ b/docs/design/sysml2-tools-core/layout/internal/state-transition-view-layout-strategy.md @@ -3,9 +3,9 @@ ##### Purpose `StateTransitionViewLayoutStrategy` implements `ILayoutStrategy` to produce a State Transition -View diagram. It renders state usages as rounded boxes placed top-to-bottom by the layered layout -pipeline, an initial pseudo-state marker entering the first declared state, and transitions as -orthogonal arrows annotated with their guard conditions. +View diagram. It renders state usages as rounded boxes placed top-to-bottom through +`LayeredPlacement`, an initial pseudo-state marker entering the first declared state, and transitions +as orthogonal arrows annotated with their guard conditions. ##### Data Model @@ -38,38 +38,31 @@ indices, carrying the optional guard. ###### Placement and routing -State boxes are positioned by the `LayeredLayoutPipeline` built with `LayoutDirection.Down` and the -default stage sequence: each state becomes a node and each non-self transition a directed edge, so the -machine reads top-to-bottom (a transition leaves its source on the SOUTH face and enters its target on -the NORTH face). The pipeline's cycle-breaking stage makes the (cyclic) transition graph acyclic, so -the strategy does not need its own back-edge handling. The `LayeredGraph` is built with a -decoration-aware `BackEdgeEntryApproach` equal to the open-chevron end marker's along-line length -(`NotationMetrics.AlongLineLength(EndMarkerStyle.OpenChevron)`) plus `Theme.LineCornerRadius` plus -`Theme.CleanLegMargin` (for the Light theme, 10 + 4 + 1 = 15), so a reversed transition's final -straight approach is long enough that the renderer's rounded corner never intrudes into the end -marker. After the run the placed coordinates are read -back from `AugX`/`AugY`, normalized so the content starts at a margin offset (reserving room at the top -for the initial marker), and the canvas is sized to the full content extent — including the routed -transition polylines, which can bulge beyond the box columns, and the actual rendered extent of each -guard label. Because guard labels are drawn centred on their segment midpoints (using the same -`ConnectorLabelPlacer` the renderers use), only the part of a label that genuinely overhangs the -content widens the canvas: labels sitting on interior vertical segments add little or nothing, so the -canvas no longer reserves a full guard-label width of empty margin on the right. +State boxes are positioned by calling `LayeredPlacement.Place` with a top-to-bottom flow +direction: each state becomes a sized node and each non-self transition a directed edge, so the +machine reads top-to-bottom. `LayeredPlacement` delegates to the off-the-shelf +`DemaConsulting.Rendering.Layout` layered algorithm, which returns placed rectangles for the states +and routed orthogonal polylines for the transitions. The strategy uses the open-chevron along-line +length from `NotationMetrics` in `DemaConsulting.Rendering.Abstractions`, plus +`Theme.LineCornerRadius` and `Theme.CleanLegMargin`, so any routed back edge has enough final straight +approach that the renderer's rounded corner never intrudes into the end marker. The placed coordinates +are normalized so the content starts at a margin offset +(reserving room at the top for the initial marker), and the canvas is sized to the full content +extent, including routed transition polylines that can bulge beyond the box columns and the actual +rendered extent of each guard label. Because guard labels are drawn centred on their segment +midpoints with `ConnectorLabelPlacer` from `DemaConsulting.Rendering.Abstractions`, only the part of a +label that genuinely overhangs the content widens the canvas: labels sitting on interior vertical +segments add little or nothing. `AddInitialMarker` places a filled-circle badge above the first state with a straight arrow into it. -`AddTransitions` maps each transition to the orthogonal polyline the pipeline routed for it. Because -the cycle-breaking stage drops self-loops, de-duplicates identical directed pairs, and reverses back -edges, `LayeredGraph.Waypoints` is not 1:1 with the input transitions; a lookup keyed by the routed -`(source, target)` pair recovers each polyline, and a transition whose routed edge was reversed reuses -that polyline in reverse so its open chevron end marker lands on the true target. Successive -transitions sharing -one routed corridor (parallel guards, or a forward/back-edge pair) are spread laterally so their anchor -points and guard labels do not coincide. Each transition is emitted with an open chevron end marker -(`EndMarkerStyle.OpenChevron`, drawn open in both renderers) at the -target state, matching SysML v2 state transition notation, and labelled with its bracketed guard. A -self-transition is drawn as a small loop above its state, also terminated by an open chevron end -marker. The method returns the number of transitions -whose polyline crosses a non-endpoint state box. +`AddTransitions` maps each transition to the corresponding orthogonal polyline returned by +`LayeredPlacement`, preserving input-edge order and source-to-target orientation. Successive +transitions sharing one routed corridor are spread laterally so their anchor points and guard labels +do not coincide. Each transition is emitted with an open chevron end marker +(`EndMarkerStyle.OpenChevron`, drawn open in both renderers) at the target state, matching SysML v2 +state transition notation, and labelled with its bracketed guard. A self-transition is drawn as a +small loop above its state, also terminated by an open chevron end marker. The method returns the +number of transitions whose polyline crosses a non-endpoint state box. ##### Error Handling @@ -80,13 +73,16 @@ are surfaced through `LayoutWarnings`. ##### Dependencies -- `ILayoutStrategy`, `ViewContext`, `RenderOptions`, `Theme` (Rendering subsystem) — the strategy contract and inputs. -- `LayeredLayoutPipeline`, `LayeredGraph`, `LayerNode`, `LayerEdge`, `LayoutDirection`, `HierarchyHandling`, - `BoxMetrics` (Layout Engine subsystem) — top-to-bottom placement and orthogonal routing. +- `ILayoutStrategy` and `ViewContext` (Rendering subsystem) — the strategy contract and view input. +- `RenderOptions`, `Theme`, `BoxMetrics`, `NotationMetrics`, and `ConnectorLabelPlacer` + (`DemaConsulting.Rendering.Abstractions`) — render options, sizing, and label metrics. +- `LayeredPlacement` (Layout Internal subsystem) — top-to-bottom placement and orthogonal routing + through `DemaConsulting.Rendering.Layout`. - `StdlibFilter` (Rendering Internal subsystem) — standard-library exclusion. - `SysmlWorkspace`, `SysmlDefinitionNode`, `SysmlFeatureNode`, `SysmlTransitionNode` (Semantic subsystem) — model input. - `LayoutWarnings` (Layout Internal subsystem) — crossing-warning construction. -- The `LayoutTree`, `LayoutBox`, `LayoutBadge`, and `LayoutLine` data types (Layout subsystem). +- The `LayoutTree`, `LayoutBox`, `LayoutBadge`, and `LayoutLine` data types + (`DemaConsulting.Rendering`). ##### Callers diff --git a/docs/design/sysml2-tools-core/layout/layout-tree.md b/docs/design/sysml2-tools-core/layout/layout-tree.md deleted file mode 100644 index 15fd86fb..00000000 --- a/docs/design/sysml2-tools-core/layout/layout-tree.md +++ /dev/null @@ -1,59 +0,0 @@ -### LayoutTree - -#### Purpose - -`LayoutTree` is the intermediate representation consumed by every renderer: a tree of immutable -records that describes the visual structure of one rendered diagram view. All spatial decisions are -made by an `ILayoutStrategy` before the tree is handed to a renderer; the renderer only reads the -tree and writes output. - -#### Grouped Unit - -This unit is a **grouped data-model unit**. It bundles the ten cohesive `LayoutTree` record source -files that together define the representation, because they are small immutable records with no logic -that are always used and versioned as one vocabulary: - -- `LayoutTree.cs` — root container (`Width`, `Height`, top-level `Nodes`) and `Point2D`. -- `LayoutNode.cs` — the abstract discriminated-union base. -- `LayoutBox.cs` — rectangular container plus `LayoutCompartment`. -- `LayoutPort.cs` — edge connection point. -- `LayoutLine.cs` — pre-routed orthogonal polyline. -- `LayoutLabel.cs` — standalone text label (and shared `TextAlign`). -- `LayoutBadge.cs` — small icon decorator. -- `LayoutBand.cs` — swim-lane container. -- `LayoutGrid.cs` — tabular node with `LayoutGridRow` / `LayoutGridCell`. -- `LayoutLifeline.cs` — sequence-diagram lifeline plus the nested `LayoutActivation`. - -The full per-record contract (every field of every node type) is documented in the **Layout -Subsystem** chapter's *Interfaces* section and is not duplicated here; this chapter records the -grouping and the data-model invariants that the unit tests pin. - -#### Data Model - -Every type is a `sealed record` (or the abstract `LayoutNode` base). The tree has no methods; all -construction is performed by `ILayoutStrategy` implementations. Coordinates are absolute, boxes carry -an integer `Depth` (not a color), and nesting is expressed through `LayoutBox.Children` and -`LayoutBand.Children`. - -#### Error Handling - -The records are immutable value containers; construction stores the supplied values unchanged and -performs no validation beyond the language's non-nullable reference guarantees. - -#### Dependencies - -- `Theme` (Rendering subsystem) is referenced only indirectly: renderers index `Theme.DepthFillColors` - with `LayoutBox.Depth`. The Layout records themselves depend on nothing beyond the base class - library. - -#### Callers - -Every `ILayoutStrategy` constructs a `LayoutTree`; every `IRenderer` reads one. - -#### Requirements Traceability - -| Requirement ID | Satisfied by | -| --- | --- | -| SysML2Tools-Core-Layout-LayoutTree-RecordFamily | The ten grouped record source files | -| SysML2Tools-Core-Layout-LayoutTree-AbsoluteCoordinates | Absolute coordinate fields on every node type | -| SysML2Tools-Core-Layout-LayoutTree-DepthAndHierarchy | `LayoutBox.Depth` and `LayoutBox.Children` | diff --git a/docs/design/sysml2-tools-core/rendering.md b/docs/design/sysml2-tools-core/rendering.md index 653b0cd9..81a07471 100644 --- a/docs/design/sysml2-tools-core/rendering.md +++ b/docs/design/sysml2-tools-core/rendering.md @@ -2,14 +2,18 @@ ### Overview -The Rendering subsystem defines the interfaces and data types that form the rendering -pipeline for SysML2 Tools. It bridges the Layout subsystem (which produces a `LayoutTree`) -and the concrete renderer packages (`DemaConsulting.SysML2Tools.Svg` and -`DemaConsulting.SysML2Tools.Png`) by declaring the contracts that both sides must satisfy. - -The subsystem contains these types: `IRenderer` (low-level render interface), `ILayoutStrategy` -(layout computation interface), `Theme` (visual configuration), `RenderOptions` -(per-render parameters), `RenderOutput` (render result), and `DiagramRenderer` (orchestrator). +The Rendering subsystem wires together the rendering pipeline for SysML2 Tools. It bridges the +Layout subsystem (which produces a `LayoutTree`) and the off-the-shelf renderer packages +(`DemaConsulting.Rendering.Svg` and `DemaConsulting.Rendering.Skia`) using the contracts that +both sides must satisfy. + +The SysML-agnostic rendering contracts — `IRenderer` (low-level render interface), `Theme` +(visual configuration), `RenderOptions` (per-render parameters), and `RenderOutput` (render +result) — are provided off-the-shelf by the `DemaConsulting.Rendering.Abstractions` package. +The SysML-coupled types that remain in this subsystem are `ILayoutStrategy` and `ViewContext` +(the layout computation contract) and `DiagramRenderer` (orchestrator), together with the +internal `DiagramTypeRouter` and `StdlibFilter` helpers. SysML2Tools verifies its integration +with the off-the-shelf contracts through its own tests. ### Interfaces @@ -143,9 +147,8 @@ flowchart TD - `ViewContext.Workspace` references `SysmlWorkspace` from `DemaConsulting.SysML2Tools.Semantic`; the `using` directive `using DemaConsulting.SysML2Tools.Semantic;` is required in `ILayoutStrategy.cs` and `DiagramRenderer.cs`. -- `IRenderer` implementations in `DemaConsulting.SysML2Tools.Svg` and - `DemaConsulting.SysML2Tools.Png` require `` entries pointing to - `DemaConsulting.SysML2Tools.csproj`. +- The `IRenderer` implementations come from the off-the-shelf `DemaConsulting.Rendering.Svg` and + `DemaConsulting.Rendering.Skia` packages, referenced by the Tool via ``. ### Requirements Traceability diff --git a/docs/design/sysml2-tools-core/rendering/internal.md b/docs/design/sysml2-tools-core/rendering/internal.md index e99a9cbf..b64918b6 100644 --- a/docs/design/sysml2-tools-core/rendering/internal.md +++ b/docs/design/sysml2-tools-core/rendering/internal.md @@ -6,13 +6,13 @@ The Internal sub-subsystem of Rendering holds the implementation details that th rendering pipeline relies on but does not expose: selecting a layout strategy for each view and excluding standard-library elements from user-facing diagrams. It contains the `DiagramTypeRouter` unit. The stdlib exclusion is performed with the `StdlibFilter` helper, which -is grouped with the rendering contracts and documented in the *RenderingContracts* chapter. +is documented in the Rendering subsystem design. #### Interfaces The components are internal and are consumed only by other Core types. `DiagramTypeRouter` exposes a single `GetStrategy` method returning an `ILayoutStrategy`. The view strategies consume -the `StdlibFilter.IsStdlibElement` predicate (owned by the RenderingContracts unit) to decide +the `StdlibFilter.IsStdlibElement` predicate to decide whether an element belongs to the standard library. #### Design @@ -21,5 +21,4 @@ whether an element belongs to the standard library. kind (interconnection, state transition, action flow, grid/matrix, browser/tree, sequence) and returns the matching strategy, defaulting to the general view strategy. To keep diagrams focused on the user's model, the view strategies omit standard-library elements by testing each qualified -name with the `StdlibFilter` helper (grouped with the rendering contracts; see the -*RenderingContracts* chapter). The `DiagramTypeRouter` unit is described in its own chapter. +name with the `StdlibFilter` helper. The `DiagramTypeRouter` unit is described in its own chapter. diff --git a/docs/design/sysml2-tools-core/rendering/notation-metrics.md b/docs/design/sysml2-tools-core/rendering/notation-metrics.md deleted file mode 100644 index 666664d9..00000000 --- a/docs/design/sysml2-tools-core/rendering/notation-metrics.md +++ /dev/null @@ -1,68 +0,0 @@ -### NotationMetrics - -#### Purpose - -`NotationMetrics` is the single home for all intrinsic, theme-independent notation geometry shared by -the SVG and PNG renderers: end-marker (arrowhead) shapes and sizes, port squares, folder-tab -proportions, note dog-ear folds, rounded-rectangle corner scaling, badge fractions, and the -label-background inset. It is the notation-geometry peer of `BoxMetrics`: every value is either a -documented primitive notation constant or a documented derivation of those primitives, so a geometry -literal never appears more than once in the rendering path. - -#### Data Model - -`NotationMetrics` is a static class with no instance state. It exposes a `readonly record struct -MarkerVertex(double Along, double Across)` that expresses one marker vertex in tip-relative notation -units: `Along` is the distance measured back from the line endpoint into the line, and `Across` is -the perpendicular offset. All other members are public `const double` notation constants grouped by -marker family (triangle, diamond, circle, bar, crossbar), plus port, folder-tab, note-fold, -rounded-rectangle, badge, and label-background constants. - -The canonical values are the historical SVG marker values — triangle 10x7 with `refX` 9, diamond 14x8 -with `refX` 13, circle 10x10 radius 4, bar 4x12 — and every PNG size is derived from the same -constants so the two renderers draw the identical shape. - -#### Key Methods - -##### `TriangleVertices()` and `DiamondVertices()` - -Return the shared marker outlines in tip-relative notation units. The triangle (base corner, apex, -base corner) is used by the open chevron, hollow triangle, and filled arrow markers; its apex sits -one `EndMarkerTipOvershoot` beyond the endpoint. The diamond (near, side, far, side) is used by the -hollow and filled diamond markers; its far point lands exactly on the line endpoint. - -##### `AlongLineLength(style)` - -Returns the along-line length consumed by an end-marker decoration (the marker-box length for that -style, or `0.0` for `EndMarkerStyle.None`). The layout strategies use it to reserve a clean approach -and the renderers use it to clamp the final corner radius. - -##### `RoundedRectRadius(theme)` - -Returns the rounded-rectangle corner radius for a box: `theme.LineCornerRadius` scaled by -`RoundedRectCornerFactor`. Throws `ArgumentNullException` for a null theme. - -#### Error Handling - -`RoundedRectRadius` throws `ArgumentNullException` for a null `theme`. All other members are constants -or pure functions over enum inputs and cannot fail. - -#### Dependencies - -- `Theme` (Rendering subsystem) — supplies the base line-corner radius for `RoundedRectRadius`. -- `EndMarkerStyle` (Layout subsystem) — selects the marker family in `AlongLineLength`. - -#### Callers - -The SVG and PNG renderers read these constants and call `TriangleVertices`, `DiamondVertices`, and -`RoundedRectRadius` when drawing end markers and rounded boxes. The layout strategies call -`AlongLineLength` to reserve connector approach space. - -#### Requirements Traceability - -| Requirement ID | Satisfied by | -| --- | --- | -| SysML2Tools-Core-Rendering-NotationMetrics-CanonicalConstants | The named notation constants for every marker family | -| SysML2Tools-Core-Rendering-NotationMetrics-MarkerVertices | `TriangleVertices()` and `DiamondVertices()` | -| SysML2Tools-Core-Rendering-NotationMetrics-AlongLineLength | `AlongLineLength(EndMarkerStyle)` | -| SysML2Tools-Core-Rendering-NotationMetrics-RoundedRectRadius | `RoundedRectRadius(Theme)` | diff --git a/docs/design/sysml2-tools-core/rendering/rendering-contracts.md b/docs/design/sysml2-tools-core/rendering/rendering-contracts.md deleted file mode 100644 index 61815573..00000000 --- a/docs/design/sysml2-tools-core/rendering/rendering-contracts.md +++ /dev/null @@ -1,69 +0,0 @@ -### RenderingContracts - -#### Purpose - -`RenderingContracts` is the grouped unit that gathers the small, cohesive contract types defining the -rendering pipeline: the `IRenderer` and `ILayoutStrategy` interfaces (with the `ViewContext` input -record), the `RenderOptions` and `RenderOutput` records, and the internal `StdlibFilter` helper. -Together they are the seam between the Layout subsystem, the `DiagramRenderer` orchestrator, and the -concrete renderer packages. - -#### Grouped Unit - -This unit is a **grouped contracts unit**. It bundles five cohesive contract source files because -they are small interface/record declarations with little or no logic that are versioned together as -the rendering pipeline's public and internal surface: - -- `IRenderer.cs` — the low-level, stateless render interface. -- `ILayoutStrategy.cs` — the layout-computation interface, plus the `ViewContext` input record. -- `RenderOptions.cs` — per-render parameters (`Theme`, `Scale`, `Dpi`, `DepthLimit`). -- `RenderOutput.cs` — a single rendered output (`SuggestedFileName`, `MediaType`, `Data`, `Warnings`). -- `Internal/StdlibFilter.cs` — identifies standard-library elements to exclude from diagrams. - -The full per-type contract is documented in the **Rendering Subsystem** chapter's *Interfaces* -section and is not duplicated here; this chapter records the grouping and the contract behaviors that -the unit tests pin. - -#### Data Model - -`IRenderer` and `ILayoutStrategy` are interfaces; `ViewContext`, `RenderOptions`, and `RenderOutput` -are sealed records; `StdlibFilter` is an internal static class holding the known stdlib root-package -prefixes and the `IsStdlibElement` predicates. - -#### Key Behaviors - -- **IRenderer** exposes `MediaType`, `DefaultExtension`, and `Render(LayoutTree, RenderOptions, - Stream)`; implementations are pure, stateless, and do not touch the filesystem. -- **ILayoutStrategy** exposes `BuildLayout(ViewContext, RenderOptions)` returning a fully resolved - `LayoutTree`. -- **RenderOptions** defaults `Scale` to 1.0, `Dpi` to 96, and `DepthLimit` to 0 (unlimited). -- **RenderOutput** carries a suggested file name, media type, data stream, and a `Warnings` list of - non-fatal layout-quality warnings (empty when the layout is clean). -- **StdlibFilter.IsStdlibElement** returns `true` for qualified names in a known stdlib package (by - seed-set membership or root-package prefix). - -#### Error Handling - -The records store their fields unchanged. `StdlibFilter` is a pure predicate. Renderer -implementations own the lifetime of the supplied output stream per the `IRenderer` contract. - -#### Dependencies - -- `LayoutTree` (Layout subsystem) — the input drawn by `IRenderer` and produced by `ILayoutStrategy`. -- `SysmlWorkspace` (Semantic subsystem) — carried by `ViewContext`. -- `Theme` (Rendering subsystem) — held by `RenderOptions`. - -#### Callers - -`DiagramRenderer` depends on all five types to orchestrate rendering; the SVG and PNG renderer -packages implement `IRenderer`; the layout strategies implement `ILayoutStrategy`. - -#### Requirements Traceability - -| Requirement ID | Satisfied by | -| --- | --- | -| SysML2Tools-Core-Rendering-RenderingContracts-IRenderer | `IRenderer` and its SVG/PNG implementations | -| SysML2Tools-Core-Rendering-RenderingContracts-ILayoutStrategy | `ILayoutStrategy` and the `ViewContext` record | -| SysML2Tools-Core-Rendering-RenderingContracts-RenderOptions | `RenderOptions` record with default values | -| SysML2Tools-Core-Rendering-RenderingContracts-RenderOutput | `RenderOutput` record | -| SysML2Tools-Core-Rendering-RenderingContracts-StdlibFilter | `StdlibFilter.IsStdlibElement` | diff --git a/docs/design/sysml2-tools-core/rendering/theme.md b/docs/design/sysml2-tools-core/rendering/theme.md deleted file mode 100644 index f1a45381..00000000 --- a/docs/design/sysml2-tools-core/rendering/theme.md +++ /dev/null @@ -1,60 +0,0 @@ -### Theme - -#### Purpose - -`Theme` is the immutable visual-configuration record that gathers every appearance parameter for a -rendered diagram into a single object, so the whole look of a diagram can be changed by substituting -one `Theme`. The companion static `Themes` provider exposes the three built-in themes (`Light`, -`Dark`, `Print`). The subsystem-level contract for the record's fields is described in the *Rendering -Subsystem* chapter; this unit chapter focuses on the connector-geometry members and the built-in -theme values that the unit tests pin. - -#### Data Model - -`Theme` is a `sealed record` whose primary constructor carries `DepthFillColors`, `StrokeColor`, -`StrokeWidth`, `LineCornerRadius`, `FontSizeTitle`, `FontSizeBody`, `LabelPadding`, `ConnectorStub`, -`BendRadius`, and `CleanLegMargin`. `DepthFillColors` is indexed as `DepthFillColors[depth % count]` -to derive a box fill from its nesting depth. `Themes` is a static class exposing `Light`, `Dark`, and -`Print` as static read-only `Theme` instances. - -#### Key Methods - -##### `ConnectorApproachZone(connectorClearance)` - -Returns the clear distance a connector needs off a box face before it can bend, computed as -`ConnectorStub + BendRadius + connectorClearance`. The layout strategies call it to reserve that -approach zone; `BendRadius` contributes only to this reservation and is not read by any renderer -(renderers round connector elbows using `LineCornerRadius`). - -##### `BackgroundColor` - -Returns the depth-0 fill (`DepthFillColors[0]`), used to occlude connector lines behind hollow -enclosing end markers. - -#### Built-in Theme Values - -- `Light` and `Dark` share connector geometry: `ConnectorStub` 8.0, `BendRadius` 4.0. -- `Print` is tighter: `ConnectorStub` 6.0, `BendRadius` 0.0, reserving no extra bend allowance in the - connector approach zone for crisp black-and-white output. - -#### Error Handling - -`Theme` is an immutable record; construction stores the supplied values unchanged. -`ConnectorApproachZone` is a pure arithmetic helper that cannot fail. - -#### Dependencies - -None beyond the base class library. `Theme` is consumed by `RenderOptions`, the layout strategies, -and every `IRenderer` implementation. - -#### Callers - -`RenderOptions` holds a `Theme`; the SVG and PNG renderers read its colors, stroke, and connector -geometry; the layout strategies call `ConnectorApproachZone` to reserve connector space. - -#### Requirements Traceability - -| Requirement ID | Satisfied by | -| --- | --- | -| SysML2Tools-Core-Rendering-Theme-ConnectorApproachZone | `Theme.ConnectorApproachZone(double)` | -| SysML2Tools-Core-Rendering-Theme-ConnectorGeometry | `Themes.Light`, `Themes.Dark`, `Themes.Print` connector fields | diff --git a/docs/design/sysml2-tools-png.md b/docs/design/sysml2-tools-png.md deleted file mode 100644 index 094c423c..00000000 --- a/docs/design/sysml2-tools-png.md +++ /dev/null @@ -1,225 +0,0 @@ -# DemaConsulting.SysML2Tools.Png - -## Overview - -`DemaConsulting.SysML2Tools.Png` is the PNG renderer system for SysML2 Tools. It provides -a single public class, `PngRenderer`, that uses SkiaSharp to rasterize a `LayoutTree` -into a PNG image written to an output stream. - -## PngRenderer - -### Purpose - -`PngRenderer` implements the `IRenderer` interface to produce PNG diagram output from a -`LayoutTree` intermediate representation. Each call to `Render` allocates an `SKBitmap`, -draws all layout nodes onto an `SKCanvas`, encodes the result as PNG via `SKImage.Encode`, -and writes the bytes to the output stream. All SkiaSharp resources are disposed before -the method returns. The renderer is pure and stateless. - -### Data Model - -`PngRenderer` has no instance state. All inputs are supplied through `Render` parameters. - -- `LayoutTree` — read-only input; canvas dimensions and node list -- `RenderOptions` — read-only input; `Theme` for colors/fonts, `Scale` for bitmap size -- `Stream output` — write-only output; receives PNG bytes; caller owns lifetime - -### Embedded Font - -`PngRenderer` embeds the four static Noto Sans TTF files as assembly resources to guarantee -pixel-identical output across all platforms regardless of which fonts are installed on the -host system: - -| Resource | Typeface | -| --- | --- | -| `Fonts/NotoSans-Regular.ttf` | Regular weight, normal style | -| `Fonts/NotoSans-Bold.ttf` | Bold weight, normal style | -| `Fonts/NotoSans-Italic.ttf` | Regular weight, italic style | -| `Fonts/NotoSans-BoldItalic.ttf` | Bold weight, italic style | - -The four static `Lazy` fields (`RegularTypeface`, `BoldTypeface`, -`ItalicTypeface`, `BoldItalicTypeface`) load each font once on first use via the -`LoadTypeface(string fileName)` helper. `LoadTypeface` locates the resource by matching -the file name suffix (case-insensitive) against the assembly manifest resource names and -falls back to `SKTypeface.Default` if the resource is not found, so the renderer -remains functional even when the font files are absent. - -The SIL Open Font License 1.1 attribution file for Noto Sans is included at -`Fonts/OFL.txt` and is also embedded as an assembly resource. - -### Font Weight and Style Per Node Type - -Each node type uses a fixed weight and style: - -| Node Type | Weight | Style | -| --- | --- | --- | -| `LayoutBox` label | Bold | Normal | -| `LayoutBoxCompartment` title | Bold | Italic | -| `LayoutBoxCompartment` rows | Regular | Normal | -| `LayoutLine` midpoint label | Regular | Normal | -| `LayoutLabel` | Per `FontWeight` field | Per `FontStyle` field | -| `LayoutPort` label | Regular | Normal | -| `LayoutBadge` label | Regular | Normal | -| `LayoutBand` label | Regular | Normal | -| `LayoutLifeline` label | Bold | Normal | -| `LayoutGrid` header cells | Bold | Normal | -| `LayoutGrid` body cells | Regular | Normal | - -### LayoutLabel Font Styling Fields - -`LayoutLabel` carries three explicit font styling fields added in Phase 4: - -- `Weight` (`FontWeight`) — `Regular` or `Bold`; selects the typeface variant. -- `Style` (`FontStyle`) — `Normal` or `Italic`; selects the typeface variant. -- `FontSize` (double) — Font size in logical pixels, independent of the theme body size. - -### Key Methods - -**`Render(LayoutTree layout, RenderOptions options, Stream output)`** - -Entry point. Validates arguments. Computes bitmap width and height as -`(int)Math.Ceiling(layout.Width * options.Scale)`, clamped to a minimum of 1×1 pixels -to prevent SkiaSharp allocation errors on empty trees. Creates `SKBitmap(w, h, Rgba8888, Premul)`, -fills background with `SKColors.White`, calls `RenderNode` for each top-level node, -then encodes via `SKImage.FromBitmap(bitmap).Encode(Png, 100)` and saves to `output`. - -**`RenderNode(SKCanvas canvas, LayoutNode node, RenderOptions options)`** - -Dispatches by concrete node type to the appropriate typed render method. All nine -`LayoutNode` subtypes are handled: `LayoutBox` → `RenderBox`, `LayoutLine` → `RenderLine`, -`LayoutLabel` → `RenderLabel`, `LayoutPort` → `RenderPort`, `LayoutBadge` → `RenderBadge`, -`LayoutBand` → `RenderBand`, `LayoutLifeline` → `RenderLifeline`, -`LayoutActivation` → `RenderActivation`, `LayoutGrid` → `RenderGrid`. Unknown subtypes -are silently skipped for forward compatibility. - -**`LoadTypeface(string fileName)`** - -Locates the embedded assembly resource whose name ends with `fileName` -(case-insensitive). Returns an `SKTypeface` decoded from the resource stream, or -`SKTypeface.Default` if no matching resource is found. - -**`CreateTextPaint(SKColor color, float fontSize, bool bold, bool italic)`** - -Selects the appropriate `Lazy` variant based on the `(bold, italic)` tuple, -then returns a new `SKPaint` configured with the color, font size, anti-aliasing, and -typeface. The caller is responsible for disposing the returned paint. - -**`FitFontSize(SKPaint paint, string text, float availableWidth, float maxFontSize)`** - -Measures the text width at `maxFontSize`. Returns `maxFontSize` unchanged when the text -fits within `availableWidth` or when `availableWidth` is zero or negative. Otherwise -scales the font size proportionally: `maxFontSize * (availableWidth / measuredWidth)`. -This ensures long labels do not overflow their bounding box. - -**`RenderBox(SKCanvas canvas, LayoutBox box, RenderOptions options)`** - -Draws a filled rectangle (plain or rounded via `DrawRoundRect` when -`BoxShape.RoundedRectangle` and `LineCornerRadius > 0`) using the fill color from -`theme.DepthFillColors[depth % count]`. Draws a matching stroke rectangle. Draws centered -bold title text when `box.Label` is non-null, calling `FitFontSize` to prevent overflow. -Calls `RenderBoxCompartments` for any compartments, then recursively calls `RenderNode` -for all `box.Children`. - -**`RenderBoxCompartments(SKCanvas canvas, LayoutBox box, RenderOptions options, SKColor strokeColor)`** - -Draws a full-width horizontal divider line at the start of each compartment, followed by -an optional bold-italic title row and zero or more left-aligned regular-weight body-font -text rows. Tracks a running Y offset starting below the label area. - -**`RenderLine(SKCanvas canvas, LayoutLine line, RenderOptions options)`** - -Builds a single `SKPath` from all waypoints. Applies `SKPathEffect.CreateCorner` when -`LineCornerRadius > 0`. When dashing is also active, composes effects with -`SKPathEffect.CreateCompose(dash, corner)` so the dash pattern follows the rounded path. -When either end carries a marker, the corner radius is clamped (via `NeedsEndCornerClamp` -and `BuildClampedLinePath`) so the rounded corner completes at least the marker's -along-line length before the endpoint, keeping the curve out of the end-marker zone. -After drawing the path, calls `DrawEndMarker` for non-None `SourceEnd` and `TargetEnd` -styles, then `RenderLineMidpointLabel` when `MidpointLabel` is non-null. - -**`DrawEndMarker(SKCanvas, tipX, tipY, dx, dy, EndMarkerStyle, EndMarkerPaint)`** - -Draws the line-end marker at the given tip using a normalized direction vector. Supports all -nine `EndMarkerStyle` values: `None` (no-op), `OpenChevron` (open chevron — two strokes that -meet at the apex with no closing base edge), `HollowTriangle` (hollow triangle, closed), -`HollowTriangleCrossbar` (hollow triangle with perpendicular crossbar), `FilledArrow` (solid -triangle), `HollowDiamond` (hollow four-point polygon, closed), `FilledDiamond` (solid -four-point polygon, closed), `Circle` (open circle), and `Bar` (perpendicular stroke). Every -vertex comes from the shared `NotationMetrics` geometry (for example `TriangleVertices()`, -`DiamondVertices()`, `EndMarkerRefX`, `CrossbarX`, `CircleRadius`, `BarAlong`/`BarAcross`), so -the PNG markers are geometrically identical to the SVG markers built from the same source. - -**`RenderLabel(SKCanvas canvas, LayoutLabel label, RenderOptions options)`** - -Draws text using `CreateTextPaint` with the weight and style from `label.Weight` and -`label.Style`, font size from `label.FontSize`, and alignment from `label.Align`. Calls -`FitFontSize` when `label.MaxWidth > 0`. - -**`RenderPort(SKCanvas canvas, LayoutPort port, RenderOptions options)`** - -Draws an 8×8-pixel filled square (filled with the stroke color) centered at -`(CentreX, CentreY)`. Optional label is offset away from the attached `PortSide`. - -**`RenderBadge(SKCanvas canvas, LayoutBadge badge, RenderOptions options)`** - -Draws the badge shape centered at `(CentreX, CentreY)` within a bounding circle of -radius `Size/2`. Shapes: `FilledCircle` (solid circle), `Bullseye` (filled circle with -white inner circle), `Diamond` (rotated open square), `HorizontalBar` (horizontal stroke), -`VerticalBar` (vertical stroke). Optional label drawn to the right. - -**`RenderBand(SKCanvas canvas, LayoutBand band, RenderOptions options)`** - -Draws a filled and stroked rectangle using `DepthFillColors[0]`. For `Horizontal` -orientation the label is rendered with 90° CCW rotation along the left edge using -`canvas.Save/Translate/RotateDegrees/Restore`. For `Vertical` orientation the label is -horizontal at the top. Children are rendered recursively. - -**`RenderLifeline(SKCanvas canvas, LayoutLifeline lifeline, RenderOptions options)`** - -Draws a header box centered at `CentreX` (top at `TopY`, size `HeaderWidth × HeaderHeight`) -filled with `DepthFillColors[0]`. Draws a bold centered label in the box. Draws a dashed -vertical stem (`SKPathEffect.CreateDash`) from the bottom of the header to `BottomY`. - -**`RenderActivation(SKCanvas canvas, LayoutActivation activation, RenderOptions options)`** - -Draws a white-filled rectangle of width `LabelPadding * 2` centered at `CentreX`, -spanning `TopY` to `BottomY`, with a stroke border. - -**`RenderGrid(SKCanvas canvas, LayoutGrid grid, RenderOptions options)`** - -Iterates rows and cells, accumulating X/Y positions. Each cell gets a filled background -(`DepthFillColors[1]` for header rows, `DepthFillColors[0]` for body rows), a stroke -border, and a text element vertically centered within the row height and horizontally -aligned per `LayoutGridCell.Align`. Header cells use bold weight; body cells use regular. - -### Error Handling - -`Render` throws `ArgumentNullException` when `layout`, `options`, or `output` is null. -`SKColor.Parse` throws `ArgumentException` for malformed hex strings; this is a programming -error in the theme definition, not a user input error. - -### Dependencies - -- `DemaConsulting.SysML2Tools` — provides `IRenderer`, `LayoutTree`, all nine `LayoutNode` - subtypes, `RenderOptions`, `Theme` -- `SkiaSharp` (OTS) — provides `SKBitmap`, `SKCanvas`, `SKImage`, `SKPaint`, `SKColor`, - `SKPath`, `SKPathEffect`, `SKTypeface`, `SKData` -- Noto Sans (OTS, SIL OFL 1.1) — four static TTF files embedded as assembly resources - -### Callers - -- `DiagramRenderer.RenderWorkspace` (in `DemaConsulting.SysML2Tools`) — passes the - renderer to `IRenderer.Render` as part of the orchestrated rendering pipeline -- `RenderCommand.RunAsync` (in `DemaConsulting.SysML2Tools.Tool`) — creates a - `PngRenderer` instance when `--format png` is selected - -## Requirements Traceability - -| Requirement ID | Satisfied by | -| --- | --- | -| SysML2Tools-Core-Rendering-IRenderer | `IRenderer` implementation in `PngRenderer` | -| SysML2Tools-Core-Rendering-IRendererStateless | `PngRenderer` is a stateless, pure class | -| SysML2Tools-Png-MediaType | `PngRenderer.MediaType` property | -| SysML2Tools-Png-DefaultExtension | `PngRenderer.DefaultExtension` property | -| SysML2Tools-Png-Render-Signature | `PngRenderer.Render` encodes via SkiaSharp PNG | -| SysML2Tools-Png-Render-Box | `RenderBox` draws filled and stroked rectangle | diff --git a/docs/design/sysml2-tools-png/png-renderer.md b/docs/design/sysml2-tools-png/png-renderer.md deleted file mode 100644 index a55e0d12..00000000 --- a/docs/design/sysml2-tools-png/png-renderer.md +++ /dev/null @@ -1,42 +0,0 @@ -### PngRenderer - -#### Purpose - -`PngRenderer` is the single unit of the `DemaConsulting.SysML2Tools.Png` system. It implements the -`IRenderer` interface and rasterizes a `LayoutTree` into a PNG image using SkiaSharp, written to a -caller-supplied stream. It performs no layout; it draws the already-placed nodes a layout strategy -produced. - -#### Data Model - -`PngRenderer` is a stateless class. Each `Render` call creates its own SkiaSharp surface, canvas, and -paints, disposing them before returning, so calls are independent. Intrinsic marker geometry is not -stored on the renderer; it is read from the shared `NotationMetrics` so that PNG and SVG markers are -identical. - -#### Key Methods - -##### `MediaType` / `DefaultExtension` - -Report `"image/png"` and `".png"` so the diagram renderer can select PNG output and callers can name -and serve the output correctly. - -##### `Render(LayoutTree tree, RenderOptions options, Stream output)` - -Creates an `SKSurface` sized to the layout, clears it to white, and walks the layout tree drawing each -node with SkiaSharp: filled and stroked rectangles for boxes (fill selected from the theme depth -colours), rasterized text for labels, stroked paths for connector lines, the notation-appropriate -shapes for port, badge, band, lifeline, activation, and grid nodes, and connector end markers. It then -encodes the surface as PNG and writes the bytes to the output stream, disposing all SkiaSharp objects. - -#### Dependencies - -- **Core `IRenderer` / `LayoutTree` / `RenderOptions`** — the rendering contract and intermediate - representation the renderer consumes. -- **SkiaSharp** — provides the surface, canvas, paints, and PNG encoder. -- **`NotationMetrics`** — supplies the intrinsic end-marker geometry so markers match the SVG output. - -#### Callers - -- `DiagramRenderer` (Core) invokes `PngRenderer` once per view when PNG output is requested. -- Tests construct `PngRenderer` directly and assert on the decoded PNG pixels and signature. diff --git a/docs/design/sysml2-tools-svg.md b/docs/design/sysml2-tools-svg.md deleted file mode 100644 index 7cd3ebdc..00000000 --- a/docs/design/sysml2-tools-svg.md +++ /dev/null @@ -1,220 +0,0 @@ -# DemaConsulting.SysML2Tools.Svg - -## Overview - -`DemaConsulting.SysML2Tools.Svg` is the SVG renderer system for SysML2 Tools. It provides -a single public class, `SvgRenderer`, that translates a `LayoutTree` into a self-contained -SVG 1.1 document written to an output stream. The renderer has zero external runtime -dependencies beyond the .NET base class library. - -## SvgRenderer - -### Purpose - -`SvgRenderer` implements the `IRenderer` interface to produce SVG 1.1 diagram output -from a `LayoutTree` intermediate representation. Each call to `Render` builds a complete -SVG document in a `StringBuilder` and writes it to the supplied stream in UTF-8 encoding. -The renderer is pure and stateless; no fields are mutated between calls. - -### Data Model - -`SvgRenderer` has no instance state. All inputs are supplied through `Render` parameters. - -- `LayoutTree` — read-only input; canvas dimensions and node list -- `RenderOptions` — read-only input; `Theme` for visual parameters, `Scale` for sizing -- `Stream output` — write-only output; receives UTF-8 SVG bytes; caller owns lifetime - -### Font Family - -All text elements use `font-family="Noto Sans, sans-serif"`. The `Noto Sans` family is -specified first so that browsers and renderers with Noto Sans installed use it; `sans-serif` -is the CSS generic fallback. This replaced the earlier `Segoe UI, sans-serif` default to -provide consistent rendering across all platforms. - -### Font Weight and Style Per Node Type - -Each node type uses a fixed font weight and style as SVG attributes: - -| Node Type | `font-weight` | `font-style` | -| --- | --- | --- | -| `LayoutBox` label | `bold` | (default) | -| `LayoutBoxCompartment` title | `bold` | `italic` | -| `LayoutBoxCompartment` rows | (default) | (default) | -| `LayoutLine` midpoint label | (default) | (default) | -| `LayoutLabel` | Per `FontWeight` field | Per `FontStyle` field | -| `LayoutPort` label | (default) | (default) | -| `LayoutBadge` label | (default) | (default) | -| `LayoutBand` label | (default) | (default) | -| `LayoutLifeline` label | `bold` | (default) | -| `LayoutGrid` header cells | `bold` | (default) | -| `LayoutGrid` body cells | (default) | (default) | - -### LayoutLabel Font Styling Fields - -`LayoutLabel` carries three explicit font styling fields added in Phase 4: - -- `Weight` (`FontWeight`) — `Regular` maps to `font-weight="normal"`; `Bold` maps to `font-weight="bold"`. -- `Style` (`FontStyle`) — `Normal` maps to `font-style="normal"`; `Italic` maps to `font-style="italic"`. -- `FontSize` (double) — Font size in logical pixels, used as `font-size` instead of the theme body size. - -### Text Length Shrink-to-Fit - -`LayoutBox` labels and `LayoutLabel` nodes are constrained to their available width only -when the text would otherwise overflow it. The renderer estimates each label's natural -width (character count × font size × an average glyph-width factor) and compares it to the -available width — `box.Width - 2 * theme.LabelPadding` for box labels, or `MaxWidth` for a -`LayoutLabel`. Only when the estimate exceeds the available width does the renderer emit -`textLength="{availableWidth * scale}"` together with `lengthAdjust="spacingAndGlyphs"`, -which instructs SVG viewers to compress the glyph spacing so the text shrinks into the -available area without overflow. - -When the text already fits (or the available width is non-positive), no `textLength` or -`lengthAdjust` attribute is emitted, so short labels render at their natural width and are -never stretched to fill the box. - -### Key Methods - -**`Render(LayoutTree layout, RenderOptions options, Stream output)`** - -Entry point. Validates arguments, computes canvas size clamped to a minimum of 1×1, -writes the SVG root element with `xmlns`, `width`, `height`, and `viewBox` attributes, -then calls `WriteEndMarkerDefs` followed by recursive `RenderNode` calls for every -top-level node. Encodes the completed `StringBuilder` as UTF-8 and writes all bytes -to `output` in a single `Write` call. - -**`WriteEndMarkerDefs(StringBuilder sb, Theme theme)`** - -Writes the SVG `` block containing eight named line-end marker elements: -`line-end-open-chevron` (open chevron drawn as a `` with no closing base edge), -`line-end-hollow-triangle` (hollow triangle), `line-end-filled-arrow` (solid triangle), -`line-end-hollow-diamond` (hollow four-point polygon), `line-end-filled-diamond` -(solid four-point polygon), `line-end-circle` (open circle), `line-end-bar` -(perpendicular line), and `line-end-hollow-triangle-crossbar` (hollow triangle with -perpendicular crossbar). All markers use `theme.StrokeColor` and `theme.StrokeWidth`. - -Every marker coordinate is derived from the single-source notation geometry in -`NotationMetrics` (for example `EndMarkerLength`, `EndMarkerWidth`, `EndMarkerRefX`, -`DiamondLength`, `CircleRadius`, `BarAlong`/`BarAcross`, and the -`TriangleVertices()`/`DiamondVertices()` helpers). Because the SVG and PNG renderers -read from the same `NotationMetrics` source, their end markers are geometrically -identical. `line-end-open-chevron` is the only open marker — it omits the closing base -edge so the chevron renders as two strokes meeting at the apex; the hollow triangle and -both diamonds remain closed. - -**`RenderNode(StringBuilder sb, LayoutNode node, Theme theme, double scale)`** - -Dispatches by concrete node type to the appropriate typed render method. All nine -`LayoutNode` subtypes are handled: `LayoutBox` → `RenderBox`, `LayoutLine` → `RenderLine`, -`LayoutLabel` → `RenderLabel`, `LayoutPort` → `RenderPort`, `LayoutBadge` → `RenderBadge`, -`LayoutBand` → `RenderBand`, `LayoutLifeline` → `RenderLifeline`, -`LayoutActivation` → `RenderActivation`, `LayoutGrid` → `RenderGrid`. Unknown subtypes -are silently skipped for forward compatibility. - -**`RenderBox(StringBuilder sb, LayoutBox box, Theme theme, double scale)`** - -Writes a `` element using fill color from `theme.DepthFillColors[box.Depth % count]`. -Adds `rx`/`ry` attributes when `BoxShape.RoundedRectangle` and `LineCornerRadius > 0`. -Writes a bold `` element with `textLength` in the title area when `box.Label` is -non-null. Calls `RenderBoxCompartments` for any compartments, then recursively calls -`RenderNode` for all `box.Children`. - -**`RenderBoxCompartments(StringBuilder sb, LayoutBox box, Theme theme, double scale)`** - -Writes a `` divider across the full box width at the top of each compartment, -followed by an optional `font-weight="bold" font-style="italic"` `` title row and -zero or more left-aligned regular-weight body-font `` rows. - -**`RenderLine(StringBuilder sb, LayoutLine line, Theme theme, double scale)`** - -Calls `BuildLinePath` to produce the path `d` attribute, then writes a `` element -with `fill="none"`. Adds `marker-start` or `marker-end` attributes for all eight non-None -`EndMarkerStyle` values, referencing the `SourceEnd` and `TargetEnd` line-end markers. -Adds `stroke-dasharray` for `Dashed` and `Dotted` line styles. -Writes an optional midpoint `` element when `MidpointLabel` is non-null. - -**`BuildLinePath(IReadOnlyList waypoints, double cornerRadius, double scale, -EndMarkerStyle sourceEnd, EndMarkerStyle targetEnd)`** - -Builds the SVG path `d` string. When `cornerRadius` is zero, emits plain `M`/`L` -commands. When positive, each interior waypoint is replaced with a shortened `L` command -to the arc start point, followed by an `A` (elliptical arc) command whose sweep direction -(0 or 1) is determined from the cross product of the incoming and outgoing unit direction -vectors. The radius is clamped to half the shorter adjacent segment to prevent overshoot. -At the first and last bends the radius is additionally clamped so the rounded corner -completes at least the marker's along-line length (`NotationMetrics.AlongLineLength` -for `sourceEnd`/`targetEnd`) before the endpoint, so the curve never intrudes into the -end-marker zone. - -**`RenderLabel(StringBuilder sb, LayoutLabel label, Theme theme, double scale)`** - -Writes a `` element with `text-anchor` from `label.Align`, `font-size` from -`label.FontSize`, `font-weight` and `font-style` from `label.Weight` and `label.Style`. -When `label.MaxWidth > 0`, adds `textLength` and `lengthAdjust="spacingAndGlyphs"`. - -**`RenderPort(StringBuilder sb, LayoutPort port, Theme theme, double scale)`** - -Writes a filled 8×8 `` centered at `(CentreX, CentreY)`. Optional label is written -as a `` element offset away from the attached `PortSide`. - -**`RenderBadge(StringBuilder sb, LayoutBadge badge, Theme theme, double scale)`** - -Writes shape-specific SVG elements: `` for `FilledCircle` and `Bullseye` (the -latter with an additional white inner circle), `` for `Diamond`, and `` -for `HorizontalBar` and `VerticalBar`. An optional label is written as ``. - -**`RenderBand(StringBuilder sb, LayoutBand band, Theme theme, double scale)`** - -Writes a `` with `DepthFillColors[0]` fill. For `Horizontal` bands writes a -`` with `transform="translate(...) rotate(-90)"` on the left edge; for `Vertical` -bands writes a horizontal `` at the top. Children are rendered recursively. - -**`RenderLifeline(StringBuilder sb, LayoutLifeline lifeline, Theme theme, double scale)`** - -Writes a `` header centered at `CentreX` filled with `DepthFillColors[0]`, a -bold centered `` label, and a dashed `` stem (`stroke-dasharray="6 3"`) from -the bottom of the header to `BottomY`. - -**`RenderActivation(StringBuilder sb, LayoutActivation activation, Theme theme, double scale)`** - -Writes a `` with `fill="white"` and a stroke border. Width is `LabelPadding * 2`, -centered at `CentreX`, spanning `TopY` to `BottomY`. - -**`RenderGrid(StringBuilder sb, LayoutGrid grid, Theme theme, double scale)`** - -Iterates rows and cells, accumulating X/Y positions. Each cell gets a `` filled -with `DepthFillColors[1]` for header rows or `DepthFillColors[0]` for body rows, plus a -stroke border, plus a `` vertically centered in the row and aligned per -`LayoutGridCell.Align`. Header cells have `font-weight="bold"` added conditionally; -body cells use the browser default. - -### Error Handling - -`Render` throws `ArgumentNullException` when `layout`, `options`, or `output` is null. -No other exceptions are expected under normal operation. XML special characters in labels -are escaped via `EscapeXml` (replaces `&`, `<`, `>` with XML entities) to prevent -malformed SVG output. - -### Dependencies - -- `DemaConsulting.SysML2Tools` — provides `IRenderer`, `LayoutTree`, all nine `LayoutNode` - subtypes, `RenderOptions`, `Theme` - -### Callers - -- `DiagramRenderer.RenderWorkspace` (in `DemaConsulting.SysML2Tools`) — passes the - renderer to `IRenderer.Render` as part of the orchestrated rendering pipeline -- `RenderCommand.RunAsync` (in `DemaConsulting.SysML2Tools.Tool`) — creates a - `SvgRenderer` instance when `--format svg` is selected - -## Requirements Traceability - -| Requirement ID | Satisfied by | -| --- | --- | -| SysML2Tools-Core-Rendering-IRenderer | `IRenderer` implementation in `SvgRenderer` | -| SysML2Tools-Core-Rendering-IRendererStateless | `SvgRenderer` is a stateless, pure class | -| SysML2Tools-Svg-MediaType | `SvgRenderer.MediaType` property | -| SysML2Tools-Svg-DefaultExtension | `SvgRenderer.DefaultExtension` property | -| SysML2Tools-Svg-Render-Document | `SvgRenderer.Render` writes SVG root element | -| SysML2Tools-Svg-Render-Box | `RenderBox` writes `` element | -| SysML2Tools-Svg-Render-Label | `RenderLabel` writes `` element | -| SysML2Tools-Svg-Render-Line | `RenderLine` writes `` element | diff --git a/docs/design/sysml2-tools-svg/svg-renderer.md b/docs/design/sysml2-tools-svg/svg-renderer.md deleted file mode 100644 index ba6d750b..00000000 --- a/docs/design/sysml2-tools-svg/svg-renderer.md +++ /dev/null @@ -1,41 +0,0 @@ -### SvgRenderer - -#### Purpose - -`SvgRenderer` is the single unit of the `DemaConsulting.SysML2Tools.Svg` system. It implements the -`IRenderer` interface and translates a `LayoutTree` into a self-contained SVG 1.1 document written -to a caller-supplied stream. It performs no layout; it draws the already-placed nodes a layout -strategy produced. - -#### Data Model - -`SvgRenderer` is a stateless class. Each `Render` call operates only on its arguments and a locally -built `StringBuilder`, so calls are independent. Intrinsic marker geometry is not stored on the -renderer; it is read from the shared `NotationMetrics` so that SVG and PNG markers are identical. - -#### Key Methods - -##### `MediaType` / `DefaultExtension` - -Report `"image/svg+xml"` and `".svg"` so the diagram renderer can select SVG output and callers can -name and serve the output correctly. - -##### `Render(LayoutTree tree, RenderOptions options, Stream output)` - -Writes the SVG root element and a `defs` block of end markers, then walks the layout tree emitting an -element per node: `rect` for boxes (with `rx` for rounded corners and inner lines/text for -compartments), `text` for labels (with bold/italic styling and XML escaping of model text), `path` -for connector lines (with arcs for rounded corners, dash arrays for dashed styling, midpoint labels, -and `marker-end` references), and the notation-appropriate elements for port, badge, band, lifeline, -activation, and grid nodes. - -#### Dependencies - -- **Core `IRenderer` / `LayoutTree` / `RenderOptions`** — the rendering contract and intermediate - representation the renderer consumes. -- **`NotationMetrics`** — supplies the intrinsic end-marker geometry so markers match the PNG output. - -#### Callers - -- `DiagramRenderer` (Core) invokes `SvgRenderer` once per view when SVG output is requested. -- Tests construct `SvgRenderer` directly and assert on the emitted SVG document. diff --git a/docs/design/sysml2-tools-tool/render.md b/docs/design/sysml2-tools-tool/render.md index a27df974..f2ff7151 100644 --- a/docs/design/sysml2-tools-tool/render.md +++ b/docs/design/sysml2-tools-tool/render.md @@ -63,9 +63,9 @@ Entry point for the render command. Steps: - `WorkspaceLoader` (in `DemaConsulting.SysML2Tools.Semantic`) — loads workspace - `DiagramRenderer` (in `DemaConsulting.SysML2Tools.Rendering`) — renders views -- `SvgRenderer` (in `DemaConsulting.SysML2Tools.Svg`) — produces SVG output -- `PngRenderer` (in `DemaConsulting.SysML2Tools.Png`) — produces PNG output -- `Themes.Light` (in `DemaConsulting.SysML2Tools.Rendering`) — default theme +- `SvgRenderer` (in `DemaConsulting.Rendering.Svg`) — produces SVG output +- `PngRenderer` (in `DemaConsulting.Rendering.Skia`) — produces PNG output +- `Themes.Light` (in `DemaConsulting.Rendering.Abstractions`) — default theme - `Context` (in `DemaConsulting.SysML2Tools.Cli`) — reads arguments; writes output ##### Callers diff --git a/docs/reqstream/ots/dema-rendering.yaml b/docs/reqstream/ots/dema-rendering.yaml new file mode 100644 index 00000000..b9d64932 --- /dev/null +++ b/docs/reqstream/ots/dema-rendering.yaml @@ -0,0 +1,101 @@ +--- +# DemaConsulting.Rendering OTS Software Requirements +# +# Requirements for the DemaConsulting.Rendering package family (DemaConsulting.Rendering, +# DemaConsulting.Rendering.Abstractions, DemaConsulting.Rendering.Layout, +# DemaConsulting.Rendering.Svg, DemaConsulting.Rendering.Skia) that SysML2Tools consumes for +# SysML-agnostic layout and rendering. Each requirement is verified indirectly through SysML2Tools +# tests that drive the package family end-to-end. + +sections: + - title: OTS Software Requirements + sections: + - title: DemaConsulting.Rendering Requirements + requirements: + - id: SysML2Tools-OTS-DemaRendering-LayoutGraph + title: >- + DemaConsulting.Rendering shall lay a graph of sized nodes and directed edges out + into placed boxes and routed connectors. + justification: | + SysML2Tools no longer owns a geometric layout engine. The view layout strategies + build a LayoutGraph of sized nodes and directed edges and rely on the package's + LayeredLayoutAlgorithm to return a LayoutTree of placed LayoutBox nodes and routed + LayoutLine connectors. Strategy layouts that emit placed boxes together with routed + connector lines confirm the package performed the placement and routing. + tags: [ots] + tests: + - ActionFlowView_BuildLayout_ActionsAndSuccessions_ProducesBoxesMarkersAndFlows + - StateTransitionView_BuildLayout_StatesAndTransitions_ProducesBoxesBadgeAndLines + - InterconnectionView_BuildLayout_PartsAndConnections_ProducesBoxesPortsAndLines + + - id: SysML2Tools-OTS-DemaRendering-Direction + title: >- + DemaConsulting.Rendering shall honor the requested layout direction, placing the + target of a directed edge downstream of its source, including a top-to-bottom + direction. + justification: | + The action-flow and state-transition strategies request a top-to-bottom (DOWN) + direction so their diagrams read downward. The package must place each successor + below its predecessor for that direction. A forward chain that flows top-to-bottom is + the observable evidence the direction was honored. + tags: [ots] + tests: + - ActionFlowView_BuildLayout_ForwardChain_FlowsTopToBottomOrthogonally + - StateTransitionView_BuildLayout_ForwardChain_FlowsTopToBottomOrthogonally + - ActionFlowView_BuildLayout_Successions_FlowTopToBottom + + - id: SysML2Tools-OTS-DemaRendering-Containers + title: >- + DemaConsulting.Rendering shall pack container regions so that child boxes are placed + inside their container and containers do not overlap one another. + justification: | + The interconnection strategy renders nested parts as containers whose children must + fall inside the container bounds, with sibling containers kept apart. The package's + containment packing produces this geometry, evidenced by children rendered inside the + container box and non-overlapping part boxes. + tags: [ots] + tests: + - InterconnectionView_BuildLayout_NestedContainer_PlacesChildrenInsideContainerBox + - InterconnectionView_BuildLayout_ContainerSize_BoundsChildrenAndTitle + - InterconnectionView_BuildLayout_PartBoxes_DoNotOverlap + + - id: SysML2Tools-OTS-DemaRendering-Routing + title: >- + DemaConsulting.Rendering shall route connectors as orthogonal segments between the + boxes it places without running them through unrelated boxes. + justification: | + Readable diagrams require connectors that turn at right angles and skirt the boxes + between their endpoints. The package's orthogonal router produces such polylines, + evidenced by forward chains that route top-to-bottom orthogonally and by the routed + connectors produced for an interconnection diagram whose boxes do not overlap. + tags: [ots] + tests: + - ActionFlowView_BuildLayout_ForwardChain_FlowsTopToBottomOrthogonally + - StateTransitionView_BuildLayout_ForwardChain_FlowsTopToBottomOrthogonally + - InterconnectionView_BuildLayout_PartsAndConnections_ProducesBoxesPortsAndLines + + - id: SysML2Tools-OTS-DemaRendering-RenderSvg + title: >- + DemaConsulting.Rendering shall render a laid-out layout tree to a valid SVG document. + justification: | + SysML2Tools produces SVG output through the package's SvgRenderer. The renderer must + turn a LayoutTree into a well-formed SVG document representing the diagram, evidenced + by SVG produced from an empty tree and from full workspace renders. + tags: [ots] + tests: + - SvgRenderer_Render_EmptyTree_WritesValidSvg + - DiagramRenderer_RenderWorkspace_SoftwareStructureModel_ReturnsSvgOutput + - DiagramRenderer_RenderWorkspace_GeneralViewModel_SvgContainsElementNames + + - id: SysML2Tools-OTS-DemaRendering-RenderPng + title: >- + DemaConsulting.Rendering shall render a laid-out layout tree to a valid PNG image. + justification: | + SysML2Tools produces raster output through the package's Skia-based PngRenderer. The + renderer must turn a LayoutTree into a valid PNG image, evidenced by PNG bytes + produced from an empty tree and from full workspace renders. + tags: [ots] + tests: + - PngRenderer_Render_EmptyTree_WritesPngBytes + - DiagramRenderer_RenderWorkspace_SoftwareStructureModel_PngRenderer_ReturnsPngOutput + - DiagramRenderer_RenderWorkspace_GeneralViewModel_PngProducesValidOutput diff --git a/docs/reqstream/sysml2-tools-core/layout.yaml b/docs/reqstream/sysml2-tools-core/layout.yaml index bb2bef30..82c8ab32 100644 --- a/docs/reqstream/sysml2-tools-core/layout.yaml +++ b/docs/reqstream/sysml2-tools-core/layout.yaml @@ -3,168 +3,53 @@ # # PURPOSE: # - Define requirements for the SysML2Tools Layout subsystem -# - LayoutTree and its node types provide the intermediate representation consumed by renderers -# - Requirements describe observable layout structure, not internal rendering algorithms +# - The layout-tree intermediate representation (LayoutTree, LayoutBox, LayoutLine, ...) and +# the geometric layered layout algorithm are provided off-the-shelf by the +# DemaConsulting.Rendering and DemaConsulting.Rendering.Layout packages +# - This subsystem maps the SysML semantic model onto that IR, one diagram view at a time, and +# delegates geometric node placement and connector routing to the off-the-shelf layered algorithm +# - Requirements describe observable layout structure, not the placement algorithms sections: - title: Layout Subsystem Requirements requirements: - id: SysML2Tools-Core-Layout-LayoutTree title: >- - The Layout subsystem shall provide a LayoutTree record containing canvas Width, - Height, and a flat list of top-level LayoutNodes. + The Layout subsystem shall map each diagram view of the semantic workspace onto a + layout tree of absolutely positioned nodes and pre-routed connectors, reusing the + layout-tree intermediate representation provided by the DemaConsulting.Rendering package. justification: | - A single root container with explicit canvas dimensions allows renderers to allocate - output buffers before visiting any node. The flat top-level list enables renderers - to iterate without recursing into the root unnecessarily; nesting is expressed - within LayoutBox.Children. + The renderers consume only the layout tree. Reusing the off-the-shelf layout-tree + intermediate representation keeps SysML2Tools focused on mapping the SysML model to + boxes, ports, lines, and markers rather than defining geometric primitives. A populated + layout tree is the observable result that proves the mapping occurred. tests: - - LayoutTree_Construction_StoresWidthHeightNodes + - GeneralViewLayoutStrategy_BuildLayout_OneUserPartDef_ProducesLayoutBox + - InterconnectionView_BuildLayout_PartsAndConnections_ProducesBoxesPortsAndLines + - SequenceView_BuildLayout_Messages_ProducesLifelinesAndOrderedLines - - id: SysML2Tools-Core-Layout-AbsoluteCoordinates + - id: SysML2Tools-Core-Layout-DelegatedGeometry title: >- - All coordinate values in LayoutTree and its descendant nodes shall be absolute, - with the origin at the top-left corner of the canvas. + The Layout subsystem shall delegate geometric node placement and connector routing to + the off-the-shelf DemaConsulting.Rendering.Layout layered algorithm, positioning the + boxes of a diagram so that they do not overlap one another. justification: | - Absolute coordinates eliminate the need for renderers to maintain a coordinate - transform stack. Every node can be drawn independently without knowledge of its - ancestors, simplifying renderer implementations and enabling future parallel - rendering. + Reusing the off-the-shelf layered algorithm avoids maintaining a bespoke geometric + layout engine while still guaranteeing readable, non-overlapping geometry. Non-overlap + is an observable property of the produced layout tree that every view must guarantee. tests: - - LayoutBox_Coordinates_AreAbsolute - - LayoutPort_Coordinates_AreAbsolute - - - id: SysML2Tools-Core-Layout-LayoutBox - title: >- - The Layout subsystem shall provide a LayoutBox node representing a rectangular - container with position, size, optional label, integer depth, shape, compartments, - and nested children. - justification: | - LayoutBox is the primary structural node for block diagrams. The integer Depth - field allows the renderer to look up a fill color from the Theme without embedding - color state in the layout tree, keeping the tree pure and re-renderable with - different themes. Children allow nested blocks to be expressed as a tree. - tests: - - LayoutBox_Construction_StoresAllFields - - LayoutBox_Depth_IsInteger - - - id: SysML2Tools-Core-Layout-DepthNotColor - title: >- - LayoutBox shall carry an integer Depth field and no color fields; the renderer - shall derive fill color by indexing into Theme.DepthFillColors, wrapping if the - depth exceeds the color count. - justification: | - Separating layout from color concerns allows the same LayoutTree to be rendered - with different themes without recomputing layout. Wrapping ensures that deeply - nested blocks always receive a valid color regardless of theme depth. - tests: - - LayoutBox_Depth_IsInteger - - - id: SysML2Tools-Core-Layout-TreeStructure - title: >- - LayoutBox.Children shall contain the nested LayoutNodes that reside spatially - inside the box, including LayoutPort nodes attached to its edges. - justification: | - Expressing nesting via Children preserves the parent–child spatial relationship - without requiring a back-reference from child to parent. Renderers can clip or - recursively render children knowing they are contained within the parent bounds. - tests: - - LayoutBox_Children_ContainsNestedNodes - - - id: SysML2Tools-Core-Layout-LayoutPort - title: >- - The Layout subsystem shall provide a LayoutPort node with absolute centre - coordinates and a PortSide enum indicating which edge of the parent box it is - attached to. - justification: | - Ports are small connection points on box edges. Storing the absolute centre - position and side allows renderers to draw port symbols without requiring access - to the parent box dimensions. - tests: - - LayoutPort_Construction_StoresAllFields - - - id: SysML2Tools-Core-Layout-LayoutLine - title: >- - The Layout subsystem shall provide a LayoutLine node containing a pre-routed - ordered list of absolute waypoints, source and target end-marker styles, a line - stroke style, and an optional midpoint label. - justification: | - Pre-routed waypoints mean the renderer only draws straight segments between - consecutive points; path-finding is entirely the responsibility of ILayoutStrategy. - This separation allows multiple renderers (SVG, PNG) to share the same routing - algorithm without duplication. - tests: - - LayoutLine_Construction_StoresAllFields - - - id: SysML2Tools-Core-Layout-LayoutLabel - title: >- - The Layout subsystem shall provide a LayoutLabel node with absolute position, - maximum width, text content, and horizontal text alignment. - justification: | - Standalone labels are needed for diagram titles, note annotations, and edge - mid-labels that are not part of a box compartment. MaxWidth allows the renderer - to wrap or truncate text without recomputing positions. - tests: - - LayoutLabel_Construction_StoresAllFields - - - id: SysML2Tools-Core-Layout-LayoutBadge - title: >- - The Layout subsystem shall provide a LayoutBadge node with absolute centre - position, size, shape, and optional label for small icon decorators. - justification: | - Badges represent SysML notational icons (e.g., initial pseudostates, choice - nodes, history connectors) that are too small to be LayoutBox instances. - A dedicated node type allows renderers to apply specialized drawing logic. - tests: - - LayoutBadge_Construction_StoresAllFields - - - id: SysML2Tools-Core-Layout-LayoutBand - title: >- - The Layout subsystem shall provide a LayoutBand node representing a swim-lane - with position, size, orientation, optional label, and nested children. - justification: | - Swim-lanes appear in activity and sequence diagrams. Expressing them as a - dedicated node type (rather than a styled LayoutBox) allows renderers to - apply lane-specific styling and header positioning. - tests: - - LayoutBand_Construction_StoresAllFields - - - id: SysML2Tools-Core-Layout-LayoutLifeline - title: >- - The Layout subsystem shall provide a LayoutLifeline node representing a - sequence-diagram lifeline with absolute centre X, top Y, bottom Y, label, - header width, and header height; and a LayoutActivation node representing - an activation bar with centre X, top Y, and bottom Y. - justification: | - Lifelines and activation bars are structural elements of sequence diagrams - with distinct visual representations. Dedicated node types allow renderers - to draw them correctly without inferring their roles from generic properties. - tests: - - LayoutLifeline_Construction_StoresAllFields - - LayoutActivation_Construction_StoresAllFields - - - id: SysML2Tools-Core-Layout-LayoutGrid - title: >- - The Layout subsystem shall provide a LayoutGrid node representing a tabular - layout at an absolute position, containing rows of cells with width, height, - text, alignment, and column span. - justification: | - Grids are needed for SysML table views and property compartments that have - multi-column structure. A dedicated node type allows renderers to draw borders - and apply header styling without heuristic detection. - tests: - - LayoutGrid_Construction_StoresAllFields + - InterconnectionView_BuildLayout_PartBoxes_DoNotOverlap + - ActionFlowView_BuildLayout_NoOverlap - id: SysML2Tools-Core-Layout-PreRoutedLines title: >- - All line routing, including A* path-finding and even waypoint spacing, shall - be performed by ILayoutStrategy before the LayoutTree is passed to the renderer. - LayoutLine.Waypoints shall contain the complete ordered sequence of absolute - points that the renderer draws as straight segments. + All connector routing shall be resolved before the layout tree is passed to a renderer, + so that LayoutLine waypoints contain the complete ordered sequence of absolute points + that the renderer draws as straight segments. justification: | - Delegating routing to ILayoutStrategy keeps renderers stateless and free of - path-finding logic. A renderer that implements IRenderer only needs to draw - line segments between consecutive waypoints and apply the Theme's - LineCornerRadius for elbow rounding. + Delegating routing to the view layout strategies (through the layered algorithm) keeps + renderers stateless and free of path-finding logic. A renderer only needs to draw + segments between consecutive absolute waypoints. tests: - - LayoutLine_Waypoints_AreAbsolute + - ActionFlowView_BuildLayout_ForwardChain_FlowsTopToBottomOrthogonally + - StateTransitionView_BuildLayout_ForwardChain_FlowsTopToBottomOrthogonally diff --git a/docs/reqstream/sysml2-tools-core/layout/box-metrics.yaml b/docs/reqstream/sysml2-tools-core/layout/box-metrics.yaml deleted file mode 100644 index e488ea26..00000000 --- a/docs/reqstream/sysml2-tools-core/layout/box-metrics.yaml +++ /dev/null @@ -1,35 +0,0 @@ ---- -# BoxMetrics Unit Requirements -# -# PURPOSE: -# - Define requirements for the BoxMetrics unit -# - BoxMetrics provides the shared box title-area and folder-tab height formulas so that the -# space reserved by the layout strategies equals the space drawn by the renderers -# - Each requirement is verified directly by BoxMetricsTests - -sections: - - title: BoxMetrics Unit Requirements - requirements: - - id: SysML2Tools-Core-Layout-BoxMetrics-TitleAreaHeight - title: >- - BoxMetrics shall compute the title-area height reserved at the top of a box from the - theme font sizes and label padding, returning zero when the box has neither a name label - nor a keyword line. - justification: | - The layout strategies reserve the title area and the renderers draw into it. Sharing one - formula keeps reserved space and drawn space consistent, so nested children never collide - with the box title. - tests: - - BoxMetrics_TitleAreaHeight_NoLabelNoKeyword_IsZero - - BoxMetrics_TitleAreaHeight_LabelOnly_ReservesTitleLine - - BoxMetrics_TitleAreaHeight_LabelAndKeyword_ReservesBothLines - - - id: SysML2Tools-Core-Layout-BoxMetrics-FolderTabHeight - title: >- - BoxMetrics shall compute the folder-tab height drawn at the top-left of a folder box from - the theme body font size and label padding. - justification: |- - The folder tab is drawn by the renderers and its height must match the space the layout - strategies reserve above the box body, so both derive it from one theme-based formula. - tests: - - BoxMetrics_FolderTabHeight_DerivesFromThemeBodyFontAndPadding diff --git a/docs/reqstream/sysml2-tools-core/layout/connector-label-placer.yaml b/docs/reqstream/sysml2-tools-core/layout/connector-label-placer.yaml deleted file mode 100644 index 7217baa6..00000000 --- a/docs/reqstream/sysml2-tools-core/layout/connector-label-placer.yaml +++ /dev/null @@ -1,41 +0,0 @@ ---- -# ConnectorLabelPlacer Unit Requirements -# -# PURPOSE: -# - Define requirements for the ConnectorLabelPlacer unit -# - ConnectorLabelPlacer computes screen positions for connector (midpoint) labels -# - Requirements describe observable placement properties, not the placement algorithm - -sections: - - title: ConnectorLabelPlacer Unit Requirements - requirements: - - id: SysML2Tools-Core-Layout-ConnectorLabelPlacer-LabelledLinesOnly - title: >- - ConnectorLabelPlacer shall compute a position for every line that carries a label and - shall omit lines that carry no label. - justification: | - Only labelled connectors need a label position. Omitting unlabelled lines keeps the - result limited to the connectors that are actually annotated. - tests: - - Place_LineWithoutLabel_IsOmitted - - - id: SysML2Tools-Core-Layout-ConnectorLabelPlacer-PreferredPlacement - title: >- - ConnectorLabelPlacer shall place a connector's label at the midpoint of the connector's - longest segment. - justification: | - The longest segment is the most open run of a connector, so a label centered there is the - least likely to overlap boxes or bends and reads as belonging to that connector. - tests: - - Place_SingleLine_UsesLongestSegmentMidpoint - - - id: SysML2Tools-Core-Layout-ConnectorLabelPlacer-Separation - title: >- - When two labels would otherwise overlap, ConnectorLabelPlacer shall separate them so the - placed labels do not collide, resolving the order deterministically from the input order. - justification: | - Overlapping labels are unreadable. Moving a colliding label clear of the ones already - placed keeps every label legible, and resolving collisions by input order makes the - result reproducible across renderers. - tests: - - Place_CollidingLabels_AreSeparated diff --git a/docs/reqstream/sysml2-tools-core/layout/engine.yaml b/docs/reqstream/sysml2-tools-core/layout/engine.yaml deleted file mode 100644 index a557fc26..00000000 --- a/docs/reqstream/sysml2-tools-core/layout/engine.yaml +++ /dev/null @@ -1,45 +0,0 @@ ---- -# Layout Engine Subsystem Requirements -# -# PURPOSE: -# - Define requirements for the Engine subsystem of the Layout subsystem -# - Engines are reusable geometric layout components independent of the SysML model -# - Requirements describe observable geometric behavior, not the algorithms used - -sections: - - title: Layout Engine Subsystem Requirements - requirements: - - id: SysML2Tools-Core-Layout-Engine-ModelIndependent - title: >- - The layout engines shall compute geometry from plain geometric inputs (sizes, - edges, anchors, and connections) without reference to the SysML semantic model. - justification: | - Keeping the engines independent of the semantic model allows every view strategy - to reuse the same engines and allows each engine to be tested in isolation with - synthetic geometric input. - tests: - - Route_NoObstacles_ProducesOrthogonalPath - - Pack_MixedSizes_AllRectsWithinBounds - - LayerAssigner_Apply_LinearChain_AssignsMonotonicLayers - - - id: SysML2Tools-Core-Layout-Engine-NonOverlapping - title: >- - The placement engines shall position boxes so that boxes placed in the same - region do not overlap one another. - justification: | - Overlapping boxes produce unreadable diagrams. Non-overlap is an observable - property of the produced geometry that any placement engine must guarantee. - tests: - - Pack_MixedSizes_ProducesNoOverlaps - - ComponentPacker_Apply_DisconnectedSingletons_PackSeparately - - - id: SysML2Tools-Core-Layout-Engine-Deterministic - title: >- - Given identical input, the layout engines shall produce identical geometry on - every invocation. - justification: | - Deterministic output is required for reproducible diagrams, stable golden-image - tests, and meaningful diffs between renders of the same model. - tests: - - ComponentPacker_Apply_ComponentOrder_IsDeterministic - - Route_AlignedEndpoints_ProducesStraightLine diff --git a/docs/reqstream/sysml2-tools-core/layout/engine/channel-router.yaml b/docs/reqstream/sysml2-tools-core/layout/engine/channel-router.yaml deleted file mode 100644 index bf91971f..00000000 --- a/docs/reqstream/sysml2-tools-core/layout/engine/channel-router.yaml +++ /dev/null @@ -1,77 +0,0 @@ ---- -# ChannelRouter Unit Requirements -# -# PURPOSE: -# - Define requirements for the ChannelRouter unit -# - ChannelRouter routes an orthogonal connector between two anchor points -# - Requirements describe observable path properties, not the routing algorithm - -sections: - - title: ChannelRouter Unit Requirements - requirements: - - id: SysML2Tools-Core-Layout-Engine-ChannelRouter-Orthogonal - title: >- - ChannelRouter shall produce a path of axis-aligned segments connecting the source - anchor to the target anchor. - justification: | - Orthogonal (axis-aligned) connectors are the convention for the block, state, and - activity diagrams the tool renders. Consecutive waypoints therefore always share an - X or a Y coordinate. - tests: - - Route_NoObstacles_ProducesOrthogonalPath - - Route_AlignedEndpoints_ProducesStraightLine - - - id: SysML2Tools-Core-Layout-Engine-ChannelRouter-AvoidObstacles - title: >- - When an obstacle-free path exists, ChannelRouter shall route around obstacle - rectangles without passing through their interiors. - justification: | - Connectors that cut through unrelated boxes are unreadable. The router must steer - segments around obstacles whenever the geometry allows. - tests: - - Route_ObstacleBetween_RoutesAround - - Route_MultipleObstacles_RemainsValid - - RouteWithStatus_ObstacleBetween_RoutesAroundWithoutCrossing - - - id: SysML2Tools-Core-Layout-Engine-ChannelRouter-Clearance - title: >- - When an obstacle-free path is achievable, ChannelRouter shall keep routed segments - clear of obstacles by the caller-specified clearance distance. - justification: | - A connector that grazes the edge of a box reads as touching it. Honoring a - clearance keeps visible breathing space between connectors and unrelated boxes. - tests: - - RouteWithStatus_CleanRoute_KeepsClearanceFromObstacles - - - id: SysML2Tools-Core-Layout-Engine-ChannelRouter-PerpendicularEnds - title: >- - When an anchor is given with the box side it sits on, ChannelRouter shall leave or - enter that anchor with a segment perpendicular to the side. - justification: | - Connectors that meet a box edge at a right angle read as attached to the box rather - than sliding along its border, matching diagram notation conventions. - tests: - - Route_WithSourceSide_LeavesPerpendicular - - Route_WithTargetSide_EntersPerpendicular - - - id: SysML2Tools-Core-Layout-Engine-ChannelRouter-CrossingStatus - title: >- - ChannelRouter shall report whether the produced path could not be routed without - crossing an obstacle. - justification: | - When geometry forces a connector through a box (for example an enclosed target), - callers need to know so the condition can be surfaced as a layout warning rather - than silently producing a misleading diagram. - tests: - - RouteWithStatus_NoBlockingObstacle_ReportsNotCrossed - - RouteWithStatus_TargetEnclosedByObstacle_ReportsCrossed - - - id: SysML2Tools-Core-Layout-Engine-ChannelRouter-CostBands - title: >- - When cost bands are supplied, ChannelRouter shall prefer routing through a cheaper band over - an equal-length alternative outside it. - justification: | - Highway bundling depends on a cost discount so parallel wires share a corridor; the router - must bias toward discounted bands while keeping null bands neutral. - tests: - - RouteWithStatus_HighwayBand_PrefersBandedDetour diff --git a/docs/reqstream/sysml2-tools-core/layout/engine/containment-packer.yaml b/docs/reqstream/sysml2-tools-core/layout/engine/containment-packer.yaml deleted file mode 100644 index 602331cc..00000000 --- a/docs/reqstream/sysml2-tools-core/layout/engine/containment-packer.yaml +++ /dev/null @@ -1,81 +0,0 @@ ---- -# ContainmentPacker Unit Requirements -# -# PURPOSE: -# - Define requirements for the ContainmentPacker unit -# - ContainmentPacker arranges variable-size items into rows within a width budget -# - Requirements describe observable placement properties, not the packing algorithm - -sections: - - title: ContainmentPacker Unit Requirements - requirements: - - id: SysML2Tools-Core-Layout-Engine-ContainmentPacker-SingleRow - title: >- - ContainmentPacker shall place items that together fit within the maximum content width on - a single row. - justification: | - When the available width can hold all the items, splitting them across rows would waste - vertical space. Items that fit must share one row, ordered left to right. - tests: - - Pack_ItemsFitInRow_ShareSameRow - - - id: SysML2Tools-Core-Layout-Engine-ContainmentPacker-Wrapping - title: >- - ContainmentPacker shall wrap an item that would exceed the maximum content width onto a - new row positioned below the current row. - justification: | - A row may not grow past the width budget. When the next item would overflow it, the - packer must start a new row beneath the current one so the content stays within the - allotted width. - tests: - - Pack_ItemsExceedWidth_WrapToNewRow - - - id: SysML2Tools-Core-Layout-Engine-ContainmentPacker-NoOverlap - title: >- - ContainmentPacker shall position items so that no two packed rectangles overlap. - justification: | - Overlapping items hide one another. Whatever mix of sizes is supplied, every packed - rectangle must be disjoint from every other. - tests: - - Pack_MixedSizes_ProducesNoOverlaps - - - id: SysML2Tools-Core-Layout-Engine-ContainmentPacker-WithinBounds - title: >- - ContainmentPacker shall place every packed rectangle within the bounds of the region size - it reports. - justification: | - Callers size the container from the reported region width and height. Every packed - rectangle must lie inside those bounds so that nothing is clipped or drawn outside the - container. - tests: - - Pack_MixedSizes_AllRectsWithinBounds - - - id: SysML2Tools-Core-Layout-Engine-ContainmentPacker-OversizedItem - title: >- - ContainmentPacker shall place an item wider than the maximum content width alone on its - own row and shall widen the region to contain it. - justification: | - An item that cannot fit the width budget still has to be placed. It must occupy its own - row, and the reported region must grow so the oversized item remains fully contained. - tests: - - Pack_ItemWiderThanContentWidth_PlacedAloneAndRegionWidens - - - id: SysML2Tools-Core-Layout-Engine-ContainmentPacker-EmptyInput - title: >- - When given no items, ContainmentPacker shall return an empty result whose region consists - solely of the requested padding. - justification: | - An empty input is a valid degenerate case. The packer must return a well-formed, empty - result sized only by the padding rather than failing. - tests: - - Pack_EmptyList_ReturnsPaddingOnlyRegion - - - id: SysML2Tools-Core-Layout-Engine-ContainmentPacker-SingleItem - title: >- - When given a single item, ContainmentPacker shall place it at the padding origin and size - the region to that item plus padding. - justification: | - A lone item has a predictable home: the padding origin, with the region sized to wrap it - exactly plus the requested padding on each side. - tests: - - Pack_SingleItem_PositionsAtPaddingOrigin diff --git a/docs/reqstream/sysml2-tools-core/layout/engine/interconnection-layout-engine.yaml b/docs/reqstream/sysml2-tools-core/layout/engine/interconnection-layout-engine.yaml deleted file mode 100644 index 0074436d..00000000 --- a/docs/reqstream/sysml2-tools-core/layout/engine/interconnection-layout-engine.yaml +++ /dev/null @@ -1,67 +0,0 @@ ---- -# InterconnectionLayoutEngine Unit Requirements -# -# PURPOSE: -# - Define requirements for the InterconnectionLayoutEngine unit -# - InterconnectionLayoutEngine implements the full Sugiyama pipeline (cycle-breaking, -# longest-path layering, dummy nodes, Barycenter ordering, slot routing) for the -# Interconnection View -# - Requirements describe observable geometric properties, not the algorithm - -sections: - - title: InterconnectionLayoutEngine Unit Requirements - requirements: - - id: SysML2Tools-Core-Layout-Engine-InterconnectionLayoutEngine-Layering - title: >- - InterconnectionLayoutEngine shall assign layer indices using longest-path layering so - that every connected pair of nodes occupies different layers. - justification: | - Longest-path layering guarantees no same-layer connections, eliminating the connector - clipping that occurred with the previous BFS approach. - tests: - - Place_LinearChain_MonotonicLayerAssignment - - Place_WorkstationTopology_CorrectLayersAndNoOverlap - - - id: SysML2Tools-Core-Layout-Engine-InterconnectionLayoutEngine-NonOverlapping - title: >- - InterconnectionLayoutEngine shall produce node rectangles that do not overlap. - justification: | - Overlapping boxes prevent readable diagrams; the layered column structure and - per-column vertical stacking guarantee non-overlap by construction. - tests: - - Place_WorkstationTopology_CorrectLayersAndNoOverlap - - - id: SysML2Tools-Core-Layout-Engine-InterconnectionLayoutEngine-DummyNodes - title: >- - InterconnectionLayoutEngine shall insert dummy nodes for long edges (span > 1) and - exclude them from the returned Rects list so the rect count equals the input node count. - justification: | - Dummy nodes force routing through the correct inter-layer corridors, preventing - connector lines from clipping intermediate boxes. They must not appear as layout - boxes in the output. - tests: - - Place_LongEdge_RectCountEqualsInputNodeCount - - Place_LongEdge_RoutesViaDummyNodesWithinBounds - - - id: SysML2Tools-Core-Layout-Engine-InterconnectionLayoutEngine-Waypoints - title: >- - InterconnectionLayoutEngine shall return one waypoint list per input edge; a span-1 edge - produces a straight two-waypoint path and a long edge routes via dummy nodes within the - layout bounds. - justification: | - Pre-computed waypoints allow InterconnectionViewLayoutStrategy to emit connector - lines without any additional routing logic. - tests: - - Place_SingleEdge_ProducesStraightTwoWaypointPath - - Place_LongEdge_RoutesViaDummyNodesWithinBounds - - - id: SysML2Tools-Core-Layout-Engine-InterconnectionLayoutEngine-Deterministic - title: >- - Given identical input, InterconnectionLayoutEngine shall produce identical geometry - and waypoints on every invocation. - justification: | - Reproducible layout is required so regenerating a view from unchanged input does not - shift boxes or change connector routes. - tests: - - Place_LinearChain_MonotonicLayerAssignment - - Place_WorkstationTopology_CorrectLayersAndNoOverlap diff --git a/docs/reqstream/sysml2-tools-core/layout/engine/layered.yaml b/docs/reqstream/sysml2-tools-core/layout/engine/layered.yaml deleted file mode 100644 index d4e34c45..00000000 --- a/docs/reqstream/sysml2-tools-core/layout/engine/layered.yaml +++ /dev/null @@ -1,61 +0,0 @@ ---- -# Layout Engine Layered Subsystem Requirements -# -# PURPOSE: -# - Define requirements for the Layered subsystem of the Layout Engine subsystem -# - The Layered subsystem is a reusable, composable ELK-style layered layout pipeline -# - Requirements describe observable behavior of the assembled pipeline, not stage internals - -sections: - - title: Layout Engine Layered Subsystem Requirements - requirements: - - id: SysML2Tools-Core-Layout-Engine-Layered-StagedPipeline - title: >- - The Layered subsystem shall compute a layout by running an ordered sequence of - composable stages, each implementing a common stage interface, over a single shared - graph state object. - justification: | - Expressing the algorithm as ordered, independently testable stages lets the pipeline be - extended, reordered, and verified one stage at a time instead of as one monolithic method. - tests: - - LayeredLayoutPipeline_RunDefaultStages_ChainGraph_PopulatesWaypointsWithoutThrowing - - Pipeline_MatchesLegacyOracle_OnRandomGraphs - - - id: SysML2Tools-Core-Layout-Engine-Layered-BehaviorPreserving - title: >- - The Layered subsystem shall produce the same rectangles, totals, layer assignments, and - connector waypoints as the legacy monolithic interconnection engine for every input. - justification: | - The subsystem was extracted from the monolithic engine as a behavior-preserving refactor; - identical geometry is required so existing views render unchanged. - tests: - - Pipeline_MatchesLegacyOracle_OnRandomGraphs - - Pipeline_MatchesLegacyOracle_OnEmptyGraph - - Pipeline_MatchesLegacyOracle_OnDroneLikeGraph - - Pipeline_MatchesLegacyOracle_OnWorkstationLikeGraph - - Pipeline_MatchesLegacyOracle_OnNamedTopologies - - - id: SysML2Tools-Core-Layout-Engine-Layered-FlatHierarchyOnly - title: >- - The Layered subsystem shall support flat (single-graph) hierarchy handling and shall - reject recursive hierarchy handling with a clear error until it is implemented. - justification: | - Flat handling reproduces the current behavior exactly; failing fast on the unimplemented - recursive mode prevents silently producing an unsupported layout. - tests: - - LayeredLayoutPipeline_Build_RecursiveHierarchy_ThrowsNotSupportedException - - - id: SysML2Tools-Core-Layout-Engine-Layered-RightDirection - title: >- - The Layered subsystem shall support laying out graphs in the right, down, left, and up - flow directions, computing in the left-to-right abstract axes and mapping the result onto - screen coordinates for the requested direction via the AxisTransform stage. - justification: | - The stages compute in the left-to-right abstract axes and AxisTransform maps the result - onto the requested direction; directed views such as the State Transition and Action Flow - views rely on the down direction, so all four directions must be supported. - tests: - - AxisTransform_Apply_RightDirection_LeavesCoordinatesUnchanged - - AxisTransform_Apply_Down_PlacesTargetSouthWithCorrectFaces - - AxisTransform_Apply_Left_PlacesTargetWestWithCorrectFaces - - AxisTransform_Apply_Up_PlacesTargetNorthWithCorrectFaces diff --git a/docs/reqstream/sysml2-tools-core/layout/engine/layered/axis-transform.yaml b/docs/reqstream/sysml2-tools-core/layout/engine/layered/axis-transform.yaml deleted file mode 100644 index 364b439e..00000000 --- a/docs/reqstream/sysml2-tools-core/layout/engine/layered/axis-transform.yaml +++ /dev/null @@ -1,62 +0,0 @@ ---- -# AxisTransform Unit Requirements -# -# PURPOSE: -# - Define requirements for the AxisTransform unit -# - AxisTransform maps abstract along/cross coordinates onto screen coordinates per direction -# - Requirements describe the observable coordinate effect, not the transform internals - -sections: - - title: AxisTransform Unit Requirements - requirements: - - id: SysML2Tools-Core-Layout-Engine-Layered-AxisTransform-RightIdentity - title: >- - AxisTransform shall leave the placed coordinates unchanged when the layout direction is - left-to-right, the abstract identity direction. - justification: | - The earlier stages already emit left-to-right screen coordinates, so the identity case - must pass them through untouched to preserve the verified output. - tests: - - AxisTransform_Apply_RightDirection_LeavesCoordinatesUnchanged - - Pipeline_MatchesLegacyOracle_OnRandomGraphs - - - id: SysML2Tools-Core-Layout-Engine-Layered-AxisTransform-DirectionMapping - title: >- - AxisTransform shall map the abstract along/cross coordinates onto screen coordinates for the - down, left, and up directions, placing each later-layer target on the correct side of its - source (below for down, left for left, above for up). - justification: | - The State Transition View and future directed views rely on the layered pipeline flowing in - a direction other than left-to-right; the stage must position nodes consistently for each. - tests: - - AxisTransform_Apply_Down_PlacesTargetSouthWithCorrectFaces - - AxisTransform_Apply_Left_PlacesTargetWestWithCorrectFaces - - AxisTransform_Apply_Up_PlacesTargetNorthWithCorrectFaces - - AxisTransform_Apply_Right_PlacesTargetEastWithCorrectFaces - - - id: SysML2Tools-Core-Layout-Engine-Layered-AxisTransform-PortFaces - title: >- - AxisTransform shall emit each transition's source endpoint on the source node's exit face and - its target endpoint on the target node's entry face for the requested direction (down: source - SOUTH, target NORTH; and the analogous faces for right, left, and up). - justification: | - Correct-face exit (diagram-quality C8) requires the routed endpoints to land on the faces - implied by the flow direction so arrows enter and leave states cleanly. - tests: - - AxisTransform_Apply_Down_PlacesTargetSouthWithCorrectFaces - - AxisTransform_Apply_Right_PlacesTargetEastWithCorrectFaces - - AxisTransform_Apply_Left_PlacesTargetWestWithCorrectFaces - - AxisTransform_Apply_Up_PlacesTargetNorthWithCorrectFaces - - - id: SysML2Tools-Core-Layout-Engine-Layered-AxisTransform-OrthogonalWaypoints - title: >- - AxisTransform shall preserve the orthogonality of every routed waypoint polyline (each - consecutive segment remains axis-aligned) after mapping, for all four directions. - justification: | - The mapping must not introduce diagonal segments; orthogonal routing is required for the - block-diagram visual style across every direction. - tests: - - AxisTransform_Apply_Right_ProducesOrthogonalWaypoints - - AxisTransform_Apply_Down_ProducesOrthogonalWaypoints - - AxisTransform_Apply_Left_ProducesOrthogonalWaypoints - - AxisTransform_Apply_Up_ProducesOrthogonalWaypoints diff --git a/docs/reqstream/sysml2-tools-core/layout/engine/layered/brandes-kopf-placer.yaml b/docs/reqstream/sysml2-tools-core/layout/engine/layered/brandes-kopf-placer.yaml deleted file mode 100644 index 0abda4f3..00000000 --- a/docs/reqstream/sysml2-tools-core/layout/engine/layered/brandes-kopf-placer.yaml +++ /dev/null @@ -1,43 +0,0 @@ ---- -# BrandesKopfPlacer Unit Requirements -# -# PURPOSE: -# - Define requirements for the BrandesKopfPlacer unit -# - BrandesKopfPlacer assigns absolute X and Y coordinates to every augmented node -# - Requirements describe the observable coordinate arrays, not the Brandes-Köpf internals - -sections: - - title: BrandesKopfPlacer Unit Requirements - requirements: - - id: SysML2Tools-Core-Layout-Engine-Layered-BrandesKopfPlacer-CoordinateAssignment - title: >- - BrandesKopfPlacer shall assign an X and a Y coordinate to every augmented node and a left - edge and maximum width to every layer column. - justification: | - Every later stage and the final result read per-node coordinates and per-column extents, - so the placer must produce a complete coordinate set for the augmented graph. - tests: - - BrandesKopfPlacer_Apply_ChainGraph_AssignsCoordinateArrays - - - id: SysML2Tools-Core-Layout-Engine-Layered-BrandesKopfPlacer-LeftToRightColumns - title: >- - BrandesKopfPlacer shall place layer columns left to right so that each column's left edge - is strictly greater than the previous column's left edge. - justification: | - Strictly increasing column positions realize the layer order as horizontal progression, - which is required for connectors to flow consistently in one direction. - tests: - - BrandesKopfPlacer_Apply_ColumnsAreLeftToRightInLayerOrder - - - id: SysML2Tools-Core-Layout-Engine-Layered-BrandesKopfPlacer-BalancedYPlacement - title: >- - BrandesKopfPlacer shall assign cross-axis (Y) coordinates using the four-pass Brandes-Köpf - balanced alignment so that a node fanning out to several successors is centered between - those successors rather than aligned to any one of them. - justification: | - The whole reason for running four independent alignment passes and averaging their medians - is to balance each node between its neighbors; a symmetric fork whose source lands exactly - at the midpoint of its two separated targets proves the balancing rather than a naive - single-pass placement. - tests: - - BrandesKopfPlacer_Apply_SymmetricFork_CentersSourceBetweenTargets diff --git a/docs/reqstream/sysml2-tools-core/layout/engine/layered/component-packer.yaml b/docs/reqstream/sysml2-tools-core/layout/engine/layered/component-packer.yaml deleted file mode 100644 index 4f108061..00000000 --- a/docs/reqstream/sysml2-tools-core/layout/engine/layered/component-packer.yaml +++ /dev/null @@ -1,72 +0,0 @@ ---- -# ComponentPacker Unit Requirements -# -# PURPOSE: -# - Define requirements for the ComponentPacker unit -# - ComponentPacker lays out a disconnected graph as a compact arrangement of its connected components -# - Requirements describe the observable component packing, not the union-find internals - -sections: - - title: ComponentPacker Unit Requirements - requirements: - - id: SysML2Tools-Core-Layout-Engine-Layered-ComponentPacker-ComponentDetection - title: >- - ComponentPacker shall partition the graph's real nodes into connected components over the - undirected edge set so that nodes joined by a path share a component and disconnected nodes - occupy separate components. - justification: | - Laying out each connected component independently is what keeps unrelated subgraphs from - being stacked into one tall column, so the components must first be detected correctly. - tests: - - ComponentPacker_Apply_ConnectedCore_StaysOneComponent - - ComponentPacker_Apply_DisconnectedSingletons_PackSeparately - - - id: SysML2Tools-Core-Layout-Engine-Layered-ComponentPacker-SingleComponentPassThrough - title: >- - ComponentPacker shall, when the graph forms a single connected component, produce output - identical to running its wrapped inner stages directly on the graph. - justification: | - The fast path preserves the behavior of every caller whose graph is connected, so the - wrapper must be transparent in that case. - tests: - - ComponentPacker_Apply_SingleComponent_EqualsDefaultPipeline - - - id: SysML2Tools-Core-Layout-Engine-Layered-ComponentPacker-NonOverlappingPacking - title: >- - ComponentPacker shall place the laid-out components so that their content bounding boxes do - not overlap. - justification: | - Overlapping components would render unreadable diagrams, so the packing must keep every - component's bounding box clear of the others. - tests: - - ComponentPacker_Apply_DisconnectedSingletons_PackSeparately - - - id: SysML2Tools-Core-Layout-Engine-Layered-ComponentPacker-Determinism - title: >- - ComponentPacker shall order components by their lowest original node index so that repeated - layouts of the same graph are identical. - justification: | - Reproducible renders require a deterministic component order independent of dictionary or - hash iteration order. - tests: - - ComponentPacker_Apply_ComponentOrder_IsDeterministic - - - id: SysML2Tools-Core-Layout-Engine-Layered-ComponentPacker-WaypointTranslation - title: >- - ComponentPacker shall translate each component's routed edge waypoints by the same offset - applied to that component's nodes so that edges stay attached to their boxes. - justification: | - An edge whose waypoints were not translated with its component would detach from its - endpoints, so the offset must be applied consistently to nodes and waypoints. - tests: - - ComponentPacker_Apply_Waypoints_TranslatedWithComponent - - - id: SysML2Tools-Core-Layout-Engine-Layered-ComponentPacker-EmptyGraph - title: >- - ComponentPacker shall treat an empty graph as a no-op and shall reject a null graph. - justification: | - The downstream stages cannot operate on an empty augmented graph, and a null graph is a - programming error that must surface immediately. - tests: - - ComponentPacker_Apply_EmptyGraph_IsNoOp - - ComponentPacker_Apply_NullGraph_Throws diff --git a/docs/reqstream/sysml2-tools-core/layout/engine/layered/crossing-minimizer.yaml b/docs/reqstream/sysml2-tools-core/layout/engine/layered/crossing-minimizer.yaml deleted file mode 100644 index 5026a5df..00000000 --- a/docs/reqstream/sysml2-tools-core/layout/engine/layered/crossing-minimizer.yaml +++ /dev/null @@ -1,34 +0,0 @@ ---- -# CrossingMinimizer Unit Requirements -# -# PURPOSE: -# - Define requirements for the CrossingMinimizer unit -# - CrossingMinimizer orders the augmented nodes within each layer to reduce edge crossings -# - Requirements describe the observable layer grouping, not the barycenter sweep internals - -sections: - - title: CrossingMinimizer Unit Requirements - requirements: - - id: SysML2Tools-Core-Layout-Engine-Layered-CrossingMinimizer-LayerGrouping - title: >- - CrossingMinimizer shall group the augmented nodes into one ordered list per layer so that - every augmented node appears in exactly one layer group. - justification: | - Per-layer ordered groups are the structure that coordinate assignment and routing consume; - every node must be placed in exactly one layer to be positioned at all. - tests: - - CrossingMinimizer_Apply_TwoLayerGraph_GroupsNodesByLayer - - CrossingMinimizer_Apply_AllAugmentedNodesAppearInGroups - - - id: SysML2Tools-Core-Layout-Engine-Layered-CrossingMinimizer-CrossingReduction - title: >- - CrossingMinimizer shall order the nodes within each layer, via barycenter sweeps over the - augmented graph, so that the total number of edge crossings is reduced relative to the - natural (unordered) layer ordering. - justification: | - Reducing edge crossings is the whole purpose of the ordering stage: fewer crossings yield a - more readable diagram. A crossing-prone two-layer ordering whose barycenter sweep strictly - decreases the measured crossing count proves the stage actually reduces crossings rather - than merely regrouping the nodes. - tests: - - CrossingMinimizer_Apply_CrossingProneOrdering_ReducesCrossings diff --git a/docs/reqstream/sysml2-tools-core/layout/engine/layered/cycle-breaker.yaml b/docs/reqstream/sysml2-tools-core/layout/engine/layered/cycle-breaker.yaml deleted file mode 100644 index f4aedbbd..00000000 --- a/docs/reqstream/sysml2-tools-core/layout/engine/layered/cycle-breaker.yaml +++ /dev/null @@ -1,31 +0,0 @@ ---- -# CycleBreaker Unit Requirements -# -# PURPOSE: -# - Define requirements for the CycleBreaker unit -# - CycleBreaker reverses cycle-causing edges so later stages see an acyclic graph -# - Requirements describe the observable acyclic edge set, not the DFS internals - -sections: - - title: CycleBreaker Unit Requirements - requirements: - - id: SysML2Tools-Core-Layout-Engine-Layered-CycleBreaker-Acyclic - title: >- - CycleBreaker shall produce an edge set with no directed cycles by reversing the - cycle-causing back edges of the input graph. - justification: | - Longest-path layering requires a directed acyclic graph; reversing back edges removes - cycles while keeping every connection represented. - tests: - - CycleBreaker_Apply_GraphWithCycle_ProducesAcyclicEdgeSet - - Pipeline_MatchesLegacyOracle_OnNamedTopologies - - - id: SysML2Tools-Core-Layout-Engine-Layered-CycleBreaker-SelfLoopAndDuplicateRemoval - title: >- - CycleBreaker shall drop self-loops and collapse duplicate edges so the acyclic edge set - contains no self-loop and no repeated source-target pair. - justification: | - Self-loops and duplicate edges cannot be layered and would distort corridor sizing, so - they are removed before any geometry is computed. - tests: - - CycleBreaker_Apply_SelfLoopsAndDuplicates_AreRemoved diff --git a/docs/reqstream/sysml2-tools-core/layout/engine/layered/layer-assigner.yaml b/docs/reqstream/sysml2-tools-core/layout/engine/layered/layer-assigner.yaml deleted file mode 100644 index 84986031..00000000 --- a/docs/reqstream/sysml2-tools-core/layout/engine/layered/layer-assigner.yaml +++ /dev/null @@ -1,32 +0,0 @@ ---- -# LayerAssigner Unit Requirements -# -# PURPOSE: -# - Define requirements for the LayerAssigner unit -# - LayerAssigner assigns each node a longest-path layer index over the acyclic graph -# - Requirements describe the observable layer indices, not the topological-sort internals - -sections: - - title: LayerAssigner Unit Requirements - requirements: - - id: SysML2Tools-Core-Layout-Engine-Layered-LayerAssigner-LongestPath - title: >- - LayerAssigner shall assign each node a layer equal to the length of its longest incoming - path, so sources occupy layer zero and every edge runs from a lower to a higher layer. - justification: | - Longest-path layering guarantees no same-layer connections, eliminating the connector - clipping that a shallower layering would cause. - tests: - - LayerAssigner_Apply_LinearChain_AssignsMonotonicLayers - - LayerAssigner_Apply_DiamondGraph_AssignsLongestPathLayers - - - id: SysML2Tools-Core-Layout-Engine-Layered-LayerAssigner-Monotonic - title: >- - LayerAssigner shall assign strictly increasing layer indices along any directed chain of - the acyclic graph. - justification: | - Monotonic layer indices along a chain are the observable property that downstream - coordinate assignment relies on to place columns left to right. - tests: - - LayerAssigner_Apply_LinearChain_AssignsMonotonicLayers - - Pipeline_MatchesLegacyOracle_OnWorkstationLikeGraph diff --git a/docs/reqstream/sysml2-tools-core/layout/engine/layered/layered-graph.yaml b/docs/reqstream/sysml2-tools-core/layout/engine/layered/layered-graph.yaml deleted file mode 100644 index 6c78e058..00000000 --- a/docs/reqstream/sysml2-tools-core/layout/engine/layered/layered-graph.yaml +++ /dev/null @@ -1,31 +0,0 @@ ---- -# LayeredGraph Unit Requirements -# -# PURPOSE: -# - Define requirements for the LayeredGraph unit -# - LayeredGraph is the mutable shared state threaded through every layered pipeline stage -# - Requirements describe observable construction and validation behavior, not field internals - -sections: - - title: LayeredGraph Unit Requirements - requirements: - - id: SysML2Tools-Core-Layout-Engine-Layered-LayeredGraph-ArgumentValidation - title: >- - LayeredGraph shall reject a null node list or a null edge list at construction by - throwing an ArgumentNullException. - justification: | - Failing fast on null inputs prevents a later stage from dereferencing a missing - collection and producing a confusing downstream error. - tests: - - LayeredGraph_Constructor_NullNodes_ThrowsArgumentNullException - - LayeredGraph_Constructor_NullEdges_ThrowsArgumentNullException - - - id: SysML2Tools-Core-Layout-Engine-Layered-LayeredGraph-StateInitialization - title: >- - LayeredGraph shall expose the supplied nodes, edges, and direction unchanged and shall - report the input node count. - justification: | - Every stage reads the original nodes, edges, direction, and node count from the shared - state, so the constructor must preserve them exactly as supplied. - tests: - - LayeredGraph_Constructor_ValidInput_StoresNodesEdgesDirectionAndCount diff --git a/docs/reqstream/sysml2-tools-core/layout/engine/layered/layered-layout-pipeline.yaml b/docs/reqstream/sysml2-tools-core/layout/engine/layered/layered-layout-pipeline.yaml deleted file mode 100644 index 72034c70..00000000 --- a/docs/reqstream/sysml2-tools-core/layout/engine/layered/layered-layout-pipeline.yaml +++ /dev/null @@ -1,43 +0,0 @@ ---- -# LayeredLayoutPipeline Unit Requirements -# -# PURPOSE: -# - Define requirements for the LayeredLayoutPipeline unit -# - LayeredLayoutPipeline assembles and runs the ordered ELK-style layered stage sequence -# - This chapter also covers ILayoutStage, LayoutDirection, HierarchyHandling, LayeredLayoutMetrics -# - Requirements describe observable assembly and execution behavior, not stage internals - -sections: - - title: LayeredLayoutPipeline Unit Requirements - requirements: - - id: SysML2Tools-Core-Layout-Engine-Layered-LayeredLayoutPipeline-DefaultStageSequence - title: >- - LayeredLayoutPipeline shall assemble the default ELK-layered stage sequence through its - fluent builder and run every stage, in order, against the supplied graph. - justification: | - A single fluent assembly point with a fixed default order makes the pipeline easy to - construct correctly and guarantees stages observe their prerequisites' output. - tests: - - LayeredLayoutPipeline_RunDefaultStages_ChainGraph_PopulatesWaypointsWithoutThrowing - - Pipeline_MatchesLegacyOracle_OnNamedTopologies - - - id: SysML2Tools-Core-Layout-Engine-Layered-LayeredLayoutPipeline-RecursiveRejected - title: >- - LayeredLayoutPipeline shall reject a request to build a pipeline with recursive hierarchy - handling by throwing a NotSupportedException. - justification: | - Recursive hierarchy handling is reserved scaffolding; failing fast at build time prevents - producing an unverified layout from an unimplemented mode. - tests: - - LayeredLayoutPipeline_Build_RecursiveHierarchy_ThrowsNotSupportedException - - - id: SysML2Tools-Core-Layout-Engine-Layered-LayeredLayoutPipeline-ArgumentValidation - title: >- - LayeredLayoutPipeline shall reject a null stage when one is added and a null graph when - the pipeline is run by throwing an ArgumentNullException. - justification: | - Rejecting null inputs at the boundary keeps a configuration error from surfacing as an - obscure failure inside an individual stage. - tests: - - LayeredLayoutPipeline_AddStage_NullStage_ThrowsArgumentNullException - - LayeredLayoutPipeline_Run_NullGraph_ThrowsArgumentNullException diff --git a/docs/reqstream/sysml2-tools-core/layout/engine/layered/long-edge-joiner.yaml b/docs/reqstream/sysml2-tools-core/layout/engine/layered/long-edge-joiner.yaml deleted file mode 100644 index f9abbfb8..00000000 --- a/docs/reqstream/sysml2-tools-core/layout/engine/layered/long-edge-joiner.yaml +++ /dev/null @@ -1,32 +0,0 @@ ---- -# LongEdgeJoiner Unit Requirements -# -# PURPOSE: -# - Define requirements for the LongEdgeJoiner unit -# - LongEdgeJoiner concatenates sub-edge bend points into one polyline per original edge -# - Requirements describe the observable per-edge waypoints, not the sorting internals - -sections: - - title: LongEdgeJoiner Unit Requirements - requirements: - - id: SysML2Tools-Core-Layout-Engine-Layered-LongEdgeJoiner-WaypointPerEdge - title: >- - LongEdgeJoiner shall produce one orthogonal waypoint polyline per original edge, beginning - at the source node's right face and ending at the target node's left face. - justification: | - The view strategy emits one connector per original edge, so each edge must yield exactly - one polyline anchored to the boxes it connects. - tests: - - LongEdgeJoiner_Apply_SingleEdge_ProducesWaypointsPerOriginalEdge - - LongEdgeJoiner_Apply_LongEdge_ConcatenatesSubEdgeBendPoints - - - id: SysML2Tools-Core-Layout-Engine-Layered-LongEdgeJoiner-Concatenation - title: >- - LongEdgeJoiner shall assemble a long edge's polyline by concatenating, in source-to-target - layer order, the bend points of every sub-edge that the long edge was split into. - justification: | - A long edge is routed as a chain of sub-edges through dummy nodes; stitching their bend - points back together reconstructs the single connector the user sees. - tests: - - LongEdgeJoiner_Apply_LongEdge_ConcatenatesSubEdgeBendPoints - - Pipeline_MatchesLegacyOracle_OnNamedTopologies diff --git a/docs/reqstream/sysml2-tools-core/layout/engine/layered/long-edge-splitter.yaml b/docs/reqstream/sysml2-tools-core/layout/engine/layered/long-edge-splitter.yaml deleted file mode 100644 index b5d0c3c7..00000000 --- a/docs/reqstream/sysml2-tools-core/layout/engine/layered/long-edge-splitter.yaml +++ /dev/null @@ -1,31 +0,0 @@ ---- -# LongEdgeSplitter Unit Requirements -# -# PURPOSE: -# - Define requirements for the LongEdgeSplitter unit -# - LongEdgeSplitter splits multi-layer edges with one dummy node per intermediate layer -# - Requirements describe the observable augmented graph, not the chaining internals - -sections: - - title: LongEdgeSplitter Unit Requirements - requirements: - - id: SysML2Tools-Core-Layout-Engine-Layered-LongEdgeSplitter-DummyInsertion - title: >- - LongEdgeSplitter shall split every edge spanning more than one layer into a chain of - unit-span sub-edges by inserting one zero-size dummy node at each intermediate layer. - justification: | - Dummy nodes force long edges through the correct inter-layer corridors, preventing - connector lines from clipping the boxes of intermediate nodes. - tests: - - LongEdgeSplitter_Apply_LongEdge_InsertsDummyNodesPerIntermediateLayer - - Pipeline_MatchesLegacyOracle_OnNamedTopologies - - - id: SysML2Tools-Core-Layout-Engine-Layered-LongEdgeSplitter-UnitSpanPreserved - title: >- - LongEdgeSplitter shall leave unit-span edges unsplit so that a graph with no long edge - gains no dummy nodes. - justification: | - Splitting only long edges keeps the augmented graph minimal, so single-layer connections - are routed directly without unnecessary dummy nodes. - tests: - - LongEdgeSplitter_Apply_SpanOneEdge_AddsNoDummyNodes diff --git a/docs/reqstream/sysml2-tools-core/layout/engine/layered/orthogonal-router.yaml b/docs/reqstream/sysml2-tools-core/layout/engine/layered/orthogonal-router.yaml deleted file mode 100644 index 8ea9c534..00000000 --- a/docs/reqstream/sysml2-tools-core/layout/engine/layered/orthogonal-router.yaml +++ /dev/null @@ -1,55 +0,0 @@ ---- -# OrthogonalRouter Unit Requirements -# -# PURPOSE: -# - Define requirements for the OrthogonalRouter unit -# - OrthogonalRouter assigns routing slots and emits orthogonal bend points per corridor -# - Requirements describe the observable bend points, not the slot-dependency internals - -sections: - - title: OrthogonalRouter Unit Requirements - requirements: - - id: SysML2Tools-Core-Layout-Engine-Layered-OrthogonalRouter-OrthogonalBendPoints - title: >- - OrthogonalRouter shall route each sub-edge with axis-aligned geometry: a sub-edge whose - source and target ports share a Y receives no bend points, and any other sub-edge receives - a vertical bend segment whose two points share an X. - justification: | - Axis-aligned routing produces the clean orthogonal connectors the interconnection view - requires; emitting no bend points for an already-straight run keeps the path minimal. - tests: - - OrthogonalRouter_Apply_StraightEdge_ProducesNoBendPoints - - OrthogonalRouter_Apply_EveryBendListIsEmptyOrVerticalSegment - - - id: SysML2Tools-Core-Layout-Engine-Layered-OrthogonalRouter-SlotRouting - title: >- - OrthogonalRouter shall assign a routing slot to each bending sub-edge in a corridor so - that the bend segment is offset from the source column by the slot position. - justification: | - Distinct routing slots keep the vertical runs of different connectors from overlapping - within a corridor, which is required for the connectors to remain distinguishable. - tests: - - OrthogonalRouter_Apply_EveryBendListIsEmptyOrVerticalSegment - - Pipeline_MatchesLegacyOracle_OnRandomGraphs - - - id: SysML2Tools-Core-Layout-Engine-Layered-OrthogonalRouter-ReversedEdgeApproach - title: >- - OrthogonalRouter shall ensure a reversed (back) edge's entry approach into the target face - is at least the graph's BackEdgeEntryApproach (default ConnectorClearance), while leaving - forward and acyclic edge geometry unchanged. - justification: | - A reversed edge is stored flipped, so the end marker (an open chevron) lands on its - augmented-source stub; at the default slot that stub is shorter than the marker, which - renders as a stubby entry. Guaranteeing a minimum approach makes the end marker read as a - clean perpendicular entry, and clamping outward only (never inward) keeps every forward and - acyclic connector byte-identical. The approach is supplied through the - LayeredGraph.BackEdgeEntryApproach parameter, which defaults to ConnectorClearance so the - unmodified engine is reproduced byte-for-byte; a decoration-aware caller (the - state-transition view) raises it to clear the end-marker along-line length. - tests: - - OrthogonalRouter_DefaultApproach_IsByteIdenticalToLegacy - - OrthogonalRouter_ReversedEdge_DefaultApproachClearsClearance - - OrthogonalRouter_CustomApproach_PushesEntryStubOutward - - OrthogonalRouter_DecorationAwareApproach_ClearsMarkerAlongLength - - OrthogonalRouter_ForwardEdges_GeometryUnchanged - - OrthogonalRouter_AcyclicGraph_NoApproachChange diff --git a/docs/reqstream/sysml2-tools-core/layout/engine/layered/port-distributor.yaml b/docs/reqstream/sysml2-tools-core/layout/engine/layered/port-distributor.yaml deleted file mode 100644 index 06efcc35..00000000 --- a/docs/reqstream/sysml2-tools-core/layout/engine/layered/port-distributor.yaml +++ /dev/null @@ -1,31 +0,0 @@ ---- -# PortDistributor Unit Requirements -# -# PURPOSE: -# - Define requirements for the PortDistributor unit -# - PortDistributor distributes connector ports along each box face -# - Requirements describe the observable port Y coordinates, not the distribution internals - -sections: - - title: PortDistributor Unit Requirements - requirements: - - id: SysML2Tools-Core-Layout-Engine-Layered-PortDistributor-PortPerSubEdge - title: >- - PortDistributor shall record a source-side and a target-side port Y coordinate for every - augmented sub-edge. - justification: | - Routing and waypoint assembly read one source port and one target port per sub-edge, so a - coordinate must be produced for each. - tests: - - PortDistributor_Apply_AssignsPortYForEverySubEdge - - - id: SysML2Tools-Core-Layout-Engine-Layered-PortDistributor-PortsWithinFace - title: >- - PortDistributor shall place each connector port within the face of the node it belongs to, - inset from the node's top and bottom edges. - justification: | - Ports that fall outside a node's face would detach a connector from its box; clamping each - port within the inset face keeps every connection visually attached. - tests: - - PortDistributor_Apply_SingleEdge_PortsLieWithinNodeFaces - - Pipeline_MatchesLegacyOracle_OnWorkstationLikeGraph diff --git a/docs/reqstream/sysml2-tools-core/layout/internal/general-view-layout-strategy.yaml b/docs/reqstream/sysml2-tools-core/layout/internal/general-view-layout-strategy.yaml index fa06a7e5..8a9567aa 100644 --- a/docs/reqstream/sysml2-tools-core/layout/internal/general-view-layout-strategy.yaml +++ b/docs/reqstream/sysml2-tools-core/layout/internal/general-view-layout-strategy.yaml @@ -132,11 +132,12 @@ sections: - id: SysML2Tools-Core-Layout-Internal-GeneralViewLayoutStrategy-LayeredPlacement title: >- - GeneralViewLayoutStrategy shall place definitions with the layered pipeline so that no two + GeneralViewLayoutStrategy shall place definitions through LayeredPlacement so that no two definition boxes overlap and every package folder stays clear of the others. justification: | - Delegating placement to the reusable layered pipeline (with a ComponentPacker stage) gives - the General view ELK-style box placement and orthogonal edge routing. The observable + Delegating placement through LayeredPlacement to the off-the-shelf + DemaConsulting.Rendering.Layout layered algorithm gives the General View ELK-style box + placement and orthogonal edge routing. The observable guarantee that matters to readers is that boxes and folders never overlap, regardless of model size or density, so the diagram stays legible without manual layout hints. tests: diff --git a/docs/reqstream/sysml2-tools-core/layout/internal/layered-placement.yaml b/docs/reqstream/sysml2-tools-core/layout/internal/layered-placement.yaml new file mode 100644 index 00000000..05abbf19 --- /dev/null +++ b/docs/reqstream/sysml2-tools-core/layout/internal/layered-placement.yaml @@ -0,0 +1,85 @@ +--- +# LayeredPlacement Unit Requirements +# +# PURPOSE: +# - Define requirements for the LayeredPlacement helper unit +# - LayeredPlacement adapts the DemaConsulting.Rendering.Layout OTS layered algorithm to the +# SysML view layout strategies, returning placed rectangles and routed connector polylines +# - Requirements describe the observable placement contract the strategies rely on +# - LayeredPlacement is exercised indirectly through the view layout strategy tests, which are +# the closest passing evidence for each requirement + +sections: + - title: LayeredPlacement Unit Requirements + requirements: + - id: SysML2Tools-Core-Layout-Internal-LayeredPlacement-Adapt + title: >- + LayeredPlacement shall place sized nodes and directed edges by delegating to the + DemaConsulting.Rendering.Layout layered algorithm, returning a placed rectangle for + each node and a routed orthogonal polyline for each edge. + justification: | + The SysML view layout strategies no longer own a geometric layout engine; they depend + on LayeredPlacement to run the reusable off-the-shelf layered algorithm and hand back + plain rectangles and connector polylines they can map onto their own model. Strategy + layouts that emit placed boxes together with routed connector lines are the observable + evidence that the adapter drove the algorithm correctly. + tests: + - ActionFlowView_BuildLayout_ActionsAndSuccessions_ProducesBoxesMarkersAndFlows + - StateTransitionView_BuildLayout_StatesAndTransitions_ProducesBoxesBadgeAndLines + - InterconnectionView_BuildLayout_PartsAndConnections_ProducesBoxesPortsAndLines + + - id: SysML2Tools-Core-Layout-Internal-LayeredPlacement-NodeOrder + title: >- + LayeredPlacement shall return exactly one placed rectangle per input node, in the + caller's input-node order, and shall position the rectangles so that they do not + overlap. + justification: | + The strategies map each returned rectangle back to its model element by index, so the + result must preserve the caller's node ordering and count. Non-overlapping placement is + the observable geometric property that keeps the resulting diagrams readable. + tests: + - InterconnectionView_BuildLayout_PartBoxes_DoNotOverlap + - ActionFlowView_BuildLayout_NoOverlap + + - id: SysML2Tools-Core-Layout-Internal-LayeredPlacement-EdgeOrder + title: >- + LayeredPlacement shall return exactly one routed polyline per input edge, in the + caller's input-edge order. + justification: | + The strategies map each routed polyline back to its succession, transition, or + connection by index, so the result must preserve the caller's edge ordering and count. + A strategy that draws one connector line per model edge is the observable evidence. + tests: + - ActionFlowView_BuildLayout_ActionsAndSuccessions_ProducesBoxesMarkersAndFlows + - InterconnectionView_BuildLayout_PartsAndConnections_ProducesBoxesPortsAndLines + + - id: SysML2Tools-Core-Layout-Internal-LayeredPlacement-Orientation + title: >- + LayeredPlacement shall orient every returned polyline from its source node to its + target node, reversing internally routed back edges so the caller always receives a + source-to-target path. + justification: | + Callers attach a directional end marker to the target end of each connector, so a + polyline that ran target-to-source would place the arrowhead on the wrong box. + Guaranteeing source-to-target orientation lets the strategies attach markers without + re-checking direction. Cyclic inputs whose connectors still terminate correctly are the + observable evidence that back-edge reversal is handled. + tests: + - ActionFlowView_BuildLayout_SuccessionEdge_IsDashedWithOpenArrowhead + - StateTransitionView_BuildLayout_TransitionEdge_HasOpenArrowhead + - ActionFlowView_BuildLayout_Cycle_IsBroken + + - id: SysML2Tools-Core-Layout-Internal-LayeredPlacement-Direction + title: >- + LayeredPlacement shall honor the caller's requested flow direction, placing the target + of a directed edge downstream of its source along that direction. + justification: | + The action-flow and state-transition strategies request a top-to-bottom direction so + the diagram reads downward, while the general and interconnection strategies request a + left-to-right direction. Honoring the requested direction is what makes the strategies' + reading order come out correct, so a forward chain that flows top-to-bottom is the + observable evidence. + tests: + - ActionFlowView_BuildLayout_ForwardChain_FlowsTopToBottomOrthogonally + - StateTransitionView_BuildLayout_ForwardChain_FlowsTopToBottomOrthogonally + - ActionFlowView_BuildLayout_Successions_FlowTopToBottom diff --git a/docs/reqstream/sysml2-tools-core/layout/layout-tree.yaml b/docs/reqstream/sysml2-tools-core/layout/layout-tree.yaml deleted file mode 100644 index e5a2ad2a..00000000 --- a/docs/reqstream/sysml2-tools-core/layout/layout-tree.yaml +++ /dev/null @@ -1,59 +0,0 @@ ---- -# LayoutTree Unit Requirements (grouped data-model unit) -# -# PURPOSE: -# - Define requirements for the LayoutTree data-model unit -# - This unit groups the ten immutable LayoutTree record source files (LayoutTree, LayoutBox, -# LayoutNode, LayoutPort, LayoutLine, LayoutLabel, LayoutBadge, LayoutBand, LayoutGrid, -# LayoutLifeline) that together form the intermediate representation consumed by every renderer -# - The per-record contracts are described in the Layout Subsystem chapter; these unit requirements -# summarize the grouped data-model invariants -# - Unit requirements decompose the Layout subsystem requirements into this unit's responsibility - -sections: - - title: LayoutTree Unit Requirements - requirements: - - id: SysML2Tools-Core-Layout-LayoutTree-RecordFamily - title: >- - The LayoutTree data-model unit shall provide the immutable record family — LayoutTree and - its LayoutNode-derived node types (LayoutBox, LayoutPort, LayoutLine, LayoutLabel, - LayoutBadge, LayoutBand, LayoutLifeline, LayoutActivation, LayoutGrid) with their nested - value types — each storing its constructor arguments unchanged. - justification: | - A single immutable record family is the shared vocabulary between every layout strategy and - every renderer. Storing constructor arguments unchanged keeps the tree a faithful, - re-renderable description of one diagram view. - tests: - - LayoutTree_Construction_StoresWidthHeightNodes - - LayoutBox_Construction_StoresAllFields - - LayoutPort_Construction_StoresAllFields - - LayoutLine_Construction_StoresAllFields - - LayoutLabel_Construction_StoresAllFields - - LayoutBadge_Construction_StoresAllFields - - LayoutBand_Construction_StoresAllFields - - LayoutLifeline_Construction_StoresAllFields - - LayoutActivation_Construction_StoresAllFields - - LayoutGrid_Construction_StoresAllFields - - - id: SysML2Tools-Core-Layout-LayoutTree-AbsoluteCoordinates - title: >- - All coordinate fields of the LayoutTree record family shall store absolute canvas - coordinates without applying any transform, so each node can be drawn independently. - justification: | - Absolute coordinates free renderers from maintaining a transform stack; every node draws - the same way regardless of its ancestors. - tests: - - LayoutBox_Coordinates_AreAbsolute - - LayoutPort_Coordinates_AreAbsolute - - LayoutLine_Waypoints_AreAbsolute - - - id: SysML2Tools-Core-Layout-LayoutTree-DepthAndHierarchy - title: >- - LayoutBox shall carry an integer Depth field (with no color field) and shall express - spatial nesting through its Children list of heterogeneous LayoutNode instances. - justification: | - Storing depth as an integer keeps the tree theme-independent — the renderer maps depth to a - fill color — while a Children list expresses containment without a parent back-reference. - tests: - - LayoutBox_Depth_IsInteger - - LayoutBox_Children_ContainsNestedNodes diff --git a/docs/reqstream/sysml2-tools-core/rendering.yaml b/docs/reqstream/sysml2-tools-core/rendering.yaml index 0ecd3e65..5fc9252a 100644 --- a/docs/reqstream/sysml2-tools-core/rendering.yaml +++ b/docs/reqstream/sysml2-tools-core/rendering.yaml @@ -3,8 +3,11 @@ # # PURPOSE: # - Define requirements for the SysML2Tools Rendering subsystem -# - IRenderer, ILayoutStrategy, Theme, RenderOptions, and DiagramRenderer define the -# rendering pipeline interfaces +# - The IRenderer, Theme, RenderOptions, and RenderOutput contracts are provided off-the-shelf by +# the DemaConsulting.Rendering.Abstractions package; SysML2Tools consumes them and verifies its +# integration with them through its own tests +# - ILayoutStrategy and DiagramRenderer are the SysML-coupled rendering pipeline that remains in +# this subsystem # - Requirements describe observable rendering behavior, not internal rendering algorithms sections: @@ -56,18 +59,6 @@ sections: - Themes_Light_IsInitialized - Themes_Dark_IsInitialized - Themes_Print_IsInitialized - - Themes_HaveExpectedConnectorGeometry - - - id: SysML2Tools-Core-Rendering-ThemeApproachZone - title: >- - A theme shall define a connector approach zone — the clear distance a connector - needs off a box face before bending — equal to the sum of its connector stub - length, bend radius, and the supplied connector clearance. - justification: | - The approach zone is the clear distance a connector needs off a box face before bending; - deriving it from the theme keeps connector geometry consistent across layout and routing. - tests: - - ConnectorApproachZone_SumsStubBendAndClearance - id: SysML2Tools-Core-Rendering-ThemeDepthWrap title: >- diff --git a/docs/reqstream/sysml2-tools-core/rendering/notation-metrics.yaml b/docs/reqstream/sysml2-tools-core/rendering/notation-metrics.yaml deleted file mode 100644 index 13b45c59..00000000 --- a/docs/reqstream/sysml2-tools-core/rendering/notation-metrics.yaml +++ /dev/null @@ -1,80 +0,0 @@ ---- -# NotationMetrics Unit Requirements -# -# PURPOSE: -# - Define requirements for the NotationMetrics unit -# - NotationMetrics is the single home for intrinsic, theme-independent notation geometry -# shared by the SVG and PNG renderers -# - Requirements describe the pinned notation values and the shapes derived from them -# - Unit requirements decompose the Rendering subsystem requirements into this unit's responsibility - -sections: - - title: NotationMetrics Unit Requirements - requirements: - - id: SysML2Tools-Core-Rendering-NotationMetrics-CanonicalConstants - title: >- - NotationMetrics shall expose the canonical end-marker, port, and label-background - notation constants (triangle 10x7 refX 9, diamond 14x8 refX 13, circle radius 4, - bar 4x12, crossbar fraction 0.7, and the symmetric label-background inset) as named - values. - justification: | - Centralizing every intrinsic notation literal as a single named constant guarantees that - the SVG marker and the PNG path describe the identical shape and that no geometry literal - is duplicated across the rendering path. - tests: - - TriangleFamily_HasCanonicalValues - - Diamond_HasCanonicalValues - - CircleAndBar_HaveCanonicalValues - - Crossbar_IsDerivedFraction - - LabelBackground_ExtentMatchesInset - - - id: SysML2Tools-Core-Rendering-NotationMetrics-MarkerVertices - title: >- - NotationMetrics shall provide the triangle and diamond marker vertices in tip-relative - notation units so that the triangle apex overshoots the line endpoint and the diamond far - point lands exactly on the endpoint. - justification: | - Sharing one vertex source for both renderers keeps the marker outlines pixel-identical and - anchors each marker to the line endpoint the same way regardless of output format. - tests: - - TriangleVertices_ReproduceSvgBoxPoints - - DiamondVertices_ReproduceSvgBoxPoints - - DiamondVertices_FarPoint_LandsOnEndpoint - - TriangleVertices_Apex_OvershootsEndpoint - - - id: SysML2Tools-Core-Rendering-NotationMetrics-AlongLineLength - title: >- - NotationMetrics shall report the along-line length consumed by each end-marker style, - returning zero for the None style. - justification: | - The layout strategies reserve a clean approach for the marker and the renderers clamp the - final corner radius, so both need one authoritative length per marker style. - tests: - - AlongLineLength_MatchesMarkerBox - - - id: SysML2Tools-Core-Rendering-NotationMetrics-RoundedRectRadius - title: >- - NotationMetrics shall compute a box's rounded-rectangle corner radius as the theme - line-corner radius scaled by the documented rounded-rectangle factor. - justification: | - Deriving the corner radius from the theme keeps rounded boxes consistent across renderers - while leaving the base radius a single theme-controlled value. - tests: - - RoundedRectRadius_IsThemeRadiusTimesFactor - - - id: SysML2Tools-Core-Rendering-NotationMetrics-DecorationConstants - title: >- - NotationMetrics shall expose the port-square, folder-tab, note dog-ear fold, and badge - fraction constants (port full size twice its half-size, folder-tab max-width fraction 0.45, - folder-tab min width 60, folder label char-width factor 0.55, note-fold fraction 0.25 and - maximum 16, bullseye inner-radius fraction 1/3, and bar-badge half-length fraction 0.8) as - named values. - justification: | - Ports, folder tabs, note dog-ears, and badges are drawn identically by the SVG and PNG - renderers, so every proportion they share must be a single named constant rather than a - literal duplicated across the two rendering paths. - tests: - - Port_SizeIsTwiceHalfSize - - FolderTab_HasDocumentedConstants - - NoteFold_HasDocumentedConstants - - BadgeFractions_HaveDocumentedValues diff --git a/docs/reqstream/sysml2-tools-core/rendering/rendering-contracts.yaml b/docs/reqstream/sysml2-tools-core/rendering/rendering-contracts.yaml deleted file mode 100644 index a15ab285..00000000 --- a/docs/reqstream/sysml2-tools-core/rendering/rendering-contracts.yaml +++ /dev/null @@ -1,74 +0,0 @@ ---- -# RenderingContracts Unit Requirements (grouped contracts unit) -# -# PURPOSE: -# - Define requirements for the RenderingContracts data-model/interface unit -# - This unit groups the small cohesive contract source files that define the rendering pipeline: -# IRenderer, ILayoutStrategy, RenderOptions, RenderOutput, and the internal StdlibFilter helper -# - The per-type contracts are described in the Rendering Subsystem chapter; these unit requirements -# summarize the grouped contract behaviors that the unit tests pin -# - Unit requirements decompose the Rendering subsystem requirements into this unit's responsibility - -sections: - - title: RenderingContracts Unit Requirements - requirements: - - id: SysML2Tools-Core-Rendering-RenderingContracts-IRenderer - title: >- - The IRenderer contract shall expose a MediaType, a DefaultExtension, and a Render method - that writes a LayoutTree to an output stream, and its implementations shall write valid - format-specific bytes for an empty tree. - justification: | - A common IRenderer contract lets the orchestrator and the CLI treat every renderer - uniformly. Proving the shipped SVG and PNG implementations honor the media type, extension, - and byte format confirms the contract is usable. - tests: - - SvgRenderer_MediaType_IsImageSvgXml - - SvgRenderer_DefaultExtension_IsDotSvg - - SvgRenderer_Render_EmptyTree_WritesValidSvg - - PngRenderer_MediaType_IsImagePng - - PngRenderer_DefaultExtension_IsDotPng - - PngRenderer_Render_EmptyTree_WritesPngBytes - - - id: SysML2Tools-Core-Rendering-RenderingContracts-ILayoutStrategy - title: >- - The ILayoutStrategy contract shall accept a ViewContext (carrying the view name and the - workspace) and RenderOptions and produce a LayoutTree, and ViewContext shall store its - fields unchanged. - justification: | - Separating layout computation from rendering behind ILayoutStrategy lets any strategy feed - any renderer. The ViewContext record is the immutable input carrier for that contract. - tests: - - ViewContext_Construction_StoresAllFields - - - id: SysML2Tools-Core-Rendering-RenderingContracts-RenderOptions - title: >- - The RenderOptions record shall carry a Theme and default a Scale of 1.0, a Dpi of 96, and a - DepthLimit of 0 (unlimited). - justification: | - Bundling all render parameters in one record with conventional defaults keeps calls simple - and makes the unlimited-depth sentinel explicit. - tests: - - RenderOptions_DefaultScale_IsOne - - RenderOptions_DefaultDpi_Is96 - - RenderOptions_DefaultDepthLimit_IsZero - - - id: SysML2Tools-Core-Rendering-RenderingContracts-RenderOutput - title: >- - The RenderOutput record shall carry a SuggestedFileName, a MediaType, and a Data stream, - storing each field unchanged. - justification: | - RenderOutput decouples the renderer from filesystem decisions; the caller receives a - suggested name and media type alongside the data stream and writes it wherever it chooses. - tests: - - RenderOutput_Construction_StoresAllFields - - - id: SysML2Tools-Core-Rendering-RenderingContracts-StdlibFilter - title: >- - The StdlibFilter helper shall identify standard-library elements by qualified name so that - the orchestrator excludes stdlib view declarations from user-facing diagram output. - justification: | - Rendering the embedded standard library would flood diagrams with library noise. Filtering - stdlib qualified names keeps output limited to user-authored views, as proven by the - integration render of a user model that renders only its own views. - tests: - - DiagramRenderer_RenderWorkspace_SoftwareStructureModel_ReturnsSvgOutput diff --git a/docs/reqstream/sysml2-tools-core/rendering/theme.yaml b/docs/reqstream/sysml2-tools-core/rendering/theme.yaml deleted file mode 100644 index 2dfefa48..00000000 --- a/docs/reqstream/sysml2-tools-core/rendering/theme.yaml +++ /dev/null @@ -1,33 +0,0 @@ ---- -# Theme Unit Requirements -# -# PURPOSE: -# - Define requirements for the Theme unit -# - Theme is the immutable visual-configuration record plus the built-in Themes provider -# - Requirements describe the unit-level connector-geometry contract and the derived helper -# - Unit requirements decompose the Rendering subsystem Theme responsibility into this unit - -sections: - - title: Theme Unit Requirements - requirements: - - id: SysML2Tools-Core-Rendering-Theme-ConnectorApproachZone - title: >- - The Theme shall provide a ConnectorApproachZone helper returning the sum of its - ConnectorStub, its BendRadius, and the caller-supplied connector clearance. - justification: | - The approach zone is the clear distance a connector needs off a box face before it can - bend. Deriving it from the theme keeps connector geometry consistent between the layout - strategies that reserve the space and the renderers that draw the elbow. - tests: - - ConnectorApproachZone_SumsStubBendAndClearance - - - id: SysML2Tools-Core-Rendering-Theme-ConnectorGeometry - title: >- - The built-in Light and Dark themes shall carry identical connector geometry (ConnectorStub - and BendRadius) and the Print theme shall carry a tighter, zero-bend connector geometry. - justification: | - Screen themes share the same connector look, while the print theme squares off its elbows - and reduces the stub so black-and-white output stays crisp. Pinning these values keeps the - three shipped themes coherent. - tests: - - Themes_HaveExpectedConnectorGeometry diff --git a/docs/reqstream/sysml2-tools-png.yaml b/docs/reqstream/sysml2-tools-png.yaml deleted file mode 100644 index 123d4bc5..00000000 --- a/docs/reqstream/sysml2-tools-png.yaml +++ /dev/null @@ -1,31 +0,0 @@ ---- -# SysML2Tools PNG Renderer System-Level Requirements -# -# PURPOSE: -# - Define system-level requirements for the DemaConsulting.SysML2Tools.Png system -# - System requirements are generic: they describe WHAT the PNG system delivers -# - Each system requirement decomposes downward (children) into the PngRenderer unit -# requirements that provide the detailed rendering behaviour -# - System requirements are verified by system-level rendering integration tests - -sections: - - title: SysML2ToolsPng Requirements - requirements: - - id: SysML2Tools-Png-WritePngImage - title: >- - The PNG system shall render a laid-out diagram to a valid PNG image that - represents the diagram's elements. - justification: | - Producing PNG output lets rendered diagrams be embedded in documents and web - pages that require a raster image rather than vector graphics. - children: - - SysML2Tools-Png-PngRenderer-ImplementsIRenderer - - SysML2Tools-Png-PngRenderer-RenderImage - - SysML2Tools-Png-PngRenderer-RenderBox - - SysML2Tools-Png-PngRenderer-RenderLabel - - SysML2Tools-Png-PngRenderer-RenderLine - - SysML2Tools-Png-PngRenderer-RenderNodeKinds - - SysML2Tools-Png-PngRenderer-EndMarkers - tests: - - DiagramRenderer_RenderWorkspace_SoftwareStructureModel_PngRenderer_ReturnsPngOutput - - DiagramRenderer_RenderWorkspace_GeneralViewModel_PngProducesValidOutput diff --git a/docs/reqstream/sysml2-tools-png/png-renderer.yaml b/docs/reqstream/sysml2-tools-png/png-renderer.yaml deleted file mode 100644 index a2b9b7cf..00000000 --- a/docs/reqstream/sysml2-tools-png/png-renderer.yaml +++ /dev/null @@ -1,95 +0,0 @@ ---- -# PngRenderer Unit Requirements -# -# PURPOSE: -# - Define unit-level requirements for the PngRenderer class, the single unit of the -# DemaConsulting.SysML2Tools.Png system -# - These requirements decompose the PNG system requirement into the specific, -# observable rendering behaviour of the PngRenderer unit -# - Each requirement is verified by PngRenderer unit tests - -sections: - - title: PngRenderer Unit Requirements - requirements: - - id: SysML2Tools-Png-PngRenderer-ImplementsIRenderer - title: >- - PngRenderer shall implement the IRenderer interface, reporting the "image/png" - media type and the ".png" default file extension. - justification: | - Implementing the shared renderer interface lets the diagram renderer select PNG - output uniformly, and the media type and extension let callers name and serve - the output correctly. - tests: - - PngRenderer_MediaType_IsImagePng - - PngRenderer_DefaultExtension_IsDotPng - - - id: SysML2Tools-Png-PngRenderer-RenderImage - title: >- - PngRenderer shall write a valid PNG image, beginning with the PNG signature and - on a white background, for any layout tree, including an empty one. - justification: | - The PNG signature confirms a decodable image, and a consistent white background - gives every diagram a predictable appearance. - tests: - - PngRenderer_Render_EmptyTree_WritesPngBytes - - PngRenderer_Render_EmptyTree_WritesPngSignature - - PngRenderer_Render_BackgroundIsWhite - - - id: SysML2Tools-Png-PngRenderer-RenderBox - title: >- - PngRenderer shall rasterize each box node as a filled, stroked rectangle whose - fill follows the theme depth colours, including deeply nested boxes. - justification: | - Boxes are the primary diagram element; depth-based fill conveys nesting, and - deep nesting must not exhaust resources. - tests: - - PngRenderer_Render_SingleBox_ProducesNonEmptyOutput - - PngRenderer_Render_SingleBox_FillColorMatchesTheme - - PngRenderer_Render_SingleBox_DepthOneUsesSecondColor - - PngRenderer_Render_DeeplyNestedBoxes_DoesNotStackOverflow - - - id: SysML2Tools-Png-PngRenderer-RenderLabel - title: >- - PngRenderer shall rasterize label text, producing valid output even when the - text contains XML-special characters. - justification: | - Labels carry element names and typing; the renderer must handle any model text - without failing. - tests: - - PngRenderer_Render_LabelWithXmlSpecialCharacters_ProducesValidPng - - - id: SysML2Tools-Png-PngRenderer-RenderLine - title: >- - PngRenderer shall rasterize each connector line in the theme stroke colour. - justification: | - Connectors express relationships; drawing them in the stroke colour makes the - routing visible in the raster image. - tests: - - PngRenderer_Render_SingleLine_PixelOnLineIsStrokeColor - - - id: SysML2Tools-Png-PngRenderer-RenderNodeKinds - title: >- - PngRenderer shall rasterize port, badge, band, lifeline, activation, and grid - nodes with their notation-appropriate colours. - justification: | - The layout tree carries the full range of SysML node kinds; each must be drawn - so every view type renders completely. - tests: - - PngRenderer_Render_SinglePort_CenterPixelIsStrokeColor - - PngRenderer_Render_SingleBadge_FilledCircle_CenterPixelIsStrokeColor - - PngRenderer_Render_SingleLifeline_StemPixelIsStrokeColor - - PngRenderer_Render_SingleActivation_CenterPixelIsWhite - - PngRenderer_Render_SingleGrid_HeaderFillMatchesTheme - - - id: SysML2Tools-Png-PngRenderer-EndMarkers - title: >- - PngRenderer shall rasterize connector end markers whose geometry derives from - the shared notation metrics. - justification: | - End markers express relationship direction and kind; deriving their geometry - from the shared notation metrics keeps the PNG and SVG markers identical. - tests: - - PngRenderer_Render_DrawArrowhead_OpenWithCrossbar_ProducesNonEmptyOutput - - FilledArrow_AlongLength_MatchesNotationMetrics - - FilledArrow_BaseWidth_MatchesNotationMetrics - - OpenChevron_HasFewerInkPixelsThanClosedTriangle diff --git a/docs/reqstream/sysml2-tools-svg.yaml b/docs/reqstream/sysml2-tools-svg.yaml deleted file mode 100644 index c205ee96..00000000 --- a/docs/reqstream/sysml2-tools-svg.yaml +++ /dev/null @@ -1,31 +0,0 @@ ---- -# SysML2Tools SVG Renderer System-Level Requirements -# -# PURPOSE: -# - Define system-level requirements for the DemaConsulting.SysML2Tools.Svg system -# - System requirements are generic: they describe WHAT the SVG system delivers -# - Each system requirement decomposes downward (children) into the SvgRenderer unit -# requirements that provide the detailed rendering behaviour -# - System requirements are verified by system-level rendering integration tests - -sections: - - title: SysML2ToolsSvg Requirements - requirements: - - id: SysML2Tools-Svg-WriteSvgDocument - title: >- - The SVG system shall render a laid-out diagram to a valid SVG document that - represents the diagram's elements. - justification: | - Producing SVG output lets rendered diagrams be embedded in architecture - documentation, viewed in any web browser, and version-controlled as text. - children: - - SysML2Tools-Svg-SvgRenderer-ImplementsIRenderer - - SysML2Tools-Svg-SvgRenderer-RenderDocument - - SysML2Tools-Svg-SvgRenderer-RenderBox - - SysML2Tools-Svg-SvgRenderer-RenderLabel - - SysML2Tools-Svg-SvgRenderer-RenderLine - - SysML2Tools-Svg-SvgRenderer-RenderNodeKinds - - SysML2Tools-Svg-SvgRenderer-EndMarkers - tests: - - DiagramRenderer_RenderWorkspace_SoftwareStructureModel_ReturnsSvgOutput - - DiagramRenderer_RenderWorkspace_GeneralViewModel_SvgContainsElementNames diff --git a/docs/reqstream/sysml2-tools-svg/svg-renderer.yaml b/docs/reqstream/sysml2-tools-svg/svg-renderer.yaml deleted file mode 100644 index e6da6bc5..00000000 --- a/docs/reqstream/sysml2-tools-svg/svg-renderer.yaml +++ /dev/null @@ -1,105 +0,0 @@ ---- -# SvgRenderer Unit Requirements -# -# PURPOSE: -# - Define unit-level requirements for the SvgRenderer class, the single unit of the -# DemaConsulting.SysML2Tools.Svg system -# - These requirements decompose the SVG system requirement into the specific, -# observable rendering behaviour of the SvgRenderer unit -# - Each requirement is verified by SvgRenderer unit tests - -sections: - - title: SvgRenderer Unit Requirements - requirements: - - id: SysML2Tools-Svg-SvgRenderer-ImplementsIRenderer - title: >- - SvgRenderer shall implement the IRenderer interface, reporting the - "image/svg+xml" media type and the ".svg" default file extension. - justification: | - Implementing the shared renderer interface lets the diagram renderer select - SVG output uniformly, and the media type and extension let callers name and - serve the output correctly. - tests: - - SvgRenderer_MediaType_IsImageSvgXml - - SvgRenderer_DefaultExtension_IsDotSvg - - - id: SysML2Tools-Svg-SvgRenderer-RenderDocument - title: >- - SvgRenderer shall write a well-formed SVG 1.1 document containing the root - svg element for any layout tree, including an empty one. - justification: | - A well-formed root document is required by every SVG viewer and is the - container for all rendered diagram content. - tests: - - SvgRenderer_Render_EmptyTree_ProducesSvgDocument - - - id: SysML2Tools-Svg-SvgRenderer-RenderBox - title: >- - SvgRenderer shall render each box node as a rect element, honouring rounded - corners and drawing its text compartments. - justification: | - Boxes are the primary diagram element; rounded corners and compartments convey - the SysML notation for definitions and usages. - tests: - - SvgRenderer_Render_SingleBox_ProducesRectElement - - SvgRenderer_Render_BoxRoundedRectangle_ProducesRxAttribute - - SvgRenderer_Render_BoxWithCompartment_ProducesLineAndText - - - id: SysML2Tools-Svg-SvgRenderer-RenderLabel - title: >- - SvgRenderer shall render each label node as a text element, applying bold and - italic styling and escaping XML-special characters. - justification: | - Labels carry element names and typing; correct styling conveys emphasis, and - escaping keeps the document well-formed for any model text. - tests: - - SvgRenderer_Render_SingleLabel_ProducesTextElement - - SvgRenderer_Render_LabelWithBold_ProducesBoldAttribute - - SvgRenderer_Render_LabelWithItalic_ProducesItalicAttribute - - SvgRenderer_Render_LabelWithXmlSpecialCharacters_ProducesWellFormedEscapedSvg - - - id: SysML2Tools-Svg-SvgRenderer-RenderLine - title: >- - SvgRenderer shall render each connector line as a path element, honouring - rounded corners, dashed styling, and midpoint labels. - justification: | - Connectors express relationships; corner, dash, and label handling convey the - connector's routing and semantics. - tests: - - SvgRenderer_Render_SingleLine_ProducesPathElement - - SvgRenderer_Render_SingleLine_WithCornerRadius_ProducesArcInPath - - SvgRenderer_Render_SingleLine_Dashed_ProducesDashArray - - SvgRenderer_Render_LineWithMidpointLabel_ProducesTextElement - - - id: SysML2Tools-Svg-SvgRenderer-RenderNodeKinds - title: >- - SvgRenderer shall render port, badge, band, lifeline, activation, and grid - nodes with their notation-appropriate SVG elements. - justification: | - The layout tree carries the full range of SysML node kinds; each must be drawn - so every view type renders completely. - tests: - - SvgRenderer_Render_SinglePort_ProducesRect - - SvgRenderer_Render_SingleBadge_FilledCircle_ProducesCircle - - SvgRenderer_Render_SingleBand_ProducesRect - - SvgRenderer_Render_SingleLifeline_ProducesRectAndLine - - SvgRenderer_Render_SingleActivation_ProducesRect - - SvgRenderer_Render_SingleGrid_ProducesRects - - - id: SysML2Tools-Svg-SvgRenderer-EndMarkers - title: >- - SvgRenderer shall emit connector end markers - open chevron, hollow triangle, - diamond, and crossbar variants - whose geometry derives from the shared - notation metrics. - justification: | - End markers express relationship direction and kind; deriving their geometry - from the shared notation metrics keeps the SVG and PNG markers identical. - tests: - - SvgRenderer_Render_SingleLine_WithOpenArrowhead_ProducesMarkerEnd - - SvgRenderer_Render_SingleLine_WithDiamondArrowhead_ProducesDiamondMarker - - SvgRenderer_Render_SingleLine_WithOpenCrossbarArrowhead_ProducesOpenCrossbarMarker - - OpenChevron_IsDefinedAsPolyline - - HollowTriangle_IsDefinedAsClosedPolygon - - TriangleMarker_DimensionsDeriveFromNotationMetrics - - DiamondMarker_DimensionsDeriveFromNotationMetrics - - OpenChevronLine_ReferencesOpenChevronMarker diff --git a/docs/verification/definition.yaml b/docs/verification/definition.yaml index 5856abe1..8f335aea 100644 --- a/docs/verification/definition.yaml +++ b/docs/verification/definition.yaml @@ -8,14 +8,10 @@ resource-path: - docs/verification/sysml2-tools-language/semantic/internal - docs/verification/sysml2-tools-core - docs/verification/sysml2-tools-core/layout - - docs/verification/sysml2-tools-core/layout/engine - - docs/verification/sysml2-tools-core/layout/engine/layered - docs/verification/sysml2-tools-core/layout/internal - docs/verification/sysml2-tools-core/rendering - docs/verification/sysml2-tools-core/rendering/internal - docs/verification/sysml2-tools-stdlib - - docs/verification/sysml2-tools-svg - - docs/verification/sysml2-tools-png - docs/verification/sysml2-tools-tool - docs/verification/sysml2-tools-tool/cli - docs/verification/sysml2-tools-tool/lint @@ -45,26 +41,6 @@ input-files: - docs/verification/sysml2-tools-stdlib/stdlib-provider.md - docs/verification/sysml2-tools-core.md - docs/verification/sysml2-tools-core/layout.md - - docs/verification/sysml2-tools-core/layout/box-metrics.md - - docs/verification/sysml2-tools-core/layout/layout-tree.md - - docs/verification/sysml2-tools-core/layout/connector-label-placer.md - - docs/verification/sysml2-tools-core/layout/engine.md - - docs/verification/sysml2-tools-core/layout/engine/channel-router.md - - docs/verification/sysml2-tools-core/layout/engine/containment-packer.md - - docs/verification/sysml2-tools-core/layout/engine/interconnection-layout-engine.md - - docs/verification/sysml2-tools-core/layout/engine/layered.md - - docs/verification/sysml2-tools-core/layout/engine/layered/layered-graph.md - - docs/verification/sysml2-tools-core/layout/engine/layered/layered-layout-pipeline.md - - docs/verification/sysml2-tools-core/layout/engine/layered/cycle-breaker.md - - docs/verification/sysml2-tools-core/layout/engine/layered/layer-assigner.md - - docs/verification/sysml2-tools-core/layout/engine/layered/long-edge-splitter.md - - docs/verification/sysml2-tools-core/layout/engine/layered/crossing-minimizer.md - - docs/verification/sysml2-tools-core/layout/engine/layered/brandes-kopf-placer.md - - docs/verification/sysml2-tools-core/layout/engine/layered/port-distributor.md - - docs/verification/sysml2-tools-core/layout/engine/layered/orthogonal-router.md - - docs/verification/sysml2-tools-core/layout/engine/layered/long-edge-joiner.md - - docs/verification/sysml2-tools-core/layout/engine/layered/axis-transform.md - - docs/verification/sysml2-tools-core/layout/engine/layered/component-packer.md - docs/verification/sysml2-tools-core/layout/internal.md - docs/verification/sysml2-tools-core/layout/internal/general-view-layout-strategy.md - docs/verification/sysml2-tools-core/layout/internal/interconnection-view-layout-strategy.md @@ -74,17 +50,11 @@ input-files: - docs/verification/sysml2-tools-core/layout/internal/grid-view-layout-strategy.md - docs/verification/sysml2-tools-core/layout/internal/browser-view-layout-strategy.md - docs/verification/sysml2-tools-core/layout/internal/layout-warnings.md + - docs/verification/sysml2-tools-core/layout/internal/layered-placement.md - docs/verification/sysml2-tools-core/rendering.md - - docs/verification/sysml2-tools-core/rendering/notation-metrics.md - - docs/verification/sysml2-tools-core/rendering/theme.md - docs/verification/sysml2-tools-core/rendering/diagram-renderer.md - - docs/verification/sysml2-tools-core/rendering/rendering-contracts.md - docs/verification/sysml2-tools-core/rendering/internal.md - docs/verification/sysml2-tools-core/rendering/internal/diagram-type-router.md - - docs/verification/sysml2-tools-svg.md - - docs/verification/sysml2-tools-svg/svg-renderer.md - - docs/verification/sysml2-tools-png.md - - docs/verification/sysml2-tools-png/png-renderer.md - docs/verification/sysml2-tools-tool.md - docs/verification/sysml2-tools-tool/program.md - docs/verification/sysml2-tools-tool/cli.md @@ -98,6 +68,7 @@ input-files: - docs/verification/ots.md - docs/verification/ots/antlr4.md - docs/verification/ots/buildmark.md + - docs/verification/ots/dema-rendering.md - docs/verification/ots/fileassert.md - docs/verification/ots/pandoc.md - docs/verification/ots/reqstream.md diff --git a/docs/verification/introduction.md b/docs/verification/introduction.md index 7ff959ea..d918ae9b 100644 --- a/docs/verification/introduction.md +++ b/docs/verification/introduction.md @@ -37,8 +37,6 @@ systems: - **Semantic/** — Language system: semantic model subsystem tests - **Layout/** — core system: layout subsystem tests - **Rendering/** — core system: rendering subsystem tests - - **DemaConsulting.SysML2Tools.Svg.Tests/** — SVG renderer tests - - **DemaConsulting.SysML2Tools.Png.Tests/** — PNG renderer tests - **DemaConsulting.SysML2Tools.Tool.Tests/** — dotnet tool unit and integration tests ## Companion Artifact Structure diff --git a/docs/verification/ots.md b/docs/verification/ots.md index 1bf24b45..bbdd624d 100644 --- a/docs/verification/ots.md +++ b/docs/verification/ots.md @@ -18,6 +18,8 @@ The following OTS items have verification evidence in this section: - ANTLR4 (_antlr4.md_) — ANTLR4 runtime (Antlr4.Runtime.Standard) - BuildMark (_buildmark.md_) — build-notes documentation tool +- DemaConsulting.Rendering (_dema-rendering.md_) — layout intermediate representation, layered + layout algorithm, and SVG/PNG renderers - FileAssert (_fileassert.md_) — document assertion tool - Pandoc (_pandoc.md_) — Markdown-to-HTML conversion tool - ReqStream (_reqstream.md_) — requirements traceability tool diff --git a/docs/verification/ots/dema-rendering.md b/docs/verification/ots/dema-rendering.md new file mode 100644 index 00000000..fe1ddea3 --- /dev/null +++ b/docs/verification/ots/dema-rendering.md @@ -0,0 +1,165 @@ +## DemaConsulting.Rendering Verification + +This document provides the verification evidence for the DemaConsulting.Rendering OTS software +item. Requirements for this OTS item are defined in the DemaConsulting.Rendering OTS Software +Requirements document. + +### Required Functionality + +`DemaConsulting.Rendering` is a family of SysML-agnostic layout and rendering packages consumed by +SysML2Tools: + +- `DemaConsulting.Rendering` — the layout intermediate representation (`LayoutTree`, `LayoutBox`, + `LayoutLine`, and related nodes), the layout property system, and `LayoutGraph`. +- `DemaConsulting.Rendering.Abstractions` — the `IRenderer` contract, `Theme`, `RenderOptions`, + `RenderOutput`, `NotationMetrics`, `BoxMetrics`, and `ConnectorLabelPlacer`. +- `DemaConsulting.Rendering.Layout` — the `LayeredLayoutAlgorithm`, `LayoutEngine`, containment + layout, and connector routing. +- `DemaConsulting.Rendering.Svg` — the `SvgRenderer`. +- `DemaConsulting.Rendering.Skia` — the Skia-based `PngRenderer` (and JPEG/WebP renderers). + +SysML2Tools relies on the family to lay a graph of sized nodes and directed edges out into placed +boxes and routed orthogonal connectors, honor the requested layout direction (including a +top-to-bottom flow), pack container regions, route connectors around the boxes it places, and +render a layout tree to both SVG and PNG. + +### Verification Approach + +`DemaConsulting.Rendering` is verified by self-validation evidence from the SysML2Tools CI +pipeline. The SysML2Tools view layout strategies and renderers drive the package family end-to-end +on every test run: the `LayeredPlacement` helper builds a `LayoutGraph` and runs +`LayeredLayoutAlgorithm`, while the `Tool` and core `DiagramRenderer` render the resulting +`LayoutTree` through the package's SVG and PNG renderers. A passing pipeline run for all scenarios +below constitutes evidence that the requirements are satisfied. + +### Test Scenarios + +#### ActionFlowView_BuildLayout_ActionsAndSuccessions_ProducesBoxesMarkersAndFlows + +**Scenario**: An action-flow model is laid out; the strategy builds a `LayoutGraph` of action nodes +and succession edges and runs the package's layered algorithm. + +**Expected**: The package returns placed action boxes and one routed connector per succession. + +**Requirement coverage**: `SysML2Tools-OTS-DemaRendering-LayoutGraph`. + +#### StateTransitionView_BuildLayout_StatesAndTransitions_ProducesBoxesBadgeAndLines + +**Scenario**: A state-machine model is laid out through the package's layered algorithm. + +**Expected**: The package returns placed state boxes and routed transition lines. + +**Requirement coverage**: `SysML2Tools-OTS-DemaRendering-LayoutGraph`. + +#### InterconnectionView_BuildLayout_PartsAndConnections_ProducesBoxesPortsAndLines + +**Scenario**: An interconnection model with parts, ports, and connections is laid out through the +package's layered algorithm. + +**Expected**: The package returns placed part boxes with ports and routed connection lines that +turn at right angles. + +**Requirement coverage**: `SysML2Tools-OTS-DemaRendering-LayoutGraph`, +`SysML2Tools-OTS-DemaRendering-Routing`. + +#### ActionFlowView_BuildLayout_ForwardChain_FlowsTopToBottomOrthogonally + +**Scenario**: A forward chain of actions is laid out with the top-to-bottom (DOWN) direction. + +**Expected**: The package places each successor below its predecessor and routes the successions as +orthogonal segments. + +**Requirement coverage**: `SysML2Tools-OTS-DemaRendering-Direction`, +`SysML2Tools-OTS-DemaRendering-Routing`. + +#### StateTransitionView_BuildLayout_ForwardChain_FlowsTopToBottomOrthogonally + +**Scenario**: A forward chain of states is laid out with the top-to-bottom (DOWN) direction. + +**Expected**: The package places each target state below its source and routes the transitions +orthogonally. + +**Requirement coverage**: `SysML2Tools-OTS-DemaRendering-Direction`, +`SysML2Tools-OTS-DemaRendering-Routing`. + +#### ActionFlowView_BuildLayout_Successions_FlowTopToBottom + +**Scenario**: A set of successions is laid out with the top-to-bottom direction. + +**Expected**: Every successor action is placed below its predecessor. + +**Requirement coverage**: `SysML2Tools-OTS-DemaRendering-Direction`. + +#### InterconnectionView_BuildLayout_NestedContainer_PlacesChildrenInsideContainerBox + +**Scenario**: A part with nested children is laid out; the package packs the container region. + +**Expected**: Every child box is placed inside its container box. + +**Requirement coverage**: `SysML2Tools-OTS-DemaRendering-Containers`. + +#### InterconnectionView_BuildLayout_ContainerSize_BoundsChildrenAndTitle + +**Scenario**: A container part is laid out around its children and title area. + +**Expected**: The container box is sized to bound all of its children and its title. + +**Requirement coverage**: `SysML2Tools-OTS-DemaRendering-Containers`. + +#### InterconnectionView_BuildLayout_PartBoxes_DoNotOverlap + +**Scenario**: An interconnection model with multiple parts is laid out. + +**Expected**: The placed part boxes do not overlap one another. + +**Requirement coverage**: `SysML2Tools-OTS-DemaRendering-Containers`. + +#### SvgRenderer_Render_EmptyTree_WritesValidSvg + +**Scenario**: The package's `SvgRenderer` renders an empty `LayoutTree`. + +**Expected**: A well-formed, valid SVG document is written to the output stream. + +**Requirement coverage**: `SysML2Tools-OTS-DemaRendering-RenderSvg`. + +#### DiagramRenderer_RenderWorkspace_SoftwareStructureModel_ReturnsSvgOutput + +**Scenario**: A full workspace is rendered to SVG through the core `DiagramRenderer` and the +package's `SvgRenderer`. + +**Expected**: An SVG render output is produced for the view. + +**Requirement coverage**: `SysML2Tools-OTS-DemaRendering-RenderSvg`. + +#### DiagramRenderer_RenderWorkspace_GeneralViewModel_SvgContainsElementNames + +**Scenario**: A general view is rendered to SVG through the package's `SvgRenderer`. + +**Expected**: The SVG document contains the view's model element names. + +**Requirement coverage**: `SysML2Tools-OTS-DemaRendering-RenderSvg`. + +#### PngRenderer_Render_EmptyTree_WritesPngBytes + +**Scenario**: The package's Skia-based `PngRenderer` renders an empty `LayoutTree`. + +**Expected**: Valid PNG image bytes are written to the output stream. + +**Requirement coverage**: `SysML2Tools-OTS-DemaRendering-RenderPng`. + +#### DiagramRenderer_RenderWorkspace_SoftwareStructureModel_PngRenderer_ReturnsPngOutput + +**Scenario**: A full workspace is rendered to PNG through the core `DiagramRenderer` and the +package's `PngRenderer`. + +**Expected**: A PNG render output is produced for the view. + +**Requirement coverage**: `SysML2Tools-OTS-DemaRendering-RenderPng`. + +#### DiagramRenderer_RenderWorkspace_GeneralViewModel_PngProducesValidOutput + +**Scenario**: A general view is rendered to PNG through the package's `PngRenderer`. + +**Expected**: A valid PNG image is produced. + +**Requirement coverage**: `SysML2Tools-OTS-DemaRendering-RenderPng`. diff --git a/docs/verification/sysml2-tools-core/layout.md b/docs/verification/sysml2-tools-core/layout.md index 58c5d8f9..b390daf5 100644 --- a/docs/verification/sysml2-tools-core/layout.md +++ b/docs/verification/sysml2-tools-core/layout.md @@ -2,87 +2,46 @@ ### Verification Approach -The Layout subsystem is verified by unit tests in `DemaConsulting.SysML2Tools.Tests`. Tests -construct `LayoutTree` and its node types directly using positional record constructors, and -assert that all fields are stored and retrievable without modification. No mocking is required; -the Layout node types are pure immutable records with no dependencies. +The Layout subsystem is verified by the view layout strategy tests in +`DemaConsulting.SysML2Tools.Tests`. Each test constructs a synthetic `SysmlWorkspace`, invokes a +view layout strategy, and asserts on the returned `LayoutTree`. Because the strategies build the +tree by mapping the model onto the off-the-shelf `DemaConsulting.Rendering` intermediate +representation and by delegating geometric placement and routing to the off-the-shelf +`DemaConsulting.Rendering.Layout` layered algorithm (through the `LayeredPlacement` helper), a +passing strategy layout is evidence that the mapping, placement, and routing all occurred +correctly. No mocking is used; the real intermediate representation and layered algorithm run on +every test. ### Test Environment Tests run via `dotnet test` against all three target frameworks: net8.0, net9.0, and net10.0. -No external network access or services are required. All test inputs are constructed inline. +No external network access or services are required beyond a standard .NET SDK installation and +the referenced `DemaConsulting.Rendering` packages. All test inputs are constructed inline. ### Acceptance Criteria -- All unit tests pass with zero failures across all three target frameworks. -- `LayoutTree` stores `Width`, `Height`, and `Nodes` exactly as supplied to the constructor. -- `LayoutBox` stores all nine constructor parameters including `Depth` as a plain integer. -- `LayoutBox.Children` can contain nested `LayoutNode` instances of any concrete type. -- `LayoutPort` stores absolute `CentreX`, `CentreY`, `Side`, and optional `Label`. -- `LayoutLine` stores the `Waypoints` list, end-marker styles, line style, and optional label. -- `LayoutLabel` stores `X`, `Y`, `MaxWidth`, `Text`, and `Align`. -- `LayoutBadge` stores `CentreX`, `CentreY`, `Size`, `Shape`, and optional `Label`. -- `LayoutBand` stores position, size, `Orientation`, optional `Label`, and `Children`. -- `LayoutLifeline` stores `CentreX`, `TopY`, `BottomY`, `Label`, `HeaderWidth`, and `HeaderHeight`. -- `LayoutActivation` stores `CentreX`, `TopY`, and `BottomY`. -- `LayoutGrid` stores `X`, `Y`, and `Rows`; each `LayoutGridRow` stores `IsHeader` and `Cells`. -- All coordinate values are stored as supplied; no transformation is applied by the data model. +- All view layout strategy tests pass with zero failures across all three target frameworks. +- Each view strategy maps its relevant model elements onto a populated `LayoutTree` of boxes, + ports, lines, and markers. +- Geometric placement is delegated to the off-the-shelf layered algorithm and positions boxes so + that they do not overlap one another. +- Connector routing is resolved before rendering, so `LayoutLine.Waypoints` holds the complete + ordered sequence of absolute points. ### Test Scenarios -**LayoutTree_Construction_StoresWidthHeightNodes**: A `LayoutTree` is constructed with -explicit `Width = 800.0`, `Height = 600.0`, and a non-empty `Nodes` list containing a single -`LayoutBox`; all three properties are asserted to equal the supplied values. This confirms -that `LayoutTree` is a transparent data container with no side effects. - -**LayoutBox_Construction_StoresAllFields**: A `LayoutBox` is constructed with all nine -parameters set to non-default values; each property is asserted to equal the supplied value. -This confirms correct positional record construction and property projection. - -**LayoutBox_Depth_IsInteger**: A `LayoutBox` is constructed with `Depth = 3`; the `Depth` -property is asserted to be of type `int` with value `3`. This confirms the depth-not-color -invariant — no color property is present on the node. - -**LayoutBox_Coordinates_AreAbsolute**: A `LayoutBox` is constructed with `X = 100.0` and -`Y = 200.0`; the `X` and `Y` properties are asserted to equal the supplied values without -offset. This confirms that the data model does not apply any coordinate transform. - -**LayoutBox_Children_ContainsNestedNodes**: A `LayoutBox` is constructed with a `Children` -list containing a `LayoutPort` and a nested `LayoutBox`; both child nodes are retrievable -from `Children` in insertion order. This confirms that `LayoutBox.Children` supports -heterogeneous node types. - -**LayoutPort_Construction_StoresAllFields**: A `LayoutPort` is constructed with `CentreX`, -`CentreY`, `Side`, and `Label` set; all four properties are asserted to equal the supplied -values. This confirms that ports carry sufficient information for absolute positioning. - -**LayoutPort_Coordinates_AreAbsolute**: A `LayoutPort` is constructed with -`CentreX = 250.0` and `CentreY = 150.0`; both properties are asserted to equal the supplied -values. This confirms that port positions are absolute and not relative to the parent box. - -**LayoutLine_Construction_StoresAllFields**: A `LayoutLine` is constructed with a two-element -`Waypoints` list, non-default `SourceEnd`, `TargetEnd`, `LineStyle`, and a -non-null `MidpointLabel`; all five properties are asserted to equal the supplied values. - -**LayoutLine_Waypoints_AreAbsolute**: A `LayoutLine` is constructed with waypoints at -`(10.0, 20.0)` and `(200.0, 300.0)`; both `Point2D` instances in `Waypoints` are asserted -to have the supplied `X` and `Y` values. This confirms that routing produces absolute coordinates. - -**LayoutLabel_Construction_StoresAllFields**: A `LayoutLabel` is constructed with all five -parameters set to non-default values; each property is asserted to equal the supplied value. - -**LayoutBadge_Construction_StoresAllFields**: A `LayoutBadge` is constructed with all five -parameters set; each property is asserted to equal the supplied value. - -**LayoutBand_Construction_StoresAllFields**: A `LayoutBand` is constructed with all seven -parameters set; each property is asserted to equal the supplied value. - -**LayoutLifeline_Construction_StoresAllFields**: A `LayoutLifeline` is constructed with all -six parameters set; each property is asserted to equal the supplied value. - -**LayoutActivation_Construction_StoresAllFields**: A `LayoutActivation` is constructed with -`CentreX`, `TopY`, and `BottomY` set; all three properties are asserted to equal the supplied values. - -**LayoutGrid_Construction_StoresAllFields**: A `LayoutGrid` is constructed with `X`, `Y`, -and a `Rows` list containing one `LayoutGridRow` with `IsHeader = true` and one -`LayoutGridCell`; all fields are asserted to equal the supplied values. +**SysML2Tools-Core-Layout-LayoutTree** is verified by +`GeneralViewLayoutStrategy_BuildLayout_OneUserPartDef_ProducesLayoutBox`, +`InterconnectionView_BuildLayout_PartsAndConnections_ProducesBoxesPortsAndLines`, and +`SequenceView_BuildLayout_Messages_ProducesLifelinesAndOrderedLines`, which confirm that each +view strategy maps the semantic model onto a populated `LayoutTree`. + +**SysML2Tools-Core-Layout-DelegatedGeometry** is verified by +`InterconnectionView_BuildLayout_PartBoxes_DoNotOverlap` and +`ActionFlowView_BuildLayout_NoOverlap`, which confirm that the geometry produced by the +off-the-shelf layered algorithm places boxes without overlap. + +**SysML2Tools-Core-Layout-PreRoutedLines** is verified by +`ActionFlowView_BuildLayout_ForwardChain_FlowsTopToBottomOrthogonally` and +`StateTransitionView_BuildLayout_ForwardChain_FlowsTopToBottomOrthogonally`, which confirm that +connectors are fully routed into orthogonal absolute waypoints before rendering. diff --git a/docs/verification/sysml2-tools-core/layout/box-metrics.md b/docs/verification/sysml2-tools-core/layout/box-metrics.md deleted file mode 100644 index 6af1645f..00000000 --- a/docs/verification/sysml2-tools-core/layout/box-metrics.md +++ /dev/null @@ -1,27 +0,0 @@ -### BoxMetrics Verification - -#### Verification Approach - -`BoxMetrics` has no dedicated unit-test class; its formulas are pure and are verified indirectly -through the interconnection view layout strategy tests, which call `BoxMetrics.TitleAreaHeight` and -assert that nested children are placed below the reserved title area within their container box. This -proves that the space reserved by the strategy and computed by `BoxMetrics` is consistent. - -#### Test Environment - -Tests run via `dotnet test` against net8.0, net9.0, and net10.0. No external services, files, or -configuration are required beyond a standard .NET SDK installation. - -#### Acceptance Criteria - -- The interconnection view tests that consume `BoxMetrics.TitleAreaHeight` pass with zero failures - across all target frameworks. -- Nested child boxes are positioned below the reserved title area of their container box. -- The folder-tab height matches the space reserved above the box body when a folder box is drawn. - -#### Test Scenarios - -| Test | Assertion | -| --- | --- | -| `InterconnectionView_BuildLayout_ContainerSize_BoundsChildrenAndTitle` | Container bounds children below title | -| `InterconnectionView_BuildLayout_NestedContainer_PlacesChildrenInsideContainerBox` | Children sit inside the box | diff --git a/docs/verification/sysml2-tools-core/layout/connector-label-placer.md b/docs/verification/sysml2-tools-core/layout/connector-label-placer.md deleted file mode 100644 index ec867969..00000000 --- a/docs/verification/sysml2-tools-core/layout/connector-label-placer.md +++ /dev/null @@ -1,27 +0,0 @@ -### ConnectorLabelPlacer Verification - -#### Verification Approach - -`ConnectorLabelPlacer` is verified through unit tests in `ConnectorLabelPlacerTests` that construct -explicit `LayoutLine` values, call `Place`, and assert on the returned position dictionary. The unit -is pure and deterministic, so no mocking is required. - -#### Test Environment - -Tests run via `dotnet test` against net8.0, net9.0, and net10.0. No external services, files, or -configuration are required beyond a standard .NET SDK installation. - -#### Acceptance Criteria - -- All `ConnectorLabelPlacerTests` pass with zero failures across all target frameworks. -- A line without a label is absent from the result. -- A single labelled line is placed at the midpoint of its longest segment. -- Two labels whose preferred positions coincide are separated so they do not overlap. - -#### Test Scenarios - -| Test | Assertion | -| --- | --- | -| `Place_LineWithoutLabel_IsOmitted` | An unlabelled line is omitted from the result | -| `Place_SingleLine_UsesLongestSegmentMidpoint` | A label lands at the midpoint of the longest segment | -| `Place_CollidingLabels_AreSeparated` | Colliding labels are separated; the first keeps its preferred midpoint | diff --git a/docs/verification/sysml2-tools-core/layout/engine.md b/docs/verification/sysml2-tools-core/layout/engine.md deleted file mode 100644 index 682111b4..00000000 --- a/docs/verification/sysml2-tools-core/layout/engine.md +++ /dev/null @@ -1,35 +0,0 @@ -### Layout Engine Subsystem Verification - -#### Verification Approach - -The Engine subsystem is verified through unit tests, one test class per engine, that supply -synthetic geometric input and assert on the returned geometry. No mocking is required: the -engines have no dependencies beyond the geometric value types, so tests construct inputs -directly and check observable properties of the output (orthogonality, non-overlap, bounds, -determinism, and layer ordering). - -#### Test Environment - -Tests run via `dotnet test` against net8.0, net9.0, and net10.0. No external services, -files, or configuration are required beyond a standard .NET SDK installation. - -#### Acceptance Criteria - -- All engine test classes pass with zero failures across all three target frameworks. -- Routed paths consist solely of axis-aligned segments. -- Placed boxes within a common region do not overlap. -- Placed geometry lies within the reported region bounds. -- Repeated invocations with identical input produce identical geometry. - -#### Test Scenarios - -| Scenario | Engine | Assertion | -| --- | --- | --- | -| Orthogonal path with no obstacles | `ChannelRouter` | Every segment is axis-aligned | -| Path around an obstacle | `ChannelRouter` | No segment crosses the obstacle interior | -| Clean route respects clearance | `ChannelRouter` | Segments stay the requested clearance from obstacles | -| Bounded packing | `ContainmentPacker` | All packed rectangles lie within the reported bounds | -| Layered chain | `LayerAssigner` (Layered) | Layers increase monotonically along the flow direction | -| Independent components | `ComponentPacker` (Layered) | Separately packed components do not overlap | -| Deterministic packing | `ComponentPacker` (Layered) | Identical input yields identical geometry | -| Container packing | `ContainmentPacker` | Packed boxes fit within the container | diff --git a/docs/verification/sysml2-tools-core/layout/engine/channel-router.md b/docs/verification/sysml2-tools-core/layout/engine/channel-router.md deleted file mode 100644 index f4fc2f3b..00000000 --- a/docs/verification/sysml2-tools-core/layout/engine/channel-router.md +++ /dev/null @@ -1,40 +0,0 @@ -#### ChannelRouter Verification - -##### Verification Approach - -`ChannelRouter` is verified through unit tests in `ChannelRouterTests` that construct -explicit source/target anchors and obstacle rectangles and assert on the returned path. -Geometric helpers in the test class confirm that every segment is axis-aligned, that no -segment passes through an obstacle interior, and that segments keep the requested clearance. -No mocking is required; the engine is pure and deterministic. - -##### Test Environment - -Tests run via `dotnet test` against net8.0, net9.0, and net10.0. No external services, -files, or configuration are required beyond a standard .NET SDK installation. - -##### Acceptance Criteria - -- All `ChannelRouterTests` pass with zero failures across all three target frameworks. -- A route with no obstacles consists solely of axis-aligned segments. -- A route around an obstacle never enters the obstacle interior. -- A clean route keeps every segment at least the requested clearance from obstacles. -- A route with a given source or target side leaves or enters perpendicular to that side. -- A route that cannot avoid an obstacle reports `Crossed = true`; a clean route reports - `Crossed = false`. - -##### Test Scenarios - -| Test | Assertion | -| --- | --- | -| `Route_NoObstacles_ProducesOrthogonalPath` | Path endpoints correct; all segments orthogonal | -| `Route_AlignedEndpoints_ProducesStraightLine` | Aligned anchors yield a single straight run | -| `Route_ObstacleBetween_RoutesAround` | Path avoids the obstacle interior | -| `Route_MultipleObstacles_RemainsValid` | Valid orthogonal path among several obstacles | -| `Route_WithSourceSide_LeavesPerpendicular` | First segment perpendicular to the source side | -| `Route_WithTargetSide_EntersPerpendicular` | Last segment perpendicular to the target side | -| `RouteWithStatus_NoBlockingObstacle_ReportsNotCrossed` | Clean route reports not crossed | -| `RouteWithStatus_ObstacleBetween_RoutesAroundWithoutCrossing` | Routed around; not crossed | -| `RouteWithStatus_CleanRoute_KeepsClearanceFromObstacles` | Segments respect clearance | -| `RouteWithStatus_TargetEnclosedByObstacle_ReportsCrossed` | Enclosed target reports crossed | -| `RouteWithStatus_HighwayBand_PrefersBandedDetour` | Route prefers a cheaper cost band | diff --git a/docs/verification/sysml2-tools-core/layout/engine/containment-packer.md b/docs/verification/sysml2-tools-core/layout/engine/containment-packer.md deleted file mode 100644 index e205ae25..00000000 --- a/docs/verification/sysml2-tools-core/layout/engine/containment-packer.md +++ /dev/null @@ -1,38 +0,0 @@ -#### ContainmentPacker Verification - -##### Verification Approach - -`ContainmentPacker` is verified through unit tests in `ContainmentPackerTests` that construct -explicit item lists with known sizes and assert on the returned packing. Row sharing and wrapping -are checked by comparing the Y coordinates of placed rectangles; a geometric helper in the test -class checks whether two rectangles overlap, and bounds are checked against the reported region -size. The oversized-item case is exercised directly. No mocking is required; the packer is pure and -deterministic. - -##### Test Environment - -Tests run via `dotnet test` against net8.0, net9.0, and net10.0. No external services, files, or -configuration are required beyond a standard .NET SDK installation. - -##### Acceptance Criteria - -- All `ContainmentPackerTests` pass with zero failures across all three target frameworks. -- Items that fit within the content width share a single row, ordered left to right. -- An item that would exceed the content width wraps to a new row below. -- A mixed-size set produces no overlapping rectangles. -- Every packed rectangle lies within the reported region bounds. -- An item wider than the content width is placed alone and the region widens to contain it. -- An empty list yields an empty result sized only by the padding; a single item sits at the padding - origin. - -##### Test Scenarios - -| Test | Assertion | -| --- | --- | -| `Pack_EmptyList_ReturnsPaddingOnlyRegion` | No rectangles; region is `2 * padding` on each axis | -| `Pack_SingleItem_PositionsAtPaddingOrigin` | Lone item at the padding origin; region wraps it plus padding | -| `Pack_ItemsFitInRow_ShareSameRow` | Items that fit share a row with increasing X positions | -| `Pack_ItemsExceedWidth_WrapToNewRow` | Overflowing item wraps to a new row at the left padding origin | -| `Pack_MixedSizes_ProducesNoOverlaps` | Every pair of packed rectangles is disjoint | -| `Pack_MixedSizes_AllRectsWithinBounds` | All rectangles lie within the reported region bounds | -| `Pack_ItemWiderThanContentWidth_PlacedAloneAndRegionWidens` | Oversized item placed alone; region grows to fit it | diff --git a/docs/verification/sysml2-tools-core/layout/engine/interconnection-layout-engine.md b/docs/verification/sysml2-tools-core/layout/engine/interconnection-layout-engine.md deleted file mode 100644 index b43467fb..00000000 --- a/docs/verification/sysml2-tools-core/layout/engine/interconnection-layout-engine.md +++ /dev/null @@ -1,35 +0,0 @@ -#### InterconnectionLayoutEngine Verification - -##### Verification Approach - -`InterconnectionLayoutEngine` is verified through unit tests in `InterconnectionLayoutEngineTests` -that construct explicit node lists and edge lists with known topology, invoke `Place`, and assert -on the returned `LayerResult`. Layer monotonicity checks verify the longest-path guarantee; waypoint -count checks verify dummy-node insertion; overlap checks verify the non-overlapping constraint. The -engine is pure and deterministic, so all assertions are stable across repeated runs. No mocking is -required. - -##### Test Environment - -Tests run via `dotnet test` against net8.0, net9.0, and net10.0. No external services, files, or -configuration are required beyond a standard .NET SDK installation. - -##### Acceptance Criteria - -- All `InterconnectionLayoutEngineTests` pass with zero failures across all three target frameworks. -- A linear chain produces strictly monotonically increasing layer indices along the chain direction. -- A span-1 edge produces exactly four waypoints in Z-path order. -- A long edge (span > 1) produces more than four waypoints, proving dummy nodes are in use. -- The returned `Rects` count always equals the input node count (no dummy rectangles leaked). -- No two rectangles from the Workstation topology (seven nodes) overlap. -- The Workstation topology places psu in layer 0, board in layer 1, and the leaf nodes in layer 2+. - -##### Test Scenarios - -| Test | Assertion | -| --- | --- | -| `Place_LinearChain_MonotonicLayerAssignment` | Each node's layer > its predecessor's layer along A→B→C chain | -| `Place_SingleEdge_ProducesFourWaypointZPath` | Single span-1 edge yields exactly 4 waypoints | -| `Place_LongEdge_RectCountEqualsInputNodeCount` | Two-node, span-2 graph: Rects.Count == 2 | -| `Place_LongEdge_WaypointsExceedFour` | Span-2 edge yields more than 4 waypoints | -| `Place_WorkstationTopology_CorrectLayersAndNoOverlap` | psu=L0, board=L1, leaves in higher layers; no overlap | diff --git a/docs/verification/sysml2-tools-core/layout/engine/layered.md b/docs/verification/sysml2-tools-core/layout/engine/layered.md deleted file mode 100644 index 98b8b0f5..00000000 --- a/docs/verification/sysml2-tools-core/layout/engine/layered.md +++ /dev/null @@ -1,34 +0,0 @@ -#### Layout Engine Layered Subsystem Verification - -##### Verification Approach - -The Layered subsystem is verified at two levels. Each stage unit has its own test class that drives -the stage through the internal `LayeredGraph` API: it runs the prerequisite stages to populate the -inputs, runs the stage under test, and asserts on the fields the stage produces. At the subsystem -level, the pipeline-equivalence tests feed many graphs through both the legacy monolithic engine and -the assembled pipeline and assert that every field of the result is bit-for-bit identical. The -stages are pure and deterministic, so all assertions are stable across repeated runs and no mocking -is required. - -##### Test Environment - -Tests run via `dotnet test` against net8.0, net9.0, and net10.0. No external services, files, or -configuration are required beyond a standard .NET SDK installation. - -##### Acceptance Criteria - -- All Layered stage test classes pass with zero failures across all three target frameworks. -- The assembled default pipeline runs to completion for chain, diamond, long-edge, and cyclic graphs. -- For every test input the pipeline output matches the legacy engine byte for byte. -- Recursive hierarchy handling is rejected with a clear error until it is implemented; the right, - down, left, and up directions are all supported and mapped by `AxisTransform`. - -##### Test Scenarios - -| Scenario | Unit | Assertion | -| --- | --- | --- | -| Default pipeline over a chain | `LayeredLayoutPipeline` | Runs without throwing and populates waypoints | -| Recursive hierarchy requested | `LayeredLayoutPipeline` | `Build` throws `NotSupportedException` | -| Equivalence over random graphs | subsystem | Every result field matches the legacy oracle exactly | -| Right-direction transform | `AxisTransform` | Coordinates are left unchanged | -| Down/left/up direction transform | `AxisTransform` | Target placed on the correct side; waypoints stay orthogonal | diff --git a/docs/verification/sysml2-tools-core/layout/engine/layered/axis-transform.md b/docs/verification/sysml2-tools-core/layout/engine/layered/axis-transform.md deleted file mode 100644 index 092a7726..00000000 --- a/docs/verification/sysml2-tools-core/layout/engine/layered/axis-transform.md +++ /dev/null @@ -1,37 +0,0 @@ -##### AxisTransform Verification - -###### Verification Approach - -`AxisTransform` is verified through unit tests in `AxisTransformTests`. One test runs the placement -pipeline with the left-to-right direction, snapshots the coordinates, runs the transform, and asserts -the coordinates are unchanged. A small two-node chain is then run through the full default pipeline -(so input-axis normalization is applied) once per direction, asserting the coordinate mapping (target -on the correct side of its source), the port faces (down: source SOUTH / target NORTH; and the -analogous faces for right, left, and up), and the orthogonality of the routed waypoints. The stage is -pure and deterministic, so no mocking is required. - -###### Test Environment - -Tests run via `dotnet test` against net8.0, net9.0, and net10.0. No external services, files, or -configuration are required beyond a standard .NET SDK installation. - -###### Acceptance Criteria - -- All `AxisTransformTests` pass with zero failures across all three target frameworks. -- The left-to-right transform leaves the placed coordinates unchanged. -- Each non-identity direction places later-layer targets on the correct side of their source with the - correct exit/entry faces, and keeps every routed waypoint polyline orthogonal. - -###### Test Scenarios - -| Test | Assertion | -| --- | --- | -| `AxisTransform_Apply_RightDirection_LeavesCoordinatesUnchanged` | Coordinates unchanged by the identity transform | -| `AxisTransform_Apply_Right_PlacesTargetEastWithCorrectFaces` | Target placed east; source EAST / target WEST face | -| `AxisTransform_Apply_Down_PlacesTargetSouthWithCorrectFaces` | Target placed south; source SOUTH / target NORTH face | -| `AxisTransform_Apply_Left_PlacesTargetWestWithCorrectFaces` | Target placed west; source WEST / target EAST face | -| `AxisTransform_Apply_Up_PlacesTargetNorthWithCorrectFaces` | Target placed north; source NORTH / target SOUTH face | -| `AxisTransform_Apply_Right_ProducesOrthogonalWaypoints` | Routed waypoints stay axis-aligned (right) | -| `AxisTransform_Apply_Down_ProducesOrthogonalWaypoints` | Routed waypoints stay axis-aligned (down) | -| `AxisTransform_Apply_Left_ProducesOrthogonalWaypoints` | Routed waypoints stay axis-aligned (left) | -| `AxisTransform_Apply_Up_ProducesOrthogonalWaypoints` | Routed waypoints stay axis-aligned (up) | diff --git a/docs/verification/sysml2-tools-core/layout/engine/layered/brandes-kopf-placer.md b/docs/verification/sysml2-tools-core/layout/engine/layered/brandes-kopf-placer.md deleted file mode 100644 index ac6a3191..00000000 --- a/docs/verification/sysml2-tools-core/layout/engine/layered/brandes-kopf-placer.md +++ /dev/null @@ -1,28 +0,0 @@ -##### BrandesKopfPlacer Verification - -###### Verification Approach - -`BrandesKopfPlacer` is verified through unit tests in `BrandesKopfPlacerTests` that run the stages up -to and including placement and assert on the produced coordinate arrays. One test confirms that every -augmented node receives a finite X and Y and that the per-column arrays are sized to the layer count; -another confirms that column left edges increase strictly in layer order. The stage is pure and -deterministic, so no mocking is required. - -###### Test Environment - -Tests run via `dotnet test` against net8.0, net9.0, and net10.0. No external services, files, or -configuration are required beyond a standard .NET SDK installation. - -###### Acceptance Criteria - -- All `BrandesKopfPlacerTests` pass with zero failures across all three target frameworks. -- Every augmented node receives a finite X and Y coordinate. -- The per-column arrays are sized to the number of layers. -- Column left edges strictly increase in layer order. - -###### Test Scenarios - -| Test | Assertion | -| --- | --- | -| `BrandesKopfPlacer_Apply_ChainGraph_AssignsCoordinateArrays` | Coordinate arrays are sized and finite | -| `BrandesKopfPlacer_Apply_ColumnsAreLeftToRightInLayerOrder` | Each column's left edge exceeds the previous column's | diff --git a/docs/verification/sysml2-tools-core/layout/engine/layered/component-packer.md b/docs/verification/sysml2-tools-core/layout/engine/layered/component-packer.md deleted file mode 100644 index 88846fd5..00000000 --- a/docs/verification/sysml2-tools-core/layout/engine/layered/component-packer.md +++ /dev/null @@ -1,37 +0,0 @@ -##### ComponentPacker Verification - -###### Verification Approach - -`ComponentPacker` is verified through unit tests in `ComponentPackerTests` that build small graphs, -run the stage (wrapping the default inner stages), and assert on the resulting node coordinates and -routed waypoints. Tests cover connected-component detection (a connected core stays one component; -disconnected singletons become separate components), non-overlapping packing of disconnected -components, byte-equality of the single-component fast path against the default pipeline, the -empty-graph no-op and null-graph guard, deterministic component ordering, and translation of edge -waypoints with their owning component. The stage is pure and deterministic, so no mocking is -required. - -###### Test Environment - -Tests run via `dotnet test` against net8.0, net9.0, and net10.0. No external services, files, or -configuration are required beyond a standard .NET SDK installation. - -###### Acceptance Criteria - -- All `ComponentPackerTests` pass with zero failures across all three target frameworks. -- A connected graph yields one component; disconnected nodes yield separate, non-overlapping components. -- The single-component output equals the default pipeline output exactly. -- An empty graph is a no-op; a null graph throws `ArgumentNullException`. -- Component order is deterministic, and edge waypoints translate with their component. - -###### Test Scenarios - -| Test | Assertion | -| --- | --- | -| `ComponentPacker_Apply_ConnectedCore_StaysOneComponent` | A connected graph lays out in one contiguous box | -| `ComponentPacker_Apply_DisconnectedSingletons_PackSeparately` | Disconnected nodes occupy non-overlapping boxes | -| `ComponentPacker_Apply_SingleComponent_EqualsDefaultPipeline` | Single-component output equals the default pipeline | -| `ComponentPacker_Apply_EmptyGraph_IsNoOp` | An empty graph leaves the outputs empty without throwing | -| `ComponentPacker_Apply_NullGraph_Throws` | A null graph throws `ArgumentNullException` | -| `ComponentPacker_Apply_ComponentOrder_IsDeterministic` | Repeated layouts produce identical coordinates | -| `ComponentPacker_Apply_Waypoints_TranslatedWithComponent` | Edge waypoints stay on their translated component | diff --git a/docs/verification/sysml2-tools-core/layout/engine/layered/crossing-minimizer.md b/docs/verification/sysml2-tools-core/layout/engine/layered/crossing-minimizer.md deleted file mode 100644 index a068cb93..00000000 --- a/docs/verification/sysml2-tools-core/layout/engine/layered/crossing-minimizer.md +++ /dev/null @@ -1,27 +0,0 @@ -##### CrossingMinimizer Verification - -###### Verification Approach - -`CrossingMinimizer` is verified through unit tests in `CrossingMinimizerTests` that run the -cycle-breaking, layering, splitting, and crossing-minimization stages and assert on the resulting -`Groups`. One test confirms the per-layer grouping shape for a diamond; another confirms that the -grouping is a partition of the augmented nodes, including the dummy nodes of a long edge. The stage -is pure and deterministic, so no mocking is required. - -###### Test Environment - -Tests run via `dotnet test` against net8.0, net9.0, and net10.0. No external services, files, or -configuration are required beyond a standard .NET SDK installation. - -###### Acceptance Criteria - -- All `CrossingMinimizerTests` pass with zero failures across all three target frameworks. -- A diamond produces one group per layer with the expected per-layer counts. -- Every augmented node index appears in exactly one layer group. - -###### Test Scenarios - -| Test | Assertion | -| --- | --- | -| `CrossingMinimizer_Apply_TwoLayerGraph_GroupsNodesByLayer` | A diamond yields three layer groups with counts 1, 2, 1 | -| `CrossingMinimizer_Apply_AllAugmentedNodesAppearInGroups` | The groups partition all augmented nodes exactly once | diff --git a/docs/verification/sysml2-tools-core/layout/engine/layered/cycle-breaker.md b/docs/verification/sysml2-tools-core/layout/engine/layered/cycle-breaker.md deleted file mode 100644 index 777767a2..00000000 --- a/docs/verification/sysml2-tools-core/layout/engine/layered/cycle-breaker.md +++ /dev/null @@ -1,27 +0,0 @@ -##### CycleBreaker Verification - -###### Verification Approach - -`CycleBreaker` is verified through unit tests in `CycleBreakerTests` that construct graphs with -known cycles, self-loops, and duplicate edges, run the stage, and assert on the resulting `Acyclic` -edge set. Acyclicity is checked with a local topological-sort helper; self-loop and duplicate -removal are checked by inspecting the resulting edges. The stage is pure and deterministic, so no -mocking is required. - -###### Test Environment - -Tests run via `dotnet test` against net8.0, net9.0, and net10.0. No external services, files, or -configuration are required beyond a standard .NET SDK installation. - -###### Acceptance Criteria - -- All `CycleBreakerTests` pass with zero failures across all three target frameworks. -- A graph containing a directed cycle yields an acyclic edge set. -- Self-loops are dropped and duplicate source-target pairs are collapsed. - -###### Test Scenarios - -| Test | Assertion | -| --- | --- | -| `CycleBreaker_Apply_GraphWithCycle_ProducesAcyclicEdgeSet` | The resulting edge set has no directed cycle | -| `CycleBreaker_Apply_SelfLoopsAndDuplicates_AreRemoved` | No self-loop remains and duplicate edges are collapsed | diff --git a/docs/verification/sysml2-tools-core/layout/engine/layered/layer-assigner.md b/docs/verification/sysml2-tools-core/layout/engine/layered/layer-assigner.md deleted file mode 100644 index 06e1c466..00000000 --- a/docs/verification/sysml2-tools-core/layout/engine/layered/layer-assigner.md +++ /dev/null @@ -1,27 +0,0 @@ -##### LayerAssigner Verification - -###### Verification Approach - -`LayerAssigner` is verified through unit tests in `LayerAssignerTests` that run `CycleBreaker` and -then `LayerAssigner` over graphs with known topology and assert on the resulting `NodeLayers`. A -linear chain checks monotonic, contiguous layer indices; a diamond checks the longest-path rule -where a join node sits one layer past the deeper of its two branches. The stage is pure and -deterministic, so no mocking is required. - -###### Test Environment - -Tests run via `dotnet test` against net8.0, net9.0, and net10.0. No external services, files, or -configuration are required beyond a standard .NET SDK installation. - -###### Acceptance Criteria - -- All `LayerAssignerTests` pass with zero failures across all three target frameworks. -- A linear chain produces strictly increasing, contiguous layer indices. -- A diamond places the join node at the longest-path layer. - -###### Test Scenarios - -| Test | Assertion | -| --- | --- | -| `LayerAssigner_Apply_LinearChain_AssignsMonotonicLayers` | Chain nodes receive layers 0, 1, 2 | -| `LayerAssigner_Apply_DiamondGraph_AssignsLongestPathLayers` | Source layer 0, branches layer 1, join layer 2 | diff --git a/docs/verification/sysml2-tools-core/layout/engine/layered/layered-graph.md b/docs/verification/sysml2-tools-core/layout/engine/layered/layered-graph.md deleted file mode 100644 index c53ad479..00000000 --- a/docs/verification/sysml2-tools-core/layout/engine/layered/layered-graph.md +++ /dev/null @@ -1,27 +0,0 @@ -##### LayeredGraph Verification - -###### Verification Approach - -`LayeredGraph` is verified through unit tests in `LayeredGraphTests` that construct the object with -valid and invalid arguments and assert on the resulting state. Null-argument tests verify the -fail-fast contract; the construction test verifies that the supplied nodes, edges, direction, and -node count are preserved. The type holds no behavior beyond construction, so no mocking is required. - -###### Test Environment - -Tests run via `dotnet test` against net8.0, net9.0, and net10.0. No external services, files, or -configuration are required beyond a standard .NET SDK installation. - -###### Acceptance Criteria - -- All `LayeredGraphTests` pass with zero failures across all three target frameworks. -- Constructing with a null node list or null edge list throws `ArgumentNullException`. -- Construction preserves the supplied nodes, edges, and direction and reports the node count. - -###### Test Scenarios - -| Test | Assertion | -| --- | --- | -| `LayeredGraph_Constructor_NullNodes_ThrowsArgumentNullException` | Null nodes throws `ArgumentNullException` | -| `LayeredGraph_Constructor_NullEdges_ThrowsArgumentNullException` | Null edges throws `ArgumentNullException` | -| `LayeredGraph_Constructor_ValidInput_StoresNodesEdgesDirectionAndCount` | Stored fields match the input | diff --git a/docs/verification/sysml2-tools-core/layout/engine/layered/layered-layout-pipeline.md b/docs/verification/sysml2-tools-core/layout/engine/layered/layered-layout-pipeline.md deleted file mode 100644 index cb351b9c..00000000 --- a/docs/verification/sysml2-tools-core/layout/engine/layered/layered-layout-pipeline.md +++ /dev/null @@ -1,31 +0,0 @@ -##### LayeredLayoutPipeline Verification - -###### Verification Approach - -`LayeredLayoutPipeline` is verified through unit tests in `LayeredLayoutPipelineTests` that assemble -pipelines with the fluent builder and exercise their assembly and execution behavior. The default -pipeline is run over a chain graph to confirm it executes end to end and populates the result; the -builder is exercised with the recursive hierarchy mode and with null inputs to confirm the -fail-fast contracts. The default stage order is also exercised indirectly by the subsystem -pipeline-equivalence tests. - -###### Test Environment - -Tests run via `dotnet test` against net8.0, net9.0, and net10.0. No external services, files, or -configuration are required beyond a standard .NET SDK installation. - -###### Acceptance Criteria - -- All `LayeredLayoutPipelineTests` pass with zero failures across all three target frameworks. -- The default pipeline runs over a chain graph without throwing and populates one waypoint list per edge. -- Building a recursive-hierarchy pipeline throws `NotSupportedException`. -- Adding a null stage and running with a null graph both throw `ArgumentNullException`. - -###### Test Scenarios - -| Test | Assertion | -| --- | --- | -| `LayeredLayoutPipeline_RunDefaultStages_ChainGraph_PopulatesWaypointsWithoutThrowing` | One waypoint list per edge | -| `LayeredLayoutPipeline_Build_RecursiveHierarchy_ThrowsNotSupportedException` | Throws `NotSupportedException` | -| `LayeredLayoutPipeline_AddStage_NullStage_ThrowsArgumentNullException` | Null stage throws `ArgumentNullException` | -| `LayeredLayoutPipeline_Run_NullGraph_ThrowsArgumentNullException` | Null graph throws `ArgumentNullException` | diff --git a/docs/verification/sysml2-tools-core/layout/engine/layered/long-edge-joiner.md b/docs/verification/sysml2-tools-core/layout/engine/layered/long-edge-joiner.md deleted file mode 100644 index 90499d70..00000000 --- a/docs/verification/sysml2-tools-core/layout/engine/layered/long-edge-joiner.md +++ /dev/null @@ -1,28 +0,0 @@ -##### LongEdgeJoiner Verification - -###### Verification Approach - -`LongEdgeJoiner` is verified through unit tests in `LongEdgeJoinerTests` that run the full routing -pipeline and assert on the assembled `Waypoints`. One test confirms one polyline per original edge -for a single short edge; another confirms that a long edge's polyline begins and ends at the right -boxes and that its point count equals the concatenation of its sub-edge bend points plus the two -endpoints. The stage is pure and deterministic, so no mocking is required. - -###### Test Environment - -Tests run via `dotnet test` against net8.0, net9.0, and net10.0. No external services, files, or -configuration are required beyond a standard .NET SDK installation. - -###### Acceptance Criteria - -- All `LongEdgeJoinerTests` pass with zero failures across all three target frameworks. -- One waypoint polyline is produced per original edge. -- A long edge's polyline endpoints sit at the source right face and the target left face. -- A long edge's point count equals two endpoints plus its sub-edges' bend points. - -###### Test Scenarios - -| Test | Assertion | -| --- | --- | -| `LongEdgeJoiner_Apply_SingleEdge_ProducesWaypointsPerOriginalEdge` | Two-point polyline for a single short edge | -| `LongEdgeJoiner_Apply_LongEdge_ConcatenatesSubEdgeBendPoints` | Endpoints and point count match the concatenation | diff --git a/docs/verification/sysml2-tools-core/layout/engine/layered/long-edge-splitter.md b/docs/verification/sysml2-tools-core/layout/engine/layered/long-edge-splitter.md deleted file mode 100644 index 011efbd8..00000000 --- a/docs/verification/sysml2-tools-core/layout/engine/layered/long-edge-splitter.md +++ /dev/null @@ -1,27 +0,0 @@ -##### LongEdgeSplitter Verification - -###### Verification Approach - -`LongEdgeSplitter` is verified through unit tests in `LongEdgeSplitterTests` that run the -cycle-breaking, layering, and splitting stages over graphs with and without long edges and assert on -the resulting `AugNodes`. A unit-span chain confirms that no dummy nodes are added; a span-three edge -confirms that one dummy node is inserted per intermediate layer. The stage is pure and deterministic, -so no mocking is required. - -###### Test Environment - -Tests run via `dotnet test` against net8.0, net9.0, and net10.0. No external services, files, or -configuration are required beyond a standard .NET SDK installation. - -###### Acceptance Criteria - -- All `LongEdgeSplitterTests` pass with zero failures across all three target frameworks. -- A graph with only unit-span edges produces no dummy nodes. -- A span-three edge inserts exactly two dummy nodes. - -###### Test Scenarios - -| Test | Assertion | -| --- | --- | -| `LongEdgeSplitter_Apply_SpanOneEdge_AddsNoDummyNodes` | Augmented node count equals the input node count | -| `LongEdgeSplitter_Apply_LongEdge_InsertsDummyNodesPerIntermediateLayer` | A span-three edge adds two dummy nodes | diff --git a/docs/verification/sysml2-tools-core/layout/engine/layered/orthogonal-router.md b/docs/verification/sysml2-tools-core/layout/engine/layered/orthogonal-router.md deleted file mode 100644 index 70264f6d..00000000 --- a/docs/verification/sysml2-tools-core/layout/engine/layered/orthogonal-router.md +++ /dev/null @@ -1,49 +0,0 @@ -##### OrthogonalRouter Verification - -###### Verification Approach - -`OrthogonalRouter` is verified through unit tests in `OrthogonalRouterTests` that run the stages up -to and including routing and assert on the produced bend points. One test confirms that a single, -already-aligned edge produces no bend points; another confirms the structural contract that every -sub-edge's bend list is either empty or a two-point vertical segment. A separate -`OrthogonalRouterBackEdgeTests` suite verifies the reversed (back) edge entry-approach guarantee, -which is now driven by the `LayeredGraph.BackEdgeEntryApproach` parameter (the magic -`ReversedEdgeApproach` constant was deleted). The suite verifies that at the default approach -(equal to `LayeredLayoutMetrics.ConnectorClearance`) the clamp is a provable no-op so a cyclic -graph stays byte-identical to the reference engine; that raising the approach pushes each reversed -edge's marker-side stub outward; that every reversed edge's entry approach still clears -`ConnectorClearance` at the default; that forward edges in a cyclic graph stay byte-identical; that -an acyclic graph is unchanged (no reversed edge, so the clamp is a no-op); and that a -decoration-aware approach derived as the state-transition view derives it (longest end-marker -along-line length plus corner radius plus clean-leg margin) leaves a final straight leg at least as -long as the open-chevron end marker. The stage is pure and deterministic, so no mocking is -required. - -###### Test Environment - -Tests run via `dotnet test` against net8.0, net9.0, and net10.0. No external services, files, or -configuration are required beyond a standard .NET SDK installation. - -###### Acceptance Criteria - -- All `OrthogonalRouterTests` and `OrthogonalRouterBackEdgeTests` pass with zero failures across all - three target frameworks. -- An aligned single edge produces no bend points. -- Every sub-edge bend list is empty or a two-point vertical segment. -- Every reversed edge that bends has a final straight approach of at least - `LayeredGraph.BackEdgeEntryApproach` (which defaults to `ConnectorClearance`). -- Forward and acyclic edge geometry is byte-identical to the reference engine (the clamp is a no-op - for them). - -###### Test Scenarios - -| Test | Assertion | -| --- | --- | -| `OrthogonalRouter_Apply_StraightEdge_ProducesNoBendPoints` | A single aligned edge has no bend points | -| `OrthogonalRouter_Apply_EveryBendListIsEmptyOrVerticalSegment` | Each bend list is empty or two points sharing an X | -| `OrthogonalRouter_DefaultApproach_IsByteIdenticalToLegacy` | Default approach is byte-identical to the reference | -| `OrthogonalRouter_CustomApproach_PushesEntryStubOutward` | A larger approach pushes a reversed stub outward | -| `OrthogonalRouter_ReversedEdge_DefaultApproachClearsClearance` | Reversed stub clears the default clearance | -| `OrthogonalRouter_ForwardEdges_GeometryUnchanged` | Forward edges in a cyclic graph match the reference engine | -| `OrthogonalRouter_AcyclicGraph_NoApproachChange` | An acyclic graph has no reversed edges and is byte-identical | -| `OrthogonalRouter_DecorationAwareApproach_ClearsMarkerAlongLength` | Clean leg at least the open-chevron length | diff --git a/docs/verification/sysml2-tools-core/layout/engine/layered/port-distributor.md b/docs/verification/sysml2-tools-core/layout/engine/layered/port-distributor.md deleted file mode 100644 index 40fb10b7..00000000 --- a/docs/verification/sysml2-tools-core/layout/engine/layered/port-distributor.md +++ /dev/null @@ -1,27 +0,0 @@ -##### PortDistributor Verification - -###### Verification Approach - -`PortDistributor` is verified through unit tests in `PortDistributorTests` that run the stages up to -and including port distribution and assert on the produced port arrays. One test confirms that a -single edge's source and target ports lie within their respective node faces; another confirms that -one source and one target port are recorded for every sub-edge. The stage is pure and deterministic, -so no mocking is required. - -###### Test Environment - -Tests run via `dotnet test` against net8.0, net9.0, and net10.0. No external services, files, or -configuration are required beyond a standard .NET SDK installation. - -###### Acceptance Criteria - -- All `PortDistributorTests` pass with zero failures across all three target frameworks. -- A single edge's ports fall within the source and target node faces. -- One source and one target port Y is recorded for every sub-edge. - -###### Test Scenarios - -| Test | Assertion | -| --- | --- | -| `PortDistributor_Apply_SingleEdge_PortsLieWithinNodeFaces` | The edge's ports lie within their node faces | -| `PortDistributor_Apply_AssignsPortYForEverySubEdge` | The port arrays have one entry per sub-edge | diff --git a/docs/verification/sysml2-tools-core/layout/internal.md b/docs/verification/sysml2-tools-core/layout/internal.md index 1eeedecc..262b265e 100644 --- a/docs/verification/sysml2-tools-core/layout/internal.md +++ b/docs/verification/sysml2-tools-core/layout/internal.md @@ -6,7 +6,7 @@ The Internal subsystem is verified through unit tests, one test class per view l that construct a synthetic `SysmlWorkspace`, invoke `BuildLayout`, and assert on the returned `LayoutTree`. The tests inspect the node tree for the expected boxes, ports, lines, badges, and canvas dimensions. No mocking is required: the strategies depend only on the in-memory semantic -model, the geometric engines, and the theme, all of which the tests construct directly. +model, the `DemaConsulting.Rendering` layout data types, `LayeredPlacement`, and render options. #### Test Environment diff --git a/docs/verification/sysml2-tools-core/layout/internal/action-flow-view-layout-strategy.md b/docs/verification/sysml2-tools-core/layout/internal/action-flow-view-layout-strategy.md index 8aac39a1..3cb7a41c 100644 --- a/docs/verification/sysml2-tools-core/layout/internal/action-flow-view-layout-strategy.md +++ b/docs/verification/sysml2-tools-core/layout/internal/action-flow-view-layout-strategy.md @@ -9,7 +9,7 @@ action definition with actions and successions, invoke `BuildLayout`, and assert (bullseye) markers and the flow lines, compare action box `Y` coordinates to confirm top-to-bottom ordering, verify that succession polylines are orthogonal and that action boxes do not overlap, and exercise branch-and-join and cyclic flows. No mocking is required; the strategy -depends only on the in-memory model, the layered layout pipeline, and the theme. +depends only on the in-memory model, `LayeredPlacement`, and render options. ##### Test Environment diff --git a/docs/verification/sysml2-tools-core/layout/internal/general-view-layout-strategy.md b/docs/verification/sysml2-tools-core/layout/internal/general-view-layout-strategy.md index deb35da1..db704d46 100644 --- a/docs/verification/sysml2-tools-core/layout/internal/general-view-layout-strategy.md +++ b/docs/verification/sysml2-tools-core/layout/internal/general-view-layout-strategy.md @@ -7,8 +7,8 @@ that construct a synthetic `SysmlWorkspace` of definitions, invoke `BuildLayout` the returned `LayoutTree`. A recursive helper collects boxes from the (possibly nested) node tree so assertions can confirm box keywords, folder shapes, compartments, and specialization, membership, and attribute-typing lines. No -mocking is required; the strategy depends only on the in-memory model, the geometric engines, and -the theme, all constructed directly by the tests. +mocking is required; the strategy depends only on the in-memory model, `LayeredPlacement`, and +render options, all constructed directly by the tests. ##### Test Environment @@ -32,11 +32,11 @@ configuration are required beyond a standard .NET SDK installation. the enumeration definition. - An `attribute`-feature whose type does not resolve to a definition in the view yields no typing edge. - A dense model with many part edges produces a layout in which no two definition boxes overlap, - confirming the layered pipeline keeps boxes separated. + confirming `LayeredPlacement` keeps boxes separated. - A connected model (many cross-referencing part edges) produces a layout in which all definition boxes remain mutually non-overlapping. - A sparse model (two boxes and one edge) produces a compact canvas with no warnings, confirming the - layered engine does not over-pad sparse layouts. + delegated layout does not over-pad sparse diagrams. - Standard-library-only input (by prefix or by seed set) yields a minimal empty canvas. - An empty workspace yields a 200×100 canvas with no nodes. diff --git a/docs/verification/sysml2-tools-core/layout/internal/interconnection-view-layout-strategy.md b/docs/verification/sysml2-tools-core/layout/internal/interconnection-view-layout-strategy.md index a7779658..8ff67b2b 100644 --- a/docs/verification/sysml2-tools-core/layout/internal/interconnection-view-layout-strategy.md +++ b/docs/verification/sysml2-tools-core/layout/internal/interconnection-view-layout-strategy.md @@ -9,7 +9,7 @@ returned `LayoutTree`. Assertions count the container box, rounded part boxes, p connector lines, and a geometric helper confirms that no two part boxes overlap. Nested-layout tests build a two-level workspace (a part typed by a definition with its own internal parts) and assert on the container box's nested `Children`. No mocking is required; the strategy depends only -on the in-memory model, the layered placement engine, and the theme. +on the in-memory model, `LayeredPlacement`, and render options. ##### Test Environment diff --git a/docs/verification/sysml2-tools-core/layout/internal/layered-placement.md b/docs/verification/sysml2-tools-core/layout/internal/layered-placement.md new file mode 100644 index 00000000..d20dadb2 --- /dev/null +++ b/docs/verification/sysml2-tools-core/layout/internal/layered-placement.md @@ -0,0 +1,43 @@ +#### LayeredPlacement Verification + +##### Verification Approach + +`LayeredPlacement` is a thin adapter over the off-the-shelf `DemaConsulting.Rendering.Layout` +layered algorithm and has no direct unit test of its own. It is verified indirectly through the +view layout strategy tests that depend on it: `ActionFlowViewLayoutStrategyTests`, +`StateTransitionViewLayoutStrategyTests`, `InterconnectionViewLayoutStrategyTests`, and +`GeneralViewLayoutStrategyTests`. Those strategies pass sized nodes and directed edges to +`LayeredPlacement.Place` and build their `LayoutTree` from the returned rectangles and polylines, +so a passing strategy layout is evidence that the adapter placed nodes and routed edges correctly. +No mocking is used; the real layered algorithm runs on every test. + +##### Test Environment + +Tests run via `dotnet test` against net8.0, net9.0, and net10.0. No external services, files, or +configuration are required beyond a standard .NET SDK installation and the referenced +`DemaConsulting.Rendering` packages. + +##### Acceptance Criteria + +- The strategy tests that exercise `LayeredPlacement` pass with zero failures across all target + frameworks. +- Placement returns one non-overlapping rectangle per input node in input-node order. +- Routing returns one polyline per input edge in input-edge order, oriented source-to-target even + when the input contains cycles. +- The requested flow direction is honored so a forward chain reads top-to-bottom. + +##### Test Scenarios + +| Test | Assertion | +| --- | --- | +| `ActionFlowView_BuildLayout_ActionsAndSuccessions_ProducesBoxesMarkersAndFlows` | Boxes and flows produced | +| `StateTransitionView_BuildLayout_StatesAndTransitions_ProducesBoxesBadgeAndLines` | State boxes and lines produced | +| `InterconnectionView_BuildLayout_PartsAndConnections_ProducesBoxesPortsAndLines` | Part boxes and lines produced | +| `InterconnectionView_BuildLayout_PartBoxes_DoNotOverlap` | Placed rectangles do not overlap | +| `ActionFlowView_BuildLayout_NoOverlap` | Placed action boxes do not overlap | +| `ActionFlowView_BuildLayout_SuccessionEdge_IsDashedWithOpenArrowhead` | Polyline oriented to the target | +| `StateTransitionView_BuildLayout_TransitionEdge_HasOpenArrowhead` | Polyline oriented source-to-target | +| `ActionFlowView_BuildLayout_Cycle_IsBroken` | Cyclic input placed, back edges reversed | +| `ActionFlowView_BuildLayout_ForwardChain_FlowsTopToBottomOrthogonally` | Top-to-bottom direction honored | +| `StateTransitionView_BuildLayout_ForwardChain_FlowsTopToBottomOrthogonally` | Top-to-bottom direction honored | +| `ActionFlowView_BuildLayout_Successions_FlowTopToBottom` | Successor placed below predecessor | diff --git a/docs/verification/sysml2-tools-core/layout/internal/state-transition-view-layout-strategy.md b/docs/verification/sysml2-tools-core/layout/internal/state-transition-view-layout-strategy.md index c1f21fa1..9f557c3b 100644 --- a/docs/verification/sysml2-tools-core/layout/internal/state-transition-view-layout-strategy.md +++ b/docs/verification/sysml2-tools-core/layout/internal/state-transition-view-layout-strategy.md @@ -9,7 +9,7 @@ state definition with states and transitions, invoke `BuildLayout`, and assert o labels on the transition lines, compare transition endpoint waypoints to confirm distinct anchors, and verify the top-to-bottom flow (a forward chain's target boxes sit below their sources) with orthogonal transition polylines. No mocking is required; the strategy depends only on the in-memory -model, the layered layout pipeline, and the theme. +model, `LayeredPlacement`, and render options. ##### Test Environment diff --git a/docs/verification/sysml2-tools-core/layout/layout-tree.md b/docs/verification/sysml2-tools-core/layout/layout-tree.md deleted file mode 100644 index 466b691c..00000000 --- a/docs/verification/sysml2-tools-core/layout/layout-tree.md +++ /dev/null @@ -1,40 +0,0 @@ -### LayoutTree Verification - -#### Verification Approach - -The `LayoutTree` data-model unit is verified through unit tests in `LayoutTests` that construct each -record type with explicit values and assert that every constructor argument is stored unchanged, that -coordinates remain absolute, and that boxes carry an integer depth and a heterogeneous children list. -The records are pure immutable value types, so no mocking is required. - -#### Test Environment - -Tests run via `dotnet test` against net8.0, net9.0, and net10.0. No external services, files, or -configuration are required beyond a standard .NET SDK installation. - -#### Acceptance Criteria - -- All `LayoutTests` pass with zero failures across all target frameworks. -- Every record type stores its constructor arguments unchanged. -- All coordinate fields are stored as absolute values without transformation. -- `LayoutBox.Depth` is an integer and `LayoutBox.Children` holds heterogeneous nodes in order. - -#### Test Scenarios - -| Test | Assertion | -| --- | --- | -| `LayoutTree_Construction_StoresWidthHeightNodes` | The tree stores width, height, and nodes | -| `LayoutBox_Construction_StoresAllFields` | A box stores all nine fields | -| `LayoutPort_Construction_StoresAllFields` | A port stores all four fields | -| `LayoutLine_Construction_StoresAllFields` | A line stores waypoints, end markers, style, and label | -| `LayoutLabel_Construction_StoresAllFields` | A label stores all eight fields | -| `LayoutBadge_Construction_StoresAllFields` | A badge stores all five fields | -| `LayoutBand_Construction_StoresAllFields` | A band stores all seven fields | -| `LayoutLifeline_Construction_StoresAllFields` | A lifeline stores all six fields | -| `LayoutActivation_Construction_StoresAllFields` | An activation stores all three fields | -| `LayoutGrid_Construction_StoresAllFields` | A grid stores rows, cells, and cell fields | -| `LayoutBox_Coordinates_AreAbsolute` | Box coordinates are stored without offset | -| `LayoutPort_Coordinates_AreAbsolute` | Port coordinates are stored without offset | -| `LayoutLine_Waypoints_AreAbsolute` | Line waypoints retain their absolute values | -| `LayoutBox_Depth_IsInteger` | Depth is stored as an integer with no color field | -| `LayoutBox_Children_ContainsNestedNodes` | Children hold heterogeneous nodes in insertion order | diff --git a/docs/verification/sysml2-tools-core/rendering.md b/docs/verification/sysml2-tools-core/rendering.md index c4ed20cd..524993fc 100644 --- a/docs/verification/sysml2-tools-core/rendering.md +++ b/docs/verification/sysml2-tools-core/rendering.md @@ -2,11 +2,15 @@ ### Verification Approach -The Rendering subsystem is verified by unit tests in `DemaConsulting.SysML2Tools.Tests`. -Tests assert that stub implementations (`SvgRenderer`, `PngRenderer`, `DiagramRenderer`) -throw `NotImplementedException` as documented, that the `Themes` static properties are -non-null and correctly initialized, and that `RenderOptions` default parameter values -match their documented defaults. No I/O or filesystem access is required. +The Rendering subsystem is verified by unit tests in `DemaConsulting.SysML2Tools.Tests`. The +SysML-agnostic rendering contracts and renderers (`IRenderer`, `Theme`, `RenderOptions`, +`RenderOutput`, and the `SvgRenderer` and `PngRenderer` implementations) are provided +off-the-shelf by the `DemaConsulting.Rendering` packages; the tests exercise them through +SysML2Tools to confirm the integration. Tests assert that the renderers report their media type +and default extension and write valid output for an empty `LayoutTree`, that the `Themes` static +properties are non-null and correctly initialized, that `RenderOptions` default parameter values +match their documented defaults, and that `DiagramRenderer` orchestrates the pipeline. No I/O or +filesystem access is required. ### Test Environment diff --git a/docs/verification/sysml2-tools-core/rendering/notation-metrics.md b/docs/verification/sysml2-tools-core/rendering/notation-metrics.md deleted file mode 100644 index 2b24cb2e..00000000 --- a/docs/verification/sysml2-tools-core/rendering/notation-metrics.md +++ /dev/null @@ -1,37 +0,0 @@ -### NotationMetrics Verification - -#### Verification Approach - -`NotationMetrics` is verified through unit tests in `NotationMetricsTests` that pin the canonical -notation values and prove every end-marker shape is a documented derivation of named metrics. The -tests map the tip-relative marker vertices back to the historical SVG marker-box points, confirming -that no geometry literal has drifted. The unit is pure, so no mocking is required. - -#### Test Environment - -Tests run via `dotnet test` against net8.0, net9.0, and net10.0. No external services, files, or -configuration are required beyond a standard .NET SDK installation. - -#### Acceptance Criteria - -- All `NotationMetricsTests` pass with zero failures across all target frameworks. -- The triangle, diamond, circle, bar, and crossbar constants match their canonical values. -- The triangle apex overshoots the endpoint and the diamond far point lands on the endpoint. -- Each end-marker style reports the documented along-line length. -- The rounded-rectangle radius equals the theme radius scaled by the documented factor. - -#### Test Scenarios - -| Test | Assertion | -| --- | --- | -| `TriangleFamily_HasCanonicalValues` | Triangle-family constants match the historical 10x7 refX 9 marker | -| `Diamond_HasCanonicalValues` | Diamond constants match the historical 14x8 refX 13 marker | -| `CircleAndBar_HaveCanonicalValues` | Circle (r4) and bar (4x12) constants match their canonical values | -| `Crossbar_IsDerivedFraction` | The crossbar position is the documented fraction of the marker length | -| `LabelBackground_ExtentMatchesInset` | The label-background extent is symmetric about the documented inset | -| `TriangleVertices_ReproduceSvgBoxPoints` | Triangle vertices reproduce the SVG marker-box points | -| `DiamondVertices_ReproduceSvgBoxPoints` | Diamond vertices reproduce the SVG marker-box points | -| `DiamondVertices_FarPoint_LandsOnEndpoint` | The diamond far point lands on the line endpoint | -| `TriangleVertices_Apex_OvershootsEndpoint` | The triangle apex overshoots the endpoint by the documented amount | -| `AlongLineLength_MatchesMarkerBox` | Each end-marker style reports the documented along-line length | -| `RoundedRectRadius_IsThemeRadiusTimesFactor` | The rounded-rectangle radius is the theme radius times the factor | diff --git a/docs/verification/sysml2-tools-core/rendering/rendering-contracts.md b/docs/verification/sysml2-tools-core/rendering/rendering-contracts.md deleted file mode 100644 index d12f5845..00000000 --- a/docs/verification/sysml2-tools-core/rendering/rendering-contracts.md +++ /dev/null @@ -1,41 +0,0 @@ -### RenderingContracts Verification - -#### Verification Approach - -The `RenderingContracts` unit is verified through unit tests in `RenderingTests` that exercise the -shipped `IRenderer` implementations (media type, extension, and empty-tree byte output), construct -`RenderOptions` and `RenderOutput` and assert their fields and defaults, and construct a `ViewContext` -for the `ILayoutStrategy` contract. `StdlibFilter` is verified indirectly through the integration -render of a user model, which produces output only for the user's own views. - -#### Test Environment - -Tests run via `dotnet test` against net8.0, net9.0, and net10.0. The renderer tests use in-memory -streams; no external services, files, or configuration are required beyond a standard .NET SDK -installation. - -#### Acceptance Criteria - -- All `RenderingTests` pass with zero failures across all target frameworks. -- The SVG and PNG renderers report the correct media type and extension and write valid bytes for an - empty tree. -- `RenderOptions` defaults are Scale 1.0, Dpi 96, and DepthLimit 0. -- `RenderOutput` and `ViewContext` store their fields unchanged. -- A user-model render contains only user-defined views, confirming stdlib filtering. - -#### Test Scenarios - -| Test | Assertion | -| --- | --- | -| `SvgRenderer_MediaType_IsImageSvgXml` | The SVG renderer reports `image/svg+xml` | -| `SvgRenderer_DefaultExtension_IsDotSvg` | The SVG renderer reports `.svg` | -| `SvgRenderer_Render_EmptyTree_WritesValidSvg` | An empty tree renders to a valid SVG document | -| `PngRenderer_MediaType_IsImagePng` | The PNG renderer reports `image/png` | -| `PngRenderer_DefaultExtension_IsDotPng` | The PNG renderer reports `.png` | -| `PngRenderer_Render_EmptyTree_WritesPngBytes` | An empty tree renders to PNG signature bytes | -| `ViewContext_Construction_StoresAllFields` | A ViewContext stores its view name and workspace | -| `RenderOptions_DefaultScale_IsOne` | RenderOptions defaults Scale to 1.0 | -| `RenderOptions_DefaultDpi_Is96` | RenderOptions defaults Dpi to 96 | -| `RenderOptions_DefaultDepthLimit_IsZero` | RenderOptions defaults DepthLimit to 0 | -| `RenderOutput_Construction_StoresAllFields` | A RenderOutput stores its three fields | -| `DiagramRenderer_RenderWorkspace_SoftwareStructureModel_ReturnsSvgOutput` | StdlibFilter limits output to user views | diff --git a/docs/verification/sysml2-tools-core/rendering/theme.md b/docs/verification/sysml2-tools-core/rendering/theme.md deleted file mode 100644 index 000cc692..00000000 --- a/docs/verification/sysml2-tools-core/rendering/theme.md +++ /dev/null @@ -1,26 +0,0 @@ -### Theme Verification - -#### Verification Approach - -`Theme` is verified through unit tests in `ThemeTests` that construct or read the built-in themes, -call `ConnectorApproachZone`, and assert on the returned geometry. The record is immutable and the -helper is pure, so no mocking is required. - -#### Test Environment - -Tests run via `dotnet test` against net8.0, net9.0, and net10.0. No external services, files, or -configuration are required beyond a standard .NET SDK installation. - -#### Acceptance Criteria - -- All `ThemeTests` pass with zero failures across all target frameworks. -- `ConnectorApproachZone` returns the sum of the stub, bend radius, and supplied clearance. -- The Light and Dark themes carry the same connector geometry; the Print theme is tighter with a - zero bend radius. - -#### Test Scenarios - -| Test | Assertion | -| --- | --- | -| `ConnectorApproachZone_SumsStubBendAndClearance` | The approach zone equals stub + bend radius + clearance | -| `Themes_HaveExpectedConnectorGeometry` | Light/Dark share connector geometry; Print is tighter with zero bend | diff --git a/docs/verification/sysml2-tools-png.md b/docs/verification/sysml2-tools-png.md deleted file mode 100644 index 884170cc..00000000 --- a/docs/verification/sysml2-tools-png.md +++ /dev/null @@ -1,48 +0,0 @@ -# DemaConsulting.SysML2Tools.Png Verification - -## Verification Approach - -The PNG renderer is verified using unit tests in -`test/DemaConsulting.SysML2Tools.Png.Tests/PngRendererTests.cs`. Tests construct -`LayoutTree` inputs directly, invoke `PngRenderer.Render`, and inspect the output -stream for PNG signature bytes and non-zero length. No filesystem access is required; -all I/O uses `MemoryStream`. Tests run against all three target frameworks. - -## Test Environment - -- Framework: xUnit v3 -- Target frameworks: net8.0, net9.0, net10.0 -- Test project: `DemaConsulting.SysML2Tools.Png.Tests` -- Dependencies: `DemaConsulting.SysML2Tools.Png`, `DemaConsulting.SysML2Tools`, SkiaSharp - -## Acceptance Criteria - -- `PngRenderer.MediaType` returns `"image/png"` -- `PngRenderer.DefaultExtension` returns `".png"` -- `Render` with any `LayoutTree` produces a non-empty stream whose first four bytes - are `0x89 0x50 0x4E 0x47` (PNG magic number) -- `Render` with a tree containing a `LayoutBox` produces a non-empty PNG output - without throwing -- `Render` with a tree containing a `LayoutLine` using the hollow-triangle-with-crossbar - end-marker style produces a non-empty PNG output without throwing - -## Test Scenarios - -### PngRenderer_Render_EmptyTree_WritesPngSignature - -Verifies that an empty `LayoutTree` (zero canvas size) produces a stream beginning -with the four-byte PNG signature `0x89 0x50 0x4E 0x47`. Confirms that SkiaSharp -produces valid PNG output even for the minimal 1×1 bitmap case. - -### PngRenderer_Render_SingleBox_ProducesNonEmptyOutput - -Verifies that a `LayoutTree` containing one `LayoutBox` produces a non-empty PNG -stream with the PNG signature. Confirms that box drawing operations complete without -error and produce a rasterized output. - -### PngRenderer_Render_DrawArrowhead_OpenWithCrossbar_ProducesNonEmptyOutput - -Verifies that a `LayoutTree` containing a `LayoutLine` with `TargetEnd` set to -`EndMarkerStyle.HollowTriangleCrossbar` produces a non-empty PNG output stream beginning with -the PNG signature bytes. Confirms that the hollow-triangle-with-crossbar end-marker style renders -without throwing and produces valid PNG output. diff --git a/docs/verification/sysml2-tools-png/png-renderer.md b/docs/verification/sysml2-tools-png/png-renderer.md deleted file mode 100644 index 3b66586e..00000000 --- a/docs/verification/sysml2-tools-png/png-renderer.md +++ /dev/null @@ -1,52 +0,0 @@ -### PngRenderer Verification - -#### Verification Approach - -`PngRenderer` is verified by unit tests in `PngRendererTests` and `PngEndMarkerTests` (in the -`DemaConsulting.SysML2Tools.Png.Tests` project) plus the renderer-contract tests in `RenderingTests` -(in `DemaConsulting.SysML2Tools.Tests`). Tests construct a `PngRenderer`, render a small `LayoutTree`, -and assert on the decoded PNG - checking the signature bytes and sampling individual pixels. No mocking -is required; the unit's public `Render` method is exercised end to end. - -#### Test Environment - -Tests run via `dotnet test` against net8.0, net9.0, and net10.0. Layout trees are constructed inline; -no files on disk, network access, or additional configuration are required beyond a standard .NET SDK -installation and the SkiaSharp native assets restored with the package. - -#### Acceptance Criteria - -- `MediaType` is `"image/png"` and `DefaultExtension` is `".png"`. -- Any layout tree, including an empty one, yields a valid PNG that begins with the PNG signature and - has a white background. -- Each box rasterizes as a filled, stroked rectangle whose fill follows the theme depth colours, and - deeply nested boxes render without exhausting the stack. -- Label text rasterizes to a valid PNG even when it contains XML-special characters. -- Each connector line rasterizes in the theme stroke colour. -- Port, badge, band, lifeline, activation, and grid nodes each rasterize with their notation colours. -- Connector end markers rasterize with geometry derived from `NotationMetrics`. - -#### Test Scenarios - -| Test | Assertion | -| --- | --- | -| `PngRenderer_MediaType_IsImagePng` | MediaType is `image/png` | -| `PngRenderer_DefaultExtension_IsDotPng` | DefaultExtension is `.png` | -| `PngRenderer_Render_EmptyTree_WritesPngBytes` | Empty tree yields non-empty PNG bytes | -| `PngRenderer_Render_EmptyTree_WritesPngSignature` | Output begins with the PNG signature | -| `PngRenderer_Render_BackgroundIsWhite` | The background pixel is white | -| `PngRenderer_Render_SingleBox_ProducesNonEmptyOutput` | A box renders without error | -| `PngRenderer_Render_SingleBox_FillColorMatchesTheme` | Box fill matches the theme colour | -| `PngRenderer_Render_SingleBox_DepthOneUsesSecondColor` | Depth-one box uses the second depth colour | -| `PngRenderer_Render_DeeplyNestedBoxes_DoesNotStackOverflow` | Deep nesting renders without overflow | -| `PngRenderer_Render_LabelWithXmlSpecialCharacters_ProducesValidPng` | Special-character text yields a valid PNG | -| `PngRenderer_Render_SingleLine_PixelOnLineIsStrokeColor` | A line pixel is the stroke colour | -| `PngRenderer_Render_SinglePort_CenterPixelIsStrokeColor` | A port centre pixel is the stroke colour | -| `PngRenderer_Render_SingleBadge_FilledCircle_CenterPixelIsStrokeColor` | A badge centre pixel is the stroke colour | -| `PngRenderer_Render_SingleLifeline_StemPixelIsStrokeColor` | A lifeline stem pixel is the stroke colour | -| `PngRenderer_Render_SingleActivation_CenterPixelIsWhite` | An activation centre pixel is white | -| `PngRenderer_Render_SingleGrid_HeaderFillMatchesTheme` | A grid header fill matches the theme | -| `PngRenderer_Render_DrawArrowhead_OpenWithCrossbar_ProducesNonEmptyOutput` | Crossbar marker renders without error | -| `FilledArrow_AlongLength_MatchesNotationMetrics` | Filled arrow length matches NotationMetrics | -| `FilledArrow_BaseWidth_MatchesNotationMetrics` | Filled arrow base width matches NotationMetrics | -| `OpenChevron_HasFewerInkPixelsThanClosedTriangle` | Open chevron inks fewer pixels than a closed triangle | diff --git a/docs/verification/sysml2-tools-svg.md b/docs/verification/sysml2-tools-svg.md deleted file mode 100644 index 2005cd29..00000000 --- a/docs/verification/sysml2-tools-svg.md +++ /dev/null @@ -1,57 +0,0 @@ -# DemaConsulting.SysML2Tools.Svg Verification - -## Verification Approach - -The SVG renderer is verified using unit tests in -`test/DemaConsulting.SysML2Tools.Svg.Tests/SvgRendererTests.cs`. Tests construct -`LayoutTree` inputs directly, invoke `SvgRenderer.Render`, and inspect the output -stream for expected SVG elements. No filesystem access is required; all I/O uses -`MemoryStream`. Tests run against all three target frameworks (net8.0, net9.0, net10.0). - -## Test Environment - -- Framework: xUnit v3 -- Target frameworks: net8.0, net9.0, net10.0 -- Test project: `DemaConsulting.SysML2Tools.Svg.Tests` -- Dependencies: `DemaConsulting.SysML2Tools.Svg`, `DemaConsulting.SysML2Tools` - -## Acceptance Criteria - -- `SvgRenderer.MediaType` returns `"image/svg+xml"` -- `SvgRenderer.DefaultExtension` returns `".svg"` -- `Render` with any `LayoutTree` produces a non-empty stream containing `` -- `Render` with a tree containing a `LayoutBox` produces a stream containing `` tags. Confirms basic document structure for the trivial case. - -### SvgRenderer_Render_SingleBox_ProducesRectElement - -Verifies that a `LayoutTree` containing one `LayoutBox` produces SVG output containing -a ` Date: Thu, 2 Jul 2026 20:01:02 -0400 Subject: [PATCH 3/5] Regenerate diagram gallery after DemaConsulting.Rendering adoption Regenerate the committed gallery renders from the sample models with the migrated layout. Six of the eight views are byte-identical; the General (drone) and State Transition (elevator) views shift slightly because the layered and containment algorithms in the DemaConsulting.Rendering packages pack and space nodes marginally differently from the previous internal engine. Only those two views' SVG and PNG outputs change. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- docs/gallery/png/DroneGeneralView.png | Bin 94952 -> 98127 bytes .../png/ElevatorStateTransitionView.png | Bin 24551 -> 24398 bytes docs/gallery/svg/DroneGeneralView.svg | 230 +++++++++--------- .../svg/ElevatorStateTransitionView.svg | 8 +- 4 files changed, 119 insertions(+), 119 deletions(-) diff --git a/docs/gallery/png/DroneGeneralView.png b/docs/gallery/png/DroneGeneralView.png index 7ac19c090695263c8b85d323e8bd10b429670433..2106dc7e94c1e52bb972460221329e833cad0368 100644 GIT binary patch literal 98127 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π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 gHU2HF`~iQK{{3H=`YAPmARlo>F)04 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 + @@ -30,127 +30,127 @@ - - «package» - QuadcopterDrone + + «package» + QuadcopterDrone «interface def» PowerBus - - «interface def» - DataBus - - «port def» - PowerPort + + «interface def» + DataBus + + «port def» + PowerPort «port def» TelemetryPort - - «port def» - MotorControlPort + + «port def» + MotorControlPort «port def» SensorPort - - «attribute def» - Mass - - «attribute def» - Voltage - - «enum def» - FlightMode - - «part def» - Battery - - attributes - capacity : Voltage - - ports - output : PowerPort - - «part def» - FlightController - - attributes - mode : FlightMode - - ports - power : PowerPort - telemetry : TelemetryPort - motors : MotorControlPort - sensors : SensorPort - - «part def» - Motor - - attributes - maxThrust : Mass - - ports - control : MotorControlPort - - «part def» - Propeller - - «part def» - ImuSensor - - ports - data : SensorPort - - «part def» - GpsSensor - - ports - data : SensorPort - - «part def» - Frame - - «part def» - RacingMotor - - «part def» - EnduranceBattery - - «part def» - Drone - - attributes - totalMass : Mass - - parts - airframe : Frame - battery : Battery - controller : FlightController - motors : Motor [4] - propellers : Propeller [4] - imu : ImuSensor - gps : GpsSensor - - «requirement def» - FlightTimeRequirement - - - - - - - - - - - - - - - - - - - - - + + «attribute def» + Mass + + «attribute def» + Voltage + + «enum def» + FlightMode + + «part def» + Battery + + attributes + capacity : Voltage + + ports + output : PowerPort + + «part def» + FlightController + + attributes + mode : FlightMode + + ports + power : PowerPort + telemetry : TelemetryPort + motors : MotorControlPort + sensors : SensorPort + + «part def» + Motor + + attributes + maxThrust : Mass + + ports + control : MotorControlPort + + «part def» + Propeller + + «part def» + ImuSensor + + ports + data : SensorPort + + «part def» + GpsSensor + + ports + data : SensorPort + + «part def» + Frame + + «part def» + RacingMotor + + «part def» + EnduranceBattery + + «part def» + Drone + + attributes + totalMass : Mass + + parts + airframe : Frame + battery : Battery + controller : FlightController + motors : Motor [4] + propellers : Propeller [4] + imu : ImuSensor + gps : GpsSensor + + «requirement def» + FlightTimeRequirement + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/gallery/svg/ElevatorStateTransitionView.svg b/docs/gallery/svg/ElevatorStateTransitionView.svg index 6324db64..eef536ba 100644 --- a/docs/gallery/svg/ElevatorStateTransitionView.svg +++ b/docs/gallery/svg/ElevatorStateTransitionView.svg @@ -55,15 +55,15 @@ - + - + [callReceived] [doorsClosed] [atFloor] [atFloor] [doorsAreOpen] - [timeout] + [timeout] [goingDown] - [idleTimeout] + [idleTimeout] From f8c0c6785bf2daece0e1fde3bfee244dcb96f877 Mon Sep 17 00:00:00 2001 From: Malcolm Nixon Date: Thu, 2 Jul 2026 20:25:21 -0400 Subject: [PATCH 4/5] Address formal-review findings from Rendering migration Fix migration-caused documentation staleness surfaced by the formal-review pass over the affected review-sets: - action-flow / state-transition strategy design: drop stale NotationMetrics and Theme.CleanLegMargin back-edge wording; note the ~1px cosmetic back-edge difference from the dropped BackEdgeEntryApproach knob. - general strategy design: cite the ContainmentLayout.Pack / ConnectorRouter.Route / BoxMetrics OTS calls; labelled -> labeled. - diagram-renderer design: drop 'future phase injects ILayoutStrategy' wording; mark LayoutTree / IRenderer / RenderOptions / RenderOutput as OTS-owned. - rendering.yaml: retarget the mis-traced ILayoutStrategy requirement onto real end-to-end BuildLayout tests (SoftwareStructureModel/GeneralViewModel render). - ots/dema-rendering.yaml: narrow the routing requirement wording to the tested evidence. - LayeredPlacement.cs: add XML doc to Place. Build green; lint.ps1 green. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../action-flow-view-layout-strategy.md | 8 ++++---- .../internal/general-view-layout-strategy.md | 19 ++++++++++++------- .../state-transition-view-layout-strategy.md | 9 +++++---- .../rendering/diagram-renderer.md | 10 ++++++---- docs/reqstream/ots/dema-rendering.yaml | 10 +++++----- .../general-view-layout-strategy.yaml | 8 ++++---- .../sysml2-tools-core/rendering.yaml | 2 ++ .../Layout/Internal/LayeredPlacement.cs | 3 +++ 8 files changed, 41 insertions(+), 28 deletions(-) diff --git a/docs/design/sysml2-tools-core/layout/internal/action-flow-view-layout-strategy.md b/docs/design/sysml2-tools-core/layout/internal/action-flow-view-layout-strategy.md index e556e2db..87732d7a 100644 --- a/docs/design/sysml2-tools-core/layout/internal/action-flow-view-layout-strategy.md +++ b/docs/design/sysml2-tools-core/layout/internal/action-flow-view-layout-strategy.md @@ -40,10 +40,10 @@ Action boxes are positioned by calling `LayeredPlacement.Place` with a top-to-bo direction: each action becomes a sized node and each succession a directed edge, so the flow reads top-to-bottom. `LayeredPlacement` delegates to the off-the-shelf `DemaConsulting.Rendering.Layout` layered algorithm, which returns placed rectangles for the actions and routed orthogonal polylines -for the successions. The strategy uses the open-chevron along-line length from `NotationMetrics` in -`DemaConsulting.Rendering.Abstractions`, plus `Theme.LineCornerRadius` and `Theme.CleanLegMargin`, so -any routed back edge has enough final -straight approach that the renderer's rounded corner never intrudes into the end marker. The placed +for the successions, each already oriented source-to-target because the algorithm reverses back +edges internally. (The previous internal engine reserved a custom straight approach for the +open-chevron marker on reversed edges; that knob has no public equivalent, so a reversed +succession's final approach may differ by about a pixel — a purely cosmetic change.) The placed coordinates are normalized so the content starts at a margin offset, reserving a `MarkerBand` of empty space at the top (for the start marker) and at the bottom (for the done marker). The canvas is sized to the full content extent, including routed succession polylines that can bulge beyond the box diff --git a/docs/design/sysml2-tools-core/layout/internal/general-view-layout-strategy.md b/docs/design/sysml2-tools-core/layout/internal/general-view-layout-strategy.md index 823035bf..0639018c 100644 --- a/docs/design/sysml2-tools-core/layout/internal/general-view-layout-strategy.md +++ b/docs/design/sysml2-tools-core/layout/internal/general-view-layout-strategy.md @@ -4,12 +4,14 @@ `GeneralViewLayoutStrategy` implements `ILayoutStrategy` to produce a General View diagram. It renders every user-defined definition (part, port, interface, requirement, action, and so on) as -a keyword-labelled box, groups the boxes that belong to a package inside a folder-shaped +a keyword-labeled box, groups the boxes that belong to a package inside a folder-shaped container, lists each definition's owned usages in compartments, and draws specialization, -membership, and attribute-typing edges orthogonally between the boxes. Box placement and -intra-package edge routing are delegated through `LayeredPlacement` to the off-the-shelf -`DemaConsulting.Rendering.Layout` layered algorithm, so definitions and their relationships are -arranged the same way as ELK's layered algorithm. +membership, and attribute-typing edges orthogonally between the boxes. Within each package folder, +box placement and intra-package edge routing are delegated through `LayeredPlacement` to the +off-the-shelf `DemaConsulting.Rendering.Layout` layered algorithm; the folders themselves are packed +across the canvas with `ContainmentLayout.Pack`, and the rare cross-package edge is routed with +`ConnectorRouter.Route`, both from `DemaConsulting.Rendering.Layout`. Box title and folder-tab +geometry come from `BoxMetrics` in `DemaConsulting.Rendering.Abstractions`. ##### Data Model @@ -108,8 +110,11 @@ produces valid geometry, so no crossing warnings are emitted. - `ILayoutStrategy` and `ViewContext` (Rendering subsystem) — the strategy contract and view input. - `RenderOptions` and `Theme` (`DemaConsulting.Rendering.Abstractions`) — render options and sizing inputs. -- `LayeredPlacement` (Layout Internal subsystem) — box placement and orthogonal routing through - `DemaConsulting.Rendering.Layout`. +- `LayeredPlacement` (Layout Internal subsystem) — per-package box placement and orthogonal routing + through `DemaConsulting.Rendering.Layout`. +- `ContainmentLayout` and `ConnectorRouter` (`DemaConsulting.Rendering.Layout`) — folder packing + across the canvas and cross-package connector routing. +- `BoxMetrics` (`DemaConsulting.Rendering.Abstractions`) — box title-area and folder-tab geometry. - `StdlibFilter` (Rendering Internal subsystem) — standard-library exclusion. - `SysmlWorkspace`, `SysmlDefinitionNode`, `SysmlFeatureNode` (Semantic subsystem) — model input. - The `LayoutTree`, `LayoutBox`, `LayoutCompartment`, `LayoutLine`, and `Point2D` data types diff --git a/docs/design/sysml2-tools-core/layout/internal/state-transition-view-layout-strategy.md b/docs/design/sysml2-tools-core/layout/internal/state-transition-view-layout-strategy.md index 2862db04..0127fd62 100644 --- a/docs/design/sysml2-tools-core/layout/internal/state-transition-view-layout-strategy.md +++ b/docs/design/sysml2-tools-core/layout/internal/state-transition-view-layout-strategy.md @@ -42,10 +42,11 @@ State boxes are positioned by calling `LayeredPlacement.Place` with a top-to-bot direction: each state becomes a sized node and each non-self transition a directed edge, so the machine reads top-to-bottom. `LayeredPlacement` delegates to the off-the-shelf `DemaConsulting.Rendering.Layout` layered algorithm, which returns placed rectangles for the states -and routed orthogonal polylines for the transitions. The strategy uses the open-chevron along-line -length from `NotationMetrics` in `DemaConsulting.Rendering.Abstractions`, plus -`Theme.LineCornerRadius` and `Theme.CleanLegMargin`, so any routed back edge has enough final straight -approach that the renderer's rounded corner never intrudes into the end marker. The placed coordinates +and routed orthogonal polylines for the transitions, each already oriented source-to-target because +the algorithm reverses back edges internally. (The previous internal engine reserved a custom +straight approach for the open-chevron marker on reversed edges; that knob has no public equivalent, +so a reversed transition's final approach may differ by about a pixel — a purely cosmetic change.) +The placed coordinates are normalized so the content starts at a margin offset (reserving room at the top for the initial marker), and the canvas is sized to the full content extent, including routed transition polylines that can bulge beyond the box columns and the actual diff --git a/docs/design/sysml2-tools-core/rendering/diagram-renderer.md b/docs/design/sysml2-tools-core/rendering/diagram-renderer.md index c5524002..a621bc01 100644 --- a/docs/design/sysml2-tools-core/rendering/diagram-renderer.md +++ b/docs/design/sysml2-tools-core/rendering/diagram-renderer.md @@ -10,9 +10,9 @@ Rendering pieces are joined. #### Data Model -`DiagramRenderer` is a `sealed class` with no instance state (a future phase will inject an -`ILayoutStrategy`). It collaborates with `ViewContext`, `RenderOptions`, `RenderOutput`, the internal -`DiagramTypeRouter`, and the internal `StdlibFilter`. +`DiagramRenderer` is a `sealed class` with no instance state. It collaborates with the SysML-coupled +`ViewContext`, the internal `DiagramTypeRouter`, and the internal `StdlibFilter`, and with the +off-the-shelf `RenderOptions` and `RenderOutput` records from `DemaConsulting.Rendering.Abstractions`. #### Key Methods @@ -44,7 +44,9 @@ failing the whole render. #### Dependencies - `SysmlWorkspace`, `SysmlViewNode`, `SysmlDefinitionNode` (Semantic subsystem). -- `ILayoutStrategy`, `IRenderer`, `RenderOptions`, `RenderOutput`, `ViewContext` (Rendering subsystem). +- `ILayoutStrategy`, `ViewContext` (retained SysML-coupled Rendering subsystem contract). +- `LayoutTree`, `IRenderer`, `RenderOptions`, `RenderOutput` (off-the-shelf, from the + `DemaConsulting.Rendering` and `DemaConsulting.Rendering.Abstractions` OTS packages). - `DiagramTypeRouter` and `StdlibFilter` (Rendering Internal subsystem). #### Callers diff --git a/docs/reqstream/ots/dema-rendering.yaml b/docs/reqstream/ots/dema-rendering.yaml index b9d64932..e0eb39cb 100644 --- a/docs/reqstream/ots/dema-rendering.yaml +++ b/docs/reqstream/ots/dema-rendering.yaml @@ -62,12 +62,12 @@ sections: - id: SysML2Tools-OTS-DemaRendering-Routing title: >- DemaConsulting.Rendering shall route connectors as orthogonal segments between the - boxes it places without running them through unrelated boxes. + boxes it places. justification: | - Readable diagrams require connectors that turn at right angles and skirt the boxes - between their endpoints. The package's orthogonal router produces such polylines, - evidenced by forward chains that route top-to-bottom orthogonally and by the routed - connectors produced for an interconnection diagram whose boxes do not overlap. + Readable diagrams require connectors that turn at right angles between their + endpoints. The package's orthogonal router produces such polylines, evidenced by + forward chains that route top-to-bottom orthogonally and by the routed connectors + produced for an interconnection diagram whose boxes do not overlap. tags: [ots] tests: - ActionFlowView_BuildLayout_ForwardChain_FlowsTopToBottomOrthogonally diff --git a/docs/reqstream/sysml2-tools-core/layout/internal/general-view-layout-strategy.yaml b/docs/reqstream/sysml2-tools-core/layout/internal/general-view-layout-strategy.yaml index 8a9567aa..ee5a579f 100644 --- a/docs/reqstream/sysml2-tools-core/layout/internal/general-view-layout-strategy.yaml +++ b/docs/reqstream/sysml2-tools-core/layout/internal/general-view-layout-strategy.yaml @@ -11,11 +11,11 @@ sections: requirements: - id: SysML2Tools-Core-Layout-Internal-GeneralViewLayoutStrategy-Definitions title: >- - GeneralViewLayoutStrategy shall render each user-defined definition as a labelled box + GeneralViewLayoutStrategy shall render each user-defined definition as a labeled box that carries the definition's keyword. justification: | A General View shows the user's declared definitions of every kind (part, port, - interface, action, and so on). Rendering each as a keyword-labelled box is the + interface, action, and so on). Rendering each as a keyword-labeled box is the observable content the view exists to provide. tests: - GeneralViewLayoutStrategy_BuildLayout_OneUserPartDef_ProducesLayoutBox @@ -24,9 +24,9 @@ sections: - id: SysML2Tools-Core-Layout-Internal-GeneralViewLayoutStrategy-PackageGrouping title: >- GeneralViewLayoutStrategy shall group the definitions that belong to a package within a - folder-shaped container box labelled with the package name. + folder-shaped container box labeled with the package name. justification: | - Grouping a package's definitions inside a labelled folder communicates ownership and + Grouping a package's definitions inside a labeled folder communicates ownership and keeps related definitions visually together, which is essential for readable diagrams of larger models. tests: diff --git a/docs/reqstream/sysml2-tools-core/rendering.yaml b/docs/reqstream/sysml2-tools-core/rendering.yaml index 5fc9252a..cdcbdf26 100644 --- a/docs/reqstream/sysml2-tools-core/rendering.yaml +++ b/docs/reqstream/sysml2-tools-core/rendering.yaml @@ -97,6 +97,8 @@ sections: consumed by any IRenderer implementation, maximizing reuse. tests: - ViewContext_Construction_StoresAllFields + - DiagramRenderer_RenderWorkspace_SoftwareStructureModel_ReturnsSvgOutput + - DiagramRenderer_RenderWorkspace_GeneralViewModel_SvgContainsElementNames - id: SysML2Tools-Core-Rendering-DiagramRenderer title: >- diff --git a/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/LayeredPlacement.cs b/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/LayeredPlacement.cs index e54f399d..4bcc30f7 100644 --- a/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/LayeredPlacement.cs +++ b/src/DemaConsulting.SysML2Tools.Core/Layout/Internal/LayeredPlacement.cs @@ -45,6 +45,9 @@ internal static class LayeredPlacement /// Directed edges between nodes (by index), in caller order. /// Primary flow direction for the layered layout. /// The placed rectangles, routed polylines, and overall content size. + /// + /// Thrown when or is . + /// public static PlacedLayout Place( IReadOnlyList<(double Width, double Height)> nodes, IReadOnlyList<(int From, int To)> edges, From 1212b63cb3de1cdc6c843917359e15342c3f26c4 Mon Sep 17 00:00:00 2001 From: Malcolm Nixon Date: Thu, 2 Jul 2026 20:30:51 -0400 Subject: [PATCH 5/5] Reframe OTS-owned rendering requirements as consumption Close the Contracts formal-review finding that rendering.yaml framed contracts now owned by DemaConsulting.Rendering.Abstractions/Svg/Skia as subsystem-provided. Reword the IRenderer, Theme, RenderOptions, and BuiltinThemes requirement titles to consumption phrasing (render/style/configure using off-the-shelf ...). IDs and traced tests are unchanged, so traceability is preserved; all referenced tests still exist in RenderingTests.cs and pass. lint.ps1 green. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../sysml2-tools-core/rendering.yaml | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/docs/reqstream/sysml2-tools-core/rendering.yaml b/docs/reqstream/sysml2-tools-core/rendering.yaml index cdcbdf26..d34398de 100644 --- a/docs/reqstream/sysml2-tools-core/rendering.yaml +++ b/docs/reqstream/sysml2-tools-core/rendering.yaml @@ -15,10 +15,10 @@ sections: requirements: - id: SysML2Tools-Core-Rendering-IRenderer title: >- - The Rendering subsystem shall provide format renderers that each report the - media type and the default file extension of the output they produce, and that - write a laid-out diagram to a caller-supplied output stream according to the - supplied render options. + The Rendering subsystem shall render diagrams using off-the-shelf format renderers + that each report the media type and the default file extension of the output they + produce, and that write a laid-out diagram to a caller-supplied output stream + according to the supplied render options. justification: | A common IRenderer contract allows the orchestrator (DiagramRenderer) and the CLI tool to treat SVG and PNG renderers uniformly. Callers can select a renderer @@ -46,10 +46,11 @@ sections: - id: SysML2Tools-Core-Rendering-Theme title: >- - The Rendering subsystem shall provide a theme that determines a diagram's - complete appearance — including per-depth fill colors, stroke color and width, - line corner radius, title and body font sizes, label padding, and connector stub - and bend geometry — so that appearance is governed entirely by the selected theme. + The Rendering subsystem shall style diagrams using an off-the-shelf theme that + determines a diagram's complete appearance — including per-depth fill colors, + stroke color and width, line corner radius, title and body font sizes, label + padding, and connector stub and bend geometry — so that appearance is governed + entirely by the selected theme. justification: | Centralizing all visual parameters in a Theme record allows the entire appearance of a rendered diagram to be changed by substituting a single object, without @@ -74,9 +75,10 @@ sections: - id: SysML2Tools-Core-Rendering-RenderOptions title: >- - The Rendering subsystem shall let callers supply render options — a theme, a - scale factor defaulting to 1.0, an output resolution defaulting to 96 DPI, and a - depth limit defaulting to 0 (meaning unlimited) — that govern how a diagram is produced. + The Rendering subsystem shall configure rendering through off-the-shelf render + options — a theme, a scale factor defaulting to 1.0, an output resolution + defaulting to 96 DPI, and a depth limit defaulting to 0 (meaning unlimited) — + that govern how a diagram is produced. justification: | RenderOptions bundles all rendering parameters into one object passed to both ILayoutStrategy.BuildLayout and IRenderer.Render. A DepthLimit of 0 meaning @@ -126,9 +128,9 @@ sections: - id: SysML2Tools-Core-Rendering-BuiltinThemes title: >- - The Rendering subsystem shall provide at least three built-in themes: a light - theme for screen display, a dark theme for dark-mode display, and a print theme - for black-and-white output. + The Rendering subsystem shall have available at least three off-the-shelf themes: + a light theme for screen display, a dark theme for dark-mode display, and a print + theme for black-and-white output. justification: | Built-in themes allow callers to produce professional output without specifying every visual parameter. They also serve as reference values for testing and as