From 29b2572f9ad552a68b8651f67fe36a761d3f0bed Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Mon, 16 Mar 2026 00:39:34 -0400 Subject: [PATCH] feat: add IRapidPlanner, RapidPath, and SafeHeightRapidPlanner --- .../RapidPlanning/IRapidPlanner.cs | 10 +++++ OpenNest.Engine/RapidPlanning/RapidPath.cs | 11 ++++++ .../RapidPlanning/SafeHeightRapidPlanner.cs | 17 ++++++++ .../SafeHeightRapidPlannerTests.cs | 39 +++++++++++++++++++ 4 files changed, 77 insertions(+) create mode 100644 OpenNest.Engine/RapidPlanning/IRapidPlanner.cs create mode 100644 OpenNest.Engine/RapidPlanning/RapidPath.cs create mode 100644 OpenNest.Engine/RapidPlanning/SafeHeightRapidPlanner.cs create mode 100644 OpenNest.Tests/RapidPlanning/SafeHeightRapidPlannerTests.cs diff --git a/OpenNest.Engine/RapidPlanning/IRapidPlanner.cs b/OpenNest.Engine/RapidPlanning/IRapidPlanner.cs new file mode 100644 index 0000000..edae37c --- /dev/null +++ b/OpenNest.Engine/RapidPlanning/IRapidPlanner.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; +using OpenNest.Geometry; + +namespace OpenNest.Engine.RapidPlanning +{ + public interface IRapidPlanner + { + RapidPath Plan(Vector from, Vector to, IReadOnlyList cutAreas); + } +} diff --git a/OpenNest.Engine/RapidPlanning/RapidPath.cs b/OpenNest.Engine/RapidPlanning/RapidPath.cs new file mode 100644 index 0000000..8ff6eb4 --- /dev/null +++ b/OpenNest.Engine/RapidPlanning/RapidPath.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; +using OpenNest.Geometry; + +namespace OpenNest.Engine.RapidPlanning +{ + public readonly struct RapidPath + { + public bool HeadUp { get; init; } + public List Waypoints { get; init; } + } +} diff --git a/OpenNest.Engine/RapidPlanning/SafeHeightRapidPlanner.cs b/OpenNest.Engine/RapidPlanning/SafeHeightRapidPlanner.cs new file mode 100644 index 0000000..6de4db6 --- /dev/null +++ b/OpenNest.Engine/RapidPlanning/SafeHeightRapidPlanner.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; +using OpenNest.Geometry; + +namespace OpenNest.Engine.RapidPlanning +{ + public class SafeHeightRapidPlanner : IRapidPlanner + { + public RapidPath Plan(Vector from, Vector to, IReadOnlyList cutAreas) + { + return new RapidPath + { + HeadUp = true, + Waypoints = new List() + }; + } + } +} diff --git a/OpenNest.Tests/RapidPlanning/SafeHeightRapidPlannerTests.cs b/OpenNest.Tests/RapidPlanning/SafeHeightRapidPlannerTests.cs new file mode 100644 index 0000000..3db408f --- /dev/null +++ b/OpenNest.Tests/RapidPlanning/SafeHeightRapidPlannerTests.cs @@ -0,0 +1,39 @@ +using System.Collections.Generic; +using OpenNest.Engine.RapidPlanning; +using OpenNest.Geometry; +using Xunit; + +namespace OpenNest.Tests.RapidPlanning; + +public class SafeHeightRapidPlannerTests +{ + [Fact] + public void AlwaysReturnsHeadUp() + { + var planner = new SafeHeightRapidPlanner(); + var from = new Vector(10, 10); + var to = new Vector(50, 50); + var cutAreas = new List(); + + var result = planner.Plan(from, to, cutAreas); + + Assert.True(result.HeadUp); + Assert.Empty(result.Waypoints); + } + + [Fact] + public void ReturnsHeadUp_EvenWithCutAreas() + { + var planner = new SafeHeightRapidPlanner(); + var from = new Vector(0, 0); + var to = new Vector(10, 10); + + var shape = new Shape(); + shape.Entities.Add(new Line(new Vector(5, 0), new Vector(5, 20))); + var cutAreas = new List { shape }; + + var result = planner.Plan(from, to, cutAreas); + + Assert.True(result.HeadUp); + } +}