예제 #1
0
        private void InitializeProperties()
        {
            #region public:
            Vertices           = new List <Point3D>();
            Faces              = new List <int[]>();
            Normals            = new List <Vector3D>();
            TextureCoordinates = new List <Point>();
            FacesNumber        = 0;
            VerticesNumber     = 0;
            ObjectInformation  = new Dictionary <string, double>();

            #endregion

            #region private:
            modelFormat         = PlyFormatTypes.none;
            currentElement      = PlyElements.none;
            elementLine_Current = 0;
            elementLines_Count  = 0;
            elements_range      = new Dictionary <string, PLYElement>();
            #endregion
        }
예제 #2
0
        /// <summary>
        /// Loads a binary_big_endian format ply file.
        /// </summary>
        /// <param name="s"></param>
        private void Load_binaryBE(Stream s)
        {
            using (var reader = new BinaryReader(s))
            {
                while (reader.ReadString() != null)
                {
                    var      curline = reader.ReadString();
                    string[] strarr  = curline.Split(' ');
                    //comment Line
                    if (strarr[0] == "comment")
                    {
                        continue;
                    }

                    //obj_info Line
                    if (strarr[0] == "obj_info")
                    {
                        ObjectInformation.Add(strarr[1], double.Parse(strarr[2]));
                    }

                    //element Line
                    if (strarr[0] == "element")
                    {
                        /* Supported elements
                         * vertex
                         * face
                         */

                        if (strarr[1] == "vertex")
                        {
                            VerticesNumber = int.Parse(strarr[2]);

                            //Add the vertex element to the dictionary, including its contextual range
                            elements_range.Add("vertex", new PLYElement(_y1: elementLines_Count, _y2: elementLines_Count + VerticesNumber));
                            elementLines_Count += int.Parse(strarr[2]);
                            currentElement      = PlyElements.vertex;
                        }

                        else if (strarr[1] == "face")
                        {
                            FacesNumber = int.Parse(strarr[2]);

                            elements_range.Add("face", new PLYElement(elementLines_Count, elementLines_Count + FacesNumber));
                            elementLines_Count += int.Parse(strarr[2]);
                            currentElement      = PlyElements.face;
                        }
                        else
                        {
                            int miscElementNumber = int.Parse(strarr[2]);

                            elements_range.Add(strarr[1], new PLYElement(elementLines_Count, elementLines_Count + miscElementNumber));
                            elementLines_Count += int.Parse(strarr[2]);
                        }
                    }

                    //property Line
                    if (strarr[0] == "property")
                    {
                        //Ignore the numerical data type for now

                        switch (currentElement)
                        {
                        case PlyElements.vertex:
                        {
                            if (strarr[2] == "nx" || strarr[2] == "ny" || strarr[2] == "nz")
                            {
                                elements_range["vertex"].ContainsNormals = true;
                            }

                            int propInd = elements_range["vertex"].PropertyIndex;
                            elements_range["vertex"].Property_with_Index.Add(strarr[2], propInd);
                            //Increase the property index if there's an element which has/hasn't been supported.
                            elements_range["vertex"].PropertyIndex += 1;
                            break;
                        }

                        case PlyElements.face:
                        {
                            //nothing to do yet

                            break;
                        }

                        default:
                            break;
                        }
                    }

                    if (strarr[0] == "end_header")
                    {
                        //end info, begin number collection.
                        elementLine_Current = 0;
                    }

                    /* We pick the elements and its properties by checking whether the current
                     * element line is contained in the element range.
                     */
                    if (elements_range["vertex"].ContainsNumber(elementLine_Current))
                    {
                        //Get vertices
                        int     x_Indx = elements_range["vertex"].Property_with_Index["x"];
                        int     y_Indx = elements_range["vertex"].Property_with_Index["y"];
                        int     z_Indx = elements_range["vertex"].Property_with_Index["z"];
                        Point3D pt     = new Point3D()
                        {
                            X = double.Parse(strarr[x_Indx]),
                            Y = double.Parse(strarr[y_Indx]),
                            Z = double.Parse(strarr[z_Indx])
                        };
                        Vertices.Add(pt);

                        if (elements_range["vertex"].ContainsNormals == true)
                        {
                            int nx_Indx = elements_range["vertex"].Property_with_Index["nx"];
                            int ny_Indx = elements_range["vertex"].Property_with_Index["ny"];
                            int nz_Indx = elements_range["vertex"].Property_with_Index["nz"];

                            Vector3D vect3 = new Vector3D
                            {
                                X = double.Parse(strarr[nx_Indx]),
                                Y = double.Parse(strarr[ny_Indx]),
                                Z = double.Parse(strarr[nz_Indx])
                            };
                        }

                        if (elements_range["vertex"].ContainsTextureCoordinates == true)
                        {
                        }
                    }
                    if (elements_range["face"].ContainsNumber(elementLine_Current))
                    {
                        List <int> facepos = new List <int>();
                        for (int i = 1; i <= int.Parse(strarr[0]); i++)
                        {
                            facepos.Add(int.Parse(strarr[i]));
                        }
                        Faces.Add(facepos.ToArray());
                    }


                    elementLine_Current++;
                }
            }
            BinaryReader br = new BinaryReader(s);

            br.ReadString();
        }
