From 2f3888137c8fef70e0e1143d8029a943e3161de5 Mon Sep 17 00:00:00 2001 From: LarsBrubaker Date: Thu, 12 May 2022 08:46:11 -0700 Subject: [PATCH 1/3] Fixing issue with union on back to back faces --- .../View3D/Actions/CombineObject3D_2.cs | 4 +- Submodules/agg-sharp | 2 +- .../MatterControl/InteractiveSceneTests.cs | 67 ++++++++++++++++++- 3 files changed, 69 insertions(+), 4 deletions(-) diff --git a/MatterControlLib/PartPreviewWindow/View3D/Actions/CombineObject3D_2.cs b/MatterControlLib/PartPreviewWindow/View3D/Actions/CombineObject3D_2.cs index a63dcc160..6ce6bc2f6 100644 --- a/MatterControlLib/PartPreviewWindow/View3D/Actions/CombineObject3D_2.cs +++ b/MatterControlLib/PartPreviewWindow/View3D/Actions/CombineObject3D_2.cs @@ -142,7 +142,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D } else { - resultsMesh = Object3D.CombineParticipanets(SourceContainer, participants, cancellationToken, reporter); + resultsMesh = Object3D.CombineParticipants(SourceContainer, participants, cancellationToken, reporter); } var resultsItem = new Object3D() @@ -152,7 +152,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D if (holes != null) { - var holesMesh = CombineParticipanets(SourceContainer, holes, cancellationToken, null); + var holesMesh = CombineParticipants(SourceContainer, holes, cancellationToken, null); if (holesMesh != null) { var holesItem = new Object3D() diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index 8f4e9b969..8b8b6938b 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 8f4e9b969638d3c70ba81ac4f1a2d8faeda8c73b +Subproject commit 8b8b6938b05a8780f079d2f2b6f9a69d621e090e diff --git a/Tests/MatterControl.Tests/MatterControl/InteractiveSceneTests.cs b/Tests/MatterControl.Tests/MatterControl/InteractiveSceneTests.cs index b98063f9f..60aa6a925 100644 --- a/Tests/MatterControl.Tests/MatterControl/InteractiveSceneTests.cs +++ b/Tests/MatterControl.Tests/MatterControl/InteractiveSceneTests.cs @@ -36,9 +36,11 @@ using MatterHackers.MatterControl.DesignTools; using MatterHackers.MatterControl.DesignTools.Operations; using MatterHackers.MatterControl.PartPreviewWindow.View3D; using MatterHackers.MatterControl.Tests.Automation; +using MatterHackers.PolygonMesh; using MatterHackers.VectorMath; using NUnit.Framework; using System.Linq; +using System.Threading; using System.Threading.Tasks; namespace MatterControl.Tests.MatterControl @@ -280,6 +282,8 @@ namespace MatterControl.Tests.MatterControl [Test, Category("InteractiveScene")] public async Task SubtractTests() { + StartupMC(); + // Subtract has correct number of results { var root = new Object3D(); @@ -287,7 +291,7 @@ namespace MatterControl.Tests.MatterControl var cubeB = await CubeObject3D.Create(20, 20, 20); var offsetCubeB = new TranslateObject3D(cubeB, 10); - var subtract = new SubtractObject3D(); + var subtract = new SubtractObject3D_2(); subtract.Children.Add(cubeA); subtract.Children.Add(offsetCubeB); subtract.SelectedChildren.Add(offsetCubeB.ID); @@ -564,6 +568,67 @@ namespace MatterControl.Tests.MatterControl Assert.IsTrue(rootAabb.Equals(new AxisAlignedBoundingBox(new Vector3(-10, -10, -10), new Vector3(10, 10, 11)), .01)); } + [Test] + public void CombineTests2() + { + // overlaping results in simple new mesh + { + var meshA = PlatonicSolids.CreateCube(10, 10, 10); + meshA.Translate(0, 0, 0); + var meshB = PlatonicSolids.CreateCube(10, 10, 10); + meshB.Translate(0, 5, 0); + var mesh = Object3D.CombineParticipants(null, + new IObject3D[] + { + new Object3D() { Mesh = meshA }, + new Object3D() { Mesh = meshB }, + }, + new CancellationToken()); + Assert.AreEqual(12, mesh.Faces.Count()); + var aabb = mesh.GetAxisAlignedBoundingBox(); + Assert.AreEqual(15, aabb.YSize, .001); + } + + // multiple overlaping faces all combine + { + var meshA = PlatonicSolids.CreateCube(10, 10, 10); + meshA.Translate(0, 0, 0); + var meshB = PlatonicSolids.CreateCube(10, 10, 10); + meshB.Translate(0, -3, 0); + var meshC = PlatonicSolids.CreateCube(10, 10, 10); + meshC.Translate(0, 3, 0); + var mesh = Object3D.CombineParticipants(null, + new IObject3D[] + { + new Object3D() { Mesh = meshA }, + new Object3D() { Mesh = meshB }, + new Object3D() { Mesh = meshC }, + }, + new CancellationToken()); + Assert.AreEqual(12, mesh.Faces.Count()); + var aabb = mesh.GetAxisAlignedBoundingBox(); + Assert.AreEqual(16, aabb.YSize, .001); + } + + // a back face against a front face, both are removed + { + var meshA = PlatonicSolids.CreateCube(10, 10, 10); + meshA.Translate(0, -5, 0); + var meshB = PlatonicSolids.CreateCube(10, 10, 10); + meshB.Translate(0, 5, 0); + var mesh = Object3D.CombineParticipants(null, + new IObject3D[] + { + new Object3D() { Mesh = meshA }, + new Object3D() { Mesh = meshB }, + }, + new CancellationToken()); + Assert.AreEqual(12, mesh.Faces.Count()); + var aabb = mesh.GetAxisAlignedBoundingBox(); + Assert.AreEqual(15, aabb.YSize, .001); + } + } + [Test, Category("InteractiveScene")] public async Task AlignObjectHasCorrectPositionsOnXAxis() { From 721f41e74da485cba60b7b26cd93ee43f0daafe4 Mon Sep 17 00:00:00 2001 From: Lars Brubaker Date: Thu, 12 May 2022 18:15:07 -0700 Subject: [PATCH 2/3] Making abutted faces union correctly --- .../PartPreviewWindow/SelectedObjectPanel.cs | 16 +++++++++++----- Submodules/agg-sharp | 2 +- .../MatterControl/InteractiveSceneTests.cs | 2 +- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/MatterControlLib/PartPreviewWindow/SelectedObjectPanel.cs b/MatterControlLib/PartPreviewWindow/SelectedObjectPanel.cs index 1b5bc7b90..5d6f4bf35 100644 --- a/MatterControlLib/PartPreviewWindow/SelectedObjectPanel.cs +++ b/MatterControlLib/PartPreviewWindow/SelectedObjectPanel.cs @@ -368,11 +368,17 @@ namespace MatterHackers.MatterControl.PartPreviewWindow void SetToSolid() { // make sure the render mode is set to shaded or outline - if (sceneContext.ViewState.RenderType != RenderOpenGl.RenderTypes.Shaded - && sceneContext.ViewState.RenderType != RenderOpenGl.RenderTypes.Outlines) - { - // make sure the render mode is set to outline - sceneContext.ViewState.RenderType = RenderOpenGl.RenderTypes.Outlines; + switch(sceneContext.ViewState.RenderType) + { + case RenderOpenGl.RenderTypes.Shaded: + case RenderOpenGl.RenderTypes.Outlines: + case RenderOpenGl.RenderTypes.Polygons: + break; + + default: + // make sure the render mode is set to outline + sceneContext.ViewState.RenderType = RenderOpenGl.RenderTypes.Outlines; + break; } var currentOutputType = selectedItem.WorldOutputType(); diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index 8b8b6938b..575426301 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 8b8b6938b05a8780f079d2f2b6f9a69d621e090e +Subproject commit 5754263017523527f1c076b0c667fe56abb6e5bd diff --git a/Tests/MatterControl.Tests/MatterControl/InteractiveSceneTests.cs b/Tests/MatterControl.Tests/MatterControl/InteractiveSceneTests.cs index 60aa6a925..83d40c980 100644 --- a/Tests/MatterControl.Tests/MatterControl/InteractiveSceneTests.cs +++ b/Tests/MatterControl.Tests/MatterControl/InteractiveSceneTests.cs @@ -625,7 +625,7 @@ namespace MatterControl.Tests.MatterControl new CancellationToken()); Assert.AreEqual(12, mesh.Faces.Count()); var aabb = mesh.GetAxisAlignedBoundingBox(); - Assert.AreEqual(15, aabb.YSize, .001); + Assert.AreEqual(20, aabb.YSize, .001); } } From 24748df34aa69ea3b90b5884df0540b633a1b5b4 Mon Sep 17 00:00:00 2001 From: LarsBrubaker Date: Fri, 13 May 2022 08:52:42 -0700 Subject: [PATCH 3/3] adding new test --- Submodules/agg-sharp | 2 +- .../MatterControl/InteractiveSceneTests.cs | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index 575426301..b64bd80cc 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 5754263017523527f1c076b0c667fe56abb6e5bd +Subproject commit b64bd80cccc97bd8c0f9971d72c5b953588f6fa8 diff --git a/Tests/MatterControl.Tests/MatterControl/InteractiveSceneTests.cs b/Tests/MatterControl.Tests/MatterControl/InteractiveSceneTests.cs index 83d40c980..7aeaf1ecf 100644 --- a/Tests/MatterControl.Tests/MatterControl/InteractiveSceneTests.cs +++ b/Tests/MatterControl.Tests/MatterControl/InteractiveSceneTests.cs @@ -37,6 +37,7 @@ using MatterHackers.MatterControl.DesignTools.Operations; using MatterHackers.MatterControl.PartPreviewWindow.View3D; using MatterHackers.MatterControl.Tests.Automation; using MatterHackers.PolygonMesh; +using MatterHackers.PolygonMesh.Processors; using MatterHackers.VectorMath; using NUnit.Framework; using System.Linq; @@ -627,6 +628,32 @@ namespace MatterControl.Tests.MatterControl var aabb = mesh.GetAxisAlignedBoundingBox(); Assert.AreEqual(20, aabb.YSize, .001); } + + // multiple overlaping faces all combine + { + // right side at 0 + var meshA = PlatonicSolids.CreateCube(10, 5, 10); + meshA.Translate(-5, 0, 0); + // left side at -5 + var meshB = PlatonicSolids.CreateCube(10, 5, 10); + meshB.Translate(0, 0, 0); + // right side at 0 + var meshC = PlatonicSolids.CreateCube(5, 10, 10); + meshC.Translate(-2.5, 0, 0); + var mesh = Object3D.CombineParticipants(null, + new IObject3D[] + { + new Object3D() { Mesh = meshA }, + new Object3D() { Mesh = meshB }, + new Object3D() { Mesh = meshC }, + }, + new CancellationToken()); + StlProcessing.Save(mesh, @"C:\temp\temp.stl", new CancellationToken()); + Assert.AreEqual(20, mesh.Faces.Count()); + var aabb = mesh.GetAxisAlignedBoundingBox(); + Assert.AreEqual(16, aabb.YSize, .001); + } + } [Test, Category("InteractiveScene")]