refactor: extract RunAutoNest_Click into focused helper methods
Break the 113-line click handler into single-responsibility methods: RunAutoNestAsync, GetOrCreatePlate, NestSinglePlateAsync, and CreatePreviewPlate (eliminates duplicated plate-cloning code). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
+80
-66
@@ -901,19 +901,8 @@ namespace OpenNest.Forms
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
nestingCts = new CancellationTokenSource();
|
nestingCts = new CancellationTokenSource();
|
||||||
var token = nestingCts.Token;
|
|
||||||
|
|
||||||
var progressForm = new NestProgressForm(nestingCts, showPlateRow: true);
|
var progressForm = new NestProgressForm(nestingCts, showPlateRow: true);
|
||||||
|
progressForm.PreviewPlate = CreatePreviewPlate(activeForm.PlateView.Plate);
|
||||||
var previewPlate = new Plate(activeForm.PlateView.Plate.Size)
|
|
||||||
{
|
|
||||||
Quadrant = activeForm.PlateView.Plate.Quadrant,
|
|
||||||
PartSpacing = activeForm.PlateView.Plate.PartSpacing,
|
|
||||||
Thickness = activeForm.PlateView.Plate.Thickness,
|
|
||||||
Material = activeForm.PlateView.Plate.Material,
|
|
||||||
};
|
|
||||||
previewPlate.EdgeSpacing = activeForm.PlateView.Plate.EdgeSpacing;
|
|
||||||
progressForm.PreviewPlate = previewPlate;
|
|
||||||
|
|
||||||
var progress = new Progress<NestProgress>(p =>
|
var progress = new Progress<NestProgress>(p =>
|
||||||
{
|
{
|
||||||
@@ -931,60 +920,7 @@ namespace OpenNest.Forms
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var maxPlates = 100;
|
await RunAutoNestAsync(items, progressForm, progress, nestingCts.Token);
|
||||||
|
|
||||||
for (var plateCount = 0; plateCount < maxPlates; plateCount++)
|
|
||||||
{
|
|
||||||
var remaining = items.Where(i => i.Quantity > 0).ToList();
|
|
||||||
|
|
||||||
if (remaining.Count == 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (token.IsCancellationRequested)
|
|
||||||
break;
|
|
||||||
|
|
||||||
var plate = activeForm.PlateView.Plate.Parts.Count > 0
|
|
||||||
? activeForm.Nest.CreatePlate()
|
|
||||||
: activeForm.PlateView.Plate;
|
|
||||||
|
|
||||||
if (plate != activeForm.PlateView.Plate)
|
|
||||||
{
|
|
||||||
activeForm.LoadLastPlate();
|
|
||||||
|
|
||||||
var newPreviewPlate = new Plate(plate.Size)
|
|
||||||
{
|
|
||||||
Quadrant = plate.Quadrant,
|
|
||||||
PartSpacing = plate.PartSpacing,
|
|
||||||
Thickness = plate.Thickness,
|
|
||||||
Material = plate.Material,
|
|
||||||
};
|
|
||||||
newPreviewPlate.EdgeSpacing = plate.EdgeSpacing;
|
|
||||||
progressForm.PreviewPlate = newPreviewPlate;
|
|
||||||
}
|
|
||||||
|
|
||||||
var anyPlaced = false;
|
|
||||||
|
|
||||||
var engine = NestEngineRegistry.Create(plate);
|
|
||||||
engine.PlateNumber = plateCount;
|
|
||||||
|
|
||||||
var nestParts = await Task.Run(() =>
|
|
||||||
engine.Nest(remaining, progress, token));
|
|
||||||
|
|
||||||
activeForm.PlateView.ClearPreviewParts();
|
|
||||||
|
|
||||||
if (nestParts.Count > 0 && (!token.IsCancellationRequested || progressForm.Accepted))
|
|
||||||
{
|
|
||||||
plate.Parts.AddRange(nestParts);
|
|
||||||
activeForm.PlateView.Invalidate();
|
|
||||||
anyPlaced = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!anyPlaced)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
activeForm.Nest.UpdateDrawingQuantities();
|
|
||||||
progressForm.ShowCompleted();
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -1002,6 +938,84 @@ namespace OpenNest.Forms
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task RunAutoNestAsync(
|
||||||
|
List<NestItem> items,
|
||||||
|
NestProgressForm progressForm,
|
||||||
|
IProgress<NestProgress> progress,
|
||||||
|
CancellationToken token)
|
||||||
|
{
|
||||||
|
const int maxPlates = 100;
|
||||||
|
|
||||||
|
for (var plateIndex = 0; plateIndex < maxPlates; plateIndex++)
|
||||||
|
{
|
||||||
|
var remaining = items.Where(i => i.Quantity > 0).ToList();
|
||||||
|
|
||||||
|
if (remaining.Count == 0 || token.IsCancellationRequested)
|
||||||
|
break;
|
||||||
|
|
||||||
|
var plate = GetOrCreatePlate(progressForm);
|
||||||
|
|
||||||
|
var placed = await NestSinglePlateAsync(
|
||||||
|
plate, plateIndex, remaining, progressForm, progress, token);
|
||||||
|
|
||||||
|
if (!placed)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
activeForm.Nest.UpdateDrawingQuantities();
|
||||||
|
progressForm.ShowCompleted();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Plate GetOrCreatePlate(NestProgressForm progressForm)
|
||||||
|
{
|
||||||
|
var currentPlate = activeForm.PlateView.Plate;
|
||||||
|
|
||||||
|
if (currentPlate.Parts.Count == 0)
|
||||||
|
return currentPlate;
|
||||||
|
|
||||||
|
var plate = activeForm.Nest.CreatePlate();
|
||||||
|
activeForm.LoadLastPlate();
|
||||||
|
progressForm.PreviewPlate = CreatePreviewPlate(plate);
|
||||||
|
return plate;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task<bool> NestSinglePlateAsync(
|
||||||
|
Plate plate,
|
||||||
|
int plateIndex,
|
||||||
|
List<NestItem> items,
|
||||||
|
NestProgressForm progressForm,
|
||||||
|
IProgress<NestProgress> progress,
|
||||||
|
CancellationToken token)
|
||||||
|
{
|
||||||
|
var engine = NestEngineRegistry.Create(plate);
|
||||||
|
engine.PlateNumber = plateIndex;
|
||||||
|
|
||||||
|
var nestParts = await Task.Run(() =>
|
||||||
|
engine.Nest(items, progress, token));
|
||||||
|
|
||||||
|
activeForm.PlateView.ClearPreviewParts();
|
||||||
|
|
||||||
|
if (nestParts.Count == 0 || (token.IsCancellationRequested && !progressForm.Accepted))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
plate.Parts.AddRange(nestParts);
|
||||||
|
activeForm.PlateView.Invalidate();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Plate CreatePreviewPlate(Plate source)
|
||||||
|
{
|
||||||
|
var plate = new Plate(source.Size)
|
||||||
|
{
|
||||||
|
Quadrant = source.Quadrant,
|
||||||
|
PartSpacing = source.PartSpacing,
|
||||||
|
Thickness = source.Thickness,
|
||||||
|
Material = source.Material,
|
||||||
|
};
|
||||||
|
plate.EdgeSpacing = source.EdgeSpacing;
|
||||||
|
return plate;
|
||||||
|
}
|
||||||
|
|
||||||
private void SequenceAllPlates_Click(object sender, EventArgs e)
|
private void SequenceAllPlates_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (activeForm == null)
|
if (activeForm == null)
|
||||||
|
|||||||
Reference in New Issue
Block a user