private static void RunOptions(Options opts) { // TODO: Make sure the best versions of these generic collections are being used in the right places. // Use arrays when size is known and is not expected to change // Otherwise, use a list // Consider places where we can avoid a conversion of .ToArray/.ToList and rely on the IEnumerable interface try { Mesh3 model = new Mesh3(ReadFacetsFromFile(opts.StlInputPath, opts.IsStlAscii)); Console.WriteLine("Read " + model.Facets.Length + " facets from file"); Polygon3[] unsupportedFacets = model.Facets.Where(facet => DoesFacetNeedSupported(facet, opts.CriticalAngle)).ToArray(); Console.WriteLine("Identified " + unsupportedFacets.Length + " unsupported facets"); Point3Tree <List <Polygon3> > edgeFacetIndex = new Point3Tree <List <Polygon3> >(GetEdgeFacetKeys(unsupportedFacets)); Console.WriteLine("Created an index with " + edgeFacetIndex.Keys.Length + " edges"); CreateEdgeFacetAssociation(unsupportedFacets, edgeFacetIndex); Console.WriteLine("Association created between facets and edges"); List <Mesh3> unsupportedRegions = BuildUnsupportedRegions(unsupportedFacets, edgeFacetIndex); Console.WriteLine("Built " + unsupportedRegions.Count + " unsupported regions"); List <Mesh3> largeRegions = unsupportedRegions.Where(region => IsLargeRegion(region, edgeFacetIndex, opts.DimensionLength, opts.ToleranceAngle)).ToList(); Console.WriteLine("Removed " + (unsupportedRegions.Count - largeRegions.Count) + " small unsupported regions"); List <Polygon3> scaffoldingFacets = new List <Polygon3>(); if (opts.DoXScaffolding || opts.DoYScaffolding) { List <Vector3> supportNormals = new List <Vector3>(); Quaternion rotation = new Quaternion(0, 0, (float)AngleConverter.DegToRad(opts.ScaffoldingAngle)); if (opts.DoXScaffolding) { supportNormals.Add(Vector3.Transform(YZNormal, rotation)); } if (opts.DoYScaffolding) { supportNormals.Add(Vector3.Transform(XZNormal, rotation)); } Console.WriteLine("Made support normals"); foreach (Vector3 supportNormal in supportNormals) { scaffoldingFacets.AddRange(GenerateLineScaffolding(model, largeRegions, supportNormal, (float)opts.SupportSpacing, (float)opts.PlateSpacing)); } } if (opts.DoContourScaffolding) { scaffoldingFacets.AddRange(GenerateContourScaffolding(largeRegions, (float)opts.PlateSpacing, edgeFacetIndex)); } StlBinaryWriter writer = new StlBinaryWriter(); writer.Write(opts.StlOutputPath, scaffoldingFacets.ToArray()); } catch (Exception ex) { Console.Error.WriteLine(ex); Environment.Exit(1); } }
public void TestBinaryWriter() { Solid solid1 = new Solid("test", new Facet[] { new Facet(new Vertex(0, 0, 1), new Vertex[] { new Vertex(0, 0, 0), new Vertex(-10, -10, 0), new Vertex(-10, 0, 0) }, 0) }); byte[] data; using (MemoryStream stream = new MemoryStream()) using (var writer = new StlBinaryWriter(stream)) { writer.WriteSolid(solid1); data = stream.ToArray(); } Solid solid2; using (MemoryStream stream = new MemoryStream(data)) using (var reader = new StlReader(stream)) { solid2 = reader.ReadSolid(); } Assert.NotEqual(solid1.Name, solid2.Name); Assert.Null(solid2.Name); Assert.Equal(solid1.Facets.Count, solid2.Facets.Count); for (int i = 0; i < solid1.Facets.Count; i++) { Assert.True(solid1.Facets[i].Equals(solid2.Facets[i])); } }
public void TestBinaryWriter() { Solid solid1 = new Solid("test", new Facet[] { new Facet(new Vertex( 0, 0, 1), new Vertex[] { new Vertex( 0, 0, 0), new Vertex(-10, -10, 0), new Vertex(-10, 0, 0) }, 0) }); byte[] data; using (MemoryStream stream = new MemoryStream()) using (var writer = new StlBinaryWriter(stream)) { writer.WriteSolid(solid1); data = stream.ToArray(); } Solid solid2; using (MemoryStream stream = new MemoryStream(data)) using (var reader = new StlReader(stream)) { solid2 = reader.ReadSolid(); } Assert.NotEqual(solid1.Name, solid2.Name); Assert.Null(solid2.Name); Assert.Equal(solid1.Facets.Count, solid2.Facets.Count); for (int i = 0; i < solid1.Facets.Count; i++) Assert.True(solid1.Facets[i].Equals(solid2.Facets[i])); }
//-------------------------------------------------------------------------------------------------- bool IBodyExporter.DoExport(string fileName, IEnumerable <Body> bodies) { try { var sumTriangleCount = 0; var triangulations = new List <TriangulationData>(); foreach (var body in bodies) { var shape = body.Shape.GetTransformedBRep(); if (shape == null) { continue; } var triangulation = TriangulationHelper.GetTriangulation(shape); if (triangulation.TriangleCount == 0) { continue; } triangulations.Add(triangulation); sumTriangleCount += triangulation.TriangleCount; } if (sumTriangleCount == 0) { return(false); } IStlWriter writer; if (Settings.ExportBinaryFormat) { writer = new StlBinaryWriter(); } else { writer = new StlAsciiWriter(); } writer.Init("Written by Macad3D STL-Export", sumTriangleCount); foreach (var triangulation in triangulations) { var index = 0; for (int triangle = 0; triangle < triangulation.TriangleCount; triangle++) { // Get vertices var vertex1 = triangulation.Vertices[triangulation.Indices[index]]; var vertex2 = triangulation.Vertices[triangulation.Indices[index + 1]]; var vertex3 = triangulation.Vertices[triangulation.Indices[index + 2]]; index += 3; // Calculate normal of facet var vec1 = new Vec(vertex1, vertex2); var vec2 = new Vec(vertex1, vertex3); var normal = vec1.Crossed(vec2); if (normal.SquareMagnitude() > gp.Resolution) { normal.Normalize(); } else { normal = default; } // Write out facet writer.AddFacet(normal, vertex1, vertex2, vertex3); } } return(writer.WriteToFile(fileName)); } catch (Exception e) { Messages.Exception($"Exception occured while exporting {fileName}.", e); return(false); } }