feat: add FillRow method for single-axis geometry-aware fill

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-07 00:56:44 -05:00
parent b8d9155cd0
commit 1193091338

View File

@@ -62,5 +62,76 @@ namespace OpenNest
return bboxDim - slideDistance;
}
/// <summary>
/// Fills a single row of identical parts along one axis using geometry-aware spacing.
/// Returns a Pattern containing all placed parts.
/// </summary>
public Pattern FillRow(Drawing drawing, double rotationAngle, NestDirection direction)
{
var pattern = new Pattern();
// Create the template part with rotation applied.
var template = new Part(drawing);
if (!rotationAngle.IsEqualTo(0))
template.Rotate(rotationAngle);
// Position template at work area origin.
var bbox = template.Program.BoundingBox();
template.Offset(WorkArea.Location - bbox.Location);
template.UpdateBounds();
// Check if the part fits in the work area at all.
if (template.BoundingBox.Width > WorkArea.Width + Tolerance.Epsilon ||
template.BoundingBox.Height > WorkArea.Height + Tolerance.Epsilon)
return pattern;
pattern.Parts.Add(template);
// Find the geometry-aware copy distance.
var copyDistance = FindCopyDistance(template, direction);
if (copyDistance <= 0)
{
pattern.UpdateBounds();
return pattern;
}
// Fill the row by copying at the fixed interval.
double limit = direction == NestDirection.Horizontal
? WorkArea.Right
: WorkArea.Top;
double partDim = direction == NestDirection.Horizontal
? template.BoundingBox.Width
: template.BoundingBox.Height;
int count = 1;
while (true)
{
double nextPos = (direction == NestDirection.Horizontal
? template.BoundingBox.Left
: template.BoundingBox.Bottom) + copyDistance * count;
// Check if the next part would exceed the work area.
if (nextPos + partDim > limit + Tolerance.Epsilon)
break;
var offset = direction == NestDirection.Horizontal
? new Vector(copyDistance * count, 0)
: new Vector(0, copyDistance * count);
var clone = (Part)template.Clone();
clone.Offset(offset);
pattern.Parts.Add(clone);
count++;
}
pattern.UpdateBounds();
return pattern;
}
}
}