private void AddColorProperties(PlyElement edgeElement, int index)
 {
     foreach (var color in new[] { PlyKeywords.Red, PlyKeywords.Green, PlyKeywords.Blue })
     {
         edgeElement.Properties.Add(color, new PlyProperty(color, index, PlyPropertyType.UChar));
     }
 }
Пример #2
0
 /// <summary>
 /// Initializes a ply header with type <see cref="PlyFormatTypes.ascii"/> and no elements, comments and object infos.
 /// </summary>
 public PlyHeader()
 {
     FormatType  = PlyFormatTypes.ascii;
     Version     = SUPPORTEDVERSION;
     Comments    = new string[] { };
     ObjectInfos = new Tuple <string, string>[] { };
     Elements    = new PlyElement[] { };
 }
        public string[] ReadElementTokens(PlyElement element)
        {
            var tokens = new List <string>();

            foreach (var property in element.Properties)
            {
                var bytes = _binaryReader.ReadBytes(property.Value.Type.ByteCount);
                var o     = property.Value.Type.ByteConverter(bytes, 0);
                tokens.Add(o.ToString());
            }
            return(tokens.ToArray());
        }
        private void AddEdgeElement(PlyFile plyFile, Mesh mesh)
        {
            if (mesh.ContainsEdges)
            {
                int index        = 0;
                var edgeElements = new PlyElement(PlyKeywords.Edge, mesh.Edges.Count);

                AddEdgeProperty(edgeElements, PlyKeywords.Vertex1, index++);
                AddEdgeProperty(edgeElements, PlyKeywords.Vertex2, index++);
                AddColorProperties(edgeElements, index++);

                plyFile.Elements.Add(edgeElements);
            }
        }
Пример #5
0
        private void ReadBody()
        {
            foreach(var elementType in _result.ElementTypes.Values) {
                var elements = new PlyElement[elementType.Count];

                for(var i = 0; i < elements.Length; i++) {
                    if (AtEnd)
                        throw new Exception("The end of the PLY file was reached before the expected number of elements could be parsed.");

                    elements[i] = ReadElement(elementType);
                }

                _result.Elements[elementType] = elements;
            }
        }
        public string[] ReadElementTokens(PlyElement element)
        {
            if (_streamReader.EndOfStream)
            {
                return(null);
            }

            var line = _streamReader.ReadLine();

            if (line == null)
            {
                return(null);
            }

            return(line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries));
        }
        private void AddVertexElement(PlyFile plyFile, Mesh mesh)
        {
            int index          = 0;
            var vertexElements = new PlyElement(PlyKeywords.Vertex, mesh.Points.Count);

            foreach (var name in new List <string>()
            {
                PlyKeywords.X, PlyKeywords.Y, PlyKeywords.Z
            })
            {
                AddVertexProperty(vertexElements, name, index++);
            }

            if (mesh.ContainsNormals)
            {
                foreach (var name in new List <string>()
                {
                    PlyKeywords.NormalX, PlyKeywords.NormalY, PlyKeywords.NormalZ
                })
                {
                    AddVertexProperty(vertexElements, name, index++);
                }
            }

            if (mesh.ContainsColors)
            {
                foreach (var name in new List <string>()
                {
                    PlyKeywords.Red, PlyKeywords.Green, PlyKeywords.Blue, PlyKeywords.Alpha
                })
                {
                    AddColorProperty(vertexElements, name, index++);
                }
            }

            plyFile.Elements.Add(vertexElements);
        }
