From f01914f1b197ae5d2bfa3364c66e09c9f634e2c3 Mon Sep 17 00:00:00 2001 From: LarsBrubaker Date: Wed, 7 Oct 2020 08:03:57 -0700 Subject: [PATCH] Make sure array does not move the source object issue: MatterHackers/MCCentral#6107 array should not move the initial object --- .../Operations/ArrayLinearObject3D.cs | 41 +++++++---------- .../DesignTools/Operations/ArrayObject3D.cs | 45 +++++++++++++++++++ 2 files changed, 62 insertions(+), 24 deletions(-) create mode 100644 MatterControlLib/DesignTools/Operations/ArrayObject3D.cs diff --git a/MatterControlLib/DesignTools/Operations/ArrayLinearObject3D.cs b/MatterControlLib/DesignTools/Operations/ArrayLinearObject3D.cs index b695668ce..6728a49d4 100644 --- a/MatterControlLib/DesignTools/Operations/ArrayLinearObject3D.cs +++ b/MatterControlLib/DesignTools/Operations/ArrayLinearObject3D.cs @@ -38,10 +38,6 @@ using MatterHackers.VectorMath; namespace MatterHackers.MatterControl.DesignTools.Operations { - public abstract class ArrayObject3D : OperationSourceContainerObject3D - { - public abstract int Count { get; set; } - } public class ArrayLinearObject3D : ArrayObject3D { @@ -70,29 +66,26 @@ namespace MatterHackers.MatterControl.DesignTools.Operations { this.DebugDepth("Rebuild"); - using (new CenterAndHeightMaintainer(this)) + var newChildren = new List(); + + newChildren.Add(SourceContainer); + + var arrayItem = SourceContainer.Children.First(); + + // add in all the array items + for (int i = 0; i < Math.Max(Count, 1); i++) { - var newChildren = new List(); - - newChildren.Add(SourceContainer); - - var arrayItem = SourceContainer.Children.First(); - - // add in all the array items - for (int i = 0; i < Math.Max(Count, 1); i++) - { - var next = arrayItem.Clone(); - next.Matrix = arrayItem.Matrix * Matrix4X4.CreateTranslation(Direction.Normal.GetNormal() * Distance * i); - newChildren.Add(next); - } - - Children.Modify(list => - { - list.Clear(); - list.AddRange(newChildren); - }); + var next = arrayItem.Clone(); + next.Matrix = arrayItem.Matrix * Matrix4X4.CreateTranslation(Direction.Normal.GetNormal() * Distance * i); + newChildren.Add(next); } + Children.Modify(list => + { + list.Clear(); + list.AddRange(newChildren); + }); + SourceContainer.Visible = false; rebuildLock.Dispose(); Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children)); diff --git a/MatterControlLib/DesignTools/Operations/ArrayObject3D.cs b/MatterControlLib/DesignTools/Operations/ArrayObject3D.cs new file mode 100644 index 000000000..22d66d63b --- /dev/null +++ b/MatterControlLib/DesignTools/Operations/ArrayObject3D.cs @@ -0,0 +1,45 @@ +/* +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.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using MatterHackers.DataConverters3D; +using MatterHackers.Localizations; +using MatterHackers.MatterControl.DesignTools.EditableTypes; +using MatterHackers.VectorMath; + +namespace MatterHackers.MatterControl.DesignTools.Operations +{ + public abstract class ArrayObject3D : OperationSourceContainerObject3D + { + public abstract int Count { get; set; } + } +} \ No newline at end of file