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