/// <summary> /// Refresh the chart from data in the specified soil. /// </summary> public void Populate(Soil Soil, string ChartType, bool ShowSW = false) { DataTable Table = new DataTable(); if (ChartType == "Water") { DataTableUtility.AddColumn(Table, "DepthMidPoints (mm)", Soil.ToMidPoints(Soil.Water.Thickness)); DataTableUtility.AddColumn(Table, "Airdry (mm/mm)", Soil.Water.AirDry); DataTableUtility.AddColumn(Table, "LL15 (mm/mm)", Soil.Water.LL15); DataTableUtility.AddColumn(Table, "DUL (mm/mm)", Soil.Water.DUL); DataTableUtility.AddColumn(Table, "SAT (mm/mm)", Soil.Water.SAT); if (ShowSW) { DataTableUtility.AddColumn(Table, "SW (mm/mm)", Soil.SW); } foreach (string CropName in Soil.CropNames) { double[] PAWCmm = MathUtility.Multiply(Soil.PAWCCrop(CropName), Soil.Thickness); string LegendTitle = CropName + " LL (PAWC: " + MathUtility.Sum(PAWCmm).ToString("f0") + "mm)"; DataTableUtility.AddColumn(Table, LegendTitle, Soil.Crop(CropName).LL); } } else if (ChartType == "SoilOrganicMatter") { DataTableUtility.AddColumn(Table, "DepthMidPoints (mm)", Soil.ToMidPoints(Soil.SoilOrganicMatter.Thickness)); DataTableUtility.AddColumn(Table, "InertC (kg/ha)", Soil.SoilOrganicMatter.InertC(Soil)); DataTableUtility.AddColumn(Table, "BiomC (kg/ha)", Soil.SoilOrganicMatter.BiomC(Soil)); DataTableUtility.AddColumn(Table, "HumC (kg/ha)", Soil.SoilOrganicMatter.HumC(Soil)); } Populate(Table, ChartType, Soil); }
/// <summary> /// Set a column of string values in the specified table. /// </summary> private static void SetStringValues(DataTable Table, string ColumnName, string[] Values, int StartRow) { if (MathUtility.ValuesInArray(Values)) { DataTableUtility.AddColumn(Table, ColumnName, Values, StartRow, Values.Length); } else if (!Table.Columns.Contains(ColumnName)) { Table.Columns.Add(ColumnName, typeof(string)); } }
/// <summary> /// We need to trap the end of an edit and write the data back to the /// table. /// </summary> protected override void OnCellValueChanged(DataGridViewCellEventArgs e) { base.OnCellValueChanged(e); if (DataSourceTable != null && !InRefresh && e.RowIndex != -1 && e.ColumnIndex != -1) { try { int Col = e.ColumnIndex; int Row = e.RowIndex; if (Row > DataSourceTable.Rows.Count - 1) { DataSourceTable.Rows.Add(DataSourceTable.NewRow()); } // Make sure this row has our popup menu. if (Rows[e.RowIndex].ContextMenuStrip == null) { Rows[e.RowIndex].ContextMenuStrip = PopupMenu; } ContextMenuStrip = PopupMenu; if (DataSourceTable.Columns[Col].DataType == typeof(double) && !MathUtility.IsNumerical(Rows[Row].Cells[Col].Value.ToString())) { // Turn the column into a string column. // Capture state of existing column and remove it from DataTable. string ColumnName = DataSourceTable.Columns[Col].ColumnName; string[] Values = GridUtility.GetColumnAsStringsUsingCellFormat(this, Col); int Ordinal = DataSourceTable.Columns[Col].Ordinal; DataSourceTable.Columns.RemoveAt(Col); // Create a new column of string type. DataColumn NewColumn = DataSourceTable.Columns.Add(ColumnName, typeof(string)); NewColumn.SetOrdinal(Ordinal); DataTableUtility.AddColumn(DataSourceTable, ColumnName, Values); } DataSourceTable.Rows[Row][Col] = Rows[Row].Cells[Col].Value; ChangedColumnNames.Add(DataSourceTable.Columns[Col].ColumnName); if (TableColumnChangedEvent != null) { TableColumnChangedEvent.Invoke(ChangedColumnNames); } ChangedColumnNames.Clear(); } catch (Exception) { } // This can happen when the user puts a text value into a numeric column. } }
/// <summary> /// Populate the graph. /// </summary> private void PopulateGraph() { DataTable Table = new DataTable(); Table.TableName = "InitWater"; DataTableUtility.AddColumn(Table, "DepthMidPoints (mm)", Soil.ToMidPoints(Soil.Water.Thickness)); DataTableUtility.AddColumn(Table, "SW (mm/mm)", Soil.SWAtWaterThickness); DataTableUtility.AddColumn(Table, "AirDry (mm/mm)", Soil.Water.AirDry); DataTableUtility.AddColumn(Table, "LL15 (mm/mm)", Soil.Water.LL15); DataTableUtility.AddColumn(Table, "DUL (mm/mm)", Soil.Water.DUL); DataTableUtility.AddColumn(Table, "SAT (mm/mm)", Soil.Water.SAT); SoilGraph.AddDataSource(Table); SoilGraph.Populate(Table, "InitWater", Soil); }
private static void AddCropColumn(DataTable Data, string CropName, Soil MySoil, int Row, int NumLayers) { if (MySoil.CropExists(CropName)) { DataTableUtility.AddColumn(Data, "ll(" + CropName + ")", MySoil.LL(CropName), Row, NumLayers); DataTableUtility.AddColumn(Data, "kl(" + CropName + ")", MySoil.KL(CropName), Row, NumLayers); DataTableUtility.AddColumn(Data, "xf(" + CropName + ")", MySoil.XF(CropName), Row, NumLayers); } else { DataTableUtility.AddValue(Data, "ll(" + CropName + ")", MathUtility.MissingValue, Row, NumLayers); DataTableUtility.AddValue(Data, "kl(" + CropName + ")", MathUtility.MissingValue, Row, NumLayers); DataTableUtility.AddValue(Data, "xf(" + CropName + ")", MathUtility.MissingValue, Row, NumLayers); } }
/// <summary> /// Create and fill a datatable from the grid. /// </summary> /// <returns></returns> public DataTable ToTable() { DataTable Table = new DataTable(); for (int Col = 0; Col < Columns.Count; Col++) { string ColumnName = Columns[Col].HeaderText.Replace("\r\n", " "); string[] Values = GridUtility.GetColumnAsStrings(this, Col); if (MathUtility.IsNumerical(Values)) { DataTableUtility.AddColumn(Table, ColumnName, MathUtility.StringsToDoubles(Values)); } else { DataTableUtility.AddColumn(Table, ColumnName, Values); } } return(Table); }
public void ConvertDataTableToSoil() { double NaN = double.NaN; DataTable Table = new DataTable(); DataTableUtility.AddColumn(Table, "Name", new string[] { "soil1", "soil1", "soil1", "soil1", "soil2", "soil2", "soil2", "soil2", "soil2", "soil2" }); DataTableUtility.AddColumn(Table, "Country", new string[] { "Aust", "Aust", "Aust", "Aust", "NZ", "NZ", "NZ", "NZ", "NZ", "NZ" }); DataTableUtility.AddColumn(Table, "Thickness (mm)", new double[] { 150.00, 150.00, 300.00, NaN, 50.00, 50.00, 150.00, 300.00, 300.00, 300.00 }); DataTableUtility.AddColumn(Table, "BD (g/cc)", new double[] { 1.02, 1.03, 1.02, NaN, 1.06, 1.02, 1.03, 1.02, 1.02, 1.06 }); DataTableUtility.AddColumn(Table, "BDCode", new string[] { "FM", "LM", "C_grav", "E", "", "", "", "", "", "" }); DataTableUtility.AddColumn(Table, "ThicknessChem (mm)", new double[] { 150.00, 150.00, 300.00, 300.00, 50.00, 50.00, 150.00, 300.00, 300.00, 300.00 }); DataTableUtility.AddColumn(Table, "OC", new double[] { 0.25, 1.20, 1.60, 1.80, 0.10, 0.20, 0.30, 0.40, 0.50, 00.60 }); DataTableUtility.AddColumn(Table, "OCCode", new string[] { "M (Walkley Black %)", "E (Walkley Black %)", "E (Walkley Black %)", "E (Walkley Black %)", "", "", "", "", "", "" }); DataTableUtility.AddColumn(Table, "AirDry (mm/mm)", new double[] { 0.15, 0.26, 0.29, 0.29, 0.30, 0.15, 0.26, 0.29, 0.29, 0.30 }); DataTableUtility.AddColumn(Table, "Wheat LL (mm/mm)", new double[] { 0.29, 0.25, 0.24, 0.23, 0.22, 0.29, 0.25, 0.24, 0.23, 0.22 }); DataTableUtility.AddColumn(Table, "Wheat KL (/day)", new double[] { 0.10, 0.08, 0.06, 0.04, 0.02, 0.10, 0.08, 0.06, 0.04, 0.02 }); DataTableUtility.AddColumn(Table, "Wheat XF (0-1)", new double[] { 1.00, 0.80, 0.80, 0.60, 0.60, 1.00, 0.80, 0.80, 0.60, 0.60 }); DataTableUtility.AddColumn(Table, "Barley LL (mm/mm)", new double[] { 0.25, 0.24, 0.23, 0.22, 0.21, 0.25, 0.24, 0.23, 0.22, 0.21 }); Soil[] Soils = SoilDataTable.TableToSoils(Table); Assert.AreEqual(Soils.Length, 2); Assert.AreEqual(Soils[0].Name, "soil1"); Assert.AreEqual(Soils[1].Name, "soil2"); Assert.AreEqual(Soils[0].Water.BD, new double[] { 1.02, 1.03, 1.02 }, 0.01); Assert.IsTrue(MathUtility.AreEqual(Soils[0].Water.BDMetadata, new string[] { "Field measured and checked for sensibility", "Laboratory measured", "Calculated from gravimetric moisture when profile wet but drained" })); Assert.AreEqual(Soils[1].Water.BD, new double[] { 1.06, 1.02, 1.03, 1.02, 1.02, 1.06 }, 0.01); Assert.AreEqual(Soils[0].SoilOrganicMatter.OC, new double[] { 0.25, 1.20, 1.60, 1.80 }); Assert.AreEqual(Soils[0].Crop("wheat").LL, new double[] { 0.29, 0.25, 0.24 }); Assert.AreEqual(Soils[0].Crop("wheat").KL, new double[] { 0.10, 0.08, 0.06 }); }
public DataTable CreateTable(ApsimFile.Component childComp) { DataTable Table = new DataTable(); XmlNodeList uiNodes = childComp.ContentsAsXML.SelectNodes("//ui/* | //CustomUI/*"); bool isManager = true; if (uiNodes.Count == 0) { uiNodes = childComp.ContentsAsXML.ChildNodes; isManager = false; } bool useSingleColumnTable = uiNodes.Count == 1 || childComp.Type == "siloinput"; if (useSingleColumnTable) { csvLabel.Visible = false; XmlNodeList foundNodes = Data.SelectNodes("//vars/" + uiNodes[0].Name); string[] values = null; if (foundNodes.Count == 1) { values = foundNodes[0].InnerText.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); } else { values = new string[0]; } DataTableUtility.AddColumn(Table, uiNodes[0].Name, values); // If there is only 1 variable, then turn the table into lots of rows so that the user can // enter one value per row rather than all on one line csv style. for (int i = 0; i < 10000; i++) { Table.Rows.Add(Table.NewRow()); } } else { csvLabel.Visible = true; Table.Columns.Add(" ", typeof(System.Boolean)); Table.Columns.Add("names", typeof(string)); Table.Columns.Add("Variables", typeof(string)); Table.Columns.Add("Parameters", typeof(string)); foreach (XmlNode ui in uiNodes) { DataRow newRow = Table.NewRow(); newRow[0] = false; string varName = ""; string text = ""; if (isManager) { varName = ui.Name; if (ui.Attributes["description"] != null) { text = ui.Attributes["description"].Value; } else { text = varName; } } else { varName = XmlHelper.Name(ui); } newRow[1] = varName; newRow[2] = text; newRow[3] = ui.InnerText; //look for corresponding node in the variables node if (varName != "#comment") { XmlNodeList foundNodes = Data.SelectNodes("//vars/" + varName); if (foundNodes.Count == 1) { XmlNode varNode = foundNodes[0]; if (varNode != null) { newRow[0] = true; newRow[3] = varNode.InnerText; } } Table.Rows.Add(newRow); } } } return(Table); }
/// <summary> /// Refresh the chart from data in the specified datasource. /// </summary> public void Populate(DataTable DataSource, string ChartType, Soil Soil) { this.Soil = Soil; this.Table = DataSource; DataSource.TableName = ChartType; Chart.Axes.Left.Automatic = true; Chart.Axes.Top.Automatic = true; Chart.Axes.Right.Automatic = true; Chart.Axes.Bottom.Automatic = true; //Chart.Series.Clear(); // Try and load an appropriate template. if (Directory.Exists(Path.Combine(Configuration.ApsimDirectory(), "UserInterface"))) { FileName = Path.Combine(Configuration.ApsimDirectory(), "UserInterface", ChartType + ".xml"); } else { FileName = Path.Combine(Configuration.ApsimDirectory(), ChartType + ".xml"); } XmlDocument Doc = new XmlDocument(); if (File.Exists(FileName)) { Doc.Load(FileName); Data = Doc.DocumentElement; } else { Data = null; } // Get the base chart to do it's thing. base.OnRefresh(); // Make sure there is a DepthMidPoints column if (DataSource.Columns.IndexOf("DepthMidPoints (mm)") == -1) { try { string[] Depths = DataTableUtility.GetColumnAsStrings(DataSource, "Depth (cm)"); double[] Thickness = Soil.ToThickness(Depths); double[] DepthMidPoints = Soil.ToMidPoints(Thickness); DataTableUtility.AddColumn(DataSource, "DepthMidPoints (mm)", DepthMidPoints); } catch (Exception e) { MessageBox.Show(e.Message); } } // Add in LL series and SW if it is present. foreach (DataColumn Column in DataSource.Columns) { if (Column.ColumnName.Contains(" LL") || Column.ColumnName.Contains("SW")) { Line Line = new Line(); Line.LinePen.Width = 2; AddSeries(DataSource, Column.ColumnName, Line); } } // Get our data. AddDataSource(DataSource); AdjustTopAxisTitle = false; // For some charts were we don't have a predefined chart XML file we need to set // up some default chart settings. Chart.Axes.Left.Inverted = true; // If there are no series then add some e.g. Analysis if (Chart.Series.Count == 0) { bool FirstSeries = true; foreach (DataColumn Column in DataSource.Columns) { if (Column.DataType == typeof(double) && !Column.ColumnName.Contains("Depth")) { string[] Values = DataTableUtility.GetColumnAsStrings(DataSource, Column.ColumnName); if (MathUtility.ValuesInArray(Values)) { Line Line = new Line(); Line.LinePen.Width = 2; AddSeries(DataSource, Column.ColumnName, Line); Line.Active = FirstSeries; FirstSeries = false; } } } AdjustTopAxisTitle = true; FormatTopAxis(); } // Now we can populate all series as we've created our series. PopulateSeries(); Chart.Refresh(); }
static private void CreateTableFromSoil(Soil MySoil, DataTable Data, string ChildPath, ref int Row) { int NumLayers = MySoil.Thickness.Length; DataTableUtility.AddValue(Data, "Name", ChildPath, Row, NumLayers); DataTableUtility.AddValue(Data, "State", MySoil.State, Row, NumLayers); DataTableUtility.AddValue(Data, "Region", MySoil.Region, Row, NumLayers); DataTableUtility.AddValue(Data, "NearestTown", MySoil.NearestTown, Row, NumLayers); DataTableUtility.AddValue(Data, "Site", MySoil.Site, Row, NumLayers); DataTableUtility.AddValue(Data, "APSoilNumber", MySoil.ApsoilNumber, Row, NumLayers); DataTableUtility.AddValue(Data, "Classification", MySoil.Classification, Row, NumLayers); DataTableUtility.AddValue(Data, "Latitude(WGS84)", MySoil.Latitude, Row, NumLayers); DataTableUtility.AddValue(Data, "Longitude(WGS84)", MySoil.Longitude, Row, NumLayers); DataTableUtility.AddValue(Data, "LocationAccuracy", MySoil.LocationAccuracy, Row, NumLayers); DataTableUtility.AddValue(Data, "DataSource", MySoil.DataSource, Row, NumLayers); DataTableUtility.AddValue(Data, "Comments", MySoil.Comment, Row, NumLayers); DataTableUtility.AddValue(Data, "NaturalVegetation", MySoil.NaturalVegetation, Row, NumLayers); DataTableUtility.AddColumn(Data, "Thickness", MySoil.Thickness, Row, NumLayers); DataTableUtility.AddColumn(Data, "BD", MySoil.BD, Row, NumLayers); DataTableUtility.AddColumn(Data, "Rocks", MySoil.Rocks, Row, NumLayers); DataTableUtility.AddColumn(Data, "Texture", MySoil.Texture, Row, NumLayers); DataTableUtility.AddColumn(Data, "SAT", MySoil.SAT, Row, NumLayers); DataTableUtility.AddColumn(Data, "DUL", MySoil.DUL, Row, NumLayers); DataTableUtility.AddColumn(Data, "LL15", MySoil.LL15, Row, NumLayers); DataTableUtility.AddColumn(Data, "Airdry", MySoil.Airdry, Row, NumLayers); string[] CropOrder = { "wheat", "barley", "oats", "canola", "chickpea", "cotton", "sorghum", "lentil", "lupin", "fieldpea", "mungbean", "sunflower", "fababean", "lucerne", "maize", "perennial grass", "cowpea", "navybean", "peanut", "pigeonpea", "soybean", "stylo", "sugar", "lablab", "millet", "triticale", "weed", "medic" }; for (int i = 0; i != 7; i++) { AddCropColumn(Data, CropOrder[i], MySoil, Row, NumLayers); } DataTableUtility.AddValue(Data, "SummerU", MySoil.SummerU, Row, NumLayers); DataTableUtility.AddValue(Data, "SummerCona", MySoil.SummerCona, Row, NumLayers); DataTableUtility.AddValue(Data, "WinterU", MySoil.WinterU, Row, NumLayers); DataTableUtility.AddValue(Data, "WinterCona", MySoil.WinterCona, Row, NumLayers); DataTableUtility.AddValue(Data, "SummerDate", "=\"" + MySoil.SummerDate + "\"", Row, NumLayers); DataTableUtility.AddValue(Data, "WinterDate", "=\"" + MySoil.WinterDate + "\"", Row, NumLayers); DataTableUtility.AddValue(Data, "U", MySoil.U, Row, NumLayers); DataTableUtility.AddValue(Data, "Cona", MySoil.Cona, Row, NumLayers); DataTableUtility.AddValue(Data, "Salb", MySoil.Salb, Row, NumLayers); DataTableUtility.AddValue(Data, "DiffusConst", MySoil.DiffusConst, Row, NumLayers); DataTableUtility.AddValue(Data, "DiffusSlope", MySoil.DiffusSlope, Row, NumLayers); DataTableUtility.AddValue(Data, "CN2Bare", MySoil.CN2Bare, Row, NumLayers); DataTableUtility.AddValue(Data, "CNRed", MySoil.CNRed, Row, NumLayers); DataTableUtility.AddValue(Data, "CNCov", MySoil.CNCov, Row, NumLayers); DataTableUtility.AddValue(Data, "RootCN", MySoil.RootCN, Row, NumLayers); DataTableUtility.AddValue(Data, "RootWT", MySoil.RootWT, Row, NumLayers); DataTableUtility.AddValue(Data, "SoilCN", MySoil.SoilCN, Row, NumLayers); DataTableUtility.AddValue(Data, "EnrACoeff", MySoil.EnrACoeff, Row, NumLayers); DataTableUtility.AddValue(Data, "EnrBCoeff", MySoil.EnrBCoeff, Row, NumLayers); DataTableUtility.AddColumn(Data, "SWCON", MySoil.SWCON, Row, NumLayers); DataTableUtility.AddColumn(Data, "MWCON", MySoil.MWCON, Row, NumLayers); DataTableUtility.AddColumn(Data, "FBIOM", MySoil.FBIOM, Row, NumLayers); DataTableUtility.AddColumn(Data, "FINERT", MySoil.FINERT, Row, NumLayers); DataTableUtility.AddColumn(Data, "KS", MySoil.KS, Row, NumLayers); DataTableUtility.AddColumn(Data, "OC", MySoil.OC, Row, NumLayers); DataTableUtility.AddColumn(Data, "EC", MySoil.EC, Row, NumLayers); DataTableUtility.AddColumn(Data, "PH", MySoil.PH, Row, NumLayers); DataTableUtility.AddColumn(Data, "CL", MySoil.CL, Row, NumLayers); DataTableUtility.AddColumn(Data, "Boron", MySoil.Boron, Row, NumLayers); DataTableUtility.AddColumn(Data, "CEC", MySoil.CEC, Row, NumLayers); DataTableUtility.AddColumn(Data, "Ca", MySoil.Ca, Row, NumLayers); DataTableUtility.AddColumn(Data, "Mg", MySoil.Mg, Row, NumLayers); DataTableUtility.AddColumn(Data, "Na", MySoil.Na, Row, NumLayers); DataTableUtility.AddColumn(Data, "K", MySoil.K, Row, NumLayers); DataTableUtility.AddColumn(Data, "ESP", MySoil.ESP, Row, NumLayers); DataTableUtility.AddColumn(Data, "Mn", MySoil.Mn, Row, NumLayers); DataTableUtility.AddColumn(Data, "Al", MySoil.Al, Row, NumLayers); DataTableUtility.AddColumn(Data, "ParticleSizeSand", MySoil.ParticleSizeSand, Row, NumLayers); DataTableUtility.AddColumn(Data, "ParticleSizeSilt", MySoil.ParticleSizeSilt, Row, NumLayers); DataTableUtility.AddColumn(Data, "ParticleSizeClay", MySoil.ParticleSizeClay, Row, NumLayers); for (int i = 7; i != CropOrder.Length; i++) { AddCropColumn(Data, CropOrder[i], MySoil, Row, NumLayers); } // Add other crops not in our list above. foreach (string CropName in MySoil.CropsMeasured) { if (Array.IndexOf(CropOrder, CropName.ToLower()) == -1) { AddCropColumn(Data, CropName, MySoil, Row, NumLayers); } } Row += NumLayers; }