/// <summary> /// Reads the points from the specified <see cref="Stream"/> and collects their specifications, such as type, tolerance, segment and metadata. /// </summary> /// <param name="formplotType">Type of the formplot.</param> /// <param name="metadataReader">The metadata reader.</param> /// <param name="pointdataStream">The pointdata stream.</param> /// <returns></returns> private static Point[] ReadPoints(FormplotTypes formplotType, XmlReader metadataReader, Stream pointdataStream) { if (metadataReader == null) { throw new ArgumentNullException(nameof(metadataReader)); } if (pointdataStream == null) { throw new ArgumentNullException(nameof(pointdataStream)); } var count = 0; var propertyLists = new Dictionary <Property, RangeList>(); var statelists = new Dictionary <PointState, RangeList>(); var segmentlists = new Dictionary <Segment, RangeList>(); var tolerancelists = new Dictionary <Tolerance, RangeList>(); while (metadataReader.Read() && metadataReader.NodeType != XmlNodeType.EndElement) { if (metadataReader.IsEmptyElement) { continue; } switch (metadataReader.Name) { case "Count": count = XmlConvert.ToInt32(metadataReader.ReadString()); break; case "Properties": while (metadataReader.Read() && metadataReader.NodeType != XmlNodeType.EndElement) { switch (metadataReader.Name) { case "Property": var points = RangeList.TryParseOrEmpty(metadataReader.GetAttribute("Points")); var property = Property.Deserialize(metadataReader); propertyLists[property] = points; break; } } break; case "States": while (metadataReader.Read() && metadataReader.NodeType != XmlNodeType.EndElement) { switch (metadataReader.Name) { case "State": var points = RangeList.TryParseOrEmpty(metadataReader.GetAttribute("Points")); var text = metadataReader.ReadString(); var value = ( PointState )Enum.Parse(typeof(PointState), text); statelists[value] = points; break; } } break; case "Segments": while (metadataReader.Read() && metadataReader.NodeType != XmlNodeType.EndElement) { switch (metadataReader.Name) { case "Segment": var points = RangeList.TryParseOrEmpty(metadataReader.GetAttribute("Points")); var typeString = metadataReader.GetAttribute("Type"); SegmentTypes type; Enum.TryParse(typeString, out type); var name = metadataReader.ReadString(); var segment = new Segment(name, type); segmentlists[segment] = points; break; } } break; case "Tolerances": var isTolerancesElement = false; while (metadataReader.NodeType != XmlNodeType.EndElement || !isTolerancesElement) { if (metadataReader.NodeType == XmlNodeType.Element && metadataReader.Name.Equals("Tolerance")) { var points = RangeList.TryParseOrEmpty(metadataReader.GetAttribute("Points")); var tolerance = Tolerance.Deserialize(metadataReader); tolerancelists[tolerance] = points; metadataReader.Read(); } else { metadataReader.Read(); } isTolerancesElement = metadataReader.Name.Equals("Tolerances"); } break; } } var result = new List <Point>(); for (var index = 0; index < count; index++) { var point = Point.Create(formplotType); point.ReadFromStream(pointdataStream, index); result.Add(point); } SetProperties(propertyLists, result); SetStates(statelists, result); SetSegment(segmentlists, result); SetTolerance(tolerancelists, result); return(result.ToArray()); }