diff --git a/ApplicationView/ApplicationController.cs b/ApplicationView/ApplicationController.cs
index 526b5776b..ef1bb5d3d 100644
--- a/ApplicationView/ApplicationController.cs
+++ b/ApplicationView/ApplicationController.cs
@@ -399,7 +399,24 @@ namespace MatterHackers.MatterControl
new SceneSelectionOperation()
{
TitleResolver = () => "Proportional Scale".Localize(),
- Action = (scene) => HoldChildProportional.AddSelectionAsChildren(scene, nameof(ProportionalEditor), "Proportional Scale"),
+ Action = (scene) =>
+ {
+ HoldChildProportional.AddSelectionAsChildren(scene, new HoldChildProportional(), nameof(ProportionalEditor), "Proportional Scale");
+ },
+ //Icon = AggContext.StaticData.LoadIcon("subtract.png").SetPreMultiply(),
+ IsEnabled = (scene) => scene.HasSelection,
+ },
+ new SceneSelectionOperation()
+ {
+ TitleResolver = () => "Array".Localize(),
+ Action = (scene) =>
+ {
+ HoldChildProportional.AddSelectionAsChildren(scene, new ArrayObject3D(), nameof(ArrayObject3D), "Array Part");
+ if(scene.SelectedItem is ArrayObject3D array)
+ {
+ array.SetCopy();
+ }
+ },
//Icon = AggContext.StaticData.LoadIcon("subtract.png").SetPreMultiply(),
IsEnabled = (scene) => scene.HasSelection,
},
diff --git a/DesignTools/Operations/ArrayObject3D.cs b/DesignTools/Operations/ArrayObject3D.cs
new file mode 100644
index 000000000..a6b2fb24b
--- /dev/null
+++ b/DesignTools/Operations/ArrayObject3D.cs
@@ -0,0 +1,72 @@
+/*
+Copyright (c) 2018, Lars Brubaker, John Lewin
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+The views and conclusions contained in the software and documentation are those
+of the authors and should not be interpreted as representing official policies,
+either expressed or implied, of the FreeBSD Project.
+*/
+
+using System;
+using System.Linq;
+using MatterHackers.DataConverters3D;
+using MatterHackers.VectorMath;
+
+namespace MatterHackers.MatterControl.DesignTools.Operations
+{
+ public class ArrayObject3D : Object3D, IRebuildable
+ {
+ IObject3D item;
+
+ public int Count { get; set; } = 3;
+ public double XOffset { get; set; } = 30;
+ public double YOffset { get; set; } = 30;
+
+ public override string ActiveEditor => "PublicPropertyEditor";
+
+ public ArrayObject3D()
+ {
+ }
+
+ public void Rebuild()
+ {
+ this.Children.Modify(list =>
+ {
+ list.Clear();
+ for(int i=0; i
+
diff --git a/PartPreviewWindow/View3D/Actions/ProportionalEditor.cs b/PartPreviewWindow/View3D/Actions/ProportionalEditor.cs
index 80e071e6d..208f0323b 100644
--- a/PartPreviewWindow/View3D/Actions/ProportionalEditor.cs
+++ b/PartPreviewWindow/View3D/Actions/ProportionalEditor.cs
@@ -80,11 +80,10 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
base.OnInvalidate();
}
- public static void AddSelectionAsChildren(InteractiveScene scene, string classDescriptor, string editorName)
+ public static void AddSelectionAsChildren(InteractiveScene scene, IObject3D newParent, string classDescriptor, string editorName)
{
if (scene.HasSelection)
{
- HoldChildProportional newParent = new HoldChildProportional();
IObject3D itemToHoldProportional;
List itemsToReplace;
@@ -120,7 +119,10 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
newParent.Matrix = itemToHoldProportional.Matrix;
itemToHoldProportional.Matrix = Matrix4X4.Identity;
- newParent.InitialChildBounds = itemToHoldProportional.GetAxisAlignedBoundingBox();
+ if (newParent is HoldChildProportional pe)
+ {
+ pe.InitialChildBounds = itemToHoldProportional.GetAxisAlignedBoundingBox();
+ }
scene.SelectedItem = newParent;
}