public GenerateChart ( string title, List |
||
title | string | |
keys | List |
|
names | List |
|
startTime | System.DateTime | |
endTime | System.DateTime | |
리턴 | System.Windows.Forms.DataVisualization.Charting.Chart |
private static Chart GenerateChart(ChartGenerator generator, XElement chartElement) { Chart chart; FaultSummaryTableAdapter faultSummaryAdapter; FaultLocationData.FaultSummaryDataTable faultSummaries; FaultLocationData.FaultSummaryRow faultSummary; int width; int height; double prefaultCycles; double postfaultCycles; string title; List <string> keys; List <string> names; DateTime startTime; DateTime endTime; int faultID; faultSummaryAdapter = s_dbAdapterContainer.GetAdapter <FaultSummaryTableAdapter>(); faultSummaries = faultSummaryAdapter.GetDataBy(generator.EventID); faultID = Convert.ToInt32((string)chartElement.Attribute("faultID")); faultSummary = faultSummaries .Where(row => row.ID == faultID) .FirstOrDefault(row => row.IsSelectedAlgorithm != 0); if ((object)faultSummary == null) { return(null); } prefaultCycles = Convert.ToDouble((string)chartElement.Attribute("prefaultCycles")); postfaultCycles = Convert.ToDouble((string)chartElement.Attribute("postfaultCycles")); title = (string)chartElement.Attribute("yAxisTitle"); keys = GetKeys(chartElement); names = GetNames(chartElement); startTime = faultSummary.Inception.AddSeconds(-prefaultCycles / 60.0D); endTime = faultSummary.Inception.AddSeconds(faultSummary.DurationSeconds).AddSeconds(postfaultCycles / 60.0D); chart = generator.GenerateChart(title, keys, names, startTime, endTime); width = Convert.ToInt32((string)chartElement.Attribute("width")); height = Convert.ToInt32((string)chartElement.Attribute("height")); SetChartSize(chart, width, height); if ((object)chartElement.Attribute("yAxisMaximum") != null) { chart.ChartAreas[0].AxisY.Maximum = Convert.ToDouble((string)chartElement.Attribute("yAxisMaximum")); } if ((object)chartElement.Attribute("yAxisMinimum") != null) { chart.ChartAreas[0].AxisY.Minimum = Convert.ToDouble((string)chartElement.Attribute("yAxisMinimum")); } if (string.Equals((string)chartElement.Attribute("highlightCalculation"), "index", StringComparison.OrdinalIgnoreCase)) { DateTime calculationTime = generator.ToDateTime(faultSummary.CalculationCycle); double calculationPosition = chart.ChartAreas[0].AxisX.Minimum + (calculationTime - startTime).TotalSeconds; chart.ChartAreas[0].CursorX.Position = calculationPosition; } else if (string.Equals((string)chartElement.Attribute("highlightCalculation"), "cycle", StringComparison.OrdinalIgnoreCase)) { DateTime calculationTime = generator.ToDateTime(faultSummary.CalculationCycle); double calculationPosition = chart.ChartAreas[0].AxisX.Minimum + (calculationTime - startTime).TotalSeconds; chart.ChartAreas[0].CursorX.SelectionStart = calculationPosition; chart.ChartAreas[0].CursorX.SelectionEnd = calculationPosition + 1.0D / 60.0D; } return(chart); }
// Static Methods public static Stream ConvertToChartImageStream(DbAdapterContainer dbAdapterContainer, XElement chartElement) { ChartGenerator chartGenerator; Lazy <DataRow> faultSummary; Lazy <double> systemFrequency; DateTime inception; DateTime clearing; int width; int height; double prefaultCycles; double postfaultCycles; string title; List <string> keys; List <string> names; DateTime startTime; DateTime endTime; int eventID; int faultID; // Read parameters from the XML data and set up defaults eventID = Convert.ToInt32((string)chartElement.Attribute("eventID") ?? "-1"); faultID = Convert.ToInt32((string)chartElement.Attribute("faultID") ?? "-1"); prefaultCycles = Convert.ToDouble((string)chartElement.Attribute("prefaultCycles") ?? "NaN"); postfaultCycles = Convert.ToDouble((string)chartElement.Attribute("postfaultCycles") ?? "NaN"); title = (string)chartElement.Attribute("yAxisTitle"); keys = GetKeys(chartElement); names = GetNames(chartElement); width = Convert.ToInt32((string)chartElement.Attribute("width")); height = Convert.ToInt32((string)chartElement.Attribute("height")); startTime = DateTime.MinValue; endTime = DateTime.MaxValue; using (AdoDataConnection connection = new AdoDataConnection(dbAdapterContainer.Connection, typeof(SqlDataAdapter), false)) { faultSummary = new Lazy <DataRow>(() => connection.RetrieveData("SELECT * FROM FaultSummary WHERE ID = {0}", faultID).Select().FirstOrDefault()); systemFrequency = new Lazy <double>(() => connection.ExecuteScalar(60.0D, "SELECT Value FROM Setting WHERE Name = 'SystemFrequency'")); // If prefaultCycles is specified and we have a fault summary we can use, // we can determine the start time of the chart based on fault inception if (!double.IsNaN(prefaultCycles) && (object)faultSummary.Value != null) { inception = faultSummary.Value.ConvertField <DateTime>("Inception"); startTime = inception.AddSeconds(-prefaultCycles / systemFrequency.Value); } // If postfaultCycles is specified and we have a fault summary we can use, // we can determine the start time of the chart based on fault clearing if (!double.IsNaN(postfaultCycles) && (object)faultSummary.Value != null) { inception = faultSummary.Value.ConvertField <DateTime>("Inception"); clearing = inception.AddSeconds(faultSummary.Value.ConvertField <double>("DurationSeconds")); endTime = clearing.AddSeconds(postfaultCycles / systemFrequency.Value); } // Create the chart generator to generate the chart chartGenerator = new ChartGenerator(dbAdapterContainer, eventID); using (Chart chart = chartGenerator.GenerateChart(title, keys, names, startTime, endTime)) { // Set the chart size based on the specified width and height; // this allows us to dynamically change font sizes and line // widths before converting the chart to an image SetChartSize(chart, width, height); // Determine if either the minimum or maximum of the y-axis is specified explicitly if ((object)chartElement.Attribute("yAxisMaximum") != null) { chart.ChartAreas[0].AxisY.Maximum = Convert.ToDouble((string)chartElement.Attribute("yAxisMaximum")); } if ((object)chartElement.Attribute("yAxisMinimum") != null) { chart.ChartAreas[0].AxisY.Minimum = Convert.ToDouble((string)chartElement.Attribute("yAxisMinimum")); } // If the calculation cycle is to be highlighted, determine whether the highlight should be in the range of a single index or a full cycle. // If we have a fault summary we can use, apply the appropriate highlight based on the calculation cycle if (string.Equals((string)chartElement.Attribute("highlightCalculation"), "index", StringComparison.OrdinalIgnoreCase)) { if ((object)faultSummary.Value != null) { int calculationCycle = faultSummary.Value.ConvertField <int>("CalculationCycle"); DateTime calculationTime = chartGenerator.ToDateTime(calculationCycle); double calculationPosition = chart.ChartAreas[0].AxisX.Minimum + (calculationTime - startTime).TotalSeconds; chart.ChartAreas[0].CursorX.Position = calculationPosition; } } else if (string.Equals((string)chartElement.Attribute("highlightCalculation"), "cycle", StringComparison.OrdinalIgnoreCase)) { if ((object)faultSummary.Value != null) { int calculationCycle = faultSummary.Value.ConvertField <int>("CalculationCycle"); DateTime calculationTime = chartGenerator.ToDateTime(calculationCycle); double calculationPosition = chart.ChartAreas[0].AxisX.Minimum + (calculationTime - startTime).TotalSeconds; chart.ChartAreas[0].CursorX.SelectionStart = calculationPosition; chart.ChartAreas[0].CursorX.SelectionEnd = calculationPosition + 1.0D / 60.0D; } } // Convert the generated chart to an image return(ConvertToImageStream(chart, ChartImageFormat.Png)); } } }
// Static Methods public static Stream ConvertToChartImageStream(DbAdapterContainer dbAdapterContainer, XElement chartElement) { ChartGenerator chartGenerator; Lazy<DataRow> faultSummary; Lazy<double> systemFrequency; DateTime inception; DateTime clearing; int width; int height; double prefaultCycles; double postfaultCycles; string title; List<string> keys; List<string> names; DateTime startTime; DateTime endTime; int eventID; int faultID; // Read parameters from the XML data and set up defaults eventID = Convert.ToInt32((string)chartElement.Attribute("eventID") ?? "-1"); faultID = Convert.ToInt32((string)chartElement.Attribute("faultID") ?? "-1"); prefaultCycles = Convert.ToDouble((string)chartElement.Attribute("prefaultCycles") ?? "NaN"); postfaultCycles = Convert.ToDouble((string)chartElement.Attribute("postfaultCycles") ?? "NaN"); title = (string)chartElement.Attribute("yAxisTitle"); keys = GetKeys(chartElement); names = GetNames(chartElement); width = Convert.ToInt32((string)chartElement.Attribute("width")); height = Convert.ToInt32((string)chartElement.Attribute("height")); startTime = DateTime.MinValue; endTime = DateTime.MaxValue; using (AdoDataConnection connection = new AdoDataConnection(dbAdapterContainer.Connection, typeof(SqlDataAdapter), false)) { faultSummary = new Lazy<DataRow>(() => connection.RetrieveData("SELECT * FROM FaultSummary WHERE ID = {0}", faultID).Select().FirstOrDefault()); systemFrequency = new Lazy<double>(() => connection.ExecuteScalar(60.0D, "SELECT Value FROM Setting WHERE Name = 'SystemFrequency'")); // If prefaultCycles is specified and we have a fault summary we can use, // we can determine the start time of the chart based on fault inception if (!double.IsNaN(prefaultCycles) && (object)faultSummary.Value != null) { inception = faultSummary.Value.ConvertField<DateTime>("Inception"); startTime = inception.AddSeconds(-prefaultCycles / systemFrequency.Value); } // If postfaultCycles is specified and we have a fault summary we can use, // we can determine the start time of the chart based on fault clearing if (!double.IsNaN(postfaultCycles) && (object)faultSummary.Value != null) { inception = faultSummary.Value.ConvertField<DateTime>("Inception"); clearing = inception.AddSeconds(faultSummary.Value.ConvertField<double>("DurationSeconds")); endTime = clearing.AddSeconds(postfaultCycles / systemFrequency.Value); } // Create the chart generator to generate the chart chartGenerator = new ChartGenerator(dbAdapterContainer, eventID); using (Chart chart = chartGenerator.GenerateChart(title, keys, names, startTime, endTime)) { // Set the chart size based on the specified width and height; // this allows us to dynamically change font sizes and line // widths before converting the chart to an image SetChartSize(chart, width, height); // Determine if either the minimum or maximum of the y-axis is specified explicitly if ((object)chartElement.Attribute("yAxisMaximum") != null) chart.ChartAreas[0].AxisY.Maximum = Convert.ToDouble((string)chartElement.Attribute("yAxisMaximum")); if ((object)chartElement.Attribute("yAxisMinimum") != null) chart.ChartAreas[0].AxisY.Minimum = Convert.ToDouble((string)chartElement.Attribute("yAxisMinimum")); // If the calculation cycle is to be highlighted, determine whether the highlight should be in the range of a single index or a full cycle. // If we have a fault summary we can use, apply the appropriate highlight based on the calculation cycle if (string.Equals((string)chartElement.Attribute("highlightCalculation"), "index", StringComparison.OrdinalIgnoreCase)) { if ((object)faultSummary.Value != null) { int calculationCycle = faultSummary.Value.ConvertField<int>("CalculationCycle"); DateTime calculationTime = chartGenerator.ToDateTime(calculationCycle); double calculationPosition = chart.ChartAreas[0].AxisX.Minimum + (calculationTime - startTime).TotalSeconds; chart.ChartAreas[0].CursorX.Position = calculationPosition; } } else if (string.Equals((string)chartElement.Attribute("highlightCalculation"), "cycle", StringComparison.OrdinalIgnoreCase)) { if ((object)faultSummary.Value != null) { int calculationCycle = faultSummary.Value.ConvertField<int>("CalculationCycle"); DateTime calculationTime = chartGenerator.ToDateTime(calculationCycle); double calculationPosition = chart.ChartAreas[0].AxisX.Minimum + (calculationTime - startTime).TotalSeconds; chart.ChartAreas[0].CursorX.SelectionStart = calculationPosition; chart.ChartAreas[0].CursorX.SelectionEnd = calculationPosition + 1.0D / 60.0D; } } // Convert the generated chart to an image return ConvertToImageStream(chart, ChartImageFormat.Png); } } }