예제 #3
0
        /// <summary>
        /// Loads an ascii format ply file.
        /// </summary>
        /// <param name="s"></param>
        private void Load_ascii(Stream s)
        {
            using (var reader = new StreamReader(s))
            {
                while (!reader.EndOfStream)
                {
                    var      curline = reader.ReadLine();
                    string[] strarr  = curline.Split(' ');
                    if (curline == null)
                    {
                        //reader.Close();
                    }

                    #region Heading
                    //comment Line
                    else if (strarr[0] == "comment" || strarr[0] == "format" || strarr[0] == "ply")
                    {
                    }

                    //obj_info Line
                    else if (strarr[0] == "obj_info")
                    {
                        //ObjectInformation.Add(strarr[1], double.Parse(strarr[2]));
                    }

                    //element Line
                    else if (strarr[0] == "element")
                    {
                        /* Supported elements
                         * vertex
                         * face
                         */

                        if (strarr[1] == "vertex")
                        {
                            VerticesNumber = int.Parse(strarr[2]);
                            //Add the vertex element to the dictionary, including its contextual range
                            elements_range.Add("vertex", new PLYElement(elementLines_Count + 1, elementLines_Count + VerticesNumber));
                            elementLines_Count += int.Parse(strarr[2]);
                            //set the current element as a "vertex"element
                            currentElement = PlyElements.vertex;
                        }

                        else if (strarr[1] == "face")
                        {
                            FacesNumber = int.Parse(strarr[2]);

                            elements_range.Add("face", new PLYElement(elementLines_Count + 1, elementLines_Count + FacesNumber));
                            elementLines_Count += int.Parse(strarr[2]);
                            currentElement      = PlyElements.face;
                        }

                        else
                        {
                            int miscElementNumber = int.Parse(strarr[2]);

                            elements_range.Add(strarr[1], new PLYElement(elementLines_Count, elementLines_Count + miscElementNumber));
                            elementLines_Count += int.Parse(strarr[2]);
                            currentElement      = PlyElements.none;
                        }
                    }

                    //property Line
                    else if (strarr[0] == "property")
                    {
                        //Ignore the numerical data type for now

                        switch (currentElement)
                        {
                        case PlyElements.vertex:
                        {
                            int propInd = elements_range["vertex"].PropertyIndex;
                            elements_range["vertex"].Property_with_Index.Add(strarr[2], propInd);
                            //Increase the property index if there's an element which has/hasn't been supported.
                            elements_range["vertex"].PropertyIndex += 1;
                            if (strarr[2] == "nx" || strarr[2] == "ny" || strarr[2] == "nz")
                            {
                                elements_range["vertex"].ContainsNormals = true;
                            }
                            else if (strarr[2] == "s" || strarr[2] == "t")
                            {
                                elements_range["vertex"].ContainsTextureCoordinates = true;
                            }

                            break;
                        }

                        case PlyElements.face:
                        {
                            //nothing to do yet

                            break;
                        }

                        default:
                            break;
                        }
                    }

                    else if (strarr[0] == "end_header")
                    {
                        //end info, begin number collection.
                        elementLine_Current = 0;
                    }

                    #endregion

                    /* We pick the elements and its properties by checking whether the current
                     * element line is contained in the element range.
                     * The picking occurs if the first character in the string indicates a number follows.
                     */
                    else if (IsDigitChar(strarr[0][0]) == true)
                    {
                        elementLine_Current++;
                        if (elements_range.ContainsKey("vertex"))
                        {
                            if (elements_range["vertex"].ContainsNumber(elementLine_Current) == true)
                            {
                                //Get vertices
                                int     x_Indx = elements_range["vertex"].Property_with_Index["x"];
                                int     y_Indx = elements_range["vertex"].Property_with_Index["y"];
                                int     z_Indx = elements_range["vertex"].Property_with_Index["z"];
                                Point3D pt     = new Point3D()
                                {
                                    X = double.Parse(strarr[x_Indx]),
                                    Y = double.Parse(strarr[y_Indx]),
                                    Z = double.Parse(strarr[z_Indx])
                                };
                                Vertices.Add(pt);

                                if (elements_range["vertex"].ContainsNormals == true)
                                {
                                    int nx_Indx = elements_range["vertex"].Property_with_Index["nx"];
                                    int ny_Indx = elements_range["vertex"].Property_with_Index["ny"];
                                    int nz_Indx = elements_range["vertex"].Property_with_Index["nz"];

                                    Vector3D vect3d = new Vector3D
                                    {
                                        X = double.Parse(strarr[nx_Indx]),
                                        Y = double.Parse(strarr[ny_Indx]),
                                        Z = double.Parse(strarr[nz_Indx])
                                    };
                                    Normals.Add(vect3d);
                                }

                                if (elements_range["vertex"].ContainsTextureCoordinates == true)
                                {
                                    int s_Indx = elements_range["vertex"].Property_with_Index["s"];
                                    int t_Indx = elements_range["vertex"].Property_with_Index["t"];

                                    Point texpt = new Point
                                    {
                                        X = double.Parse(strarr[s_Indx]),
                                        Y = double.Parse(strarr[t_Indx]),
                                    };
                                    TextureCoordinates.Add(texpt);
                                }
                            }
                        }

                        if (elements_range.ContainsKey("face"))
                        {
                            if (elements_range["face"].ContainsNumber(elementLine_Current) == true)
                            {
                                List <int> facepos = new List <int>();
                                for (int i = 1; i <= int.Parse(strarr[0]); i++)
                                {
                                    facepos.Add(int.Parse(strarr[i]));
                                }
                                Faces.Add(facepos.ToArray());
                            }
                        }

                        else
                        {
                            continue;
                        }
                        //should increase the elementLine_Current iff
                        //the line contains element data.
                    }

                    else
                    {
                        continue;
                    }
                }
            }
        }