Beispiel #1
0
        //Convert one quad into two triangles
        public static Triangles QuadToTwoTriangles(Quad quad)
        {
            var       triangleList = new List <Triangle>();
            Triangles triangles    = new Triangles();

            var x1 = (float)quad.Pt1.X;
            var x2 = (float)quad.Pt2.X;
            var y1 = (float)quad.Pt1.Y;
            var y2 = (float)quad.Pt2.Y;
            var z1 = (float)quad.Pt1.Z;
            var z2 = (float)quad.Pt2.Z;

            QuadAxis qa = quad.FindAxis();

            if (qa == QuadAxis.X)
            {
                float sameX = x1;

                Triangle triangle1 = new Triangle();
                triangle1.SetTriangle(
                    sameX, y1, z1,
                    sameX, y2, z1,
                    sameX, y2, z2
                    );

                /*
                 *  sameX, y1, z1,
                 *  sameX, y2, z1,
                 *  sameX, y2, z2
                 * );
                 */
                triangle1.Properties = quad.Properties.Clone();
                triangleList.Add(triangle1);

                Triangle triangle2 = new Triangle();
                triangle2.SetTriangle(
                    sameX, y1, z1,
                    sameX, y1, z2,
                    sameX, y2, z2);
                triangle2.Properties = quad.Properties.Clone();
                triangleList.Add(triangle2);
            }
            if (qa == QuadAxis.Y)
            {
                float sameY = y1;

                Triangle triangle1 = new Triangle();
                triangle1.SetTriangle(
                    x1, sameY, z1,
                    x2, sameY, z2,
                    x1, sameY, z2);
                triangle1.Properties = quad.Properties.Clone();
                triangleList.Add(triangle1);

                Triangle triangle2 = new Triangle();
                triangle2.SetTriangle(
                    x1, sameY, z1,
                    x2, sameY, z1,
                    x2, sameY, z2);
                triangle2.Properties = quad.Properties.Clone();
                triangleList.Add(triangle2);
            }
            if (qa == QuadAxis.Z)
            {
                float sameZ = z1;

                Triangle triangle1 = new Triangle();
                triangle1.SetTriangle(
                    x1, y1, sameZ,
                    x2, y2, sameZ,
                    x1, y2, sameZ);
                triangle1.Properties = quad.Properties.Clone();
                triangleList.Add(triangle1);

                Triangle triangle2 = new Triangle();
                triangle2.SetTriangle(
                    x1, y1, sameZ,
                    x2, y1, sameZ,
                    x2, y2, sameZ);
                triangle2.Properties = quad.Properties.Clone();
                triangleList.Add(triangle2);
            }

            triangles.SetTriangles(triangleList.ToArray());
            return(triangles);
        }
Beispiel #2
0
        //Read a binary STL file, or call the ascii reader
        public static Triangles ReadFile(string filename)
        {
            var trianglesList = new List <Triangle>();

            bool isAscii = false;

            using (var reader = new BinaryReader(File.Open(filename, FileMode.Open)))
            {
                if (reader.PeekChar() == 's')
                {
                    //If it's ascii, note so
                    isAscii = true;
                }
            }

            if (isAscii)
            {
                //This is an ascii not binary file
                return(ReadFileAscii(filename));
            }

            try
            {
                using (var reader = new BinaryReader(File.Open(filename, FileMode.Open)))
                {
                    //Header (80 bytes)read and discard
                    reader.ReadBytes(80);

                    //Facets (4 bytes)
                    UInt32 numTriangles = reader.ReadUInt32();

                    //Normals and vertices
                    for (int facet = 0; facet < numTriangles; facet++)
                    {
                        var sf = new Triangle();

                        //Read normal = 3 floats
                        sf.Normal[0] = reader.ReadSingle();
                        sf.Normal[2] = reader.ReadSingle();
                        sf.Normal[1] = reader.ReadSingle();

                        //Read vertex 1 = 3 floats
                        sf.Vertex1[0] = reader.ReadSingle();
                        sf.Vertex1[2] = reader.ReadSingle();
                        sf.Vertex1[1] = reader.ReadSingle();

                        //Read vertex 2 = 3 floats
                        sf.Vertex2[0] = reader.ReadSingle();
                        sf.Vertex2[2] = reader.ReadSingle();
                        sf.Vertex2[1] = reader.ReadSingle();

                        //Read vertex 3 = 3 floats
                        sf.Vertex3[0] = reader.ReadSingle();
                        sf.Vertex3[2] = reader.ReadSingle();
                        sf.Vertex3[1] = reader.ReadSingle();

                        // ignore attribute_by_count
                        reader.ReadUInt16();

                        trianglesList.Add(sf);
                    }
                    Triangles triangles = new Triangles(trianglesList.ToArray())
                    {
                        Name = filename
                    };

                    return(triangles);
                }
            }
            catch (Exception)
            {
                return(null);
            }
        }
