diff --git a/OpenNest.Engine/Strategies/FillStrategyRegistry.cs b/OpenNest.Engine/Strategies/FillStrategyRegistry.cs index 581b4bf..1c1759b 100644 --- a/OpenNest.Engine/Strategies/FillStrategyRegistry.cs +++ b/OpenNest.Engine/Strategies/FillStrategyRegistry.cs @@ -12,6 +12,7 @@ namespace OpenNest.Engine.Strategies private static readonly List strategies = new(); private static List sorted; private static HashSet enabledFilter; + private static readonly HashSet disabled = new(StringComparer.OrdinalIgnoreCase); static FillStrategyRegistry() { @@ -19,9 +20,36 @@ namespace OpenNest.Engine.Strategies } public static IReadOnlyList Strategies => - sorted ??= (enabledFilter != null - ? strategies.Where(s => enabledFilter.Contains(s.Name)).OrderBy(s => s.Order).ToList() - : strategies.OrderBy(s => s.Order).ToList()); + sorted ??= FilterStrategies(); + + private static List FilterStrategies() + { + var source = enabledFilter != null + ? strategies.Where(s => enabledFilter.Contains(s.Name)) + : strategies.Where(s => !disabled.Contains(s.Name)); + return source.OrderBy(s => s.Order).ToList(); + } + + /// + /// Permanently disables strategies by name. They remain registered + /// but are excluded from the default pipeline. + /// + public static void Disable(params string[] names) + { + foreach (var name in names) + disabled.Add(name); + sorted = null; + } + + /// + /// Re-enables a previously disabled strategy. + /// + public static void Enable(params string[] names) + { + foreach (var name in names) + disabled.Remove(name); + sorted = null; + } /// /// Restricts the active strategies to only those whose names are listed. diff --git a/OpenNest.Tests/Strategies/FillPipelineTests.cs b/OpenNest.Tests/Strategies/FillPipelineTests.cs index 4fe34b1..6f6bb70 100644 --- a/OpenNest.Tests/Strategies/FillPipelineTests.cs +++ b/OpenNest.Tests/Strategies/FillPipelineTests.cs @@ -1,3 +1,4 @@ +using OpenNest.Engine.Strategies; using OpenNest.Geometry; namespace OpenNest.Tests.Strategies; @@ -24,8 +25,8 @@ public class FillPipelineTests engine.Fill(item, plate.WorkArea(), null, System.Threading.CancellationToken.None); - Assert.True(engine.PhaseResults.Count >= 6, - $"Expected phase results from all strategies, got {engine.PhaseResults.Count}"); + Assert.True(engine.PhaseResults.Count >= FillStrategyRegistry.Strategies.Count, + $"Expected phase results from all active strategies, got {engine.PhaseResults.Count}"); } [Fact]