Improved selection maintainer
This commit is contained in:
parent
61e68b6afa
commit
7000ae843d
9 changed files with 55 additions and 91 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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()));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
Loading…
Add table
Add a link
Reference in a new issue