diff --git a/MatterControlLib/ApplicationView/EditContext.cs b/MatterControlLib/ApplicationView/EditContext.cs index 79a971889..a4fc9f914 100644 --- a/MatterControlLib/ApplicationView/EditContext.cs +++ b/MatterControlLib/ApplicationView/EditContext.cs @@ -131,7 +131,7 @@ namespace MatterHackers.MatterControl if (scene is InteractiveScene interactiveScene) { - using (new ClearThenRestorSelection(interactiveScene)) + using (new SelectionMaintainer(interactiveScene)) { // Call save on the provider this.ContentStore?.Save(this.SourceItem, scene); @@ -228,41 +228,4 @@ namespace MatterHackers.MatterControl return Path.ChangeExtension(await GCodePath(printer), GCodeFile.PostProcessedExtension); } } - - public class ClearThenRestorSelection : IDisposable - { - private InteractiveScene interactiveScene; - private List selectedObjects = new List(); - - public ClearThenRestorSelection(InteractiveScene interactiveScene) - { - this.interactiveScene = interactiveScene; - - // remember any selected objects we have - var selection = interactiveScene.SelectedItem; - if (selection != null) - { - if (selection is SelectionGroupObject3D selectionGroup) - { - selectedObjects.AddRange(selectionGroup.Children); - } - else - { - selectedObjects.Add(selection); - } - } - } - - public void Dispose() - { - // restore the selcetion - foreach(var item in selectedObjects) - { - if (!(item is SelectionGroupObject3D)) - { - interactiveScene.AddToSelection(item); - } - } - } - } } \ No newline at end of file diff --git a/MatterControlLib/ApplicationView/SceneOperations.cs b/MatterControlLib/ApplicationView/SceneOperations.cs index abde2ea7b..e8a789754 100644 --- a/MatterControlLib/ApplicationView/SceneOperations.cs +++ b/MatterControlLib/ApplicationView/SceneOperations.cs @@ -331,7 +331,7 @@ namespace MatterHackers.MatterControl component.Matrix = imageObject.Matrix; imageObject.Matrix = Matrix4X4.Identity; - using (new SelectionMaintainer(scene)) + using (new DataConverters3D.SelectionMaintainer(scene)) { scene.UndoBuffer.AddAndDo(new ReplaceCommand(new[] { sceneItem }, new[] { component })); } @@ -397,7 +397,7 @@ namespace MatterHackers.MatterControl inflatePath.Matrix = itemClone.Matrix; itemClone.Matrix = Matrix4X4.Identity; - using (new SelectionMaintainer(scene)) + using (new DataConverters3D.SelectionMaintainer(scene)) { scene.UndoBuffer.AddAndDo(new ReplaceCommand(new[] { sceneItem }, new[] { inflatePath })); } @@ -430,7 +430,7 @@ namespace MatterHackers.MatterControl extrude.Matrix = itemClone.Matrix; itemClone.Matrix = Matrix4X4.Identity; - using (new SelectionMaintainer(scene)) + using (new DataConverters3D.SelectionMaintainer(scene)) { scene.UndoBuffer.AddAndDo(new ReplaceCommand(new[] { sceneItem }, new[] { extrude })); } @@ -464,7 +464,7 @@ namespace MatterHackers.MatterControl revolve.Matrix = itemClone.Matrix; itemClone.Matrix = Matrix4X4.Identity; - using (new SelectionMaintainer(scene)) + using (new DataConverters3D.SelectionMaintainer(scene)) { scene.UndoBuffer.AddAndDo(new ReplaceCommand(new[] { sceneItem }, new[] { revolve })); } @@ -497,10 +497,10 @@ namespace MatterHackers.MatterControl } // Dump selection forcing collapse of selection group - using (new SelectionMaintainer(scene)) + using (new DataConverters3D.SelectionMaintainer(scene)) { var component = new ComponentObject3D - { + { Name = "New Component", Finalized = false }; @@ -562,7 +562,7 @@ namespace MatterHackers.MatterControl outlinePath.Matrix = itemClone.Matrix; itemClone.Matrix = Matrix4X4.Identity; - using (new SelectionMaintainer(scene)) + using (new DataConverters3D.SelectionMaintainer(scene)) { scene.UndoBuffer.AddAndDo(new ReplaceCommand(new[] { sceneItem }, new[] { outlinePath })); } @@ -626,7 +626,7 @@ namespace MatterHackers.MatterControl smoothPath.Matrix = itemClone.Matrix; itemClone.Matrix = Matrix4X4.Identity; - using (new SelectionMaintainer(scene)) + using (new DataConverters3D.SelectionMaintainer(scene)) { scene.UndoBuffer.AddAndDo(new ReplaceCommand(new[] { sceneItem }, new[] { smoothPath })); } @@ -1039,7 +1039,7 @@ namespace MatterHackers.MatterControl { var scene = sceneContext.Scene; var selectedItem = scene.SelectedItem; - using (new SelectionMaintainer(scene)) + using (new DataConverters3D.SelectionMaintainer(scene)) { var fit = await FitToBoundsObject3D_3.Create(selectedItem.Clone()); fit.MakeNameNonColliding(); @@ -1063,7 +1063,7 @@ namespace MatterHackers.MatterControl { var scene = sceneContext.Scene; var selectedItem = scene.SelectedItem; - using (new SelectionMaintainer(scene)) + using (new DataConverters3D.SelectionMaintainer(scene)) { var fit = await FitToCylinderObject3D.Create(selectedItem.Clone()); fit.MakeNameNonColliding(); diff --git a/MatterControlLib/DesignTools/Operations/Object3DExtensions.cs b/MatterControlLib/DesignTools/Operations/Object3DExtensions.cs index 692bd757a..cf4d32e34 100644 --- a/MatterControlLib/DesignTools/Operations/Object3DExtensions.cs +++ b/MatterControlLib/DesignTools/Operations/Object3DExtensions.cs @@ -148,9 +148,9 @@ namespace MatterHackers.MatterControl.DesignTools.Operations && (object3D.Parents().Contains(scene.SelectedItem) || object3D == scene.SelectedItem)) { - var selection = scene.SelectedItem; - scene.SelectedItem = null; - scene.SelectedItem = selection; + using(new SelectionMaintainer(scene)) + { + } } } @@ -415,7 +415,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations { var selectedItems = scene.GetSelectedItems(); - using (new SelectionMaintainer(scene)) + using (new DataConverters3D.SelectionMaintainer(scene)) { using (selectedItem.Parent.RebuildLock()) { diff --git a/MatterControlLib/DesignTools/SupportGenerator.cs b/MatterControlLib/DesignTools/SupportGenerator.cs index ee25a32f6..3b6b72173 100644 --- a/MatterControlLib/DesignTools/SupportGenerator.cs +++ b/MatterControlLib/DesignTools/SupportGenerator.cs @@ -152,10 +152,10 @@ namespace MatterHackers.MatterControl.DesignTools { var selectedItem = scene.SelectedItem; - using (new SelectionMaintainer(scene)) + using (new DataConverters3D.SelectionMaintainer(scene)) { var status = new ProgressStatus - { + { Status = "Enter" }; progress?.Report(status); @@ -181,9 +181,9 @@ namespace MatterHackers.MatterControl.DesignTools // create the gird of possible support var gridBounds = new RectangleDouble(Math.Floor((double)(suppoortBounds.MinXYZ.X / PillarSize)), - Math.Floor((double)(suppoortBounds.MinXYZ.Y / PillarSize)), - Math.Ceiling(suppoortBounds.MaxXYZ.X / PillarSize), - Math.Ceiling(suppoortBounds.MaxXYZ.Y / PillarSize)); + Math.Floor((double)(suppoortBounds.MinXYZ.Y / PillarSize)), + Math.Ceiling(suppoortBounds.MaxXYZ.X / PillarSize), + Math.Ceiling(suppoortBounds.MaxXYZ.Y / PillarSize)); var partBounds = new RectangleDouble(gridBounds.Left * PillarSize, gridBounds.Bottom * PillarSize, @@ -211,8 +211,8 @@ namespace MatterHackers.MatterControl.DesignTools status.Status = "Columns"; progress?.Report(status); - // minimum height requiring support is 1/2 the layer height - AddSupportColumns(gridBounds, detectedPlanes); + // minimum height requiring support is 1/2 the layer height + AddSupportColumns(gridBounds, detectedPlanes); // this is the theory for regions rather than pillars // separate the faces into face patch groups (these are the new support tops) @@ -235,7 +235,7 @@ namespace MatterHackers.MatterControl.DesignTools bedBounds = new RectangleDouble(new Vector2(aabb.MinXYZ), new Vector2(aabb.MaxXYZ)); } - using (new SelectionMaintainer(scene)) + using (new DataConverters3D.SelectionMaintainer(scene)) { var existingSupports = scene.Descendants().Where(i => { @@ -252,7 +252,7 @@ namespace MatterHackers.MatterControl.DesignTools return false; }); - scene.UndoBuffer.AddAndDo(new DeleteCommand(scene, existingSupports.ToList())); + scene.UndoBuffer.AddAndDo(new DeleteCommand(scene, existingSupports.ToList())); } } diff --git a/MatterControlLib/PartPreviewWindow/SelectedObjectPanel.cs b/MatterControlLib/PartPreviewWindow/SelectedObjectPanel.cs index 729e78a85..59dcad553 100644 --- a/MatterControlLib/PartPreviewWindow/SelectedObjectPanel.cs +++ b/MatterControlLib/PartPreviewWindow/SelectedObjectPanel.cs @@ -99,7 +99,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow if (this.item.CanApply) { var item = this.item; - using (new SelectionMaintainer(view3DWidget.Scene)) + using (new DataConverters3D.SelectionMaintainer(view3DWidget.Scene)) { item.Apply(view3DWidget.Scene.UndoBuffer); } @@ -122,7 +122,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow cancelButton.Click += (s, e) => { var item = this.item; - using (new SelectionMaintainer(view3DWidget.Scene)) + using (new DataConverters3D.SelectionMaintainer(view3DWidget.Scene)) { item.Cancel(view3DWidget.Scene.UndoBuffer); } diff --git a/MatterControlLib/PartPreviewWindow/View3D/SceneActions.cs b/MatterControlLib/PartPreviewWindow/View3D/SceneActions.cs index a96458c7e..3de7d7edd 100644 --- a/MatterControlLib/PartPreviewWindow/View3D/SceneActions.cs +++ b/MatterControlLib/PartPreviewWindow/View3D/SceneActions.cs @@ -71,33 +71,34 @@ namespace MatterHackers.MatterControl.PartPreviewWindow await Task.Run(() => { // Clear selection to ensure all root level children are arranged on the bed - scene.SelectedItem = null; - - var children = scene.Children.ToList().Where(item => + using (new SelectionMaintainer(scene)) { - var aabb = item.WorldAxisAlignedBoundingBox(); - if (aabb.Center.Length > 1000) + var children = scene.Children.ToList().Where(item => { - return true; + var aabb = item.WorldAxisAlignedBoundingBox(); + if (aabb.Center.Length > 1000) + { + return true; + } + + return item.Persistable == true && item.Printable == true; + }).ToList(); + var transformData = new List(); + foreach (var child in children) + { + transformData.Add(new TransformData() { TransformedObject = child, UndoTransform = child.Matrix }); } - return item.Persistable == true && item.Printable == true; - }).ToList(); - var transformData = new List(); - foreach (var child in children) - { - transformData.Add(new TransformData() { TransformedObject = child, UndoTransform = child.Matrix }); - } + PlatingHelper.ArrangeOnBed(children, bedCenter); + int i = 0; + foreach (var child in children) + { + transformData[i].RedoTransform = child.Matrix; + i++; + } - PlatingHelper.ArrangeOnBed(children, bedCenter); - int i = 0; - foreach (var child in children) - { - transformData[i].RedoTransform = child.Matrix; - i++; + scene.UndoBuffer.Add(new TransformCommand(transformData)); } - - scene.UndoBuffer.Add(new TransformCommand(transformData)); }); } diff --git a/MatterControlLib/PartPreviewWindow/View3D/UndoCommands/DeleteCommand.cs b/MatterControlLib/PartPreviewWindow/View3D/UndoCommands/DeleteCommand.cs index 0fa8e3ee8..090897eba 100644 --- a/MatterControlLib/PartPreviewWindow/View3D/UndoCommands/DeleteCommand.cs +++ b/MatterControlLib/PartPreviewWindow/View3D/UndoCommands/DeleteCommand.cs @@ -70,7 +70,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow public void Do() { - using (new SelectionMaintainer(scene)) + using (new DataConverters3D.SelectionMaintainer(scene)) { foreach(var item in items) { @@ -81,7 +81,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow public void Undo() { - using (new SelectionMaintainer(scene)) + using (new DataConverters3D.SelectionMaintainer(scene)) { foreach (var item in items) { diff --git a/MatterControlLib/PartPreviewWindow/View3D/View3DWidget.cs b/MatterControlLib/PartPreviewWindow/View3D/View3DWidget.cs index 9e5fe8b14..6defc0ef8 100644 --- a/MatterControlLib/PartPreviewWindow/View3D/View3DWidget.cs +++ b/MatterControlLib/PartPreviewWindow/View3D/View3DWidget.cs @@ -296,9 +296,9 @@ namespace MatterHackers.MatterControl.PartPreviewWindow UiThread.RunOnIdle(() => { // make sure the selected item is still selected after reload - var currentItem = sceneContext.Scene.SelectedItem; - sceneContext.Scene.SelectedItem = null; - sceneContext.Scene.SelectedItem = currentItem; + using(new SelectionMaintainer(Scene)) + { + } }); } } @@ -2135,7 +2135,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow if (e.InvalidateType.HasFlag(InvalidateType.Name)) { // clear and restore the selection so we have the name change - using (new ClearThenRestorSelection(Scene)) + using (new SelectionMaintainer(Scene)) { if (!rebuildTreePending) { diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index 3d4bad87c..e7098ee1c 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 3d4bad87cb2d06bad2af4de8e9303e62f6398270 +Subproject commit e7098ee1c079e7f2446a16921734f726be08ad48