From b6ee04f0383f4414c288906850bdcd6c120659e0 Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Sat, 21 Mar 2026 23:08:47 -0400 Subject: [PATCH] fix: use Part.Rotate() in PlateView to avoid mutating shared Programs RotateSelectedParts was calling Program.Rotate() directly on shared Program instances, bypassing Part's copy-on-write (EnsureOwnedProgram). Parts created via CloneAtOffset share the same Program, so rotating one part would rotate all parts with the same reference. Co-Authored-By: Claude Opus 4.6 (1M context) --- OpenNest/Controls/PlateView.cs | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/OpenNest/Controls/PlateView.cs b/OpenNest/Controls/PlateView.cs index ea68990..806f5e4 100644 --- a/OpenNest/Controls/PlateView.cs +++ b/OpenNest/Controls/PlateView.cs @@ -1098,23 +1098,16 @@ namespace OpenNest.Controls var bounds = parts.GetBoundingBox(); var center = bounds.Center; var anchor = bounds.Location; - var rotatedPrograms = new HashSet(); - for (int i = 0; i < SelectedParts.Count; ++i) + for (var i = 0; i < SelectedParts.Count; ++i) { var part = SelectedParts[i]; - var basePart = part.BasePart; - - if (rotatedPrograms.Add(basePart.Program)) - basePart.Program.Rotate(angle); - - part.Location = part.Location.Rotate(angle, center); - basePart.UpdateBounds(); + part.BasePart.Rotate(angle, center); } var diff = anchor - parts.GetBoundingBox().Location; - for (int i = 0; i < SelectedParts.Count; ++i) + for (var i = 0; i < SelectedParts.Count; ++i) SelectedParts[i].Offset(diff); }