private static Formplot?ReadFormplot(Stream metadataStream, Stream?pointDataStream, Version version, FormplotTypes[]?acceptedTypes)
        {
            using var reader = XmlReader.Create(metadataStream, CreateXmlReaderSettings());

            reader.MoveToElement();
            while (reader.Read() && reader.NodeType != XmlNodeType.EndElement)
            {
                if (reader.Name != FormplotRootTag && reader.Name != PropertiesRootTag)
                {
                    continue;
                }

                if (!EnumParser <FormplotTypes> .TryParse(reader.GetAttribute("Type") ?? "", out var plotType))
                {
                    plotType = FormplotTypes.None;                     // This code path is for Property Files (they don't have a form plot type)
                }
                if (acceptedTypes != null && !acceptedTypes.Contains(plotType))
                {
                    return(null);
                }

                var targetVersion = FormplotHelper.GetFileFormatVersion(plotType);
                if (version > targetVersion)
                {
                    throw new NotSupportedException($"Invalid form plot file. Version {version} is not supported.");
                }

                return(CreateFormplot(pointDataStream, version, plotType, reader));
            }

            return(null);
        }
        public void Test_TryParse(string name, bool expectedParseResult, TestEnum expectedEnumValue)
        {
            // act
            var parseResult = EnumParser <TestEnum> .TryParse(name, out var enumValue);

            // assert
            Assert.That(parseResult, Is.EqualTo(expectedParseResult));
            Assert.That(enumValue, Is.EqualTo(expectedEnumValue));
        }
Example #3
0
        /// <summary>
        /// Deserializes the property data.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <returns></returns>
        /// <exception cref="System.ArgumentNullException">reader</exception>
        /// <exception cref="System.NotSupportedException"></exception>
        internal static Property Deserialize(XmlReader reader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }

            var name     = reader.GetAttribute("Name");
            var dataType = EnumParser <DataTypeId> .TryParse(reader.GetAttribute("Type"), out var parsedDataType)
                                ? parsedDataType
                                : DataTypeId.String; // Fall back to DataType = String for very old form plot data that might not have a data type identifier

            var description = reader.GetAttribute("Description");
            var unit        = reader.GetAttribute("Unit");
            var stringValue = reader.ReadString();

            switch (dataType)
            {
            case DataTypeId.DateTime:
                return(Create(name, XmlConvert.ToDateTime(stringValue, XmlDateTimeSerializationMode.RoundtripKind), description));

            case DataTypeId.Double:
                return(Create(name, XmlConvert.ToDouble(stringValue), description, unit));

            case DataTypeId.Integer:
                return(Create(name, XmlConvert.ToInt64(stringValue), description, unit));

            case DataTypeId.String:
                return(Create(name, stringValue, description));

            case DataTypeId.TimeSpan:
                return(Create(name, XmlConvert.ToTimeSpan(stringValue), description));

            default:
                throw new NotSupportedException($"DataTypeId \"{dataType}\" is not supported");
            }
        }
Example #4
0
        /// <summary>
        /// Deserializes formplot data.
        /// </summary>
        /// <param name="metaDataReader">An XML reader to the header xml.</param>
        /// <param name="pointDataStream">A stream of binary formplot point data.</param>
        /// <returns></returns>
        private static Formplot Deserialize(XmlReader metaDataReader, Stream pointDataStream)
        {
            if (metaDataReader == null)
            {
                throw new ArgumentNullException(nameof(metaDataReader));
            }

            var creatorSoftware        = "unknown";
            var creatorSoftwareVersion = new Version(0, 0);
            var properties             = new List <Property>();
            var tolerance           = default(Tolerance);
            var defaultErrorScaling = default(double?);
            var projectionAxis      = ProjectionAxis.None;
            var nominal             = default(Geometry);
            var actual = default(Geometry);
            var points = default(Point[]);

            Enum.TryParse(metaDataReader.GetAttribute("Type"), out FormplotTypes formplotType);

            while (metaDataReader.Read() && metaDataReader.NodeType != XmlNodeType.EndElement)
            {
                switch (metaDataReader.Name)
                {
                case "CreatorSoftware":
                    creatorSoftware = metaDataReader.ReadString();
                    break;

                case "CreatorSoftwareVersion":
                    creatorSoftwareVersion = new Version(metaDataReader.ReadString());
                    break;

                case "Property":
                    properties.Add(Property.Deserialize(metaDataReader));
                    break;

                case "Tolerance":
                    tolerance = Tolerance.Deserialize(metaDataReader);
                    break;

                case "ErrorScaling":
                    defaultErrorScaling = XmlConvert.ToDouble(metaDataReader.ReadString());
                    break;

                case "ProjectionAxis":
                    if (formplotType == FormplotTypes.Straightness)
                    {
                        projectionAxis = ( ProjectionAxis )Enum.Parse(typeof(ProjectionAxis), metaDataReader.ReadString());
                    }
                    else
                    {
                        throw new NotSupportedException("only straightness formplot data supports a projection axis");
                    }
                    break;

                case "Geometry":
                    var geometryString = metaDataReader.GetAttribute("Type");
                    if (EnumParser <GeometryTypes> .TryParse(geometryString, out var geometryType))
                    {
                        if (geometryType != Geometry.GetGeometryTypeFromFormplotType(formplotType))
                        {
                            throw new NotSupportedException($"geometry type \"{geometryType}\" for plot type \"{formplotType}\" is not supported");
                        }

                        while (metaDataReader.Read() && metaDataReader.NodeType != XmlNodeType.EndElement)
                        {
                            switch (metaDataReader.Name)
                            {
                            case "Nominal":
                                nominal = Geometry.DeserializeGeometry(metaDataReader, geometryType);
                                break;

                            case "Actual":
                                actual = Geometry.DeserializeGeometry(metaDataReader, geometryType);
                                break;
                            }
                        }
                    }
                    else
                    {
                        throw new NotSupportedException($"geometry type \"{geometryString}\" is not supported");
                    }

                    break;

                case "Points":
                    points = ReadPoints(formplotType, metaDataReader, pointDataStream);
                    break;
                }
            }

            var plot = CreateFormplot(formplotType);

            plot.CreatorSoftware        = creatorSoftware;
            plot.CreatorSoftwareVersion = creatorSoftwareVersion;
            plot.Properties             = properties.ToArray();
            plot.Tolerance           = tolerance;
            plot.DefaultErrorScaling = defaultErrorScaling;
            plot.ProjectionAxis      = projectionAxis;
            plot.Nominal             = nominal;
            plot.Actual = actual;
            plot.Points = points;

            return(plot);
        }