Example #1
0
        /// <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());
        }