Пример #8
0
        /// <summary>
        /// Reads and validates the header lines of a ply file.
        /// </summary>
        /// <param name="headerLines">The lines to read.</param>
        /// <returns></returns>
        private PlyHeader ReadHeader(string[] headerLines)
        {
            if (headerLines.Length > 2 && (PlyHeaderItems)Enum.Parse(typeof(PlyHeaderItems), headerLines[0]) == PlyHeaderItems.ply &&
                (PlyHeaderItems)Enum.Parse(typeof(PlyHeaderItems), headerLines[headerLines.Length - 1]) == PlyHeaderItems.end_header)
            {
                var formatSpecLineParts = headerLines[1].Split(' ');
                var formatStr           = formatSpecLineParts[0];
                var formatTypeStr       = formatSpecLineParts[1];
                var fileVersion         = Version.Parse(formatSpecLineParts[2]);

                if ((PlyHeaderItems)Enum.Parse(typeof(PlyHeaderItems), formatStr) == PlyHeaderItems.format &&
                    Enum.TryParse(formatTypeStr, out PlyFormatTypes formatType) && fileVersion <= SUPPORTEDVERSION)
                {
                    var comments = new List <string>();
                    var objInfos = new List <Tuple <string, string> >();
                    var elements = new List <PlyElement>();

                    for (int i = 2; i < headerLines.Length - 1; i++)
                    {
                        var lineParts = headerLines[i].Split(' ');
                        if (Enum.TryParse(lineParts[0], out PlyHeaderItems headerItemType))
                        {
                            switch (headerItemType)
                            {
                            case PlyHeaderItems.element:
                            {
                                if (lineParts.Length == 3)
                                {
                                    var elementName  = lineParts[1];
                                    var elementCount = int.Parse(lineParts[2]);
                                    var element      = new PlyElement(elementName, elementCount, new List <PlyProperty[]> {
                                            new PlyProperty[] { }
                                        });
                                    elements.Add(element);
                                }
                                break;
                            }

                            case PlyHeaderItems.property:
                            {
                                if (lineParts.Length >= 3 && elements.Count > 0)
                                {
                                    if (lineParts[1] != "list" && lineParts.Length == 3)
                                    {
                                        if (Enum.TryParse($"_{lineParts[1]}", out PlyDataTypes propertyType))
                                        {
                                            var propertyName = lineParts[2];

                                            var property = new PlyProperty(propertyName, propertyType, null, false, PlyDataTypes._char, null);

                                            var newPropertyList = new List <PlyProperty>();
                                            for (int j = 0; j < elements.Last().Instances[0].Length; j++)
                                            {
                                                newPropertyList.Add(elements.Last().Instances[0][j]);
                                            }
                                            newPropertyList.Add(property);
                                            elements.Last().Instances[0] = newPropertyList.ToArray();
                                        }
                                        else
                                        {
                                            throw new InvalidDataException($"Invalid data type, {lineParts[1]}.");
                                        }
                                    }
                                    else if (lineParts[1] == "list" && lineParts.Length == 5)
                                    {
                                        //array property
                                        if (Enum.TryParse($"_{lineParts[2]}", out PlyDataTypes propertyType) && Enum.TryParse($"_{lineParts[3]}", out PlyDataTypes listContentType))
                                        {
                                            var propertyName = lineParts[4];

                                            var property = new PlyProperty(propertyName, propertyType, null, true, listContentType, null);

                                            var newPropertyList = new List <PlyProperty>();
                                            for (int j = 0; j < elements.Last().Instances[0].Length; j++)
                                            {
                                                newPropertyList.Add(elements.Last().Instances[0][j]);
                                            }
                                            newPropertyList.Add(property);
                                            elements.Last().Instances[0] = newPropertyList.ToArray();
                                        }
                                        else
                                        {
                                            throw new InvalidDataException($"Invalid data type, {lineParts[1]}.");
                                        }
                                    }
                                    else
                                    {
                                        throw new InvalidDataException("Invalid property definition.");
                                    }
                                }
                                break;
                            }

                            case PlyHeaderItems.obj_info:
                            {
                                if (lineParts.Length == 3)
                                {
                                    objInfos.Add(new Tuple <string, string>(lineParts[1], lineParts[2]));
                                }
                                else
                                {
                                    objInfos.Add(new Tuple <string, string>($"htk_info_{objInfos.Count}", headerLines[i].Substring(lineParts[0].Length + 1)));
                                }
                                break;
                            }

                            case PlyHeaderItems.comment:
                            {
                                comments.Add(headerLines[i].Substring(lineParts[0].Length + 1));
                                break;
                            }

                            default:
                            {
                                throw new InvalidDataException($"Unknown header item, {lineParts[0]}.");
                            }
                            }
                        }
                        else
                        {
                            throw new InvalidDataException($"Unknown header item, {lineParts[0]}.");
                        }
                    }

                    var plyHeader = new PlyHeader(formatType, fileVersion, elements.ToArray(), objInfos.ToArray(), comments.ToArray());
                    return(plyHeader);
                }
                else
                {
                    throw new InvalidDataException("Invalid format specification.");
                }
            }
 private void AddEdgeProperty(PlyElement edgeElement, string name, int index)
 {
     edgeElement.Properties.Add(name, new PlyProperty(name, index, PlyPropertyType.Int));
 }
 private void AddColorProperty(PlyElement element, string name, int index)
 {
     element.Properties.Add(name, new PlyProperty(name, index, PlyPropertyType.UChar));
 }
 private void AddVertexProperty(PlyElement element, string name, int index)
 {
     element.Properties.Add(name, new PlyProperty(name, index, PlyPropertyType.Float));
 }