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) <noreply@anthropic.com>
This commit is contained in:
2026-03-21 23:08:47 -04:00
parent 8ffdacd6c0
commit b6ee04f038

View File

@@ -1098,23 +1098,16 @@ namespace OpenNest.Controls
var bounds = parts.GetBoundingBox();
var center = bounds.Center;
var anchor = bounds.Location;
var rotatedPrograms = new HashSet<Program>();
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);
}