public List <List <double> > GetRatesForGridType2(string dataPath, ISOTreatmentZone treatmentZone)
        {
            if (treatmentZone == null || treatmentZone.ProcessDataVariables.Count <= 0)
            {
                return(null);
            }

            List <List <double> >        productRates = new List <List <double> >();
            Dictionary <string, ISOUnit> unitsByDDI   = new Dictionary <string, ISOUnit>();
            string filePath = Path.ChangeExtension(Path.Combine(dataPath, Filename), ".bin");

            using (var fileStream = File.OpenRead(filePath))
            {
                var bytes     = new byte[4];
                var rates     = new List <double>();
                var rateCount = 0;

                while (true)
                {
                    var result = fileStream.Read(bytes, 0, bytes.Length);
                    if (result == 0)
                    {
                        break;
                    }

                    var rate = BitConverter.ToInt32(bytes, 0);

                    ISOProcessDataVariable pdv = treatmentZone.ProcessDataVariables[rateCount];
                    ISOUnit unit = null;
                    if (!unitsByDDI.ContainsKey(pdv.ProcessDataDDI))
                    {
                        unit = UnitFactory.Instance.GetUnitByDDI(pdv.ProcessDataDDI.AsInt32DDI());
                        unitsByDDI.Add(pdv.ProcessDataDDI, unit);
                    }
                    unit = unitsByDDI[pdv.ProcessDataDDI];

                    if (unit != null)
                    {
                        rates.Add(unit.ConvertFromIsoUnit(rate));
                    }
                    else
                    {
                        throw new ApplicationException("Missing unit on rate calculation from PDV.");
                    }
                    rateCount++;

                    if (rateCount == treatmentZone.ProcessDataVariables.Count)
                    {
                        productRates.Add(rates);
                        rateCount = 0;
                        rates     = new List <double>();
                    }
                }
            }

            return(productRates);
        }
        public static List <ISOProcessDataVariable> ReadXML(XmlNodeList nodes)
        {
            List <ISOProcessDataVariable> items = new List <ISOProcessDataVariable>();

            foreach (XmlNode node in nodes)
            {
                items.Add(ISOProcessDataVariable.ReadXML(node));
            }
            return(items);
        }
        public static ISOProcessDataVariable ReadXML(XmlNode node)
        {
            ISOProcessDataVariable pdv = new ISOProcessDataVariable();

            pdv.ProcessDataDDI              = node.GetXmlNodeValue("@A");
            pdv.ProcessDataValue            = node.GetXmlNodeValueAsInt("@B");
            pdv.ProductIdRef                = node.GetXmlNodeValue("@C");
            pdv.DeviceElementIdRef          = node.GetXmlNodeValue("@D");
            pdv.ValuePresentationIdRef      = node.GetXmlNodeValue("@E");
            pdv.ActualCulturalPracticeValue = node.GetXmlNodeValueAsNullableInt("@F");
            pdv.ElementTypeInstanceValue    = node.GetXmlNodeValueAsNullableInt("@G");

            XmlNodeList pdvNodes = node.SelectNodes("PDV");

            if (pdvNodes != null)
            {
                pdv.ChildProcessDataVariables.AddRange(ISOProcessDataVariable.ReadXML(pdvNodes));
            }

            return(pdv);
        }
        public static ISOTreatmentZone ReadXML(XmlNode tznNode)
        {
            ISOTreatmentZone treatmentZone = new ISOTreatmentZone();

            treatmentZone.TreatmentZoneCode       = tznNode.GetXmlNodeValueAsByte("@A");
            treatmentZone.TreatmentZoneDesignator = tznNode.GetXmlNodeValue("@B");
            treatmentZone.TreatmentZoneColour     = tznNode.GetXmlNodeValueAsNullableByte("@C");

            XmlNodeList pdvNodes = tznNode.SelectNodes("PDV");

            if (pdvNodes != null)
            {
                treatmentZone.ProcessDataVariables.AddRange(ISOProcessDataVariable.ReadXML(pdvNodes));
            }

            XmlNodeList plnNodes = tznNode.SelectNodes("PLN");

            if (plnNodes != null)
            {
                treatmentZone.Polygons.AddRange(ISOPolygon.ReadXML(plnNodes));
            }
            return(treatmentZone);
        }