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