Improved selection maintainer

This commit is contained in:
LarsBrubaker 2022-02-26 22:49:12 -08:00
parent 61e68b6afa
commit 7000ae843d
9 changed files with 55 additions and 91 deletions

View file

@ -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<IObject3D> selectedObjects = new List<IObject3D>();
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);
}
}
}
}
}

View file

@ -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();

View file

@ -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())
{

View file

@ -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()));
}
}

View file

@ -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);
}

View file

@ -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<TransformData>();
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<TransformData>();
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));
});
}

View file

@ -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)
{

View file

@ -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)
{

@ -1 +1 @@
Subproject commit 3d4bad87cb2d06bad2af4de8e9303e62f6398270
Subproject commit e7098ee1c079e7f2446a16921734f726be08ad48