diff --git a/OpenNest.Core/Plate.cs b/OpenNest.Core/Plate.cs
index 5e01d5b..2614922 100644
--- a/OpenNest.Core/Plate.cs
+++ b/OpenNest.Core/Plate.cs
@@ -473,5 +473,87 @@ namespace OpenNest
return pts.Count > 0;
}
+
+ ///
+ /// Finds rectangular remnant (empty) regions on the plate.
+ /// Returns strips along edges that are clear of parts.
+ ///
+ public List GetRemnants()
+ {
+ var work = WorkArea();
+ var results = new List();
+
+ if (Parts.Count == 0)
+ {
+ results.Add(work);
+ return results;
+ }
+
+ var obstacles = new List();
+ foreach (var part in Parts)
+ obstacles.Add(part.BoundingBox.Offset(PartSpacing));
+
+ // Right strip: from the rightmost part edge to the work area right edge
+ var maxRight = double.MinValue;
+ foreach (var box in obstacles)
+ {
+ if (box.Right > maxRight)
+ maxRight = box.Right;
+ }
+
+ if (maxRight < work.Right)
+ {
+ var strip = new Box(maxRight, work.Bottom, work.Right - maxRight, work.Height);
+ if (strip.Area() > 1.0)
+ results.Add(strip);
+ }
+
+ // Top strip: from the topmost part edge to the work area top edge
+ var maxTop = double.MinValue;
+ foreach (var box in obstacles)
+ {
+ if (box.Top > maxTop)
+ maxTop = box.Top;
+ }
+
+ if (maxTop < work.Top)
+ {
+ var strip = new Box(work.Left, maxTop, work.Width, work.Top - maxTop);
+ if (strip.Area() > 1.0)
+ results.Add(strip);
+ }
+
+ // Bottom strip: from work area bottom to the lowest part edge
+ var minBottom = double.MaxValue;
+ foreach (var box in obstacles)
+ {
+ if (box.Bottom < minBottom)
+ minBottom = box.Bottom;
+ }
+
+ if (minBottom > work.Bottom)
+ {
+ var strip = new Box(work.Left, work.Bottom, work.Width, minBottom - work.Bottom);
+ if (strip.Area() > 1.0)
+ results.Add(strip);
+ }
+
+ // Left strip: from work area left to the leftmost part edge
+ var minLeft = double.MaxValue;
+ foreach (var box in obstacles)
+ {
+ if (box.Left < minLeft)
+ minLeft = box.Left;
+ }
+
+ if (minLeft > work.Left)
+ {
+ var strip = new Box(work.Left, work.Bottom, minLeft - work.Left, work.Height);
+ if (strip.Area() > 1.0)
+ results.Add(strip);
+ }
+
+ return results;
+ }
}
}