diff --git a/MatterControlLib/ApplicationView/Config/PrinterConfig.cs b/MatterControlLib/ApplicationView/Config/PrinterConfig.cs index 3472dcfe3..a12aa3f14 100644 --- a/MatterControlLib/ApplicationView/Config/PrinterConfig.cs +++ b/MatterControlLib/ApplicationView/Config/PrinterConfig.cs @@ -79,8 +79,11 @@ namespace MatterHackers.MatterControl var scene = Bed?.Scene; if (scene != null) { + var undoBuffer = scene.UndoBuffer; + if (sceneOverrides != null - && undoBufferHashCode == scene.UndoBuffer.GetLongHashCode()) + && undoBuffer != null + && undoBufferHashCode == undoBuffer.GetLongHashCode()) { return sceneOverrides; } @@ -162,7 +165,10 @@ namespace MatterHackers.MatterControl } // return the current set - undoBufferHashCode = scene.UndoBuffer.GetLongHashCode(); + if (undoBuffer != null) + { + undoBufferHashCode = undoBuffer.GetLongHashCode(); + } return sceneOverrides; } diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index 09c9c93a8..01a2e1278 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 09c9c93a84e57821ec65c17114acb629ac5320af +Subproject commit 01a2e1278918e99111251691d2b0c4cc5006e450 diff --git a/Tests/MatterControl.Tests/MatterControl/MatterControlUtilities.cs b/Tests/MatterControl.Tests/MatterControl/MatterControlUtilities.cs index 3cce49fca..bb49c856b 100644 --- a/Tests/MatterControl.Tests/MatterControl/MatterControlUtilities.cs +++ b/Tests/MatterControl.Tests/MatterControl/MatterControlUtilities.cs @@ -1515,51 +1515,10 @@ namespace MatterHackers.MatterControl.Tests.Automation /// The AutomationRunner public static AutomationRunner RectangleSelectParts(this AutomationRunner testRunner, Object3DControlsLayer controlLayer, IEnumerable partNames) { - var topWindow = controlLayer.Parents().First(); - var widgets = partNames - .Select(name => ResolveName(controlLayer.Scene.Children, name)) - .Where(x => x.Ok) - .Select(x => - { - var widget = testRunner.GetWidgetByName(x.Name, out var containingWindow, 1); - return new - { - Widget = widget ?? controlLayer, - ContainingWindow = widget != null ? containingWindow : topWindow, - x.Bounds - }; - }) - .ToList(); - if (!widgets.Any()) - { - return testRunner; - } - - var minPosition = widgets.Aggregate((double.MaxValue, double.MaxValue), (acc, wi) => - { - var bounds = wi.Widget.TransformToParentSpace(wi.ContainingWindow, wi.Bounds); - var x = bounds.Left - 1; - var y = bounds.Bottom - 1; - return (x < acc.Item1 ? x : acc.Item1, y < acc.Item2 ? y : acc.Item2); - }); - var maxPosition = widgets.Aggregate((0d, 0d), (acc, wi) => - { - var bounds = wi.Widget.TransformToParentSpace(wi.ContainingWindow, wi.Bounds); - var x = bounds.Right + 1; - var y = bounds.Top + 1; - return (x > acc.Item1 ? x : acc.Item1, y > acc.Item2 ? y : acc.Item2); - }); - - var systemWindow = widgets.First().ContainingWindow; - testRunner.SetMouseCursorPosition(systemWindow, (int)minPosition.Item1, (int)minPosition.Item2); - testRunner.DragToPosition(systemWindow, (int)maxPosition.Item1, (int)maxPosition.Item2).Drop(); - - return testRunner; - RectangleDouble GetBoundingBox(IObject3D part) { var screenBoundsOfObject3D = RectangleDouble.ZeroIntersection; - var bounds = part.GetBVHData().GetAxisAlignedBoundingBox(); + var bounds = part.GetAxisAlignedBoundingBox(); for (var i = 0; i < 4; i += 1) { @@ -1570,41 +1529,87 @@ namespace MatterHackers.MatterControl.Tests.Automation return screenBoundsOfObject3D; } - (bool Ok, string Name, RectangleDouble Bounds) + (string Name, RectangleDouble Bounds) ResolveName(IEnumerable parts, string name) { foreach (var part in parts) { if (part.Name == name) { - return (true, name, GetBoundingBox(part)); + return (name, GetBoundingBox(part)); } if (part is GroupObject3D group) { - var (ok, _, bounds) = ResolveName(group.Children, name); - if (ok) + var (nameOut, bounds) = ResolveName(group.Children, name); + if (nameOut != null) { // WARNING the position of a part changes when it's added to a group. // Not sure if there's some sort of offset that needs to be applied or // if this is a bug. It is restored to its correct position when the // part is ungrouped. - return (true, name, bounds); + return (nameOut, bounds); } } if (part is SelectionGroupObject3D selection) { - var (ok, _, bounds) = ResolveName(selection.Children, name); - if (ok) + var (nameOut, bounds) = ResolveName(selection.Children, name); + if (nameOut != null) { - return (true, name, bounds); + return (nameOut, bounds); } } } - return (false, null, RectangleDouble.ZeroIntersection); + return (null, RectangleDouble.ZeroIntersection); } + + var topWindow = controlLayer.Parents().First(); + + var widgetContainingWindowBounds = partNames + .Select(name => ResolveName(controlLayer.Scene.Children, name)) + .Where(nameBounds => nameBounds.Name != null) + .Select(nameBounds => + { + var widget = testRunner.GetWidgetByName(nameBounds.Name, out var containingWindow, 1); + return new + { + Widget = widget ?? controlLayer, + ContainingWindow = widget != null ? containingWindow : topWindow, + nameBounds.Bounds + }; + }) + .ToList(); + + if (!widgetContainingWindowBounds.Any()) + { + return testRunner; + } + + // start out with a big number so we can find the smallest + var minPosition = widgetContainingWindowBounds.Aggregate((double.MaxValue, double.MaxValue), (acc, wcwb) => + { + var bounds = wcwb.Widget.TransformToParentSpace(wcwb.ContainingWindow, wcwb.Bounds); + var x = bounds.Left - 1; + var y = bounds.Bottom - 1; + return (x < acc.Item1 ? x : acc.Item1, y < acc.Item2 ? y : acc.Item2); + }); + + // start out with a small number so we can find the bigest + var maxPosition = widgetContainingWindowBounds.Aggregate((double.MinValue, double.MinValue), (acc, wi) => + { + var bounds = wi.Widget.TransformToParentSpace(wi.ContainingWindow, wi.Bounds); + var x = bounds.Right + 1; + var y = bounds.Top + 1; + return (x > acc.Item1 ? x : acc.Item1, y > acc.Item2 ? y : acc.Item2); + }); + + var systemWindow = widgetContainingWindowBounds.First().ContainingWindow; + testRunner.SetMouseCursorPosition(systemWindow, (int)minPosition.Item1, (int)minPosition.Item2); + testRunner.DragToPosition(systemWindow, (int)maxPosition.Item1, (int)maxPosition.Item2).Drop(); + + return testRunner; } }