diff --git a/ApplicationView/ApplicationController.cs b/ApplicationView/ApplicationController.cs index 8e92d6ae2..0ea59dc7e 100644 --- a/ApplicationView/ApplicationController.cs +++ b/ApplicationView/ApplicationController.cs @@ -401,7 +401,7 @@ namespace MatterHackers.MatterControl TitleResolver = () => "Proportional Scale".Localize(), Action = (scene) => { - HoldChildProportional.AddSelectionAsChildren(scene, new HoldChildProportional(), nameof(ProportionalEditor), "Proportional Scale"); + scene.AddSelectionAsChildren(new HoldChildProportional()); }, //Icon = AggContext.StaticData.LoadIcon("subtract.png").SetPreMultiply(), IsEnabled = (scene) => scene.HasSelection, @@ -411,7 +411,7 @@ namespace MatterHackers.MatterControl TitleResolver = () => "Array".Localize(), Action = (scene) => { - HoldChildProportional.AddSelectionAsChildren(scene, new ArrayObject3D(), nameof(ArrayObject3D), "Array Part"); + scene.AddSelectionAsChildren(new ArrayObject3D()); if(scene.SelectedItem is ArrayObject3D array) { array.Rebuild(); diff --git a/DesignTools/Operations/Object3DExtensions.cs b/DesignTools/Operations/Object3DExtensions.cs index 8f193905a..f53fb6e47 100644 --- a/DesignTools/Operations/Object3DExtensions.cs +++ b/DesignTools/Operations/Object3DExtensions.cs @@ -35,6 +35,7 @@ using System.Threading; using MatterHackers.Agg.Font; using MatterHackers.Agg.Platform; using MatterHackers.DataConverters3D; +using MatterHackers.DataConverters3D.UndoCommands; using MatterHackers.MatterControl.PartPreviewWindow.View3D; using MatterHackers.PolygonMesh; using MatterHackers.RenderOpenGl; @@ -63,6 +64,54 @@ namespace MatterHackers.MatterControl.DesignTools.Operations return resultsA; } + public static void AddSelectionAsChildren(this InteractiveScene scene, IObject3D newParent) + { + if (scene.HasSelection) + { + IObject3D item; + + List itemsToReplace; + + if (scene.SelectedItem is SelectionGroup) + { + Object3D container = new Object3D(); + itemsToReplace = scene.SelectedItem.Children.ToList(); + foreach (var child in itemsToReplace) + { + container.Children.Add(child.Clone()); + } + item = container; + } + else + { + itemsToReplace = new List { scene.SelectedItem }; + item = scene.SelectedItem.Clone(); + } + + scene.SelectedItem = null; + + newParent.Children.Add(item); + + newParent.MakeNameNonColliding(); + + scene.UndoBuffer.AddAndDo( + new ReplaceCommand( + itemsToReplace, + new List { newParent })); + + if (newParent is HoldChildProportional pe) + { + item.Matrix = Matrix4X4.Identity; + + // Make the object have an identity matrix and keep its position in our new object + newParent.Matrix = item.Matrix; + pe.InitialChildBounds = item.GetAxisAlignedBoundingBox(); + } + + scene.SelectedItem = newParent; + } + } + public static void WrapWith(this IObject3D originalItem, IObject3D wrapper, BedConfig sceneContext) { originalItem.Parent.Children.Modify(list => diff --git a/PartPreviewWindow/View3D/Actions/ProportionalEditor.cs b/PartPreviewWindow/View3D/Actions/ProportionalEditor.cs index 208f0323b..ab6b554fb 100644 --- a/PartPreviewWindow/View3D/Actions/ProportionalEditor.cs +++ b/PartPreviewWindow/View3D/Actions/ProportionalEditor.cs @@ -79,54 +79,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D base.OnInvalidate(); } - - public static void AddSelectionAsChildren(InteractiveScene scene, IObject3D newParent, string classDescriptor, string editorName) - { - if (scene.HasSelection) - { - IObject3D itemToHoldProportional; - - List itemsToReplace; - - if (scene.SelectedItem is SelectionGroup) - { - Object3D container = new Object3D(); - itemsToReplace = scene.SelectedItem.Children.ToList(); - foreach (var child in itemsToReplace) - { - container.Children.Add(child.Clone()); - } - itemToHoldProportional = container; - } - else - { - itemsToReplace = new List { scene.SelectedItem }; - itemToHoldProportional = scene.SelectedItem.Clone(); - } - - scene.SelectedItem = null; - - newParent.Children.Add(itemToHoldProportional); - - newParent.MakeNameNonColliding(); - - scene.UndoBuffer.AddAndDo( - new ReplaceCommand( - itemsToReplace, - new List { newParent })); - - // Make the object have an identity matrix and keep its position in our new object - newParent.Matrix = itemToHoldProportional.Matrix; - itemToHoldProportional.Matrix = Matrix4X4.Identity; - - if (newParent is HoldChildProportional pe) - { - pe.InitialChildBounds = itemToHoldProportional.GetAxisAlignedBoundingBox(); - } - - scene.SelectedItem = newParent; - } - } } public class ProportionalEditor : IObject3DEditor