From 89701f2d707987d42d48bd804c0bc76ac93185e8 Mon Sep 17 00:00:00 2001 From: Lars Brubaker Date: Fri, 25 May 2018 14:52:23 -0700 Subject: [PATCH 1/2] Improvements in mesh wrapper Default pinch to have an effect immediately Refactoring --- ApplicationView/ApplicationController.cs | 12 +-- DesignTools/Operations/CurveObject3D.cs | 2 +- DesignTools/Operations/PinchObject3D.cs | 2 +- .../View3D/Actions/MeshWrapperObject3D.cs | 61 ++++++-------- PartPreviewWindow/View3D/SceneActions.cs | 79 ++++++++++++------- PartPreviewWindow/ViewControls3D.cs | 11 ++- Submodules/agg-sharp | 2 +- 7 files changed, 88 insertions(+), 81 deletions(-) diff --git a/ApplicationView/ApplicationController.cs b/ApplicationView/ApplicationController.cs index c80a2253b..4da6330cd 100644 --- a/ApplicationView/ApplicationController.cs +++ b/ApplicationView/ApplicationController.cs @@ -512,7 +512,7 @@ namespace MatterHackers.MatterControl { OperationType = typeof(CombineObject3D), TitleResolver = () => "Combine".Localize(), - Action = (scene) => new CombineObject3D().DoInitialWrapping(scene), + Action = (scene) => new CombineObject3D().WrapSelectedItemAndSelect(scene), Icon = AggContext.StaticData.LoadIcon("combine.png").SetPreMultiply(), IsEnabled = (scene) => scene.SelectedItem is SelectionGroup, }, @@ -520,7 +520,7 @@ namespace MatterHackers.MatterControl { OperationType = typeof(SubtractObject3D), TitleResolver = () => "Subtract".Localize(), - Action = (scene) => new SubtractObject3D().DoInitialWrapping(scene), + Action = (scene) => new SubtractObject3D().WrapSelectedItemAndSelect(scene), Icon = AggContext.StaticData.LoadIcon("subtract.png").SetPreMultiply(), IsEnabled = (scene) => scene.SelectedItem is SelectionGroup, }, @@ -528,7 +528,7 @@ namespace MatterHackers.MatterControl { OperationType = typeof(IntersectionObject3D), TitleResolver = () => "Intersect".Localize(), - Action = (scene) => new IntersectionObject3D().DoInitialWrapping(scene), + Action = (scene) => new IntersectionObject3D().WrapSelectedItemAndSelect(scene), Icon = AggContext.StaticData.LoadIcon("intersect.png"), IsEnabled = (scene) => scene.SelectedItem is SelectionGroup, }, @@ -536,7 +536,7 @@ namespace MatterHackers.MatterControl { OperationType = typeof(SubtractAndReplaceObject3D), TitleResolver = () => "Subtract & Replace".Localize(), - Action = (scene) => new SubtractAndReplaceObject3D().DoInitialWrapping(scene), + Action = (scene) => new SubtractAndReplaceObject3D().WrapSelectedItemAndSelect(scene), Icon = AggContext.StaticData.LoadIcon("subtract_and_replace.png").SetPreMultiply(), IsEnabled = (scene) => scene.SelectedItem is SelectionGroup, }, @@ -594,7 +594,7 @@ namespace MatterHackers.MatterControl Action = (scene) => { var pinch = new PinchObject3D(); - pinch.DoInitialWrapping(scene); + pinch.WrapSelectedItemAndSelect(scene); }, Icon = AggContext.StaticData.LoadIcon("pinch.png", 16, 16, theme.InvertIcons), IsEnabled = (scene) => scene.HasSelection, @@ -606,7 +606,7 @@ namespace MatterHackers.MatterControl Action = (scene) => { var curve = new CurveObject3D(); - curve.DoInitialWrapping(scene); + curve.WrapSelectedItemAndSelect(scene); }, Icon = AggContext.StaticData.LoadIcon("curve.png", 16, 16, theme.InvertIcons), IsEnabled = (scene) => scene.HasSelection, diff --git a/DesignTools/Operations/CurveObject3D.cs b/DesignTools/Operations/CurveObject3D.cs index 92d5fe416..e2190357a 100644 --- a/DesignTools/Operations/CurveObject3D.cs +++ b/DesignTools/Operations/CurveObject3D.cs @@ -145,7 +145,7 @@ namespace MatterHackers.MatterControl.DesignTools if (curvedMesh == originalMesh) { // Make sure the mesh we are going to copy is in a good state to be copied (so we maintain vertex count) - originalMesh.CleanAndMergeMesh(CancellationToken.None); + //originalMesh.CleanAndMergeMesh(CancellationToken.None); curvedMesh = Mesh.Copy(originalMesh, CancellationToken.None); object3Ds.Curved.Mesh = curvedMesh; } diff --git a/DesignTools/Operations/PinchObject3D.cs b/DesignTools/Operations/PinchObject3D.cs index f9acdaa33..3fb7698d8 100644 --- a/DesignTools/Operations/PinchObject3D.cs +++ b/DesignTools/Operations/PinchObject3D.cs @@ -41,7 +41,7 @@ namespace MatterHackers.MatterControl.DesignTools public class PinchObject3D : MeshWrapperObject3D, IPublicPropertyObject { [DisplayName("Back Ratio")] - public double PinchRatio { get; set; } = 1; + public double PinchRatio { get; set; } = .5; public PinchObject3D() { diff --git a/PartPreviewWindow/View3D/Actions/MeshWrapperObject3D.cs b/PartPreviewWindow/View3D/Actions/MeshWrapperObject3D.cs index a200376b3..309f15548 100644 --- a/PartPreviewWindow/View3D/Actions/MeshWrapperObject3D.cs +++ b/PartPreviewWindow/View3D/Actions/MeshWrapperObject3D.cs @@ -90,58 +90,45 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D base.Apply(undoBuffer); } - public void DoInitialWrapping(InteractiveScene scene) + public void WrapSelectedItemAndSelect(InteractiveScene scene) { - MeshWrapperObject3D meshWrapper = this; - Rebuilding = true; - var selectedItem = scene.SelectedItem; - if (selectedItem != null) - { + var selectedItems = scene.GetSelectedItems(); + + if(selectedItems.Count > 0) + { + // cleare the selected item scene.SelectedItem = null; - List originalItems; + var clonedItemsToAdd = new List(selectedItems.Select((i) => i.Clone())); - if (selectedItem is SelectionGroup) + Children.Modify((list) => { - originalItems = selectedItem.Children.ToList(); - } - else - { - originalItems = new List { selectedItem }; - } + list.Clear(); - var itemsToAdd = new List(originalItems.Select((i) => i.Clone())); - meshWrapper.WrapAndAddAsChildren(itemsToAdd); + foreach (var child in clonedItemsToAdd) + { + list.Add(child); + } + }); + + AddMeshWrapperToAllChildren(); scene.UndoBuffer.AddAndDo( new ReplaceCommand( - new List(originalItems), - new List { meshWrapper })); + new List(selectedItems), + new List { this })); - meshWrapper.MakeNameNonColliding(); - scene.SelectedItem = meshWrapper; + this.MakeNameNonColliding(); + + // and select this + scene.SelectedItem = this; } Rebuilding = false; Rebuild(null); } - public void WrapAndAddAsChildren(List children) - { - Children.Modify((list) => - { - list.Clear(); - - foreach (var child in children) - { - list.Add(child); - } - }); - - AddMeshWrapperToAllChildren(); - } - private void AddMeshWrapperToAllChildren() { // Wrap every first descendant that has a mesh @@ -173,9 +160,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D // set the mesh back to the child mesh item.Mesh = firstChild.Mesh; // and reset the properties - var itemMatrix = item.Matrix; - item.CopyProperties(firstChild, flags); - item.Matrix = itemMatrix; + item.CopyProperties(firstChild, flags & (~Object3DPropertyFlags.Matrix)); } } } diff --git a/PartPreviewWindow/View3D/SceneActions.cs b/PartPreviewWindow/View3D/SceneActions.cs index 40c8ad5bc..be8980a74 100644 --- a/PartPreviewWindow/View3D/SceneActions.cs +++ b/PartPreviewWindow/View3D/SceneActions.cs @@ -44,23 +44,42 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { public static class SceneActions { - public static async void UngroupSelection(this InteractiveScene Scene) + public static List GetSelectedItems(this InteractiveScene scene) { - if (Scene.HasSelection) + var selectedItem = scene.SelectedItem; + var selectedItems = new List(); + if (selectedItem != null) + { + if (selectedItem is SelectionGroup) + { + selectedItems = selectedItem.Children.ToList(); + } + else + { + selectedItems = new List { selectedItem }; + } + } + + return selectedItems; + } + + public static async void UngroupSelection(this InteractiveScene scene) + { + if (scene.HasSelection) { await Task.Run(() => { - var selectedItem = Scene.SelectedItem; - bool isGroupItemType = Scene.HasSelection && selectedItem.Children.Count > 0; + var selectedItem = scene.SelectedItem; + bool isGroupItemType = scene.HasSelection && selectedItem.Children.Count > 0; // If not a Group ItemType, look for mesh volumes and split into distinct objects if found if (!isGroupItemType && !selectedItem.HasChildren() && selectedItem.Mesh != null) { - var ungroupItem = Scene.SelectedItem; + var ungroupItem = scene.SelectedItem; // clear the selection - Scene.SelectedItem = null; + scene.SelectedItem = null; var ungroupMesh = ungroupItem.Mesh; if (!ungroupMesh.Vertices.IsSorted) @@ -77,7 +96,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow if (discreetMeshes.Count == 1) { // restore the selection - Scene.SelectedItem = ungroupItem; + scene.SelectedItem = ungroupItem; // No further processing needed, nothing to ungroup return; } @@ -90,27 +109,27 @@ namespace MatterHackers.MatterControl.PartPreviewWindow })); // add and do the undo data - Scene.UndoBuffer.AddAndDo(new ReplaceCommand(new List { ungroupItem }, addItems)); + scene.UndoBuffer.AddAndDo(new ReplaceCommand(new List { ungroupItem }, addItems)); } if (isGroupItemType) { // Create and perform the delete operation // Store the operation for undo/redo - Scene.UndoBuffer.AddAndDo(new UngroupCommand(Scene, Scene.SelectedItem)); + scene.UndoBuffer.AddAndDo(new UngroupCommand(scene, scene.SelectedItem)); } }); // leave no selection - Scene.SelectedItem = null; + scene.SelectedItem = null; } } - public static async void AutoArrangeChildren(this InteractiveScene Scene, View3DWidget view3DWidget) + public static async void AutoArrangeChildren(this InteractiveScene scene, View3DWidget view3DWidget) { await Task.Run(() => { - PlatingHelper.ArrangeOnBed(Scene.Children.ToList(), Scene, view3DWidget.BedCenter); + PlatingHelper.ArrangeOnBed(scene.Children.ToList(), scene, view3DWidget.BedCenter); }); } @@ -139,13 +158,13 @@ namespace MatterHackers.MatterControl.PartPreviewWindow } } - public static async void DuplicateItem(this InteractiveScene Scene, IObject3D sourceItem = null) + public static async void DuplicateItem(this InteractiveScene scene, IObject3D sourceItem = null) { if (sourceItem == null) { - if (Scene.HasSelection) + if (scene.HasSelection) { - sourceItem = Scene.SelectedItem; + sourceItem = scene.SelectedItem; } } @@ -160,17 +179,17 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { // the selection is a group of objects that need to be copied var copyList = sourceItem.Children.ToList(); - Scene.SelectedItem = null; + scene.SelectedItem = null; foreach(var item in copyList) { var clonedItem = item.Clone(); // make the name unique - var newName = agg_basics.GetNonCollidingName(item.Name, Scene.DescendantsAndSelf().Select((d) => d.Name)); + var newName = agg_basics.GetNonCollidingName(item.Name, scene.DescendantsAndSelf().Select((d) => d.Name)); clonedItem.Name = newName; // add it to the scene - Scene.Children.Add(clonedItem); + scene.Children.Add(clonedItem); // add it to the selection - Scene.AddToSelection(clonedItem); + scene.AddToSelection(clonedItem); } } else // the selection can be cloned easily @@ -178,7 +197,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow var clonedItem = sourceItem.Clone(); // make the name unique - var newName = agg_basics.GetNonCollidingName(sourceItem.Name, Scene.DescendantsAndSelf().Select((d) => d.Name)); + var newName = agg_basics.GetNonCollidingName(sourceItem.Name, scene.DescendantsAndSelf().Select((d) => d.Name)); clonedItem.Name = newName; // More useful if it creates the part in the exact position and then the user can move it. @@ -195,15 +214,15 @@ namespace MatterHackers.MatterControl.PartPreviewWindow // it might come back null due to threading if (newItem != null) { - Scene.InsertNewItem(newItem); + scene.InsertNewItem(newItem); } } } - public static void InsertNewItem(this InteractiveScene Scene, IObject3D newItem) + public static void InsertNewItem(this InteractiveScene scene, IObject3D newItem) { // Reposition first item to bed center - if (Scene.Children.Count == 0) + if (scene.Children.Count == 0) { var printer = ApplicationController.Instance.ActivePrinter; var aabb = newItem.GetAxisAlignedBoundingBox(Matrix4X4.Identity); @@ -216,24 +235,24 @@ namespace MatterHackers.MatterControl.PartPreviewWindow } // Create and perform a new insert operation - var insertOperation = new InsertCommand(Scene, newItem); + var insertOperation = new InsertCommand(scene, newItem); insertOperation.Do(); // Store the operation for undo/redo - Scene.UndoBuffer.Add(insertOperation); + scene.UndoBuffer.Add(insertOperation); } - public static void DeleteSelection(this InteractiveScene Scene) + public static void DeleteSelection(this InteractiveScene scene) { - if (Scene.HasSelection) + if (scene.HasSelection) { // Create and perform the delete operation - var deleteOperation = new DeleteCommand(Scene, Scene.SelectedItem); + var deleteOperation = new DeleteCommand(scene, scene.SelectedItem); // Store the operation for undo/redo - Scene.UndoBuffer.AddAndDo(deleteOperation); + scene.UndoBuffer.AddAndDo(deleteOperation); - Scene.ClearSelection(); + scene.ClearSelection(); } } diff --git a/PartPreviewWindow/ViewControls3D.cs b/PartPreviewWindow/ViewControls3D.cs index 05a248702..4167965be 100644 --- a/PartPreviewWindow/ViewControls3D.cs +++ b/PartPreviewWindow/ViewControls3D.cs @@ -309,10 +309,13 @@ namespace MatterHackers.MatterControl.PartPreviewWindow button.Click += (s, e) => { - namedAction.Action.Invoke(sceneContext.Scene); - var partTab = button.Parents().FirstOrDefault(); - var view3D = partTab.Descendants().FirstOrDefault(); - view3D.InteractionLayer.Focus(); + UiThread.RunOnIdle(() => + { + namedAction.Action.Invoke(sceneContext.Scene); + var partTab = button.Parents().FirstOrDefault(); + var view3D = partTab.Descendants().FirstOrDefault(); + view3D.InteractionLayer.Focus(); + }); }; this.AddChild(button); } diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index f02d67941..442bb141b 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit f02d679414fccc74de9af4d9e299ffa5fc2845e7 +Subproject commit 442bb141b986683e4baee060eed329035e0c1204 From 4f8aad70e88ae6871155915f71888d024b1f14e3 Mon Sep 17 00:00:00 2001 From: Lars Brubaker Date: Fri, 25 May 2018 17:11:39 -0700 Subject: [PATCH 2/2] fixing more rebuild problems --- .../View3D/Actions/MeshWrapperObject3D.cs | 38 ++++++++++++++++--- Submodules/agg-sharp | 2 +- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/PartPreviewWindow/View3D/Actions/MeshWrapperObject3D.cs b/PartPreviewWindow/View3D/Actions/MeshWrapperObject3D.cs index 309f15548..fdacf46a0 100644 --- a/PartPreviewWindow/View3D/Actions/MeshWrapperObject3D.cs +++ b/PartPreviewWindow/View3D/Actions/MeshWrapperObject3D.cs @@ -49,19 +49,39 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D public override void Remove(UndoBuffer undoBuffer) { + if (Rebuilding) + { + int a = 0; + } + + SetRebuilding(true); // remove all the mesh wrappers that we own var meshWrappers = this.Descendants().Where(o => o.OwnerID == this.ID).ToList(); - foreach(var meshWrapper in meshWrappers) + foreach (var meshWrapper in meshWrappers) { - meshWrapper.Remove(undoBuffer); + meshWrapper.Remove(null); } - foreach(var child in Children) + foreach (var child in Children) { child.OutputType = PrintOutputTypes.Default; } // collapse our children into our parent - base.Remove(undoBuffer); + base.Remove(null); + SetRebuilding(false); + + Invalidate(new InvalidateArgs(this, InvalidateType.Content)); + } + + private void SetRebuilding(bool rebuilding) + { + foreach (var item in this.DescendantsAndSelf()) + { + if (item is Object3D object3D) + { + object3D.Rebuilding = rebuilding; + } + } } public override void Apply(UndoBuffer undoBuffer) @@ -92,7 +112,13 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D public void WrapSelectedItemAndSelect(InteractiveScene scene) { - Rebuilding = true; + if (Rebuilding) + { + int a = 0; + } + + SetRebuilding(true); + var selectedItems = scene.GetSelectedItems(); if(selectedItems.Count > 0) @@ -125,7 +151,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D scene.SelectedItem = this; } - Rebuilding = false; + SetRebuilding(false); Rebuild(null); } diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index 442bb141b..ffa51299d 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 442bb141b986683e4baee060eed329035e0c1204 +Subproject commit ffa51299d57405e5ee73204d4f295dcd29b680ea