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:
@@ -1098,23 +1098,16 @@ namespace OpenNest.Controls
|
|||||||
var bounds = parts.GetBoundingBox();
|
var bounds = parts.GetBoundingBox();
|
||||||
var center = bounds.Center;
|
var center = bounds.Center;
|
||||||
var anchor = bounds.Location;
|
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 part = SelectedParts[i];
|
||||||
var basePart = part.BasePart;
|
part.BasePart.Rotate(angle, center);
|
||||||
|
|
||||||
if (rotatedPrograms.Add(basePart.Program))
|
|
||||||
basePart.Program.Rotate(angle);
|
|
||||||
|
|
||||||
part.Location = part.Location.Rotate(angle, center);
|
|
||||||
basePart.UpdateBounds();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var diff = anchor - parts.GetBoundingBox().Location;
|
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);
|
SelectedParts[i].Offset(diff);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user