0
MeshGeometryHelper Cut Method Help: Normals Flipping and Cannot Cut Twice
Good Day Everyone,
I'm having a hard time with cutting a model in my program. I import a STL file into a Model3DGroup, add that model to a MeshBuilder (true for include normals), and attempt to cut the model along the 0 z-axis (pInf and nInf) This is to ensure it has a flat base to 3D print on.
First issue:
The flat cut is inverted when added. If i add a larger model, it inverts all the normals and appear to be inside out.
Second issue:
I attempt to cut the model at 10 mm (pSup and nSup), but the attempt keeps failing. It will fail even if I comment out the 0 z-axis cut.
private void CutBottom() { //load the stl file to edit string file = @"E:\Test\test.stl"; var mi = new ModelImporter(); Model3DGroup model = mi.Load(file, System.Windows.Threading.Dispatcher.CurrentDispatcher); //convert model to Geometry3D MeshBuilder meshModel = new MeshBuilder(true, false); foreach (var m in model.Children) { var mGeo = m as GeometryModel3D; var tri = (MeshGeometry3D)mGeo.Geometry; if (tri != null) { meshModel.Append(tri); } } MeshGeometry3D mesh = meshModel.ToMesh(); //create a copy of the mesh var g = mesh as MeshGeometry3D; MeshGeometry3D gOrig = g.Clone(); //Cut the Mesh and then apply the cutplane var pInf = new Point3D(0, 0, 0); var nInf = new Vector3D(0, 0, 1); Plane3D cpInf = new Plane3D(pInf, nInf); var pSup = new Point3D(0, 0, 2); var nSup = new Vector3D(0, 0, 3); Plane3D cpSup = new Plane3D(pSup, nSup); //cp, p & n are the cut plane (Plane3D) and the position (Point3D) and the normal (Vector3D) of the plane g = MeshGeometryHelper.Cut(g, pInf, nInf); g = MeshPlaneCut(g, gOrig, cpInf); //g = MeshPlaneCut(g, gOrig, cpSup); DiffuseMaterial graySide = new DiffuseMaterial(new SolidColorBrush(Colors.Gray)); var meshGeo = new GeometryModel3D(g, graySide); Model3DGroup finalModel = new Model3DGroup(); finalModel.Children.Add(meshGeo); //remove gridlines bolusMesh.Content = finalModel; //export stl Viewport.Viewport.Children.Remove(grids); Viewport.Export(@"E:\Test\test_cut.stl"); Viewport.Viewport.Children.Add(grids); } private static MeshGeometry3D MeshPlaneCut(MeshGeometry3D meshCut, MeshGeometry3D meshOrig, Plane3D plane) { //Store the positions on the cut plane var segments = MeshGeometryHelper.GetContourSegments(meshOrig, plane.Position, plane.Normal).ToList(); //assumes largest contour is the outer contour! IList<Point3D> vertexPoints = MeshGeometryHelper.CombineSegments(segments, 1e-6).ToList().OrderByDescending(x => x.Count).First(); //meshCut the polygon opening and add to existing cut mesh var builder = new MeshBuilder(false, false); builder.Append(meshCut.Positions, meshCut.TriangleIndices); builder.AddPolygon(vertexPoints); MeshGeometry3D mg3D = builder.ToMesh(); return mg3D; }
Customer support service by UserEcho