//--------------------------------------- ///------------------------------------------------------------------------------------------------- /// <summary> a method used to compare data for sorting /// </summary> /// <param name="P1"> The first ChartPointsByYear. </param> /// <param name="P2"> The second ChartPointsByYear. </param> /// <returns>0 are equal, 1 P2 greater than P1, -1 P1 greater than P2 . </returns> ///------------------------------------------------------------------------------------------------- public static int CompareForSort_UseMax(ChartPointsByYear P1, ChartPointsByYear P2) { int P1Max = P1.MaxValue(); int P2Max = P2.MaxValue(); if (P1Max == P2Max) { return(0); } else if (P1Max < P2Max) { return(1); } else { return(-1); } }
///------------------------------------------------------------------------------------------------- /// <summary> Builds an annual parameter graph. </summary> /// <param name="DT"> The datatable. </param> /// <param name="DbConnection"> The database connection. </param> /// <param name="Providers"> The providers to be charted. </param> /// <param name="fldname"> The fldname or column name to be charted. </param> ///------------------------------------------------------------------------------------------------- //public void BuildAnnualParameterGraph(DataTable DT, UniDbConnection DbConnection, string ScenarioName, List<providerinfo> Providers, string fldname, string fieldlabel) public void BuildAnnualParameterGraph(WaterSimManagerClass WSIM, SimulationResults SimRes, string fldname, string fieldlabel, string[] Regions) { List <string> debug = new List <string>(); // create a lits for data List <ChartPointsByYear> ChartSeriesList = new List <ChartPointsByYear>(); // ok clear up chart FChart.Series.Clear(); FChart.Legends.Clear(); FChart.ChartAreas.Clear(); // ProviderPopChart.Update(); // Setup legend FChart.ChartAreas.Add(FTitle); System.Windows.Forms.DataVisualization.Charting.Legend MyLegend = new System.Windows.Forms.DataVisualization.Charting.Legend("Default"); FChart.Legends.Add(MyLegend); // get data int pIndex = -1; int year = 0; int pop = 0; string pcode = ""; int yearCount = 0; int yearIndex = 0; // OK, figure out the years Min Max and Count int MaxYear = -1; int MinYear = 9999; // There must be a way to speed this up! foreach (AnnualSimulationResults ASR in SimRes) { year = ASR.year; if (year > MaxYear) { MaxYear = year; } if (year < MinYear) { MinYear = year; } } yearCount = (MaxYear - MinYear) + 1; // OK can set up the dta int ProviderCount = SimRes[0].Outputs.ProviderOutput[0].Values.Length; //int ProviderCount = Providers.Count; // create provider value data array int[][] ValueData = null; // new int[ProviderCount][]; // now create new arrays (years length) for each provider array //for (int i = 0; i < ProviderCount; i++) // ValueData[i] = new int[yearCount]; // Cycle through each record and stick data into the right slot // first get the parmeters index into AnnualResults arrays ModelParameterClass theModelParmeter = WSIM.ParamManager.Model_Parameter(fldname); int ModelParmIndex = SimRes[0].GetParmIndex(theModelParmeter); ValueData = GrabProviderDataByYear(SimRes, theModelParmeter); // OK create the series // First create a year array int[] allYearValues = new int[yearCount]; for (int i = 0; i < yearCount; i++) { allYearValues[i] = MinYear + i; } for (int i = 0; i < ProviderCount; i++) { string ProviderName = ProviderClass.ProviderNameList[i]; bool DoThisProvider = false; if ((Regions == null) || (Regions.Length == 0)) { DoThisProvider = true; } else { foreach (string RegName in Regions) { if (RegName == ProviderName) { DoThisProvider = true; break; } } } if (DoThisProvider) { ChartPointsByYear points = new ChartPointsByYear(allYearValues, ValueData[i], ProviderName); ChartSeriesList.Add(points); } } // Now Sort By Size ChartSeriesList.Sort(ChartPointsByYear.CompareForSort_UseMax); foreach (ChartPointsByYear points in ChartSeriesList) { Series dSeries = new Series(); int[] Years = points.Years; int[] Values = points.Values; dSeries.LegendText = points.SeriesLabel; dSeries.ChartType = FChartType; dSeries.BorderWidth = 3; dSeries.MarkerSize = 20; dSeries.LabelToolTip = points.SeriesLabel; for (int j = 0; j < Years.Length; j++) { dSeries.Points.AddXY(Years[j], Values[j]); } FChart.Series.Add(dSeries); } FChart.ChartAreas[0].AxisX.Minimum = MinYear; FChart.ChartAreas[0].AxisX.Maximum = MaxYear; FChart.ChartAreas[0].AxisX.Interval = 5; // Chart Label bool addTitle = false; Title myTitle = null; if (FChart.Titles.Count > 0) { myTitle = FChart.Titles.FindByName("MAIN"); } if (myTitle == null) { myTitle = new Title(); addTitle = true; } myTitle.Name = "MAIN"; myTitle.Text = fieldlabel + " by Water Provider and Year"; myTitle.Font = new Font(myTitle.Font.Name, 14.0F, FontStyle.Bold, myTitle.Font.Unit); myTitle.Alignment = ContentAlignment.MiddleCenter; if (addTitle) { FChart.Titles.Add(myTitle); } // Chart Legend /// <summary> The second column. </summary> LegendCellColumn secondColumn = new LegendCellColumn(); secondColumn.ColumnType = LegendCellColumnType.Text; secondColumn.HeaderText = "Name"; secondColumn.Text = "#LEGENDTEXT"; secondColumn.HeaderBackColor = Color.WhiteSmoke; FChart.Legends["Default"].CellColumns.Add(secondColumn); // Set Min cell column attributes LegendCellColumn maxColumn = new LegendCellColumn(); maxColumn.Text = "#MAX{N1}"; maxColumn.HeaderText = "Max"; maxColumn.Name = "MaxColumn"; maxColumn.HeaderBackColor = Color.WhiteSmoke; FChart.Legends["Default"].CellColumns.Add(maxColumn); // Add Color column LegendCellColumn firstColumn = new LegendCellColumn(); firstColumn.ColumnType = LegendCellColumnType.SeriesSymbol; firstColumn.HeaderText = "Color"; firstColumn.HeaderBackColor = Color.WhiteSmoke; FChart.Legends["Default"].CellColumns.Add(firstColumn); // OK let's see what happens //FChart.Update; //FChart.Scale(new SizeF()) }
public void BuildAnnualProviderGraph(SimulationResults SimRes, ParameterManagerClass PM, List <string> ParameterFieldNames, int ProviderIndex, string aLabel) { // create a lits for data List <ChartPointsByYear> ChartSeriesList = new List <ChartPointsByYear>(); int year = 0; int parmvalue = 0; int yearCount = SimRes.Length; int yearIndex = 0; // OK, figure out the years Min Max and Count int MaxYear = -1; int MinYear = 9999; foreach (AnnualSimulationResults ASR in SimRes) { year = ASR.year; if (year > MaxYear) { MaxYear = year; } if (year < MinYear) { MinYear = year; } } // Count all the the parameter in first year of SimRes int ParameterCount = SimRes[0].Outputs.BaseOutput.Length + SimRes[0].Outputs.ProviderOutput.Length + SimRes[0].Inputs.BaseInput.Length + SimRes[0].Inputs.ProviderInput.Length; // Set up the Data array for that many parameters int[][] ValueData = new int[ParameterCount][]; // now set up for array of years data for (int i = 0; i < ParameterCount; i++) { ValueData[i] = new int[yearCount]; } // index for parms int ParmDataIndex = 0; // ok Build an list of parameter indexes and ModelParameters int ParamterCount = ParameterFieldNames.Count; int[] ParmIndexes = new int[ParameterCount]; ModelParameterClass[] ModelParameters = new ModelParameterClass[ParameterCount]; for (int i = 0; i < ParameterCount; i++) { ModelParameters[i] = PM.Model_Parameter(ParameterFieldNames[i]); if (ModelParameters[i] != null) { ParmIndexes[i] = SimRes[0].GetParmIndex(ModelParameters[i]); } else { ParmIndexes[i] = -1; } } foreach (AnnualSimulationResults ASR in SimRes) { year = ASR.year; yearIndex = year - MinYear; for (int i = 0; i < ParameterCount; i++) { if (ParmIndexes[i] >= 0) { if (ModelParameters[i].isBaseParam) { ValueData[i][yearIndex] = GrabParmBaseData(ASR, ModelParameters[i].ParamType, ParmIndexes[i]); } else if (ModelParameters[i].isProviderParam) { ValueData[i][yearIndex] = GrabParmProviderData(ASR, ModelParameters[i].ParamType, ParmIndexes[i])[ProviderIndex]; } } } } //bool iserr = false; // string errMessage = ""; // year = //yearIndex = year - MinYear; // // Fetch only records that match the scenario name or if "" then just the first scenario // if (((ScenarioName == "") && (ScnStr == FirstScnName)) || (ScnStr == ScenarioName)) // { // // fetch only records for the target provider // pcode = DR[PrvdFldStr].ToString().Trim(); // if (pcode.ToUpper() == targetProvider.ToUpper()) // { // int pIndex = 0; // // Ok get all the fields requested // foreach (fieldinfo info in dbFields) // { // if (DT.Columns.Contains(info.Fieldname)) // { // parmvalue = UniDB.Tools.ConvertToInt32(DR[info.Fieldname].ToString(), ref iserr, ref errMessage); // ValueData[pIndex][yearIndex] = parmvalue; // pIndex++; // } // } // // OK get a years worth of data, increment year count // YearCnt++; // } // } // // OK, if we have read values for all the years, then break // if (YearCnt == NumberOfYears) break; // from foreach // if (iserr) // { // // Do What? // } // OK create the series // First create a year array int[] allYearValues = new int[yearCount]; for (int i = 0; i < yearCount; i++) { allYearValues[i] = MinYear + i; } for (int i = 0; i < ParameterCount; i++) { ChartPointsByYear points = new ChartPointsByYear(allYearValues, ValueData[i], ParameterFieldNames[i]); ChartSeriesList.Add(points); } // Now Sort By Size ChartSeriesList.Sort(ChartPointsByYear.CompareForSort_UseMax); // ok clear up chart FChart.Series.Clear(); FChart.Legends.Clear(); FChart.ChartAreas.Clear(); // ProviderPopChart.Update(); // Setup legend FChart.ChartAreas.Add(FTitle); System.Windows.Forms.DataVisualization.Charting.Legend MyLegend = new System.Windows.Forms.DataVisualization.Charting.Legend("Default"); FChart.Legends.Add(MyLegend); int index = 0; foreach (ChartPointsByYear points in ChartSeriesList) { Series dSeries = new Series(); int[] Years = points.Years; int[] Values = points.Values; dSeries.LegendText = points.SeriesLabel; dSeries.BorderWidth = 2; dSeries.ChartType = FChartType; dSeries.LabelToolTip = points.SeriesLabel; //dSeries.Label = points.SeriesLabel; for (int j = 0; j < Years.Length; j++) { dSeries.Points.AddXY(Years[j], Values[j]); } FChart.Series.Add(dSeries); index++; } // Chart Label // First build field label string fldlabel = ""; foreach (string str in ParameterFieldNames) { if (fldlabel != "") { fldlabel += ", "; } fldlabel += str; } bool addTitle = false; Title myTitle = null; if (FChart.Titles.Count > 0) { myTitle = FChart.Titles.FindByName("MAIN"); } if (myTitle == null) { myTitle = new Title(); addTitle = true; } myTitle.Name = "MAIN"; myTitle.Text = aLabel.Trim() + " by " + fldlabel + " and Year"; myTitle.Alignment = ContentAlignment.MiddleCenter; myTitle.Font = new Font(myTitle.Font.Name, 14.0F, FontStyle.Bold, myTitle.Font.Unit); if (addTitle) { FChart.Titles.Add(myTitle); } // Add Legend LegendCellColumn secondColumn = new LegendCellColumn(); secondColumn.ColumnType = LegendCellColumnType.Text; secondColumn.HeaderText = "Name"; secondColumn.Text = "#LEGENDTEXT"; secondColumn.HeaderBackColor = Color.WhiteSmoke; FChart.Legends["Default"].CellColumns.Add(secondColumn); // Set Min cell column attributes LegendCellColumn maxColumn = new LegendCellColumn(); maxColumn.Text = "#MAX{N1}"; maxColumn.HeaderText = "Max"; maxColumn.Name = "MaxColumn"; maxColumn.HeaderBackColor = Color.WhiteSmoke; FChart.Legends["Default"].CellColumns.Add(maxColumn); // Add Color column LegendCellColumn firstColumn = new LegendCellColumn(); firstColumn.ColumnType = LegendCellColumnType.SeriesSymbol; firstColumn.HeaderText = "Color"; firstColumn.HeaderBackColor = Color.WhiteSmoke; FChart.Legends["Default"].CellColumns.Add(firstColumn); // OK let's see what happens }