mirror of
https://github.com/ajisaacs/OpenNest.git
synced 2026-10-05 09:02:10 -04:00
refactor(engine): share the private-plate Fill run between blocks and future callers
Move BlockCatalog's private-drawing Fill invocation (BestFitCache stabilization plus the Default FillItem call) into PrivatePlateFill so the cutout fill can reuse it without duplicating the cache handling. Behavior unchanged; Irregular filter 96/96.
This commit is contained in:
1 parent
a15c54fbaf
commit
418f75916b
2 files changed
+43
-16
No files matched your search
@@ -0,0 +1,41 @@
|
||||
#nullable enable
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using OpenNest.Engine.BestFit;
|
||||
using OpenNest.Engine.Jobs.Adapters;
|
||||
using OpenNest.Geometry;
|
||||
|
||||
namespace OpenNest.Engine.Jobs.Placement;
|
||||
|
||||
/// <summary>
|
||||
/// Runs the Default Fill for one private drawing on a private plate, for callers that turn the
|
||||
/// result into job poses. The caller owns the drawing and must call
|
||||
/// <see cref="BestFitCache.Invalidate"/> for it when finished.
|
||||
/// </summary>
|
||||
internal static class PrivatePlateFill
|
||||
{
|
||||
/// <param name="length">X extent of the plate and work area.</param>
|
||||
/// <param name="width">Y extent of the plate and work area.</param>
|
||||
/// <param name="quantity">Copies wanted; zero fills the whole area.</param>
|
||||
internal static List<Part> Run(Drawing drawing, RotationPolicy rotation, double spacing,
|
||||
double length, double width, int quantity, CancellationToken token)
|
||||
{
|
||||
var plate = new Plate(new Size(width, length)) { PartSpacing = spacing };
|
||||
// The drawing is private: stabilize this cache entry before Fill's candidate pruning.
|
||||
var fits = BestFitCache.GetOrCompute(drawing, plate.Size.Length, plate.Size.Width, spacing);
|
||||
var sorted = fits.OrderBy(f => f.RotatedArea).ThenBy(f => f.Candidate.StrategyIndex)
|
||||
.ThenBy(f => f.Candidate.Part2Rotation).ThenBy(f => f.Candidate.Part2Offset.X)
|
||||
.ThenBy(f => f.Candidate.Part2Offset.Y).ThenBy(f => f.OptimalRotation).ToArray();
|
||||
fits.Clear();
|
||||
fits.AddRange(sorted);
|
||||
return PlateFillService.FillItem("Default", plate, new NestItem
|
||||
{
|
||||
Drawing = drawing,
|
||||
Quantity = quantity,
|
||||
RotationStart = rotation.Start,
|
||||
RotationEnd = rotation.End,
|
||||
StepAngle = DrawingJobMapper.LegacyStep(rotation),
|
||||
}, new Box(0, 0, length, width), null!, token);
|
||||
}
|
||||
}
|
||||
@@ -77,24 +77,10 @@ internal sealed class BlockCatalog : IDisposable
|
||||
{
|
||||
if (!drawings.TryGetValue(type.Index, out var drawing))
|
||||
drawings[type.Index] = drawing = DrawingJobMapper.CreateDrawing(type.Part);
|
||||
var plate = new Plate(new Size(rectangle.Width, rectangle.Length)) { PartSpacing = spacing };
|
||||
try
|
||||
{
|
||||
// The drawing is private: stabilize this cache entry before Fill's candidate pruning.
|
||||
var fits = BestFitCache.GetOrCompute(drawing, plate.Size.Length, plate.Size.Width, spacing);
|
||||
var sorted = fits.OrderBy(f => f.RotatedArea).ThenBy(f => f.Candidate.StrategyIndex)
|
||||
.ThenBy(f => f.Candidate.Part2Rotation).ThenBy(f => f.Candidate.Part2Offset.X)
|
||||
.ThenBy(f => f.Candidate.Part2Offset.Y).ThenBy(f => f.OptimalRotation).ToArray();
|
||||
fits.Clear();
|
||||
fits.AddRange(sorted);
|
||||
var members = PlateFillService.FillItem("Default", plate, new NestItem
|
||||
{
|
||||
Drawing = drawing,
|
||||
Quantity = quantity,
|
||||
RotationStart = type.Part.Rotation.Start,
|
||||
RotationEnd = type.Part.Rotation.End,
|
||||
StepAngle = DrawingJobMapper.LegacyStep(type.Part.Rotation),
|
||||
}, new Box(0, 0, rectangle.Length, rectangle.Width), null!, token);
|
||||
var members = PrivatePlateFill.Run(drawing, type.Part.Rotation, spacing,
|
||||
rectangle.Length, rectangle.Width, quantity, token);
|
||||
token.ThrowIfCancellationRequested();
|
||||
return Resolve(type, members.Take(quantity).ToArray(), orientations[type.Index], spacing, token);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user