The filter only checked ShortestSide against the plate's short dimension, allowing results where the long side far exceeded the plate length. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
49 lines
1.6 KiB
C#
49 lines
1.6 KiB
C#
using System.Collections.Generic;
|
|
|
|
namespace OpenNest.Engine.BestFit
|
|
{
|
|
public class BestFitFilter
|
|
{
|
|
public double MaxPlateWidth { get; set; }
|
|
public double MaxPlateHeight { get; set; }
|
|
public double MaxAspectRatio { get; set; } = 5.0;
|
|
public double MinUtilization { get; set; } = 0.3;
|
|
public double UtilizationOverride { get; set; } = 0.75;
|
|
|
|
public void Apply(List<BestFitResult> results)
|
|
{
|
|
foreach (var result in results)
|
|
{
|
|
if (!result.Keep)
|
|
continue;
|
|
|
|
if (result.ShortestSide > System.Math.Min(MaxPlateWidth, MaxPlateHeight) ||
|
|
result.LongestSide > System.Math.Max(MaxPlateWidth, MaxPlateHeight))
|
|
{
|
|
result.Keep = false;
|
|
result.Reason = "Exceeds plate dimensions";
|
|
continue;
|
|
}
|
|
|
|
var aspect = result.LongestSide / result.ShortestSide;
|
|
|
|
if (aspect > MaxAspectRatio && result.Utilization < UtilizationOverride)
|
|
{
|
|
result.Keep = false;
|
|
result.Reason = string.Format("Aspect ratio {0:F1} exceeds max {1}", aspect, MaxAspectRatio);
|
|
continue;
|
|
}
|
|
|
|
if (result.Utilization < MinUtilization)
|
|
{
|
|
result.Keep = false;
|
|
result.Reason = string.Format("Utilization {0:P0} below minimum", result.Utilization);
|
|
continue;
|
|
}
|
|
|
|
result.Reason = "Valid";
|
|
}
|
|
}
|
|
}
|
|
}
|