diff --git a/DesignTools/PublicPropertyEditor.cs b/DesignTools/PublicPropertyEditor.cs index 823376423..78b5fbe39 100644 --- a/DesignTools/PublicPropertyEditor.cs +++ b/DesignTools/PublicPropertyEditor.cs @@ -32,6 +32,7 @@ using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Reflection; +using System.Threading; using MatterHackers.Agg; using MatterHackers.Agg.Image; using MatterHackers.Agg.Platform; @@ -41,6 +42,7 @@ using MatterHackers.Localizations; using MatterHackers.MatterControl.CustomWidgets; using MatterHackers.MatterControl.DesignTools.EditableTypes; using MatterHackers.MatterControl.PartPreviewWindow; +using MatterHackers.MatterControl.PartPreviewWindow.View3D; using MatterHackers.MatterControl.SlicerConfiguration; using MatterHackers.VectorMath; @@ -534,6 +536,31 @@ namespace MatterHackers.MatterControl.DesignTools { GuiWidget tabContainer = new FlowLayoutWidget(FlowDirection.TopToBottom); + void UpdateSelectColors(bool selectionChanged = false) + { + foreach (var child in parent.Children.ToList()) + { + child.SuspendRebuild(); + if (!childSelector.Contains(child.ID) + || tabContainer.HasBeenClosed) + { + child.Color = new Color(child.WorldColor(), 255); + } + else + { + child.Color = new Color(child.WorldColor(), 200); + } + + if (selectionChanged) + { + child.Visible = true; + } + child.ResumeRebuild(); + } + } + + tabContainer.Closed += (s, e) => UpdateSelectColors(); + var children = parent.Children.ToList(); Dictionary objectChecks = new Dictionary(); @@ -589,10 +616,20 @@ namespace MatterHackers.MatterControl.DesignTools childSelector.Remove(objectChecks[checkbox].ID); } } + + if(parent is MeshWrapperObject3D meshWrapper) + { + meshWrapper.SuspendRebuild(); + meshWrapper.ResetMeshWrapperMeshes(Object3DPropertyFlags.All, CancellationToken.None); + meshWrapper.ResumeRebuild(); + } + + UpdateSelectColors(true); } }; tabContainer.AddChild(rowContainer); + UpdateSelectColors(); } /* diff --git a/PartPreviewWindow/View3D/Actions/SubtractAndReplaceObject3D.cs b/PartPreviewWindow/View3D/Actions/SubtractAndReplaceObject3D.cs index 1079693d0..4efb3b150 100644 --- a/PartPreviewWindow/View3D/Actions/SubtractAndReplaceObject3D.cs +++ b/PartPreviewWindow/View3D/Actions/SubtractAndReplaceObject3D.cs @@ -94,18 +94,17 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D double amountPerOperation = 1.0 / totalOperations; double percentCompleted = 0; - foreach (var paint in paintObjects) + foreach (var paint in paintObjects.Select((r) => (obj3D: r, matrix: r.WorldMatrix())).ToList()) { - var transformedPaint = Mesh.Copy(paint.Mesh, cancellationToken); - transformedPaint.Transform(paint.WorldMatrix()); - var inverseRemove = paint.WorldMatrix(); - inverseRemove.Invert(); + var transformedPaint = Mesh.Copy(paint.obj3D.Mesh, cancellationToken); + transformedPaint.Transform(paint.matrix); + var inverseRemove = paint.matrix.Inverted; Mesh paintMesh = null; - foreach (var keep in keepObjects) + foreach (var keep in keepObjects.Select((r) => (obj3D: r, matrix: r.WorldMatrix())).ToList()) { - var transformedKeep = Mesh.Copy(keep.Mesh, cancellationToken); - transformedKeep.Transform(keep.WorldMatrix()); + var transformedKeep = Mesh.Copy(keep.obj3D.Mesh, cancellationToken); + transformedKeep.Transform(keep.matrix); // remove the paint from the original var intersectAndSubtract = PolygonMesh.Csg.CsgOperations.IntersectAndSubtract(transformedKeep, transformedPaint, (status, progress0To1) => @@ -117,10 +116,9 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D progressStatus.Progress0To1 = percentCompleted + amountPerOperation * progress0To1; reporter?.Report(progressStatus); }, cancellationToken); - var inverseKeep = keep.WorldMatrix(); - inverseKeep.Invert(); + var inverseKeep = keep.matrix.Inverted; intersectAndSubtract.subtract.Transform(inverseKeep); - keep.Mesh = intersectAndSubtract.subtract; + keep.obj3D.Mesh = intersectAndSubtract.subtract; // keep all the intersections together if (paintMesh == null) @@ -141,12 +139,9 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D // move the paint mesh back to its original coordinates paintMesh.Transform(inverseRemove); - paint.Mesh = paintMesh; + paint.obj3D.Mesh = paintMesh; - paint.Color = paint.WorldColor().AdjustContrast(keepObjects.First().WorldColor(), 2).ToColor(); - - // now set it to the new solid color - paint.OutputType = PrintOutputTypes.Solid; + paint.obj3D.Color = paint.obj3D.WorldColor().AdjustContrast(keepObjects.First().WorldColor(), 2).ToColor(); } } diff --git a/PartPreviewWindow/View3D/Actions/SubtractObject3D.cs b/PartPreviewWindow/View3D/Actions/SubtractObject3D.cs index ffcd26769..002b392eb 100644 --- a/PartPreviewWindow/View3D/Actions/SubtractObject3D.cs +++ b/PartPreviewWindow/View3D/Actions/SubtractObject3D.cs @@ -33,6 +33,7 @@ using MatterHackers.DataConverters3D; using MatterHackers.Localizations; using MatterHackers.MatterControl.DesignTools; using MatterHackers.PolygonMesh; +using MatterHackers.VectorMath; using System; using System.Collections.Generic; using System.Linq; @@ -65,19 +66,19 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D double percentCompleted = 0; ProgressStatus progressStatus = new ProgressStatus(); - foreach (var remove in removeObjects) + foreach (var remove in removeObjects.Select((r) => (obj3D: r, matrix: r.WorldMatrix())).ToList()) { - foreach (var keep in keepObjects) + foreach (var keep in keepObjects.Select((r) => (obj3D: r, matrix: r.WorldMatrix())).ToList()) { progressStatus.Status = "Copy Remove"; reporter?.Report(progressStatus); - var transformedRemove = Mesh.Copy(remove.Mesh, cancellationToken); - transformedRemove.Transform(remove.WorldMatrix()); + var transformedRemove = Mesh.Copy(remove.obj3D.Mesh, cancellationToken); + transformedRemove.Transform(remove.matrix); progressStatus.Status = "Copy Keep"; reporter?.Report(progressStatus); - var transformedKeep = Mesh.Copy(keep.Mesh, cancellationToken); - transformedKeep.Transform(keep.WorldMatrix()); + var transformedKeep = Mesh.Copy(keep.obj3D.Mesh, cancellationToken); + transformedKeep.Transform(keep.matrix); progressStatus.Status = "Do CSG"; reporter?.Report(progressStatus); @@ -90,20 +91,19 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D progressStatus.Progress0To1 = percentCompleted + amountPerOperation * progress0To1; reporter?.Report(progressStatus); }, cancellationToken); - var inverse = keep.WorldMatrix(); - inverse.Invert(); + var inverse = keep.matrix.Inverted; transformedKeep.Transform(inverse); - keep.SuspendRebuild(); - keep.Mesh = transformedKeep; - keep.ResumeRebuild(); + keep.obj3D.SuspendRebuild(); + keep.obj3D.Mesh = transformedKeep; + keep.obj3D.ResumeRebuild(); percentCompleted += amountPerOperation; progressStatus.Progress0To1 = percentCompleted; reporter?.Report(progressStatus); } - remove.Visible = false; + remove.obj3D.Visible = false; } } } diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index 5271ad98f..a7907690f 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 5271ad98f4e8a114a9f81c8f04b0e68065493483 +Subproject commit a7907690fed11c303e61d071537275c9e87ed4ab