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/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..b64bd80cc 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 8f4e9b969638d3c70ba81ac4f1a2d8faeda8c73b +Subproject commit b64bd80cccc97bd8c0f9971d72c5b953588f6fa8 diff --git a/Tests/MatterControl.Tests/MatterControl/InteractiveSceneTests.cs b/Tests/MatterControl.Tests/MatterControl/InteractiveSceneTests.cs index b98063f9f..7aeaf1ecf 100644 --- a/Tests/MatterControl.Tests/MatterControl/InteractiveSceneTests.cs +++ b/Tests/MatterControl.Tests/MatterControl/InteractiveSceneTests.cs @@ -36,9 +36,12 @@ using MatterHackers.MatterControl.DesignTools; 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; +using System.Threading; using System.Threading.Tasks; namespace MatterControl.Tests.MatterControl @@ -280,6 +283,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 +292,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 +569,93 @@ 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(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")] public async Task AlignObjectHasCorrectPositionsOnXAxis() {