Beispiel #1
0
        private PlyElement ReadElement()
        {
            string[] tokens = CurrentLine.Split(splitter, StringSplitOptions.RemoveEmptyEntries);
            int      count  = 0;

            if (!int.TryParse(tokens[2], out count))
            {
                throw new Exception(
                          string.Format("Invalid element count: \"{0}\"", tokens[2]));
            }

            PlyElement element = new PlyElement();

            element.Name = tokens[1];
            PlyElementType tempType = PlyElementType.other;

            if (Enum.TryParse <PlyElementType>(tokens[1], out tempType))
            {
                element.Type = tempType;
            }
            element.Count = count;


            while (NextHeaderLine().StartsWith("property"))
            {
                element.AddProperty(ReadProperty(CurrentLine));
            }
            return(element);
        }
Beispiel #2
0
 void AnalyzeElement(ref PlyElement element)
 {
     foreach (PlyProperty property in element.Properties)
     {
         if ((property.Type == PlyPropertyType.nx) |
             (property.Type == PlyPropertyType.ny) |
             (property.Type == PlyPropertyType.nz))
         {
             element.containsNormal = true;
         }
         if ((property.Type == PlyPropertyType.x) |
             (property.Type == PlyPropertyType.y) |
             (property.Type == PlyPropertyType.z))
         {
             element.containsVertex = true;
         }
         if ((property.Type == PlyPropertyType.red) |
             (property.Type == PlyPropertyType.blue) |
             (property.Type == PlyPropertyType.green))
         {
             element.containsColor = true;
         }
     }
     if (element.Type == PlyElementType.vertex)
     {
         _containsVertices = true;
     }
     if (element.Type == PlyElementType.face)
     {
         _containsFaces = true;
     }
     if (element.Type == PlyElementType.edge)
     {
         _containsEdges = true;
     }
     if (element.Type == PlyElementType.material)
     {
         _containsMaterials = true;
     }
 }
Beispiel #3
0
        public void Open(string fileName)
        {
            try
            {
                using (sr = new StreamReader(fileName))
                {
                    _containsNormals = false;
                    ReadHeader();
                    for (int i = 0; i < this.Header.Elements.Count; i++)
                    {
                        PlyElement element = Header.Elements.ElementAt(i);
                        AnalyzeElement(ref element);
                        List <string> section = new List <string>(element.Count);
                        for (int k = 0; k < element.Count; k++)
                        {
                            section.Add(NextLine());
                        }

                        ReadBody(section, element);

                        if (element.containsVertex && element.containsNormal)
                        {
                            _containsNormals = true;
                        }
                    }

                    if (!_containsNormals)
                    {
                        CreateNormals();
                    }
                    GetExents();
                };
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.Message);
            }
        }
Beispiel #4
0
        private void ReadBody(List <string> section, PlyElement element)
        {
            foreach (string line in section)
            {
                string[] tokens = line.Split(splitter, StringSplitOptions.RemoveEmptyEntries);
                if (element.Type == PlyElementType.vertex)
                {
                    float[]   floatTokens = new float[tokens.Length];
                    PlyVertex Vertex      = new PlyVertex();
                    for (int i = 0; i < tokens.Length; i++)
                    {
                        string          typeName = element.Properties[i].TypeName;
                        string          name     = element.Properties[i].Name;
                        PlyPropertyType propType = element.Properties[i].Type;
                        byte            r        = 0;
                        byte            g        = 0;
                        byte            b        = 0;
                        if (propType == PlyPropertyType.x)
                        {
                            Vertex.X = float.Parse(tokens[i]);
                        }
                        if (propType == PlyPropertyType.y)
                        {
                            Vertex.Y = float.Parse(tokens[i]);
                        }
                        if (propType == PlyPropertyType.z)
                        {
                            Vertex.Z = float.Parse(tokens[i]);
                        }
                        if (propType == PlyPropertyType.nx)
                        {
                            Vertex.Normal.X = double.Parse(tokens[i]);
                        }
                        if (propType == PlyPropertyType.ny)
                        {
                            Vertex.Normal.Y = double.Parse(tokens[i]);
                        }
                        if (propType == PlyPropertyType.nz)
                        {
                            Vertex.Normal.Z = double.Parse(tokens[i]);
                        }
                        if (propType == PlyPropertyType.red)
                        {
                            r = byte.Parse(tokens[i]);
                        }
                        if (propType == PlyPropertyType.green)
                        {
                            g = byte.Parse(tokens[i]);
                        }
                        if (propType == PlyPropertyType.blue)
                        {
                            b = byte.Parse(tokens[i]);
                        }
                        Vertex.Col = System.Drawing.Color.FromArgb(r, g, b);
                    }

                    Vertices.Add(Vertex);
                }
                if (element.Type == PlyElementType.face)
                {
                    var indexList = new List <int>();
                    for (int i = 1; i < tokens.Length; i++)
                    {
                        int temp = int.Parse(tokens[i]);
                        indexList.Add(temp);
                    }
                    Faces.Add(new PlyFace(indexList));
                }
                if (element.Type == PlyElementType.edge)
                {
                    PlyEdge edge = new PlyEdge(element.containsColor);
                    for (int i = 0; i < tokens.Length; i++)
                    {
                        string          typeName = element.Properties[i].TypeName;
                        string          name     = element.Properties[i].Name;
                        PlyPropertyType propType = element.Properties[i].Type;
                        byte            r        = 0;
                        byte            b        = 0;
                        byte            g        = 0;

                        if (propType == PlyPropertyType.red)
                        {
                            r = byte.Parse(tokens[i]);
                        }
                        if (propType == PlyPropertyType.green)
                        {
                            g = byte.Parse(tokens[i]);
                        }
                        if (propType == PlyPropertyType.blue)
                        {
                            b = byte.Parse(tokens[i]);
                        }
                        if (propType == PlyPropertyType.vertex1)
                        {
                            edge.Vertex1 = int.Parse(tokens[i]);
                        }
                        if (propType == PlyPropertyType.vertex2)
                        {
                            edge.Vertex2 = int.Parse(tokens[i]);
                        }
                        edge.Color = System.Drawing.Color.FromArgb(r, g, b);
                    }
                    Edges.Add(edge);
                }
                if (element.Type == PlyElementType.material)
                {
                    for (int i = 0; i < tokens.Length; i++)
                    {
                    }
                }
                if (element.Type == PlyElementType.other)
                {
                    for (int i = 0; i < tokens.Length; i++)
                    {
                    }
                }
            }
        }