From 13f0933d29ecf4d8fcbd2c41412edccac95cfa6b Mon Sep 17 00:00:00 2001 From: LarsBrubaker Date: Sat, 12 Jan 2019 15:16:27 -0800 Subject: [PATCH] fixed support for simple mesh --- .../PartPreviewWindow/GenerateSupportPanel.cs | 134 ++++++++++-------- 1 file changed, 73 insertions(+), 61 deletions(-) diff --git a/MatterControlLib/PartPreviewWindow/GenerateSupportPanel.cs b/MatterControlLib/PartPreviewWindow/GenerateSupportPanel.cs index 3bc8cd6a9..0bec186ac 100644 --- a/MatterControlLib/PartPreviewWindow/GenerateSupportPanel.cs +++ b/MatterControlLib/PartPreviewWindow/GenerateSupportPanel.cs @@ -161,40 +161,39 @@ namespace MatterHackers.MatterControl.PartPreviewWindow var supportCandidates = visibleMeshes.Where(i => i.OutputType != PrintOutputTypes.Support); // find all the faces that are candidates for support - var upVerts = new List(); + var upVerts = new List(); var upFaces = new FaceList(); - var downVerts = new List(); + var downVerts = new List(); var downFaces = new FaceList(); foreach (var item in supportCandidates) { var matrix = item.WorldMatrix(scene); - foreach (var face in item.Mesh.Faces) + for (int faceIndex = 0; faceIndex < item.Mesh.Faces.Count; faceIndex++) { - throw new NotImplementedException(); - //var face0Normal = Vector3Ex.TransformVector(face.Normal, matrix).GetNormal(); - //var angle = MathHelper.RadiansToDegrees(Math.Acos(Vector3Ex.Dot(-Vector3.UnitZ, face0Normal))); + var face0Normal = item.Mesh.FaceNormals[faceIndex].TransformVector(matrix).GetNormal(); + var angle = MathHelper.RadiansToDegrees(Math.Acos(face0Normal.Dot(-Vector3Float.UnitZ))); - //if (angle < MaxOverHangAngle) - //{ - // foreach (var triangle in face.AsTriangles()) - // { - // downFaces.Add(new int[] { downVerts.Count, downVerts.Count + 1, downVerts.Count + 2 }); - // downVerts.Add(Vector3Ex.Transform(triangle.p0, matrix)); - // downVerts.Add(Vector3Ex.Transform(triangle.p1, matrix)); - // downVerts.Add(Vector3Ex.Transform(triangle.p2, matrix)); - // } - //} + if (angle < MaxOverHangAngle) + { + var face = item.Mesh.Faces[faceIndex]; + var verts = new int[] { face.v0, face.v1, face.v2 }; + var fc = downVerts.Count; + downFaces.Add((fc, fc+1, fc+2)); + downVerts.Add(item.Mesh.Vertices[face.v0].Transform(matrix)); + downVerts.Add(item.Mesh.Vertices[face.v1].Transform(matrix)); + downVerts.Add(item.Mesh.Vertices[face.v2].Transform(matrix)); + } - //if (angle > 0) - //{ - // foreach (var triangle in face.AsTriangles()) - // { - // upFaces.Add(new int[] { upVerts.Count, upVerts.Count + 1, upVerts.Count + 2 }); - // upVerts.Add(Vector3Ex.Transform(triangle.p0, matrix)); - // upVerts.Add(Vector3Ex.Transform(triangle.p1, matrix)); - // upVerts.Add(Vector3Ex.Transform(triangle.p2, matrix)); - // } - //} + if (angle > 0) + { + var face = item.Mesh.Faces[faceIndex]; + var verts = new int[] { face.v0, face.v1, face.v2 }; + var fc = upFaces.Count; + upFaces.Add((fc, fc + 1, fc + 2)); + upVerts.Add(item.Mesh.Vertices[face.v0].Transform(matrix)); + upVerts.Add(item.Mesh.Vertices[face.v1].Transform(matrix)); + upVerts.Add(item.Mesh.Vertices[face.v2].Transform(matrix)); + } } } @@ -281,44 +280,45 @@ namespace MatterHackers.MatterControl.PartPreviewWindow public static bool RequiresSupport(InteractiveScene scene) { - throw new NotImplementedException(); - //bool supportInScene = scene.VisibleMeshes().Any(i => i.WorldOutputType() == PrintOutputTypes.Support); - //if (!supportInScene) - //{ - // // there is no support in the scene check if there are faces that require support - // var supportCandidates = scene.VisibleMeshes().Where(i => i.OutputType != PrintOutputTypes.Support); + bool supportInScene = scene.VisibleMeshes().Any(i => i.WorldOutputType() == PrintOutputTypes.Support); + if (!supportInScene) + { + // there is no support in the scene check if there are faces that require support + var supportCandidates = scene.VisibleMeshes().Where(i => i.OutputType != PrintOutputTypes.Support); - // // find all the faces that are candidates for support - // foreach (var item in supportCandidates) - // { - // var matrix = item.WorldMatrix(scene); - // foreach (var face in item.Mesh.Faces) - // { - // bool aboveBed = false; - // foreach(var vertex in face.Vertices()) - // { - // if(Vector3Ex.Transform(vertex.Position, matrix).Z > .01) - // { - // aboveBed = true; - // break; - // } - // } - // if (aboveBed) - // { - // var face0Normal = Vector3Ex.TransformVector(face.Normal, matrix).GetNormal(); - // var angle = MathHelper.RadiansToDegrees(Math.Acos(Vector3Ex.Dot(-Vector3.UnitZ, face0Normal))); + // find all the faces that are candidates for support + foreach (var item in supportCandidates) + { + var matrix = item.WorldMatrix(scene); + for (int faceIndex = 0; faceIndex < item.Mesh.Faces.Count; faceIndex++) + { + bool aboveBed = false; + var face = item.Mesh.Faces[faceIndex]; + var verts = new int[] { face.v0, face.v1, face.v2 }; + foreach(var vertex in verts) + { + if(item.Mesh.Vertices[vertex].Transform(matrix).Z > .01) + { + aboveBed = true; + break; + } + } + if (aboveBed) + { + var face0Normal = item.Mesh.FaceNormals[faceIndex].TransformVector(matrix).GetNormal(); + var angle = MathHelper.RadiansToDegrees(Math.Acos(face0Normal.Dot(-Vector3Float.UnitZ))); - // if (angle < MaxOverHangAngle) - // { - // // TODO: consider how much area all supported polygons represent - // return true; - // } - // } - // } - // } - //} + if (angle < MaxOverHangAngle) + { + // TODO: consider how much area all supported polygons represent + return true; + } + } + } + } + } - //return false; + return false; } } @@ -335,5 +335,17 @@ namespace MatterHackers.MatterControl.PartPreviewWindow return BoundingVolumeHierarchy.CreateNewHierachy(allPolys, maxRecursion); } + + public static IPrimitive CreateTraceData(this FaceList faceList, List vertexList, int maxRecursion = int.MaxValue) + { + var allPolys = new List(); + + foreach (var face in faceList) + { + allPolys.Add(new TriangleShape(vertexList[face.v0], vertexList[face.v1], vertexList[face.v2], null)); + } + + return BoundingVolumeHierarchy.CreateNewHierachy(allPolys, maxRecursion); + } } } \ No newline at end of file