コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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]));
            }
        }
コード例 #3
0
        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]));

        }
コード例 #4
0
ファイル: StlExchanger.cs プロジェクト: lanicon/Macad3D
        //--------------------------------------------------------------------------------------------------

        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);
            }
        }