private static void SetupAxisX(Axis axis, GraphConfiguration configuration) { SetupAxis(axis, configuration.AxisXConfiguration); axis.Interval = configuration.AxisXConfiguration.Interval ?? 1; switch (configuration.AxisXConfiguration.AxisXLabelFilter.Value) { case AxisXLabelFilter.All: break; case AxisXLabelFilter.AllDays: axis.IntervalType = DateTimeIntervalType.Days; break; case AxisXLabelFilter.StartOfMonth: axis.IntervalType = DateTimeIntervalType.Months; break; case AxisXLabelFilter.StartOfWeek: axis.IntervalType = DateTimeIntervalType.Weeks; axis.IntervalOffsetType = DateTimeIntervalType.Days; axis.IntervalOffset = configuration.FirstWeekDay - DayOfWeek.Sunday; break; default: throw new ArgumentException( "Invalid AxisXLabelFilter value", configuration.AxisXConfiguration.AxisXLabelFilter.ToString() ); } }
private static void MinuteSecondSort( GraphData data, GraphConfiguration configuration, ValGroup sortGroup, string name, Series series ) { int i = 0; int point = 0; double?value = null; for (DateTime date = data.FromDate; date <= data.ToDate; date = sortGroup == ValGroup.Minute ? date.AddMinutes(1) : date.AddSeconds(1)) { value = data.GetValueForNameAndDate(name, date, data.Configuration.ItemsConfiguration.Unit, sortGroup); if (value != null && value >= 1.0d) { point = series.Points.AddXY(i, value.Value); series.Points[point].AxisLabel = date.ToString("HH:mm" + (sortGroup == ValGroup.Minute ? "" : ":ss") + " dd.MM.yy"); } else if (value != null && value < 1.0d) { } else if (configuration.GraphType.Value == GraphTypeEnum.NameDateStackedColumn) { point = series.Points.AddXY(i, 0.0d); series.Points[point].AxisLabel = date.ToString("HH:mm" + (sortGroup == ValGroup.Minute ? "" : ":ss") + " dd.MM.yy"); } i++; } }
internal GraphData(GraphConfiguration configuration, object context) { this._configuration = configuration; this._plainData = this._configuration.GraphSource.GetPlainData(context); if ((configuration.GraphType == GraphTypeEnum.NameDateStackedColumn) || (configuration.GraphType == GraphTypeEnum.NameDateLine) || (configuration.GraphType == GraphTypeEnum.NamedLine)) { ParseData(); } }
private static void SetupSeries(Series series, GraphConfiguration configuration, int index) { if (configuration.Palette.Count > 0) { PaletteItem item = configuration.Palette[index % configuration.Palette.Count]; series.BackHatchStyle = item.HatchStyle; series.Color = item.Color; } }
private static void SetupPoint(DataPoint point, GraphConfiguration configuration, int index) { if (configuration.Palette.Count > 0) { PaletteItem item = configuration.Palette[index % configuration.Palette.Count]; point.BackHatchStyle = item.HatchStyle; point.Color = item.Color; } }
private void DrawSimpleGraph(GraphData data, GraphConfiguration configuration) { var dt = data.PlainData.FirstOrDefault(d => d.Value.Where(p => p.XValue.HasValue).Count() > 0); if (dt.Value != null) { DrawSimpleXYGraph(dt.Value, configuration); } else { DrawSimpleDateTimeGraph(data, configuration); } }
/// <summary> /// Get configuration from string and draw graph. /// </summary> /// <param name="text">XML configuration represented as string.</param> /// <param name="ownerSize">Owner size.</param> /// <param name="context">Configuration context.</param> public void SetConfigurationFromText(string text, Size ownerSize, object context) { using (MemoryStream stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(text))) { stream.Seek(0, SeekOrigin.Begin); this.SetConfiguration( GraphConfiguration.LoadFromXml(stream), ownerSize, context ); } }
/// <summary> /// Draw graph according passed configuration /// </summary> /// <param name="configuration">Graph configuration</param> /// <param name="ownerSize">Owner size.</param> /// <param name="context">Configuration context.</param> public void SetConfiguration(GraphConfiguration configuration, Size ownerSize, object context) { this.chart.Series.Clear(); this.SetupGraph(configuration); switch (configuration.GraphType.Value) { case GraphTypeEnum.NameDateStackedColumn: case GraphTypeEnum.NameDateLine: this.DrawNameDateGraph(new GraphData(configuration, context), configuration); break; case GraphTypeEnum.NamedLine: this.DrawNamedGraph(new GraphData(configuration, context), configuration); break; case GraphTypeEnum.GanttDiagram: this.DrawGantt(new GanttGraphData(configuration, context), configuration); break; default: this.DrawSimpleGraph(new GraphData(configuration, context), configuration); break; } foreach (Series series in this.chart.Series) { GraphSeriesSettings seriesState = this._stateSettings.GetSeriesSettings(series.Name); series.Enabled = seriesState.Visible; if (!seriesState.Visible && configuration.GraphType.Value == GraphTypeEnum.GanttDiagram) { this.RevalueAxisY(series); } } if (configuration.GraphType == GraphTypeEnum.NameDateStackedColumn || configuration.GraphType == GraphTypeEnum.NameDateLine || configuration.GraphType == GraphTypeEnum.NamedLine ) { this.HideUnnecessaryXAxisZeroLabel(); } }
private void SetupGraph(GraphConfiguration configuration) { this._graphType = configuration.GraphType; // set background color for the graph as transparent this.chart.BackColor = Color.Transparent; this.chart.ChartAreas[0].BorderWidth = configuration.AxisXConfiguration.MajorGrid.Enabled ? configuration.AxisXConfiguration.MajorGrid.LineWidth : 0; this.chart.ChartAreas[0].BorderColor = configuration.AxisXConfiguration.MajorGrid.LineColor; this.chart.ChartAreas[0].BorderDashStyle = ChartDashStyle.Solid; switch (configuration.GraphType.Value) { case GraphTypeEnum.GanttDiagram: this.chart.ChartAreas[0].AxisX.Enabled = AxisEnabled.False; SetupAxisX(this.chart.ChartAreas[0].AxisY, configuration); this.chart.FormatNumber += chart_FormatNumber; break; default: SetupAxisX(this.chart.ChartAreas[0].AxisX, configuration); SetupAxisY(configuration.AxisYConfiguration); break; } this.chart.Legends[0].Enabled = configuration.LegendConfiguration.Enabled; this.chart.Legends[0].Docking = configuration.LegendConfiguration.Docking; this.chart.Legends[0].Alignment = configuration.LegendConfiguration.Alignment; if (configuration.LegendConfiguration.GraphicOverlap) { // this.chart.Legends[0].Alignment = StringAlignment.Center; // this.chart.Legends[0].Docking = Docking.Top; this.chart.Legends[0].DockedToChartArea = this.chart.ChartAreas[0].Name; } SetupChartMargin(configuration); }
private void DrawSimpleXYGraph(List <PlainItem> values, GraphConfiguration configuration) { var linesData = values.GroupBy(v => v.Name); int i = 0; foreach (var items in linesData) { var series = new Series(); SetupSeries(series, configuration, i++); series.IsXValueIndexed = false; series.ChartType = SeriesChartType.Line; series.Name = items.Key; this.chart.Series.Add(series); this.chart.ChartAreas[0].AxisX.IntervalAutoMode = IntervalAutoMode.VariableCount; if (configuration.AxisXConfiguration.Interval.HasValue) { this.chart.ChartAreas[0].AxisX.Interval = configuration.AxisXConfiguration.Interval.Value; } this.chart.ChartAreas[0].AxisX.LabelStyle.Format = configuration.AxisXConfiguration.Format; this.chart.FormatNumber += chart_FormatNumber; var orderedItems = items.OrderBy(itm => itm.XValue); foreach (var item in orderedItems) { var x = item.Name != null ? (object)item.Name : item.DateTime; var y = GraphData.FormatNumericValue(configuration.ItemsConfiguration.Unit, item.YValue); double fx = GraphData.FormatNumericValue(configuration.ItemsConfiguration.Unit, item.XValue.Value); series.Points.AddXY(fx, y); } } }
/// <summary> /// Load configuration from XML file and draw graph /// </summary> /// <param name="fileName">XML configuration filename</param> /// <param name="ownerSize">Owner size.</param> /// <param name="context">Configuration context.</param> public void SetConfiguration(string fileName, Size ownerSize, object context) { this.SetConfiguration(GraphConfiguration.LoadFromXml(fileName), ownerSize, context); }
private void DrawSimpleDateTimeGraph(GraphData data, GraphConfiguration configuration) { int i = 0; this.chart.FormatNumber -= chart_FormatNumber; foreach (var items in data.PlainData) { var series = new Series(); SetupSeries(series, configuration, i++); series.IsXValueIndexed = true; switch (configuration.GraphType.Value) { case GraphTypeEnum.Line: series.ChartType = SeriesChartType.Line; break; case GraphTypeEnum.Pie: series.ChartType = SeriesChartType.Pie; break; case GraphTypeEnum.Column: series.ChartType = SeriesChartType.Column; break; case GraphTypeEnum.StackedColumn: series.ChartType = SeriesChartType.StackedColumn; break; } series.Name = items.Key; this.chart.Series.Add(series); foreach (var item in items.Value) { if (String.IsNullOrEmpty(item.Name) && configuration.GraphType.Value != GraphTypeEnum.Pie && items.Value[items.Value.Count - 1].DateTime - items.Value[0].DateTime <= new TimeSpan(2, 0, 0, 0) ) { var d = items.Value.SelectMany(it => new[] { it.DateTime }).ToList(); var min = d.Min(); var max = d.Max(); this.chart.ChartAreas[0].AxisX.Minimum = min.ToOADate(); this.chart.ChartAreas[0].AxisX.Maximum = max.ToOADate(); if (item.Equals(items.Value[0])) { this.chart.ChartAreas[0].AxisX.IntervalAutoMode = IntervalAutoMode.VariableCount; this.chart.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Auto; this.chart.ChartAreas[0].AxisX.Interval = 0.0; this.chart.FormatNumber += chart_FormatNumber; series.IsXValueIndexed = false; } var y = GraphData.FormatNumericValue(configuration.ItemsConfiguration.Unit, item.YValue); series.Points.AddXY(item.DateTime, y); } else { var x = item.Name != null ? (object)item.Name : item.DateTime; var y = GraphData.FormatNumericValue(configuration.ItemsConfiguration.Unit, item.YValue); var index = series.Points.AddXY(x, y); var point = series.Points[index]; if (configuration.GraphType.Value == GraphTypeEnum.Pie) { SetupPoint(point, configuration, index); } } } } this.chart.ChartAreas[0].AxisX.IsStartedFromZero = false; }
private void DrawNamedGraph(GraphData data, GraphConfiguration configuration) { int seriesIndex = 0; DateTime minDate = DateTime.MaxValue; DateTime maxDate = DateTime.MinValue; bool setupAxis = false; foreach (string name in data.Names) { Series series = new Series(name) { IsXValueIndexed = true }; SetupSeries(series, configuration, seriesIndex++); series.ChartType = SeriesChartType.Line; this.chart.Series.Add(series); foreach (KeyValuePair <string, List <PlainItem> > items in data.PlainData) { List <PlainItem> namedItems = items.Value.Where(el => el.Name == name).ToList(); if (namedItems.Any()) { List <DateTime> d = namedItems.SelectMany(it => new[] { it.DateTime }).ToList(); DateTime minCurrentNamedItem = d.Min(); DateTime maxCurrentNamedItem = d.Max(); // minDate = new DateTime(Math.Min(minCurrentNamedItem.Ticks, minDate.Ticks)); // maxDate = new DateTime(Math.Max(maxCurrentNamedItem.Ticks, maxDate.Ticks)); if (minDate > minCurrentNamedItem) { minDate = minCurrentNamedItem; } if (maxDate < maxCurrentNamedItem) { maxDate = maxCurrentNamedItem; } if (!setupAxis) { setupAxis = true; } this.chart.FormatNumber += chart_FormatNumber; series.IsXValueIndexed = false; foreach (PlainItem item in namedItems) { double y = GraphData.FormatNumericValue( configuration.ItemsConfiguration.Unit, item.YValue ); series.Points.AddXY(item.DateTime, y); } } } } ChartArea chartArea = this.chart.ChartAreas[0]; if (setupAxis) { chartArea.AxisX.Minimum = minDate.ToOADate(); chartArea.AxisX.Maximum = maxDate.ToOADate(); chartArea.AxisX.IntervalAutoMode = IntervalAutoMode.VariableCount; chartArea.AxisX.IntervalType = DateTimeIntervalType.Auto; chartArea.AxisX.Interval = 0.0d; chartArea.AxisX.IsStartedFromZero = false; } }
/// <summary> /// Load configuration from XML in stream and draw graph /// </summary> /// <param name="stream">Xml configuration stream</param> /// <param name="ownerSize">Owner size.</param> /// <param name="context">Configuration context.</param> public void SetConfiguration(Stream stream, Size ownerSize, object context) { this.SetConfiguration(GraphConfiguration.LoadFromXml(stream), ownerSize, context); }
private void SetupChartMargin(GraphConfiguration configuration) { // // AxisX.IsMarginVisible // if (this.chart.ChartAreas[0].AxisX.LabelStyle.Enabled) { this.chart.ChartAreas[0].AxisX.IsMarginVisible = true; // top this.chart.ChartAreas[0].InnerPlotPosition.Y = configuration.GraphMargins.GetTop(); // bottom this.chart.ChartAreas[0].InnerPlotPosition.Height = configuration.GraphMargins.GetBottom(); } else { this.chart.ChartAreas[0].AxisX.IsMarginVisible = false; // top this.chart.ChartAreas[0].InnerPlotPosition.Y = 0.0f; // bottom this.chart.ChartAreas[0].InnerPlotPosition.Height = 100.0f; } // // AxisY.IsMarginVisible // if (this.chart.ChartAreas[0].AxisY.LabelStyle.Enabled) { this.chart.ChartAreas[0].AxisY.IsMarginVisible = true; // left this.chart.ChartAreas[0].InnerPlotPosition.X = configuration.GraphMargins.GetLeft(); // right this.chart.ChartAreas[0].InnerPlotPosition.Width = configuration.GraphMargins.GetRight(); } else { this.chart.ChartAreas[0].AxisY.IsMarginVisible = false; // left this.chart.ChartAreas[0].InnerPlotPosition.X = 0.0f; // right this.chart.ChartAreas[0].InnerPlotPosition.Width = 100.0f; } /* * // left * this.chart.ChartAreas[0].InnerPlotPosition.X = configuration.GraphMargins.GetLeft(); * * // right * this.chart.ChartAreas[0].InnerPlotPosition.Width = configuration.GraphMargins.GetRight(); * * // top * this.chart.ChartAreas[0].InnerPlotPosition.Y = configuration.GraphMargins.GetTop(); * * // bottom * this.chart.ChartAreas[0].InnerPlotPosition.Height = configuration.GraphMargins.GetBottom(); */ this.chart.ChartAreas[0].Position.X = this.chart.ChartAreas[0].InnerPlotPosition.X; if (this.chart.ChartAreas[0].AxisY.LabelStyle.Enabled) { this.chart.ChartAreas[0].Position.Y = 1; } else { this.chart.ChartAreas[0].Position.Y = 0; } this.chart.ChartAreas[0].Position.Width = this.chart.ChartAreas[0].InnerPlotPosition.Width; if (this.chart.ChartAreas[0].AxisY.LabelStyle.Enabled) { this.chart.ChartAreas[0].Position.Height = 98; } else { this.chart.ChartAreas[0].Position.Height = 100; } if (!configuration.LegendConfiguration.GraphicOverlap) { this.chart.ChartAreas[0].Position.Auto = true; } else { this.chart.ChartAreas[0].Position.Auto = false; } this.chart.Padding = new Padding(0, 0, 0, 0); /* * var chartArea = this.chart.ChartAreas[0]; * * chartArea.AxisX.IsMarginVisible = true; * chartArea.AxisY.IsMarginVisible = true; * * chartArea.InnerPlotPosition = new ElementPosition( * -0.5f, * -0.5f, * configuration.GraphMargins.GetRight() + 3, * configuration.GraphMargins.GetBottom() + 3 * ); */ }
private static void MonthWeekDaySort( GraphData data, GraphConfiguration configuration, string name, Series series, ValGroup sort ) { int i = 0; int point = 0; double?value = null; for (DateTime date = data.FromDate.Date; date <= data.ToDate.Date; date = date.Date.AddDays(1)) { DateTime labelDate = date; if (sort == ValGroup.Week) { labelDate = labelDate.PreviousMonday(); } value = data.GetValueForNameAndDate(name, date, data.Configuration.ItemsConfiguration.Unit, sort); if (value != null && value >= 1.0d) { point = 0; switch (sort) { case ValGroup.Month: point = series.Points.AddXY(i, value.Value); series.Points[point].AxisLabel = date.Date.ToString("MM.yyyy"); break; case ValGroup.Day: point = series.Points.AddXY(date, value.Value); series.Points[point].AxisLabel = date.Date.ToString("dd.MM.yyyy"); break; case ValGroup.Week: point = series.Points.AddXY(labelDate, value.Value); series.Points[point].AxisLabel = labelDate.Date.ToString("dd.MM.yyyy"); break; } } else if (value != null && value < 1.0d) { } else if (configuration.GraphType.Value == GraphTypeEnum.NameDateStackedColumn) { switch (sort) { case ValGroup.Month: int t = series.Points.AddXY(i, 0.0d); series.Points[t].AxisLabel = date.Date.ToString("MM.yyyy"); while (date.AddDays(1).Day != 1) { date = date.AddDays(1); } break; case ValGroup.Day: t = series.Points.AddXY(date, 0.0d); series.Points[t].AxisLabel = date.Date.ToString("dd.MM.yyyy"); break; case ValGroup.Week: if (date.DayOfWeek == DayOfWeek.Monday) { t = series.Points.AddXY(labelDate, 0.0d); series.Points[t].AxisLabel = labelDate.Date.ToString("dd.MM.yyyy"); } break; } } i++; } }
private void DrawGantt(GanttGraphData data, GraphConfiguration configuration) { this.chart.Series.Clear(); DrawGantt(this.chart, data.Jobs); }
private void DrawNameDateGraph(GraphData data, GraphConfiguration configuration) { int i = 0; int countPoints = -1; bool flag = false; var sortGroup = ((XmlFileGraphSource)configuration.GraphSource).ValueGroup; foreach (string name in data.Names) { var series = new Series(name) { IsXValueIndexed = true }; SetupSeries(series, configuration, i); switch (configuration.GraphType.Value) { case GraphTypeEnum.NameDateStackedColumn: series.ChartType = SeriesChartType.StackedColumn; break; case GraphTypeEnum.NameDateLine: series.ChartType = SeriesChartType.Line; break; } this.chart.Series.Add(series); switch (sortGroup) { case ValGroup.Day: case ValGroup.Week: case ValGroup.Month: default: MonthWeekDaySort(data, configuration, name, series, sortGroup); break; case ValGroup.Hour: HourSort(data, configuration, sortGroup, name, series); break; case ValGroup.Minute: case ValGroup.Second: MinuteSecondSort(data, configuration, sortGroup, name, series); break; } countPoints = countPoints == -1 ? series.Points.Count : -1; flag = flag || (countPoints != series.Points.Count); i++; } if (flag) { foreach (var chartItems in this.chart.Series) { chartItems.IsXValueIndexed = false; } } }
public GanttGraphData(GraphConfiguration configuration, object context) { this._configuration = configuration; this._data = this._configuration.GraphSource.GetGanttData(context); }