Beispiel #1
0
    /// <summary>Process the raw constant straight from the input file</summary>
    /// <remarks>
    /// The objective of this method is to parse the text in the
    /// specified constant and create a representative 'PatchVariable'
    /// </remarks>
    private void ProcessConstant(APSIMConstant constant)
    {
        // Parse examples:
        //    longterm rain = 0
        //    longterm rain = patch_rain
        //    longterm rain = rain from 2014-04-01 to 2014-07-31

        if (constant.Name != "Title")
        {
            string descriptor = constant.Name + " = " + constant.Value;
            Console.WriteLine("      " + descriptor);

            string pattern = @"((?<longterm>longterm)\s+)?" +
                             @"(?<variable>\S+)" +
                             @"\s+=\s+" +
                             @"(?<value>\S+)" +
                             @"(" +
                             @"(\s+from\s+)(?<date1>\S+)" +
                             @"(\s+to\s+)(?<date2>\S+)" +
                             @")?";

            Regex r = new Regex(pattern);
            Match m = r.Match(descriptor);
            if (!m.Success)
            {
                throw new Exception("Invalid report variable found: " + descriptor);
            }
            GroupCollection c = r.Match(descriptor).Groups;

            bool     longterm          = c["longterm"].Value == "longterm";
            string   variableNameToSet = c["variable"].Value;
            string   dataColumnName    = c["value"].Value;
            string   date1String       = c["date1"].Value;
            string   date2String       = c["date2"].Value;
            DateTime date1;
            DateTime.TryParse(date1String, CultureInfo.InvariantCulture, DateTimeStyles.None, out date1);
            DateTime date2;
            DateTime.TryParse(date2String, CultureInfo.InvariantCulture, DateTimeStyles.None, out date2);
            string value = null;

            DataTable dataForConstant;
            if (data.Rows.Count > 0 && data.Columns.Contains(dataColumnName))
            {
                dataForConstant = data;
            }
            else if (date1 != DateTime.MinValue && date2 != DateTime.MinValue)
            {
                dataForConstant = getDataFromInput(date1, date2);
            }
            else
            {
                // assume the data column name is actually a value.
                value           = dataColumnName;
                dataColumnName  = null;
                dataForConstant = null;
            }

            patchVariables.Add(new PatchVariable(variableNameToSet, dataColumnName, value, longterm, date1, date2, dataForConstant, Paddock));
        }
    }
Beispiel #2
0
        public void TestReadConstants()
        {
            WriteDummyMetFile();
            APSIMInputFile InputFile = new APSIMInputFile();

            InputFile.Open("test.met");
            DataTable MetData = InputFile.ToTable();

            InputFile.Close();

            ArrayList Constants = InputFile.Constants;

            Assert.AreEqual(Constants.Count, 4);
            APSIMConstant Latitude = (APSIMConstant)Constants[0];

            Assert.AreEqual(Latitude.Name, "Latitude");
            Assert.AreEqual(Latitude.Value, "-27.11");
            Assert.AreEqual(Latitude.Units, "deg min");
            Assert.AreEqual(Latitude.Comment, "my latitude");


            DeleteDummyMetFile();
        }