diff --git a/MatterControlLib/ApplicationView/ApplicationController.cs b/MatterControlLib/ApplicationView/ApplicationController.cs index b9eb3b33b..5ae9f5be0 100644 --- a/MatterControlLib/ApplicationView/ApplicationController.cs +++ b/MatterControlLib/ApplicationView/ApplicationController.cs @@ -1047,28 +1047,6 @@ namespace MatterHackers.MatterControl }); } - public static IObject3D SelectionAsSingleClone(IObject3D selection) - { - IEnumerable items = new[] { selection }; - - // If SelectionGroup, operate on Children instead - if (selection is SelectionGroupObject3D) - { - items = selection.Children; - - var group = new GroupObject3D(); - - group.Children.Modify(children => - { - children.AddRange(items.Select(o => o.Clone())); - }); - - return group; - } - - return selection.Clone(); - } - public ApplicationController() { this.Thumbnails = new ThumbnailsConfig(); @@ -1139,14 +1117,10 @@ namespace MatterHackers.MatterControl (sceneItem, scene) => { var selectedItem = scene.SelectedItem; - var replaceItems = (selectedItem is SelectionGroupObject3D) ? selectedItem.Children.ToList() : new List { selectedItem }; scene.SelectedItem = null; - var selectedClone = SelectionAsSingleClone(selectedItem); - var tranlate = TranslateObject3D.Create(selectedClone); - tranlate.MakeNameNonColliding(); - - scene.UndoBuffer.AddAndDo(new ReplaceCommand(replaceItems, new List { tranlate })); - scene.SelectedItem = tranlate; + var scale = new TranslateObject3D(); + scale.WrapItem(selectedItem, scene.UndoBuffer); + scene.SelectedItem = scale; return Task.CompletedTask; }, @@ -1159,19 +1133,45 @@ namespace MatterHackers.MatterControl (sceneItem, scene) => { var selectedItem = scene.SelectedItem; - var replaceItems = (selectedItem is SelectionGroupObject3D) ? selectedItem.Children.ToList() : new List { selectedItem }; scene.SelectedItem = null; - var selectedClone = SelectionAsSingleClone(selectedItem); - var rotate = new RotateObject3D_2(selectedClone); - rotate.MakeNameNonColliding(); - - scene.UndoBuffer.AddAndDo(new ReplaceCommand(replaceItems, new List { rotate })); - scene.SelectedItem = rotate; + var scale = new RotateObject3D_2(); + scale.WrapItem(selectedItem, scene.UndoBuffer); + scene.SelectedItem = scale; return Task.CompletedTask; }, iconCollector: (theme) => AggContext.StaticData.LoadIcon(Path.Combine("ViewTransformControls", "rotate.png"), 16, 16, theme.InvertIcons)); + + this.Graph.RegisterOperation( + typeof(IObject3D), + typeof(ScaleObject3D), + "Scale".Localize(), + (sceneItem, scene) => + { + var selectedItem = scene.SelectedItem; + scene.SelectedItem = null; + var scale = new ScaleObject3D(); + scale.WrapItem(selectedItem, scene.UndoBuffer); + scene.SelectedItem = scale; + + return Task.CompletedTask; + }, + iconCollector: (theme) => AggContext.StaticData.LoadIcon("scale_32x32.png", 16, 16, theme.InvertIcons)); + + this.Graph.RegisterOperation( + typeof(IObject3D), + typeof(MirrorObject3D), + "Mirror".Localize(), + (sceneItem, scene) => + { + var mirror = new MirrorObject3D(); + mirror.WrapSelectedItemAndSelect(scene); + + return Task.CompletedTask; + }, + iconCollector: (theme) => AggContext.StaticData.LoadIcon("mirror_32x32.png", 16, 16, theme.InvertIcons)); + this.Graph.RegisterOperation( typeof(IObject3D), typeof(ComponentObject3D), @@ -1243,39 +1243,6 @@ namespace MatterHackers.MatterControl }, iconCollector: (theme) => AggContext.StaticData.LoadIcon("scale_32x32.png", 16, 16, theme.InvertIcons)); - this.Graph.RegisterOperation( - typeof(IObject3D), - typeof(ScaleObject3D), - "Scale".Localize(), - (sceneItem, scene) => - { - var selectedItem = scene.SelectedItem; - var replaceItems = (selectedItem is SelectionGroupObject3D) ? selectedItem.Children.ToList() : new List { selectedItem }; - scene.SelectedItem = null; - var selectedClone = SelectionAsSingleClone(selectedItem); - var scale = new ScaleObject3D(selectedClone); - scale.MakeNameNonColliding(); - - scene.UndoBuffer.AddAndDo(new ReplaceCommand(replaceItems, new List { scale })); - scene.SelectedItem = scale; - - return Task.CompletedTask; - }, - iconCollector: (theme) => AggContext.StaticData.LoadIcon("scale_32x32.png", 16, 16, theme.InvertIcons)); - - this.Graph.RegisterOperation( - typeof(IObject3D), - typeof(MirrorObject3D), - "Mirror".Localize(), - (sceneItem, scene) => - { - var mirror = new MirrorObject3D(); - mirror.WrapSelectedItemAndSelect(scene); - - return Task.CompletedTask; - }, - iconCollector: (theme) => AggContext.StaticData.LoadIcon("mirror_32x32.png", 16, 16, theme.InvertIcons)); - this.Graph.RegisterOperation( typeof(IPathObject), typeof(LinearExtrudeObject3D), diff --git a/MatterControlLib/DesignTools/Operations/RotateObject3D_2.cs b/MatterControlLib/DesignTools/Operations/RotateObject3D_2.cs index 662071ab6..7e30d7754 100644 --- a/MatterControlLib/DesignTools/Operations/RotateObject3D_2.cs +++ b/MatterControlLib/DesignTools/Operations/RotateObject3D_2.cs @@ -50,15 +50,9 @@ namespace MatterHackers.MatterControl.DesignTools.Operations public RotateObject3D_2(IObject3D itemToRotate, double xRadians = 0, double yRadians = 0, double zRadians = 0, string name = "") : this() { - var aabb = itemToRotate.GetAxisAlignedBoundingBox(); + WrapItem(itemToRotate); - this.RotateAbout.Origin = aabb.Center; - - var rotateItem = new Object3D(); - this.Children.Add(rotateItem); - rotateItem.Children.Add(itemToRotate); - - Rebuild(null); + // TODO: set the rotation } public RotateObject3D_2(IObject3D itemToRotate, Vector3 translation, string name = "") @@ -66,6 +60,14 @@ namespace MatterHackers.MatterControl.DesignTools.Operations { } + public override void WrapItem(IObject3D item, UndoBuffer undoBuffer = null) + { + base.WrapItem(item, undoBuffer); + + var aabb = item.GetAxisAlignedBoundingBox(); + this.RotateAbout.Origin = aabb.Center; + } + public override bool CanFlatten => true; #region // editable properties diff --git a/MatterControlLib/DesignTools/Operations/ScaleObject3D.cs b/MatterControlLib/DesignTools/Operations/ScaleObject3D.cs index ecf1378aa..a7766e085 100644 --- a/MatterControlLib/DesignTools/Operations/ScaleObject3D.cs +++ b/MatterControlLib/DesignTools/Operations/ScaleObject3D.cs @@ -57,20 +57,17 @@ namespace MatterHackers.MatterControl.DesignTools.Operations public ScaleObject3D(IObject3D itemToScale, Vector3 scale) : this() { - var aabb = itemToScale.GetAxisAlignedBoundingBox(); - // move our inner content to a centered position + WrapItem(itemToScale); + } + + public override void WrapItem(IObject3D item, UndoBuffer undoBuffer = null) + { + base.WrapItem(item, undoBuffer); + + var aabb = item.GetAxisAlignedBoundingBox(); var newCenter = new Vector3(aabb.Center.X, aabb.Center.Y, aabb.minXYZ.Z); - itemToScale.Translate(-newCenter); + item.Translate(-newCenter); this.Translate(newCenter); - - // set some state - this.ScaleRatio = scale; - - var scaleItem = new Object3D(); - this.Children.Add(scaleItem); - scaleItem.Children.Add(itemToScale); - - Rebuild(null); } public override bool CanFlatten => true; diff --git a/MatterControlLib/DesignTools/Operations/TransformWrapperObject3D.cs b/MatterControlLib/DesignTools/Operations/TransformWrapperObject3D.cs index 964372ba5..1245cc3b8 100644 --- a/MatterControlLib/DesignTools/Operations/TransformWrapperObject3D.cs +++ b/MatterControlLib/DesignTools/Operations/TransformWrapperObject3D.cs @@ -28,11 +28,13 @@ either expressed or implied, of the FreeBSD Project. */ using System; +using System.Collections.Generic; using System.ComponentModel; using System.Linq; using MatterHackers.Agg; using MatterHackers.Agg.UI; using MatterHackers.DataConverters3D; +using MatterHackers.DataConverters3D.UndoCommands; using MatterHackers.Localizations; using MatterHackers.MatterControl.PartPreviewWindow; using MatterHackers.MeshVisualizer; @@ -77,6 +79,42 @@ namespace MatterHackers.MatterControl.DesignTools.Operations Name = "Transform Wrapper".Localize(); } + public virtual void WrapItem(IObject3D item, UndoBuffer undoBuffer = null) + { + var replaceItems = (item is SelectionGroupObject3D) ? item.Children.ToList() : new List { item }; + IObject3D itemClone; + // If SelectionGroup, operate on Children instead + if (item is SelectionGroupObject3D) + { + IEnumerable items = item.Children; + + itemClone = new GroupObject3D(); + + itemClone.Children.Modify(children => + { + children.AddRange(items.Select(o => o.Clone())); + }); + } + else + { + itemClone = item.Clone(); + } + + var firstChild = new Object3D(); + this.Children.Add(firstChild); + firstChild.Children.Add(itemClone); + + var replace = new ReplaceCommand(replaceItems, new List { this }); + if (undoBuffer != null) + { + undoBuffer.AddAndDo(replace); + } + else + { + replace.Do(); + } + } + public override void Flatten(UndoBuffer undoBuffer) { using (RebuildLock()) diff --git a/MatterControlLib/DesignTools/Operations/TranslateObject3D.cs b/MatterControlLib/DesignTools/Operations/TranslateObject3D.cs index 2c9a1daa3..ce99b4f49 100644 --- a/MatterControlLib/DesignTools/Operations/TranslateObject3D.cs +++ b/MatterControlLib/DesignTools/Operations/TranslateObject3D.cs @@ -50,14 +50,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations public TranslateObject3D(IObject3D itemToTranslate, Vector3 translation) : this() { - Translation = translation; - var aabb = itemToTranslate.GetAxisAlignedBoundingBox(); - - var translateItem = new Object3D(); - this.Children.Add(translateItem); - translateItem.Children.Add(itemToTranslate); - - Rebuild(null); + WrapItem(itemToTranslate); } public override bool CanFlatten => true; diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index d78ab52ec..dfdd6ede1 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit d78ab52ec3d904a480f9f61881096dc7c7b5b830 +Subproject commit dfdd6ede10f6f2c680b4b7b0f0c25c22b330e97f