refactor(ui): drop duplicate plate preview from nesting progress dialog

The dialog rendered the same best-parts layout as transparent ghost
parts already shown live on the main plate view, and its embedded view
reset zoom on every improvement while lacking placed parts, work-area
and cut-off context. The progress dialog is now a compact stats strip
(266px wide) with the plate counter preserved for multi-plate runs.
Removes the never-called SetStationaryParts stationary-preview path
along with PreviewPlate/UpdatePreview/CreatePreviewPlate.
This commit is contained in:
aj
2026-09-27 20:43:34 -04:00
parent 27948ba8cf
commit a04460c57b
5 changed files with 17 additions and 185 deletions
+2 -16
View File
@@ -10,13 +10,13 @@ using System.Threading.Tasks;
using System.Windows.Forms;
using OpenNest.Actions;
using OpenNest.Collections;
using OpenNest.Engine;
using OpenNest.Engine.Fill;
using OpenNest.Engine.Jobs.Placement;
using OpenNest.Forms;
using OpenNest.Geometry;
using OpenNest.Math;
using Timer = System.Timers.Timer;
using OpenNest.Engine;
using OpenNest.Engine.Jobs.Placement;
namespace OpenNest.Controls
{
@@ -562,9 +562,6 @@ namespace OpenNest.Controls
Plate.Parts.Add(part);
}
public void SetStationaryParts(List<Part> parts) =>
previewManager.SetStationaryParts(parts);
public void SetActiveParts(List<Part> parts) => previewManager.SetActiveParts(parts);
public void ClearPreviewParts() => previewManager.ClearPreviewParts();
@@ -578,23 +575,12 @@ namespace OpenNest.Controls
var cts = new CancellationTokenSource();
var progressForm = new NestProgressForm(cts, showPlateRow: false);
var previewPlate = new Plate(Plate.Size)
{
Quadrant = Plate.Quadrant,
PartSpacing = Plate.PartSpacing,
};
previewPlate.EdgeSpacing = Plate.EdgeSpacing;
progressForm.PreviewPlate = previewPlate;
var progress = new Progress<NestProgress>(p =>
{
progressForm.UpdateProgress(p);
if (p.IsOverallBest)
{
progressForm.UpdatePreview(p.BestParts);
SetActiveParts(p.BestParts);
}
ActiveWorkArea = p.ActiveWorkArea;
});
+3 -29
View File
@@ -6,7 +6,6 @@ namespace OpenNest.Controls
internal class PreviewManager
{
private readonly PlateView view;
private readonly List<LayoutPart> stationaryParts = new List<LayoutPart>();
private readonly List<LayoutPart> activeParts = new List<LayoutPart>();
public PreviewManager(PlateView view)
@@ -14,32 +13,11 @@ namespace OpenNest.Controls
this.view = view;
}
public IReadOnlyList<LayoutPart> PreviewParts =>
activeParts.Count > 0 ? activeParts : stationaryParts;
public IReadOnlyList<LayoutPart> PreviewParts => activeParts;
public Brush PreviewBrush =>
activeParts.Count > 0
? view.ColorScheme.ActivePreviewPartBrush
: view.ColorScheme.PreviewPartBrush;
public Brush PreviewBrush => view.ColorScheme.ActivePreviewPartBrush;
public Pen PreviewPen =>
activeParts.Count > 0
? view.ColorScheme.ActivePreviewPartPen
: view.ColorScheme.PreviewPartPen;
public void SetStationaryParts(List<Part> parts)
{
stationaryParts.Clear();
activeParts.Clear();
if (parts != null)
{
foreach (var part in parts)
stationaryParts.Add(LayoutPart.Create(part, view));
}
view.Invalidate();
}
public Pen PreviewPen => view.ColorScheme.ActivePreviewPartPen;
public void SetActiveParts(List<Part> parts)
{
@@ -56,7 +34,6 @@ namespace OpenNest.Controls
public void ClearPreviewParts()
{
stationaryParts.Clear();
activeParts.Clear();
view.Invalidate();
}
@@ -69,19 +46,16 @@ namespace OpenNest.Controls
view.Plate.Parts.Add(part);
}
stationaryParts.Clear();
activeParts.Clear();
}
public void Update()
{
stationaryParts.ForEach(p => p.Update(view));
activeParts.ForEach(p => p.Update(view));
}
public void Clear()
{
stationaryParts.Clear();
activeParts.Clear();
}
}
+9 -24
View File
@@ -10,16 +10,16 @@ using System.Windows.Forms;
using OpenNest.Actions;
using OpenNest.Collections;
using OpenNest.Data;
using OpenNest.Engine;
using OpenNest.Engine.BestFit;
using OpenNest.Engine.Fill;
using OpenNest.Engine.Jobs;
using OpenNest.Engine.Jobs.Adapters;
using OpenNest.Engine.Jobs.Placement;
using OpenNest.Geometry;
using OpenNest.Gpu;
using OpenNest.IO;
using OpenNest.Properties;
using OpenNest.Engine;
using OpenNest.Engine.Jobs;
using OpenNest.Engine.Jobs.Adapters;
using OpenNest.Engine.Jobs.Placement;
namespace OpenNest.Forms
{
@@ -1040,7 +1040,6 @@ namespace OpenNest.Forms
nestingCts = new CancellationTokenSource();
var progressForm = new NestProgressForm(nestingCts, showPlateRow: true);
progressForm.PreviewPlate = CreatePreviewPlate(activeForm.PlateView.Plate);
var jobEngineName = EngineSelection.IsFillStrategy(EngineSelection.EngineName)
? null
@@ -1052,9 +1051,7 @@ namespace OpenNest.Forms
progressForm.UpdateProgress(p);
if (p.IsOverallBest)
progressForm.UpdatePreview(p.BestParts);
activeForm.PlateView.SetActiveParts(p.BestParts);
activeForm.PlateView.SetActiveParts(p.BestParts);
activeForm.PlateView.ActiveWorkArea = p.ActiveWorkArea;
});
@@ -1152,7 +1149,7 @@ namespace OpenNest.Forms
{
if (pr.IsNew)
{
var plate = GetOrCreatePlate(progressForm);
var plate = GetOrCreatePlate();
plate.Size = pr.Plate.Size;
plate.Parts.AddRange(pr.Parts);
}
@@ -1172,7 +1169,7 @@ namespace OpenNest.Forms
if (remaining.Count == 0 || token.IsCancellationRequested)
break;
var plate = GetOrCreatePlate(progressForm);
var plate = GetOrCreatePlate();
var placed = await NestSinglePlateAsync(
plate,
@@ -1242,7 +1239,7 @@ namespace OpenNest.Forms
if (parts.Count == 0)
continue;
var plate = GetOrCreatePlate(progressForm);
var plate = GetOrCreatePlate();
plate.Size = sheet.Stock.Size;
plate.Parts.AddRange(parts);
}
@@ -1260,11 +1257,10 @@ namespace OpenNest.Forms
);
}
private Plate GetOrCreatePlate(NestProgressForm progressForm)
private Plate GetOrCreatePlate()
{
var plate = activeForm.PlateManager.GetOrCreateEmpty();
activeForm.PlateManager.LoadLast();
progressForm.PreviewPlate = CreatePreviewPlate(plate);
return plate;
}
@@ -1340,17 +1336,6 @@ namespace OpenNest.Forms
return true;
}
private static Plate CreatePreviewPlate(Plate source)
{
var plate = new Plate(source.Size)
{
Quadrant = source.Quadrant,
PartSpacing = source.PartSpacing,
};
plate.EdgeSpacing = source.EdgeSpacing;
return plate;
}
private void SequenceAllPlates_Click(object sender, EventArgs e)
{
if (activeForm == null)
+3 -88
View File
@@ -17,11 +17,6 @@ namespace OpenNest.Forms
private void InitializeComponent()
{
ColorScheme colorScheme1 = new ColorScheme();
CutOffSettings cutOffSettings1 = new CutOffSettings();
Plate plate1 = new Plate();
Collections.ObservableList<CutOff> observableList_11 = new Collections.ObservableList<CutOff>();
Collections.ObservableList<Part> observableList_12 = new Collections.ObservableList<Part>();
phaseStepper = new OpenNest.Controls.PhaseStepperControl();
resultsPanel = new System.Windows.Forms.Panel();
resultsTable = new System.Windows.Forms.TableLayoutPanel();
@@ -46,8 +41,6 @@ namespace OpenNest.Forms
buttonPanel = new System.Windows.Forms.FlowLayoutPanel();
stopButton = new System.Windows.Forms.Button();
acceptButton = new System.Windows.Forms.Button();
splitContainer = new System.Windows.Forms.SplitContainer();
previewPlateView = new OpenNest.Controls.PlateView();
statsPanel = new System.Windows.Forms.Panel();
resultsPanel.SuspendLayout();
resultsTable.SuspendLayout();
@@ -55,10 +48,6 @@ namespace OpenNest.Forms
statusPanel.SuspendLayout();
statusTable.SuspendLayout();
buttonPanel.SuspendLayout();
((System.ComponentModel.ISupportInitialize)splitContainer).BeginInit();
splitContainer.Panel1.SuspendLayout();
splitContainer.Panel2.SuspendLayout();
splitContainer.SuspendLayout();
statsPanel.SuspendLayout();
SuspendLayout();
//
@@ -365,74 +354,6 @@ namespace OpenNest.Forms
acceptButton.UseVisualStyleBackColor = true;
acceptButton.Click += AcceptButton_Click;
//
// splitContainer
//
splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
splitContainer.Location = new System.Drawing.Point(0, 0);
splitContainer.Name = "splitContainer";
//
// splitContainer.Panel1
//
splitContainer.Panel1.Controls.Add(previewPlateView);
//
// splitContainer.Panel2
//
splitContainer.Panel2.Controls.Add(statsPanel);
splitContainer.Size = new System.Drawing.Size(626, 341);
splitContainer.SplitterDistance = 356;
splitContainer.TabIndex = 0;
//
// previewPlateView
//
previewPlateView.ActiveWorkArea = null;
previewPlateView.AllowPan = true;
previewPlateView.AllowSelect = true;
previewPlateView.AllowZoom = true;
previewPlateView.BackColor = System.Drawing.Color.DarkGray;
colorScheme1.BackgroundColor = System.Drawing.Color.DarkGray;
colorScheme1.BoundingBoxColor = System.Drawing.Color.FromArgb(128, 128, 255);
colorScheme1.EdgeSpacingColor = System.Drawing.Color.FromArgb(180, 180, 180);
colorScheme1.LayoutFillColor = System.Drawing.Color.WhiteSmoke;
colorScheme1.LayoutOutlineColor = System.Drawing.Color.Gray;
colorScheme1.OriginColor = System.Drawing.Color.Gray;
colorScheme1.PreviewPartColor = System.Drawing.Color.FromArgb(255, 140, 0);
colorScheme1.RapidColor = System.Drawing.Color.DodgerBlue;
previewPlateView.ColorScheme = colorScheme1;
cutOffSettings1.CutDirection = CutDirection.AwayFromOrigin;
cutOffSettings1.MinSegmentLength = 0.05D;
cutOffSettings1.Overtravel = 0D;
cutOffSettings1.PartClearance = 0.02D;
previewPlateView.CutOffSettings = cutOffSettings1;
previewPlateView.DebugRemnantPriorities = null;
previewPlateView.DebugRemnants = null;
previewPlateView.Dock = System.Windows.Forms.DockStyle.Fill;
previewPlateView.DrawBounds = true;
previewPlateView.DrawCutDirection = false;
previewPlateView.DrawOffset = false;
previewPlateView.DrawOrigin = true;
previewPlateView.DrawPiercePoints = false;
previewPlateView.DrawRapid = false;
previewPlateView.FillParts = true;
previewPlateView.Location = new System.Drawing.Point(0, 0);
previewPlateView.Name = "previewPlateView";
previewPlateView.OffsetIncrementDistance = 10D;
previewPlateView.OffsetTolerance = 0.001D;
plate1.CutOffs = observableList_11;
plate1.CuttingParameters = null;
plate1.GrainAngle = 0D;
plate1.Parts = observableList_12;
plate1.PartSpacing = 0D;
plate1.Quadrant = 1;
plate1.Quantity = 0;
previewPlateView.Plate = plate1;
previewPlateView.RotateIncrementAngle = 10D;
previewPlateView.ShowBendLines = false;
previewPlateView.Size = new System.Drawing.Size(356, 341);
previewPlateView.Status = "Select";
previewPlateView.TabIndex = 0;
//
// statsPanel
//
statsPanel.AutoScroll = true;
@@ -450,12 +371,12 @@ namespace OpenNest.Forms
//
AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
ClientSize = new System.Drawing.Size(626, 341);
Controls.Add(splitContainer);
ClientSize = new System.Drawing.Size(266, 341);
Controls.Add(statsPanel);
FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;
MaximizeBox = false;
MinimizeBox = false;
MinimumSize = new System.Drawing.Size(550, 380);
MinimumSize = new System.Drawing.Size(320, 380);
Name = "NestProgressForm";
ShowInTaskbar = false;
StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
@@ -471,10 +392,6 @@ namespace OpenNest.Forms
statusTable.ResumeLayout(false);
statusTable.PerformLayout();
buttonPanel.ResumeLayout(false);
splitContainer.Panel1.ResumeLayout(false);
splitContainer.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)splitContainer).EndInit();
splitContainer.ResumeLayout(false);
statsPanel.ResumeLayout(false);
statsPanel.PerformLayout();
ResumeLayout(false);
@@ -506,8 +423,6 @@ namespace OpenNest.Forms
private System.Windows.Forms.FlowLayoutPanel buttonPanel;
private System.Windows.Forms.Button acceptButton;
private System.Windows.Forms.Button stopButton;
private System.Windows.Forms.SplitContainer splitContainer;
private System.Windows.Forms.Panel statsPanel;
private Controls.PlateView previewPlateView;
}
}
-28
View File
@@ -38,23 +38,11 @@ namespace OpenNest.Forms
set => acceptButton.Visible = value;
}
public Plate PreviewPlate
{
get => previewPlateView.Plate;
set
{
previewPlateView.Plate = value;
previewPlateView.ZoomToFit();
}
}
public NestProgressForm(CancellationTokenSource cts, bool showPlateRow = true)
{
this.cts = cts;
InitializeComponent();
previewPlateView.AllowSelect = false;
if (!showPlateRow)
{
plateLabel.Visible = false;
@@ -104,20 +92,6 @@ namespace OpenNest.Forms
: progress.Phase.DisplayName();
}
public void UpdatePreview(List<Part> bestParts)
{
if (IsDisposed || !IsHandleCreated)
return;
var plate = previewPlateView.Plate;
plate.Parts.Clear();
foreach (var part in bestParts)
plate.Parts.Add((Part)part.Clone());
previewPlateView.ZoomToFit();
}
public void ShowCompleted()
{
if (IsDisposed || !IsHandleCreated)
@@ -178,8 +152,6 @@ namespace OpenNest.Forms
if (!cts.IsCancellationRequested)
cts.Cancel();
previewPlateView.Dispose();
base.OnFormClosing(e);
}