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 System.Windows.Forms;
using OpenNest.Actions; using OpenNest.Actions;
using OpenNest.Collections; using OpenNest.Collections;
using OpenNest.Engine;
using OpenNest.Engine.Fill; using OpenNest.Engine.Fill;
using OpenNest.Engine.Jobs.Placement;
using OpenNest.Forms; using OpenNest.Forms;
using OpenNest.Geometry; using OpenNest.Geometry;
using OpenNest.Math; using OpenNest.Math;
using Timer = System.Timers.Timer; using Timer = System.Timers.Timer;
using OpenNest.Engine;
using OpenNest.Engine.Jobs.Placement;
namespace OpenNest.Controls namespace OpenNest.Controls
{ {
@@ -562,9 +562,6 @@ namespace OpenNest.Controls
Plate.Parts.Add(part); Plate.Parts.Add(part);
} }
public void SetStationaryParts(List<Part> parts) =>
previewManager.SetStationaryParts(parts);
public void SetActiveParts(List<Part> parts) => previewManager.SetActiveParts(parts); public void SetActiveParts(List<Part> parts) => previewManager.SetActiveParts(parts);
public void ClearPreviewParts() => previewManager.ClearPreviewParts(); public void ClearPreviewParts() => previewManager.ClearPreviewParts();
@@ -578,23 +575,12 @@ namespace OpenNest.Controls
var cts = new CancellationTokenSource(); var cts = new CancellationTokenSource();
var progressForm = new NestProgressForm(cts, showPlateRow: false); 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 => var progress = new Progress<NestProgress>(p =>
{ {
progressForm.UpdateProgress(p); progressForm.UpdateProgress(p);
if (p.IsOverallBest) if (p.IsOverallBest)
{
progressForm.UpdatePreview(p.BestParts);
SetActiveParts(p.BestParts); SetActiveParts(p.BestParts);
}
ActiveWorkArea = p.ActiveWorkArea; ActiveWorkArea = p.ActiveWorkArea;
}); });
+3 -29
View File
@@ -6,7 +6,6 @@ namespace OpenNest.Controls
internal class PreviewManager internal class PreviewManager
{ {
private readonly PlateView view; private readonly PlateView view;
private readonly List<LayoutPart> stationaryParts = new List<LayoutPart>();
private readonly List<LayoutPart> activeParts = new List<LayoutPart>(); private readonly List<LayoutPart> activeParts = new List<LayoutPart>();
public PreviewManager(PlateView view) public PreviewManager(PlateView view)
@@ -14,32 +13,11 @@ namespace OpenNest.Controls
this.view = view; this.view = view;
} }
public IReadOnlyList<LayoutPart> PreviewParts => public IReadOnlyList<LayoutPart> PreviewParts => activeParts;
activeParts.Count > 0 ? activeParts : stationaryParts;
public Brush PreviewBrush => public Brush PreviewBrush => view.ColorScheme.ActivePreviewPartBrush;
activeParts.Count > 0
? view.ColorScheme.ActivePreviewPartBrush
: view.ColorScheme.PreviewPartBrush;
public Pen PreviewPen => public Pen PreviewPen => view.ColorScheme.ActivePreviewPartPen;
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 void SetActiveParts(List<Part> parts) public void SetActiveParts(List<Part> parts)
{ {
@@ -56,7 +34,6 @@ namespace OpenNest.Controls
public void ClearPreviewParts() public void ClearPreviewParts()
{ {
stationaryParts.Clear();
activeParts.Clear(); activeParts.Clear();
view.Invalidate(); view.Invalidate();
} }
@@ -69,19 +46,16 @@ namespace OpenNest.Controls
view.Plate.Parts.Add(part); view.Plate.Parts.Add(part);
} }
stationaryParts.Clear();
activeParts.Clear(); activeParts.Clear();
} }
public void Update() public void Update()
{ {
stationaryParts.ForEach(p => p.Update(view));
activeParts.ForEach(p => p.Update(view)); activeParts.ForEach(p => p.Update(view));
} }
public void Clear() public void Clear()
{ {
stationaryParts.Clear();
activeParts.Clear(); activeParts.Clear();
} }
} }
+9 -24
View File
@@ -10,16 +10,16 @@ using System.Windows.Forms;
using OpenNest.Actions; using OpenNest.Actions;
using OpenNest.Collections; using OpenNest.Collections;
using OpenNest.Data; using OpenNest.Data;
using OpenNest.Engine;
using OpenNest.Engine.BestFit; using OpenNest.Engine.BestFit;
using OpenNest.Engine.Fill; using OpenNest.Engine.Fill;
using OpenNest.Engine.Jobs;
using OpenNest.Engine.Jobs.Adapters;
using OpenNest.Engine.Jobs.Placement;
using OpenNest.Geometry; using OpenNest.Geometry;
using OpenNest.Gpu; using OpenNest.Gpu;
using OpenNest.IO; using OpenNest.IO;
using OpenNest.Properties; using OpenNest.Properties;
using OpenNest.Engine;
using OpenNest.Engine.Jobs;
using OpenNest.Engine.Jobs.Adapters;
using OpenNest.Engine.Jobs.Placement;
namespace OpenNest.Forms namespace OpenNest.Forms
{ {
@@ -1040,7 +1040,6 @@ namespace OpenNest.Forms
nestingCts = new CancellationTokenSource(); nestingCts = new CancellationTokenSource();
var progressForm = new NestProgressForm(nestingCts, showPlateRow: true); var progressForm = new NestProgressForm(nestingCts, showPlateRow: true);
progressForm.PreviewPlate = CreatePreviewPlate(activeForm.PlateView.Plate);
var jobEngineName = EngineSelection.IsFillStrategy(EngineSelection.EngineName) var jobEngineName = EngineSelection.IsFillStrategy(EngineSelection.EngineName)
? null ? null
@@ -1052,9 +1051,7 @@ namespace OpenNest.Forms
progressForm.UpdateProgress(p); progressForm.UpdateProgress(p);
if (p.IsOverallBest) if (p.IsOverallBest)
progressForm.UpdatePreview(p.BestParts); activeForm.PlateView.SetActiveParts(p.BestParts);
activeForm.PlateView.SetActiveParts(p.BestParts);
activeForm.PlateView.ActiveWorkArea = p.ActiveWorkArea; activeForm.PlateView.ActiveWorkArea = p.ActiveWorkArea;
}); });
@@ -1152,7 +1149,7 @@ namespace OpenNest.Forms
{ {
if (pr.IsNew) if (pr.IsNew)
{ {
var plate = GetOrCreatePlate(progressForm); var plate = GetOrCreatePlate();
plate.Size = pr.Plate.Size; plate.Size = pr.Plate.Size;
plate.Parts.AddRange(pr.Parts); plate.Parts.AddRange(pr.Parts);
} }
@@ -1172,7 +1169,7 @@ namespace OpenNest.Forms
if (remaining.Count == 0 || token.IsCancellationRequested) if (remaining.Count == 0 || token.IsCancellationRequested)
break; break;
var plate = GetOrCreatePlate(progressForm); var plate = GetOrCreatePlate();
var placed = await NestSinglePlateAsync( var placed = await NestSinglePlateAsync(
plate, plate,
@@ -1242,7 +1239,7 @@ namespace OpenNest.Forms
if (parts.Count == 0) if (parts.Count == 0)
continue; continue;
var plate = GetOrCreatePlate(progressForm); var plate = GetOrCreatePlate();
plate.Size = sheet.Stock.Size; plate.Size = sheet.Stock.Size;
plate.Parts.AddRange(parts); plate.Parts.AddRange(parts);
} }
@@ -1260,11 +1257,10 @@ namespace OpenNest.Forms
); );
} }
private Plate GetOrCreatePlate(NestProgressForm progressForm) private Plate GetOrCreatePlate()
{ {
var plate = activeForm.PlateManager.GetOrCreateEmpty(); var plate = activeForm.PlateManager.GetOrCreateEmpty();
activeForm.PlateManager.LoadLast(); activeForm.PlateManager.LoadLast();
progressForm.PreviewPlate = CreatePreviewPlate(plate);
return plate; return plate;
} }
@@ -1340,17 +1336,6 @@ namespace OpenNest.Forms
return true; 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) private void SequenceAllPlates_Click(object sender, EventArgs e)
{ {
if (activeForm == null) if (activeForm == null)
+3 -88
View File
@@ -17,11 +17,6 @@ namespace OpenNest.Forms
private void InitializeComponent() 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(); phaseStepper = new OpenNest.Controls.PhaseStepperControl();
resultsPanel = new System.Windows.Forms.Panel(); resultsPanel = new System.Windows.Forms.Panel();
resultsTable = new System.Windows.Forms.TableLayoutPanel(); resultsTable = new System.Windows.Forms.TableLayoutPanel();
@@ -46,8 +41,6 @@ namespace OpenNest.Forms
buttonPanel = new System.Windows.Forms.FlowLayoutPanel(); buttonPanel = new System.Windows.Forms.FlowLayoutPanel();
stopButton = new System.Windows.Forms.Button(); stopButton = new System.Windows.Forms.Button();
acceptButton = 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(); statsPanel = new System.Windows.Forms.Panel();
resultsPanel.SuspendLayout(); resultsPanel.SuspendLayout();
resultsTable.SuspendLayout(); resultsTable.SuspendLayout();
@@ -55,10 +48,6 @@ namespace OpenNest.Forms
statusPanel.SuspendLayout(); statusPanel.SuspendLayout();
statusTable.SuspendLayout(); statusTable.SuspendLayout();
buttonPanel.SuspendLayout(); buttonPanel.SuspendLayout();
((System.ComponentModel.ISupportInitialize)splitContainer).BeginInit();
splitContainer.Panel1.SuspendLayout();
splitContainer.Panel2.SuspendLayout();
splitContainer.SuspendLayout();
statsPanel.SuspendLayout(); statsPanel.SuspendLayout();
SuspendLayout(); SuspendLayout();
// //
@@ -365,74 +354,6 @@ namespace OpenNest.Forms
acceptButton.UseVisualStyleBackColor = true; acceptButton.UseVisualStyleBackColor = true;
acceptButton.Click += AcceptButton_Click; 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
// //
statsPanel.AutoScroll = true; statsPanel.AutoScroll = true;
@@ -450,12 +371,12 @@ namespace OpenNest.Forms
// //
AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
ClientSize = new System.Drawing.Size(626, 341); ClientSize = new System.Drawing.Size(266, 341);
Controls.Add(splitContainer); Controls.Add(statsPanel);
FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow; FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;
MaximizeBox = false; MaximizeBox = false;
MinimizeBox = false; MinimizeBox = false;
MinimumSize = new System.Drawing.Size(550, 380); MinimumSize = new System.Drawing.Size(320, 380);
Name = "NestProgressForm"; Name = "NestProgressForm";
ShowInTaskbar = false; ShowInTaskbar = false;
StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
@@ -471,10 +392,6 @@ namespace OpenNest.Forms
statusTable.ResumeLayout(false); statusTable.ResumeLayout(false);
statusTable.PerformLayout(); statusTable.PerformLayout();
buttonPanel.ResumeLayout(false); buttonPanel.ResumeLayout(false);
splitContainer.Panel1.ResumeLayout(false);
splitContainer.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)splitContainer).EndInit();
splitContainer.ResumeLayout(false);
statsPanel.ResumeLayout(false); statsPanel.ResumeLayout(false);
statsPanel.PerformLayout(); statsPanel.PerformLayout();
ResumeLayout(false); ResumeLayout(false);
@@ -506,8 +423,6 @@ namespace OpenNest.Forms
private System.Windows.Forms.FlowLayoutPanel buttonPanel; private System.Windows.Forms.FlowLayoutPanel buttonPanel;
private System.Windows.Forms.Button acceptButton; private System.Windows.Forms.Button acceptButton;
private System.Windows.Forms.Button stopButton; private System.Windows.Forms.Button stopButton;
private System.Windows.Forms.SplitContainer splitContainer;
private System.Windows.Forms.Panel statsPanel; private System.Windows.Forms.Panel statsPanel;
private Controls.PlateView previewPlateView;
} }
} }
-28
View File
@@ -38,23 +38,11 @@ namespace OpenNest.Forms
set => acceptButton.Visible = value; set => acceptButton.Visible = value;
} }
public Plate PreviewPlate
{
get => previewPlateView.Plate;
set
{
previewPlateView.Plate = value;
previewPlateView.ZoomToFit();
}
}
public NestProgressForm(CancellationTokenSource cts, bool showPlateRow = true) public NestProgressForm(CancellationTokenSource cts, bool showPlateRow = true)
{ {
this.cts = cts; this.cts = cts;
InitializeComponent(); InitializeComponent();
previewPlateView.AllowSelect = false;
if (!showPlateRow) if (!showPlateRow)
{ {
plateLabel.Visible = false; plateLabel.Visible = false;
@@ -104,20 +92,6 @@ namespace OpenNest.Forms
: progress.Phase.DisplayName(); : 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() public void ShowCompleted()
{ {
if (IsDisposed || !IsHandleCreated) if (IsDisposed || !IsHandleCreated)
@@ -178,8 +152,6 @@ namespace OpenNest.Forms
if (!cts.IsCancellationRequested) if (!cts.IsCancellationRequested)
cts.Cancel(); cts.Cancel();
previewPlateView.Dispose();
base.OnFormClosing(e); base.OnFormClosing(e);
} }