Beispiel #3
0
        //Read an ascii STL file
        private static Triangles ReadFileAscii(string filename)
        {
            var trianglesList = new List <Triangle>();

            using (var reader = new StreamReader(filename))
            {
                Triangle triangle    = null;
                int      vertexcount = 0;
                while (reader.EndOfStream == false)
                {
                    string str     = reader.ReadLine().TrimStart();
                    string command = str.Split(' ')[0];


                    if (command == "solid")
                    {
                    }
                    if (command == "facet")
                    {
                        //compact those open white spaces
                        str = str.Replace("  ", " ").Replace("  ", " ").Replace("  ", " ");
                        string[] splits = str.Split(' ');

                        triangle = new Triangle();
                        trianglesList.Add(triangle);

                        //flip y/z
                        triangle.Normal[0] = float.Parse(splits[2]);
                        triangle.Normal[2] = float.Parse(splits[3]);
                        triangle.Normal[1] = float.Parse(splits[4]);
                        vertexcount        = 0;
                    }
                    if (command == "vertex")
                    {
                        str = str.Replace("  ", " ").Replace("  ", " ").Replace("  ", " ");
                        string[] splits = str.Split(' ');

                        //flip y/z
                        float x = float.Parse(splits[1]);
                        float z = float.Parse(splits[2]);
                        float y = float.Parse(splits[3]);

                        if (triangle != null)
                        {
                            if (vertexcount == 0)
                            {
                                triangle.Vertex1[0] = x;
                                triangle.Vertex1[1] = y;
                                triangle.Vertex1[2] = z;
                            }
                            if (vertexcount == 1)
                            {
                                triangle.Vertex2[0] = x;
                                triangle.Vertex2[1] = y;
                                triangle.Vertex2[2] = z;
                            }
                            if (vertexcount == 2)
                            {
                                triangle.Vertex3[0] = x;
                                triangle.Vertex3[1] = y;
                                triangle.Vertex3[2] = z;
                            }
                        }
                        vertexcount++;
                    }
                }
            }

            Triangles triangles = new Triangles(trianglesList.ToArray())
            {
                Name = filename
            };

            return(triangles);
        }
Beispiel #4
0
        public static Triangles ReadfileAscii(string filename)
        {
            using (var reader = new StreamReader(filename))
            {
                var triangles = new List <Triangle>();
                var vertices  = new List <float[]>();

                while (reader.EndOfStream == false)
                {
                    string str     = reader.ReadLine().TrimStart();
                    string command = str.Split(' ')[0];

                    if (String.CompareOrdinal("#", command) == 0)
                    {
                        //Just a comment, ignore
                    }
                    if (String.CompareOrdinal("g", command) == 0)
                    {
                        //g Object001
                    }
                    if (String.CompareOrdinal("v", command) == 0)
                    {
                        //v 0.000000E+00 0.000000E+00 78.0000

                        string[] parts = str.Split(' ');
                        var      x     = (float)Convert.ToDouble(parts[1]);
                        var      y     = (float)Convert.ToDouble(parts[2]);
                        var      z     = (float)Convert.ToDouble(parts[3]);

                        //Flip y, z
                        float[] float3 = new float[] { x, z, y };// Float3(x, z, y);
                        vertices.Add(float3);
                    }
                    if (String.CompareOrdinal("f", command) == 0)
                    {
                        //f   1 2 3
                        str = str.Replace("  ", " ").Replace("  ", " ").Replace("  ", " ");
                        string[] parts = str.Split(' ');
                        int      v1    = Convert.ToInt32(parts[1]) - 1;
                        int      v2    = Convert.ToInt32(parts[2]) - 1;
                        int      v3    = Convert.ToInt32(parts[3]) - 1;

                        Triangle triangle = new Triangle(
                            vertices[v1][0],
                            vertices[v1][1],
                            vertices[v1][2],
                            vertices[v2][0],
                            vertices[v2][1],
                            vertices[v2][2],
                            vertices[v3][0],
                            vertices[v3][1],
                            vertices[v3][2]);

                        triangles.Add(triangle);
                    }
                }
                Triangles triangleSet = new Triangles();
                triangleSet.SetTriangles(triangles.ToArray());
                return(triangleSet);
            }
        }