private void DrawTimeDomain(bool fitView) { try { if (viewModel == null || viewModel.CurrentSnapshotContract == null) { return; } PointLineSeries series = m_chart.ViewXY.PointLineSeries[0]; PointLineSeries series1 = m_chart.ViewXY.PointLineSeries[1]; LineSeriesCursor lineSeriesCursor = m_chart.ViewXY.LineSeriesCursors[0]; int index = GetNearestPointIndex(series, lineSeriesCursor.ValueAtXAxis); if (index == -1) { if (series1.PointCount > 0) { m_chart.BeginUpdate(); series1.Clear(); m_chart.EndUpdate(); } return; } SeriesPoint point = series.Points[index]; Guid id = (Guid)point.Tag; SnapshotItemContract2 itemContract2 = viewModel.CurrentSnapshotContract.Item.Where(o => o.id == id).SingleOrDefault(); if (itemContract2 == null) { return; } ChannelDataContract channelData = itemContract2.Data; if (channelData != null) { int length = channelData.VData.Length / 4; SeriesPoint[] points = new SeriesPoint[length]; for (int i = 0; i < length; i++) { points[i].X = i; points[i].Y = BitConverter.ToSingle(channelData.VData, i * 4); } m_chart.BeginUpdate(); series1.Points = points; if (fitView) { m_chart.ViewXY.FitView(); } m_chart.EndUpdate(); } } catch (Exception ex) { _eventAggregator.GetEvent <ThrowExceptionEvent>().Publish(Tuple.Create <string, Exception>("数据回放-报警点趋势-时域", ex)); } }
public Form1() { InitializeComponent(); // 1. Create chart. var chart = new LightningChart(); // Disable rendering before updating chart properties to improve performance // and to prevent unnecessary chart redrawing while changing multiple properties. chart.BeginUpdate(); // 2. Set chart control into the parent container. chart.Parent = this; // Set form as parent. chart.Dock = DockStyle.Fill; // Maximize to parent client area. // 3. Generate data for series. var rand = new Random(); int pointCounter = 70; var data = new SeriesPoint[pointCounter]; for (int i = 0; i < pointCounter; i++) { data[i].X = (double)i; data[i].Y = rand.Next(0, 100); } // 4. Define variables for X- and Y-axis. var axisX = chart.ViewXY.XAxes[0]; var axisY = chart.ViewXY.YAxes[0]; // 5. Create a new PointLineSeries. var series = new PointLineSeries(chart.ViewXY, axisX, axisY); series.LineStyle.Color = Color.Orange; // 6. Set data-points into series. series.Points = data; // 7. Add series to chart. chart.ViewXY.PointLineSeries.Add(series); // 8. Auto-scale X- and Y-axes. chart.ViewXY.ZoomToFit(); #region Hidden polishing CustomizeChart(chart); #endregion // Call EndUpdate to enable rendering again. chart.EndUpdate(); }
private void OnChannelDataChanged(IEnumerable <ChannelToken> tokens) { try { m_chart.BeginUpdate(); foreach (var token in tokens) { PointLineSeries series = m_chart.ViewXY.PointLineSeries.Where(o => o.Tag == token).Single(); if (token is VibrationChannelToken) { var vToken = token as VibrationChannelToken; SeriesPoint[] points = new SeriesPoint[vToken.DataContracts.Length]; for (int i = 0; i < points.Length; i++) { points[i].X = m_chart.ViewXY.XAxes[0].DateTimeToAxisValue(vToken.DataContracts[i].Date); points[i].Y = vToken.DataContracts[i].Value; } series.Points = points; } else if (token is DivFreChannelToken) { var divToken = token as DivFreChannelToken; SeriesPoint[] points = new SeriesPoint[divToken.DataContracts.Length]; for (int i = 0; i < points.Length; i++) { points[i].X = m_chart.ViewXY.XAxes[0].DateTimeToAxisValue(divToken.DataContracts[i].Date); points[i].Y = divToken.DataContracts[i].FreMV; } series.Points = points; } else if (token is AnalogChannelToken) { var anToken = token as AnalogChannelToken; SeriesPoint[] points = new SeriesPoint[anToken.DataContracts.Length]; for (int i = 0; i < points.Length; i++) { points[i].X = m_chart.ViewXY.XAxes[0].DateTimeToAxisValue(anToken.DataContracts[i].Date); points[i].Y = anToken.DataContracts[i].Value; } series.Points = points; } } double minX = m_chart.ViewXY.PointLineSeries.SelectMany(o => o.Points).Select(o => o.X).Min(); double maxX = m_chart.ViewXY.PointLineSeries.SelectMany(o => o.Points).Select(o => o.X).Max(); m_chart.ViewXY.XAxes[0].SetRange(minX, maxX); m_chart.EndUpdate(); } catch (Exception ex) { EventAggregatorService.Instance.EventAggregator.GetEvent <ThrowExceptionEvent>().Publish(Tuple.Create <string, Exception>("数据回放-通频趋势-数据更新", ex)); m_chart.EndUpdate(); } }
private bool SolveValueAccurate(PointLineSeries series, double xValue, out double yValue) { yValue = 0; LineSeriesValueSolveResult lssvs = series.SolveYValueAtXValue(xValue); if (lssvs.SolveStatus == LineSeriesSolveStatus.OK) { //PointLineSeries may have two or more points at same X value. If so, center it between min and max yValue = (lssvs.YMax + lssvs.YMin) / 2.0; return(true); } else { return(false); } }
public void RysujWykres(float[] times) { var data = new SeriesPoint[times.Length]; var series = new PointLineSeries(chart.ViewXY, axisX, axisY); series.LineStyle.Color = Color.FromRgb(250, 0, 0); for (int i = 0; i < times.Length; i++) { data[i].X = i; data[i].Y = times[i]; } series.Points = data; chart.ViewXY.PointLineSeries.Add(series); chart.ViewXY.ZoomToFit(); }
private void Testme_Click(object sender, RoutedEventArgs e) { NBDataReader reader = new NBDataReader(); List <NBDataItem> items = reader.GetDataItems(); MessageBox.Show(items.Count.ToString()); VM.ChartPointCollection = new System.Collections.ObjectModel.ObservableCollection <NBDataItem>(items); //Initialize chart myChart.BeginUpdate(); //Get XY view ViewXY chartView = myChart.ViewXY; //Get default x-axis and set the range and ValueType AxisX axisX = chartView.XAxes[0]; axisX.SetRange((double)items.Min(x => x.TimeStamp), (double)items.Max(x => x.TimeStamp)); axisX.ValueType = AxisValueType.Number; //Get default y-axis and set the range. AxisY axisY = chartView.YAxes[0]; axisY.SetRange((double)items.Min(x => x.Channels.Min()), (double)items.Max(x => x.Channels.Max())); //Add point line series for (int i = 0; i < reader.Channels; i++) { PointLineSeries pls = new PointLineSeries(chartView, axisX, axisY); pls.PointsVisible = false; SeriesPoint[] aPoints = new SeriesPoint[items.Count]; for (int iPoint = 0; iPoint < items.Count; iPoint++) { aPoints[iPoint].X = items[iPoint].TimeStamp; aPoints[iPoint].Y = items[iPoint].Channels[i]; } //Assign the data for the point line series pls.Points = aPoints; pls.Title = new Arction.WPF.LightningChartUltimate.Titles.SeriesTitle(); pls.Title.Text = "CHANNEL " + i; //Add series to the PointLineSeries container in the view chartView.PointLineSeries.Add(pls); } //Apply chart property changes, which causes chart to be painted myChart.EndUpdate(); MessageBox.Show("OK"); }
public Form1() { InitializeComponent(); // 1. Create chart instance and store it member variable. var chart = new LightningChartUltimate(/*Type your License key here...*/); // 2. Set chart control into the parent container. chart.Parent = this; //Set form as parent chart.Dock = DockStyle.Fill; //Maximize to parent client area // 3. Prepare data for line-series. var rand = new Random(); int pointCounter = 70; var data = new SeriesPoint[pointCounter]; for (int i = 0; i < pointCounter; i++) { data[i].X = (double)i; data[i].Y = rand.Next(0, 100); } // 4. Add PointLineSeries for variable-interval data, progressing by X. var series = new PointLineSeries(chart.ViewXY, chart.ViewXY.XAxes[0], chart.ViewXY.YAxes[0]); series.LineStyle.Color = Color.Orange; // 5. Set data-points into series. series.Points = data; // 6. Add the series into list of point-line-series. chart.ViewXY.PointLineSeries.Add(series); // 7. Auto-scale X and Y axes. chart.ViewXY.ZoomToFit(); #region Hiden polishing CusomizeChart(chart); #endregion }
private int GetNearestPointIndex(PointLineSeries series, double xValue) { double x = 0; double y = 0; double yValue = 0; int index = 0; LineSeriesValueSolveResult lssvs = series.SolveYValueAtXValue(xValue); if (lssvs.SolveStatus == LineSeriesSolveStatus.OK) { //PointLineSeries may have two or more points at same X value. If so, center it between min and max yValue = (lssvs.YMax + lssvs.YMin) / 2.0; series.SolveNearestDataPointByValue(xValue, yValue, out x, out y, out index); return(index); } else { return(-1); } }
private void initialize_pointLineSeries() { rawData2D = new PointLineSeries(LC.ViewXY, LC.ViewXY.XAxes[0], LC.ViewXY.YAxes[0]) { PointsVisible = false, MouseInteraction = false }; rawData2D.LineStyle.Color = Color.MediumBlue; rawData2D.LineStyle.Width = 1; rawData2D.LineStyle.Pattern = LinePattern.Solid; rawData2D.LineStyle.AntiAliasing = LineAntialias.None; if (LC.ViewXY.PointLineSeries.Count == 0) { LC.ViewXY.PointLineSeries.Add(rawData2D); } else { LC.ViewXY.PointLineSeries[0].Clear(); LC.ViewXY.PointLineSeries[0] = rawData2D; } }
private void AddMarker(PointLineSeries series, SeriesPoint point, int AlarmGrade) { string alarmTypeStr = JudgeAlarmType(AlarmGrade); if (!string.IsNullOrEmpty(alarmTypeStr)) { SeriesEventMarker marker = new SeriesEventMarker(series); marker.XValue = point.X; marker.YValue = point.Y; marker.HorizontalPosition = SeriesEventMarkerHorizontalPosition.AtXValue; marker.Symbol.Width = 5; marker.Symbol.Height = 5; //store values in label text marker.Label.Text = alarmTypeStr + "\r\n" + "X:" + _chart.ViewXY.XAxes[0].TimeString(point.X, "yyyy-MM-dd HH:mm:ss") + "\r\n" + "Y:" + point.Y.ToString("0.000"); marker.Label.HorizontalAlign = AlignmentHorizontal.Center; marker.Label.Font = new WpfFont(System.Drawing.FontFamily.GenericSansSerif, 9f, System.Drawing.FontStyle.Bold); marker.Label.Shadow.Style = TextShadowStyle.HighContrast; marker.Label.Shadow.ContrastColor = Colors.Black; marker.Label.VerticalAlign = AlignmentVertical.Top; marker.Label.Visible = false; marker.Symbol.GradientFill = GradientFillPoint.Solid; if (alarmTypeStr.Contains("危险")) { marker.Symbol.Color1 = Colors.Red; } else if (alarmTypeStr.Contains("警告")) { marker.Symbol.Color1 = Colors.DarkOrange; } else if (alarmTypeStr.Contains("预警")) { marker.Symbol.Color1 = Colors.Yellow; } marker.Symbol.Shape = Arction.Wpf.Charting.Shape.Circle; marker.VerticalPosition = SeriesEventMarkerVerticalPosition.AtYValue; marker.MoveByMouse = false; marker.MouseOverOn += new MouseEventHandler(marker_MouseOverOn); marker.MouseOverOff += new MouseEventHandler(marker_MouseOverOff); series.SeriesEventMarkers.Add(marker); } }
private void CreateChart() { gridChart.Children.Clear(); if (m_chart != null) { m_chart.Dispose(); m_chart = null; } m_chart = new LightningChartUltimate(); m_chart.BeginUpdate(); m_chart.Title.Text = ""; m_chart.ViewXY.AxisLayout.XAxisAutoPlacement = XAxisAutoPlacement.BottomThenTop; m_chart.ViewXY.AxisLayout.YAxisAutoPlacement = YAxisAutoPlacement.LeftThenRight; m_chart.ViewXY.AxisLayout.YAxisTitleAutoPlacement = false; m_chart.ViewXY.AxisLayout.YAxesLayout = YAxesLayout.Layered; m_chart.Background = new SolidColorBrush(Color.FromArgb(0, 0, 0, 0)); m_chart.ChartBackground.Color = Color.FromArgb(0, 0, 0, 0); m_chart.ChartBackground.GradientFill = GradientFill.Solid; m_chart.ViewXY.GraphBackground.Color = Color.FromArgb(0, 0, 0, 0); m_chart.ViewXY.GraphBackground.GradientFill = GradientFill.Solid; m_chart.ViewXY.GraphBorderColor = Color.FromArgb(0, 0, 0, 0); m_chart.ViewXY.LegendBoxes[0].Visible = false; m_chart.ViewXY.XAxes[0].ValueType = AxisValueType.DateTime; m_chart.ViewXY.XAxes[0].Title.Visible = false; m_chart.ViewXY.XAxes[0].MinorGrid.Visible = false; m_chart.ViewXY.XAxes[0].AxisThickness = 2; m_chart.ViewXY.XAxes[0].AxisColor = Color.FromArgb(0xff, 0xff, 0xff, 0xff);//Color.FromArgb(100, 135, 205, 238); m_chart.ViewXY.XAxes[0].MinorGrid.Visible = false; m_chart.ViewXY.XAxes[0].LabelsFont = new WpfFont(System.Drawing.FontFamily.GenericSansSerif, 9, System.Drawing.FontStyle.Regular); m_chart.ViewXY.YAxes[0].Title.Visible = false; m_chart.ViewXY.YAxes[0].MinorGrid.Visible = false; m_chart.ViewXY.YAxes[0].AxisThickness = 2; m_chart.ViewXY.YAxes[0].AxisColor = Color.FromArgb(0xff, 0xff, 0xff, 0xff);//Color.FromArgb(100, 135, 205, 238); m_chart.ViewXY.YAxes[0].MinorGrid.Visible = false; m_chart.ViewXY.YAxes[0].LabelsFont = new WpfFont(System.Drawing.FontFamily.GenericSansSerif, 9, System.Drawing.FontStyle.Regular); m_chart.ViewXY.YAxes[0].Title.Text = ""; AxisX xAxis2 = new AxisX(m_chart.ViewXY); xAxis2.LabelsFont = new WpfFont(System.Drawing.FontFamily.GenericSansSerif, 9, System.Drawing.FontStyle.Regular); xAxis2.Title.Text = ""; xAxis2.AxisColor = DefaultColors.SeriesForBlackBackgroundWpf[1]; xAxis2.MajorGrid.Visible = false; xAxis2.ValueType = AxisValueType.Number; m_chart.ViewXY.XAxes.Add(xAxis2); AxisY yAxis2 = new AxisY(m_chart.ViewXY); yAxis2.LabelsFont = new WpfFont(System.Drawing.FontFamily.GenericSansSerif, 9, System.Drawing.FontStyle.Regular); yAxis2.Title.Text = ""; yAxis2.AxisColor = DefaultColors.SeriesForBlackBackgroundWpf[1]; yAxis2.MajorGrid.Visible = false; m_chart.ViewXY.YAxes.Add(yAxis2); PointLineSeries series = new PointLineSeries(m_chart.ViewXY, m_chart.ViewXY.XAxes[0], m_chart.ViewXY.YAxes[0]); series.MouseInteraction = false; series.LineStyle.AntiAliasing = LineAntialias.None; series.LineStyle.Width = 1; m_chart.ViewXY.PointLineSeries.Add(series); PointLineSeries series2 = new PointLineSeries(m_chart.ViewXY, m_chart.ViewXY.XAxes[1], m_chart.ViewXY.YAxes[1]); series2.MouseInteraction = false; series2.LineStyle.Color = DefaultColors.SeriesForBlackBackgroundWpf[1]; series2.LineStyle.AntiAliasing = LineAntialias.None; series2.LineStyle.Width = 1; series2.CursorTrackEnabled = false; m_chart.ViewXY.PointLineSeries.Add(series2); //Add cursor LineSeriesCursor cursor = new LineSeriesCursor(m_chart.ViewXY, m_chart.ViewXY.XAxes[0]); cursor.PositionChanged += AlarmPointTrendDataView_PositionChanged; //cursor.AssignXAxisIndex = 0; m_chart.ViewXY.LineSeriesCursors.Add(cursor); cursor.LineStyle.Color = System.Windows.Media.Color.FromArgb(150, 255, 0, 0); cursor.SnapToPoints = true; cursor.LineStyle.Width = 2; cursor.TrackPoint.Color1 = Colors.White; m_chart.ViewXY.ZoomToFit(); m_chart.EndUpdate(); gridChart.Children.Add(m_chart); }
public MainWindow() { InitializeComponent(); // Create chart. var chart = new LightningChartUltimate(); // Disable rendering before updating chart properties to improve performance // and to prevent unnecessary chart redrawing while changing multiple properties. chart.BeginUpdate(); // Set chart control into the parent container. (Content as Grid).Children.Add(chart); // Generate data for first series. var rand = new Random(); int pointCounter = 70; var data = new SeriesPoint[pointCounter]; for (int i = 0; i < pointCounter; i++) { data[i].X = (double)i; data[i].Y = rand.Next(0, 100); } // Define variables for X- and Y-axis. var axisX = chart.ViewXY.XAxes[0]; var axisY = chart.ViewXY.YAxes[0]; // Create a new PointLineSeries and add it to the list of PointLineSeries. var series = new PointLineSeries(chart.ViewXY, axisX, axisY); series.LineStyle.Color = Colors.Orange; series.Title.Text = "Random data"; series.Points = data; chart.ViewXY.PointLineSeries.Add(series); // 1. Generate new data for second series. data = new SeriesPoint[pointCounter]; for (int i = 0; i < pointCounter; i++) { data[i].X = (double)i; data[i].Y = Math.Sin(i * 0.2) * 50 + 50; } // 2. Create another PointLineSeries and set new color and line-pattern for it. var series2 = new PointLineSeries(chart.ViewXY, chart.ViewXY.XAxes[0], chart.ViewXY.YAxes[0]); series2.LineStyle.Color = Color.FromArgb(255, 255, 67, 0); series2.LineStyle.Pattern = LinePattern.DashDot; series2.Title.Text = "Sinus data"; // 3. Set data-points into series. series2.Points = data; // 4. Add series to chart. chart.ViewXY.PointLineSeries.Add(series2); // Auto-scale X- and Y-axes. chart.ViewXY.ZoomToFit(); #region Hidden polishing CustomizeChart(chart); #endregion // Call EndUpdate to enable rendering again. chart.EndUpdate(); }
private void DrawFrequencyDomain(bool fitView) { try { if (ViewModel == null || ViewModel.CurrentSnapshotContract == null) { return; } PointLineSeries series = m_chart.ViewXY.PointLineSeries[0]; PointLineSeries series1 = m_chart.ViewXY.PointLineSeries[1]; LineSeriesCursor lineSeriesCursor = m_chart.ViewXY.LineSeriesCursors[0]; int index = GetNearestPointIndex(series, lineSeriesCursor.ValueAtXAxis); if (index == -1) { if (series1.PointCount > 0) { m_chart.BeginUpdate(); series1.Clear(); m_chart.EndUpdate(); } return; } else { SeriesPoint point = series.Points[index]; Guid id = (Guid)point.Tag; //htzk123,数据 //SnapshotItemContract2 itemContract2 = ViewModel.CurrentSnapshotContract.Item.Where(o => o.id == id).SingleOrDefault(); //if (itemContract2 == null) return; //ChannelDataContract channelData = itemContract2.Data; //if (channelData != null) //{ // int length = channelData.VData.Length / 4; // double[] vdata = new double[length]; // for (int i = 0; i < length; i++) // { // vdata[i] = BitConverter.ToSingle(channelData.VData, i * 4); // } // double frequencyInterval = channelData.SampleFre / channelData.SamplePoint; // if (channelData.TriggerN == 2) // { // frequencyInterval = ((int)channelData.TeethNumber / 2) / length; // } // int frequencyLength = (int)(channelData.SamplePoint / 2.56); // var outputAmp = Algorithm.Instance.FFT2Action(vdata, channelData.SamplePoint); // m_chart.BeginUpdate(); // if (series1.Points==null||series1.Points.Length != frequencyLength) // { // series1.Points = new SeriesPoint[frequencyLength]; // } // for (int i = 0; i < frequencyLength; i++) // { // series1.Points[i].X = frequencyInterval * i; // series1.Points[i].Y = outputAmp[i]; // } // if (fitView) // { // m_chart.ViewXY.ZoomToFit(); // } // m_chart.EndUpdate(); //} } } catch (Exception ex) { _eventAggregator.GetEvent <ThrowExceptionEvent>().Publish(Tuple.Create <string, Exception>("数据回放-报警点趋势-频域", ex)); } }
/// <summary> /// 初始化温度曲线 /// </summary> private void CreateTempChart() { //Create new _chartTemp _chartTemp = new LightningChartUltimate(); _chartTemp.BeginUpdate(); _chartTemp.ViewXY.DropOldSeriesData = true; _chartTemp.Parent = lightningChartUltimate1; _chartTemp.Name = "出铁口铁水温度曲线"; //_chartTemp.Title.Font.; _chartTemp.Title.Text = "出铁口铁水温度曲线"; _chartTemp.Title.Color = PublicColor.FromArgb(255, Color.Yellow); _chartTemp.Title.Font = new Font("黑体", 10, FontStyle.Bold); //_chartTemp.Title.Visible = false; _chartTemp.Dock = DockStyle.Fill; _chartTemp.Background.Color = PublicColor.FromArgb(255, Color.Gray); _chartTemp.Background.GradientFill = GradientFill.Solid; AxisX xAxis = _chartTemp.ViewXY.XAxes[0]; xAxis.ValueType = AxisValueType.DateTime; xAxis.Title.Text = "Time"; xAxis.AutoFormatLabels = false; //xAxis.LabelsTimeFormat = "dd/MM/yyyy\nHH:mm.ss"; xAxis.LabelsTimeFormat = "HH:mm.ss"; xAxis.LabelsAngle = 0; xAxis.ScrollMode = XAxisScrollMode.Scrolling; xAxis.Title.Visible = false; xAxis.Visible = false; //Convert DateTime values to axis values DateTime now = DateTime.Now; double minX = xAxis.DateTimeToAxisValue(now); double maxX = xAxis.DateTimeToAxisValue(now) + 100; xAxis.SetRange(minX, maxX); //Configure y-axis AxisY yAxis = _chartTemp.ViewXY.YAxes[0]; yAxis.Title.Text = "Temperature / °C"; yAxis.Title.Visible = false; yAxis.SetRange(1500, 1600); yAxis.LabelsFont = new Font("黑体", 6); yAxis.LabelsColor = PublicColor.FromArgb(255, Color.Yellow); //Configure and add series to the chart PointLineSeries series = new PointLineSeries(_chartTemp.ViewXY, xAxis, yAxis); series.LineStyle.Color = Color.Yellow; series.MouseInteraction = false; _chartTemp.ViewXY.PointLineSeries.Add(series); //Don't show legendbox _chartTemp.ViewXY.LegendBoxes[0].Visible = false; //Allow chart rendering _chartTemp.EndUpdate(); }
/// <summary> /// 初始化速度曲线 /// </summary> private void CreateVelocityChart() { //Create new _chartTemp _chartVelocity = new LightningChartUltimate(); //Disable rendering, strongly recommended before updating chart properties _chartVelocity.BeginUpdate(); //Reduce memory usage and increase performance. Destroys out-scrolled data. _chartVelocity.ViewXY.DropOldSeriesData = true; _chartVelocity.Parent = lightningChartUltimate3; _chartVelocity.Name = "Si prediction"; _chartVelocity.Title.Text = "铁水实时流速曲线"; _chartVelocity.Title.Color = PublicColor.FromArgb(255, Color.Yellow); _chartVelocity.Title.Font = new Font("黑体", 10, FontStyle.Bold); _chartVelocity.Dock = DockStyle.Fill; // Setup custom style. //ExampleUtils.SetStandardFlatStyle(_chartSi); _chartVelocity.Background.Color = PublicColor.FromArgb(255, Color.Gray); _chartVelocity.Background.GradientFill = GradientFill.Solid; //Configure x-axis AxisX xAxis = _chartVelocity.ViewXY.XAxes[0]; xAxis.ValueType = AxisValueType.DateTime; xAxis.Title.Text = "Time"; xAxis.AutoFormatLabels = false; //xAxis.LabelsTimeFormat = "dd/MM/yyyy\nHH:mm.ss"; xAxis.LabelsTimeFormat = "HH:mm.ss"; xAxis.LabelsAngle = 0; xAxis.ScrollMode = XAxisScrollMode.Scrolling; xAxis.LabelsFont = new Font("黑体", 6); xAxis.LabelsColor = PublicColor.FromArgb(255, Color.Yellow); xAxis.Visible = false; xAxis.Title.Visible = false; //Convert DateTime values to axis values DateTime now = DateTime.Now; double minX = xAxis.DateTimeToAxisValue(now); double maxX = xAxis.DateTimeToAxisValue(now) + 200; xAxis.SetRange(minX, maxX); //Configure y-axis AxisY yAxis = _chartVelocity.ViewXY.YAxes[0]; yAxis.Title.Text = "Si Predition"; yAxis.SetRange(4.5, 8); yAxis.LabelsFont = new Font("黑体", 6); yAxis.LabelsColor = PublicColor.FromArgb(255, Color.Yellow); yAxis.Title.Visible = false; //Configure and add series to the chart PointLineSeries series = new PointLineSeries(_chartVelocity.ViewXY, xAxis, yAxis); series.LineStyle.Color = Color.Yellow; series.MouseInteraction = false; _chartVelocity.ViewXY.PointLineSeries.Add(series); //Don't show legendbox _chartVelocity.ViewXY.LegendBoxes[0].Visible = false; //Allow chart rendering _chartVelocity.EndUpdate(); }
private void OnChannelAdded(ChannelToken token) { try { if (viewModel == null || !(token is VibrationChannelToken)) { return; } m_chart.BeginUpdate(); VibrationChannelToken vToken = token as VibrationChannelToken; AxisY axisY = new AxisY(m_chart.ViewXY); axisY.Tag = vToken; axisY.Title.Visible = false; axisY.AxisThickness = 2; axisY.AxisColor = Color.FromArgb(100, 135, 205, 238); m_chart.ViewXY.YAxes.Add(axisY); int count = m_chart.ViewXY.PointLineSeries.Count; while (count > 15) { count -= 15; } Color color = DefaultColors.SeriesForBlackBackgroundWPF[count]; PointLineSeries series = new PointLineSeries(m_chart.ViewXY, m_chart.ViewXY.XAxes[0], axisY); series.MouseInteraction = false; series.LineStyle.Color = color; series.LineStyle.AntiAliasing = LineAntialias.None; series.LineStyle.Width = 1; series.Tag = vToken; series.Title.Text = vToken.Channel.Name + vToken.Channel.MSSN; series.Title.Font = new WPFFont(System.Drawing.FontFamily.GenericSansSerif, 10f, System.Drawing.FontStyle.Bold); series.Title.Color = ChartTools.CalcGradient(Colors.White, Colors.White, 50); series.Title.HorizontalAlign = AlignmentHorizontal.Left; series.Title.VerticalAlign = AlignmentVertical.Top; series.Title.MoveByMouse = false; series.Title.MouseInteraction = false; series.Title.Offset = new PointIntXY(5, 5); series.Title.Visible = true; if (m_chart.ViewXY.Annotations.Count == 0) { CreateCalloutAnnotation(); CreateFAAnnotation(); } //Update Annotation AnnotationXY annotation = m_chart.ViewXY.Annotations[1]; string[] branches = annotation.Text.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); StringBuilder sb = new StringBuilder(); for (int i = 0; i < branches.Length; i++) { sb.AppendLine(branches[i]); } string freText = "F"; string ampText = "A"; if (vToken.VData != null) { int length = vToken.VData.FFTLength; SeriesPoint[] points = new SeriesPoint[length]; SeriesPoint[] phasePoints = new SeriesPoint[length]; for (int i = 0; i < length; i++) { points[i] = new SeriesPoint(vToken.VData.Frequency[i], vToken.VData.PowerSpectrum[i]); phasePoints[i] = new SeriesPoint(vToken.VData.Frequency[i], vToken.VData.Phase[i]); } series.Points = points; var fftValuesDict = vToken.VData.PowerSpectrum.Select((s, i) => new { Key = i, Value = s }).OrderByDescending(o => o.Value).Take(6); foreach (var item in fftValuesDict) { freText += string.Format("{0,6}|", vToken.VData.Frequency[item.Key].ToString("0.00")); ampText += string.Format("{0,6}|", item.Value.ToString("0.00")); } } sb.AppendLine(freText); sb.AppendLine(ampText); annotation.Text = sb.ToString(); m_chart.ViewXY.PointLineSeries.Add(series); m_chart.ViewXY.Annotations[0].AssignYAxisIndex = -1; m_chart.ViewXY.Annotations[0].AssignYAxisIndex = 0; m_chart.ViewXY.FitView(); m_chart.EndUpdate(); } catch (Exception ex) { m_chart.EndUpdate(); EventAggregatorService.Instance.EventAggregator.GetEvent <ThrowExceptionEvent>().Publish(Tuple.Create <string, Exception>("数据回放-功率谱-添加通道", ex)); } }
public MainWindow() { InitializeComponent(); // Create chart. var chart = new LightningChartUltimate(); chart.Title.Text = "Stock Series"; // Disable rendering before updating chart properties to improve performance // and to prevent unnecessary chart redrawing while changing multiple properties. chart.BeginUpdate(); // Set chart control into the parent container. (Content as Grid).Children.Add(chart); // 1. Configure X- and Y-axes. // X-axis configuration. var axisX = chart.ViewXY.XAxes[0]; axisX.Title.Text = "Date"; axisX.ValueType = AxisValueType.DateTime; axisX.LabelsAngle = 90; axisX.MajorDiv = 24 * 60 * 60; // Major division is one day in seconds. // Y-axis configuration. var axisY = chart.ViewXY.YAxes[0]; axisY.Title.Text = "Price"; // 2. Create a new StockSeries. var stockSeries = new StockSeries(chart.ViewXY, axisX, axisY); chart.ViewXY.StockSeries.Add(stockSeries); // 3. Configure the stock plot. stockSeries.Style = StockStyle.OptimizedCandleStick; stockSeries.FillBorder.Width = 1; stockSeries.Title.Text = "Example Inc."; // 4. Load data from a CSV file into series data points with LoadFromCSV. /* * The data in CSV file has to be organized in columns in the following order: * Column 0: Date (DateTime) * Column 1: Open (double) * Column 2: Close (double) * Column 3: High (double) * Column 4: Low (double) * Column 5: Volume (int) * Column 6: Transaction (double) */ stockSeries.LoadFromCSV("../../../data/data.csv", SeparatorCSV.Semicolon); // 5. Create a reference to the loaded data points. var stockData = stockSeries.DataPoints; // 6. Generate data for series, which matches closed values. var closeData = new SeriesPoint[stockData.Length]; for (var i = 0; i < stockData.Length; i++) { closeData[i] = new SeriesPoint() { X = axisX.DateTimeToAxisValue(stockData[i].Date), Y = stockData[i].Close }; } // 7. Create a new PointLineSeries to show the dynamic in closed values on Stock Exchange. var lineSeries = new PointLineSeries(); lineSeries.Title.Text = "Example Inc."; lineSeries.Points = closeData; chart.ViewXY.PointLineSeries.Add(lineSeries); // 8. Auto-scale X- and Y-axes. chart.ViewXY.ZoomToFit(); #region Hidden polishing CustomizeChart(chart); #endregion // Call EndUpdate to enable rendering again. chart.EndUpdate(); }
private void OnChannelAdded(ChannelToken token) { try { var samecount = m_chart.ViewXY.PointLineSeries.Where(o => o.Tag == token).Count(); if (samecount >= 2) //每次添加两个相同Tag { return; } if (ViewModel == null || !(token is BaseWaveChannelToken)) { return; } m_chart.BeginUpdate(); var axisYnone = m_chart.ViewXY.YAxes.Where(o => o.Units.Text == "none").SingleOrDefault(); m_chart.ViewXY.YAxes.Remove(axisYnone); BaseWaveChannelToken vToken = token as BaseWaveChannelToken; //Create new Y axis for each series AxisY axisY = new AxisY(m_chart.ViewXY); axisY.Tag = vToken; axisY.Title.Visible = false; axisY.AxisThickness = 2; axisY.AxisColor = Color.FromArgb(0xff, 0xff, 0xff, 0xff);//Color.FromArgb(100, 135, 205, 238); m_chart.ViewXY.YAxes.Add(axisY); //Create a point-line series int count = m_chart.ViewXY.PointLineSeries.Count / 2; while (count > 15) { count -= 15; } //Color color = DefaultColors.SeriesForBlackBackgroundWpf[count]; PointLineSeries series = new PointLineSeries(m_chart.ViewXY, m_chart.ViewXY.XAxes[0], axisY); series.MouseInteraction = false; series.LineStyle.Color = vToken.SolidColorBrush.Color; //color; series.LineStyle.AntiAliasing = LineAntialias.None; series.LineStyle.Width = 1; series.Tag = vToken; series.Title.Text = vToken.DisplayName;//htzk123 series.Title.Font = new WpfFont(System.Drawing.FontFamily.GenericSansSerif, 10f, System.Drawing.FontStyle.Bold); series.Title.Color = ChartTools.CalcGradient(Colors.White, Colors.White, 50); series.Title.HorizontalAlign = AlignmentHorizontal.Left; series.Title.VerticalAlign = AlignmentVertical.Top; series.Title.MoveByMouse = false; series.Title.MouseInteraction = false; series.Title.Offset = new PointIntXY(5, 5); series.Title.Visible = false; AxisY axisYPhase = new AxisY(m_chart.ViewXY); axisYPhase.Tag = vToken; axisYPhase.Title.Visible = false; axisYPhase.AxisThickness = 2; axisYPhase.AxisColor = Color.FromArgb(0xff, 0xff, 0xff, 0xff);//Color.FromArgb(100, 135, 205, 238); m_chart.ViewXY.YAxes.Add(axisYPhase); PointLineSeries phaseSeries = new PointLineSeries(m_chart.ViewXY, m_chart.ViewXY.XAxes[0], axisYPhase); phaseSeries.MouseInteraction = false; phaseSeries.LineStyle.Color = vToken.SolidColorBrush.Color; //color; phaseSeries.LineStyle.AntiAliasing = LineAntialias.None; phaseSeries.LineStyle.Width = 1; phaseSeries.Tag = vToken; phaseSeries.Title.Text = vToken.DisplayName + "相位";//htzk123 phaseSeries.Visible = false; if (m_chart.ViewXY.Annotations.Count == 0) { CreateCalloutAnnotation(); CreateFAAnnotation(); } //Update Annotation AnnotationXY annotation = m_chart.ViewXY.Annotations[1]; string[] branches = annotation.Text.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); StringBuilder sb = new StringBuilder(); for (int i = 0; i < branches.Length; i++) { sb.AppendLine(branches[i]); } string freText = "F"; string ampText = "A"; if (vToken.VData != null && vToken.VData.FFTLength != 0 && vToken.VData.Frequency != null && vToken.VData.Amplitude != null && vToken.VData.Phase != null) { int length = vToken.VData.FFTLength; SeriesPoint[] points = new SeriesPoint[length]; SeriesPoint[] phasePoints = new SeriesPoint[length]; for (int i = 0; i < length; i++) { points[i] = new SeriesPoint(vToken.VData.Frequency[i], vToken.VData.Amplitude[i]); phasePoints[i] = new SeriesPoint(vToken.VData.Frequency[i], vToken.VData.Phase[i]); } series.Points = points; phaseSeries.Points = phasePoints; var fftValuesDict = vToken.VData.Amplitude.Select((s, i) => new { Key = i, Value = s }).OrderByDescending(o => o.Value).Take(6); foreach (var item in fftValuesDict) { freText += string.Format("{0,6}|", vToken.VData.Frequency[item.Key].ToString("0.00")); ampText += string.Format("{0,6}|", item.Value.ToString("0.00")); } } sb.AppendLine(freText); sb.AppendLine(ampText); annotation.Text = sb.ToString(); m_chart.ViewXY.PointLineSeries.Add(series); m_chart.ViewXY.PointLineSeries.Add(phaseSeries); m_chart.ViewXY.AxisLayout.Segments.Add(new YAxisSegment(m_chart.ViewXY.AxisLayout)); axisY.SegmentIndex = m_chart.ViewXY.AxisLayout.Segments.Count - 1; axisYPhase.SegmentIndex = m_chart.ViewXY.AxisLayout.Segments.Count - 1; m_chart.ViewXY.Annotations[0].AssignYAxisIndex = -1; m_chart.ViewXY.Annotations[0].AssignYAxisIndex = 0; m_chart.ViewXY.ZoomToFit(); m_chart.EndUpdate(); } catch (Exception ex) { EventAggregatorService.Instance.EventAggregator.GetEvent <ThrowExceptionEvent>().Publish(Tuple.Create <string, Exception>("数据回放-频域-添加通道", ex)); } }
private void OnChannelDataChanged(IEnumerable <ChannelToken> tokens) { if (tokens == null || tokens.Count() == 0) { return; } try { m_chart.BeginUpdate(); foreach (var token in tokens) { PointLineSeries series = m_chart.ViewXY.PointLineSeries.Where(o => o.Tag == token).Single(); if (token is BaseDivfreChannelToken) { var divToken = token as BaseDivfreChannelToken; SeriesPoint[] points = new SeriesPoint[divToken.DataContracts.Count]; for (int i = 0; i < points.Length; i++) { points[i].X = m_chart.ViewXY.XAxes[0].DateTimeToAxisValue(divToken.DataContracts[i].ACQDatetime); points[i].Y = divToken.DataContracts[i].Result.Value; } series.Points = points; } else if (token is BaseWaveChannelToken) { var vToken = token as BaseWaveChannelToken; SeriesPoint[] points = new SeriesPoint[vToken.DataContracts.Count]; for (int i = 0; i < points.Length; i++) { points[i].X = m_chart.ViewXY.XAxes[0].DateTimeToAxisValue(vToken.DataContracts[i].ACQDatetime); points[i].Y = vToken.DataContracts[i].Result.Value; } series.Points = points; } else if (token is BaseAlarmChannelToken) { var anToken = token as BaseAlarmChannelToken; SeriesPoint[] points = new SeriesPoint[anToken.DataContracts.Count]; for (int i = 0; i < points.Length; i++) { points[i].X = m_chart.ViewXY.XAxes[0].DateTimeToAxisValue(anToken.DataContracts[i].ACQDatetime); points[i].Y = anToken.DataContracts[i].Result.Value; } series.Points = points; } } double minX = m_chart.ViewXY.PointLineSeries.SelectMany(o => o.Points).Select(o => o.X).Min(); double maxX = m_chart.ViewXY.PointLineSeries.SelectMany(o => o.Points).Select(o => o.X).Max(); m_chart.ViewXY.XAxes[0].SetRange(minX, maxX); m_chart.EndUpdate(); if (m_chart.ViewXY.LineSeriesCursors[0].ValueAtXAxis <m_chart.ViewXY.XAxes[0].Minimum || m_chart.ViewXY.LineSeriesCursors[0].ValueAtXAxis> m_chart.ViewXY.XAxes[0].Maximum) { m_chart.ViewXY.LineSeriesCursors[0].ValueAtXAxis = (m_chart.ViewXY.XAxes[0].Minimum + m_chart.ViewXY.XAxes[0].Maximum) / 2.0; } else { UpdateCursorResult(m_chart.ViewXY.LineSeriesCursors[0].ValueAtXAxis); } } catch (Exception ex) { EventAggregatorService.Instance.EventAggregator.GetEvent <ThrowExceptionEvent>().Publish(Tuple.Create <string, Exception>("数据回放-趋势趋势-数据更新", ex)); m_chart.EndUpdate(); } }
private void OnChannelAdded(ChannelToken token) { try { m_chart.BeginUpdate(); if (token is VibrationChannelToken) { var vToken = token as VibrationChannelToken; string unit = string.Empty; switch (vToken.DataContracts[0].Unit) { case 0: unit = "m/s2"; break; case 1: unit = "mm/s"; break; case 2: unit = "um"; break; } var axisY = m_chart.ViewXY.YAxes.Where(o => o.Units.Text == unit).SingleOrDefault(); if (axisY == null) { axisY = new AxisY(m_chart.ViewXY); axisY.Title.Font = new WPFFont(System.Drawing.FontFamily.GenericSansSerif, 10, System.Drawing.FontStyle.Regular); axisY.AxisThickness = 2; axisY.AxisColor = Color.FromArgb(100, 135, 205, 238); if (unit == "m/s2") { axisY.Title.Text = "加速度(" + unit + ")"; } else if (unit == "mm/s") { axisY.Title.Text = "速度(" + unit + ")"; } else if (unit == "um") { axisY.Title.Text = "位移(" + unit + ")"; } axisY.Units.Text = unit; axisY.SetRange(0, 10); axisY.SegmentIndex = 0; m_chart.ViewXY.YAxes.Add(axisY); m_chart.ViewXY.AxisLayout.Segments[0].Height = 2; if (m_chart.ViewXY.Annotations.Count == 0) { CreateAnnotation(); } } PointLineSeries series = new PointLineSeries(m_chart.ViewXY, m_chart.ViewXY.XAxes[0], axisY); series.MouseInteraction = false; series.Title.Text = vToken.Channel.Name + vToken.Channel.MSSN + "(" + unit + ")"; var childSeries = m_chart.ViewXY.PointLineSeries.Where(o => (o.Tag is DivFreChannelToken) && (((DivFreChannelToken)o.Tag).Channel.ChannelID == vToken.Channel.ChannelID)).SingleOrDefault(); if (childSeries != null) { series.LineStyle.Color = childSeries.LineStyle.Color; series.Title.Color = childSeries.Title.Color; } else { int count = m_chart.ViewXY.PointLineSeries.Where(o => o.Tag is VibrationChannelToken).Count(); while (count > 15) { count -= 15; } Color color = DefaultColors.SeriesForBlackBackgroundWPF[count]; series.LineStyle.Color = color; series.Title.Color = color; } series.LineStyle.AntiAliasing = LineAntialias.Normal; series.LineStyle.Width = 1; series.Tag = token; SeriesPoint[] points = new SeriesPoint[vToken.DataContracts.Length]; for (int i = 0; i < points.Length; i++) { points[i].X = m_chart.ViewXY.XAxes[0].DateTimeToAxisValue(vToken.DataContracts[i].Date); points[i].Y = vToken.DataContracts[i].Value; } series.Points = points; m_chart.ViewXY.PointLineSeries.Add(series); double minX = m_chart.ViewXY.PointLineSeries.SelectMany(o => o.Points).Select(o => o.X).Min(); double maxX = m_chart.ViewXY.PointLineSeries.SelectMany(o => o.Points).Select(o => o.X).Max(); m_chart.ViewXY.XAxes[0].SetRange(minX, maxX); double maxValue = vToken.DataContracts.Select(o => o.Value).Max(); double minValue = vToken.DataContracts.Select(o => o.Value).Min(); if (minValue < axisY.Minimum + 5) { axisY.Minimum = minValue - 5; } if (maxValue > axisY.Maximum - 5) { axisY.Maximum = maxValue + 5; } } else if (token is AnalogChannelToken) { var anToken = token as AnalogChannelToken; if (anToken.DataContracts != null) { string unit = string.Empty; switch (anToken.DataContracts[0].Unit) { case 3: unit = "°C"; break; case 4: unit = "Pa"; break; case 5: unit = "rpm"; break; } var axisY = m_chart.ViewXY.YAxes.Where(o => o.Units.Text == unit).SingleOrDefault(); if (axisY == null) { axisY = new AxisY(m_chart.ViewXY); axisY.Title.Font = new WPFFont(System.Drawing.FontFamily.GenericSansSerif, 10, System.Drawing.FontStyle.Regular); axisY.AxisThickness = 2; axisY.AxisColor = Color.FromArgb(100, 135, 205, 238); if (unit == "°C") { axisY.Title.Text = "温度(" + unit + ")"; } else if (unit == "Pa") { axisY.Title.Text = "压力(" + unit + ")"; } else if (unit == "rpm") { axisY.Title.Text = "转速(" + unit + ")"; } axisY.Units.Text = unit; axisY.SetRange(0, 10); axisY.SegmentIndex = 1; m_chart.ViewXY.YAxes.Add(axisY); m_chart.ViewXY.AxisLayout.Segments[1].Height = 1; if (m_chart.ViewXY.Annotations.Count == 0) { CreateAnnotation(); } } PointLineSeries series = new PointLineSeries(m_chart.ViewXY, m_chart.ViewXY.XAxes[0], axisY); series.MouseInteraction = false; series.Title.Text = anToken.Channel.Name + anToken.Channel.MSSN + "(" + unit + ")"; int count = m_chart.ViewXY.PointLineSeries.Where(o => o.Tag is AnalogChannelToken).Count(); while (count > 15) { count -= 15; } Color color = DefaultColors.SeriesForBlackBackgroundWPF[count]; series.LineStyle.Color = color; series.Title.Color = color; series.LineStyle.AntiAliasing = LineAntialias.Normal; series.LineStyle.Width = 1; series.Tag = token; SeriesPoint[] points = new SeriesPoint[anToken.DataContracts.Length]; for (int i = 0; i < points.Length; i++) { points[i].X = m_chart.ViewXY.XAxes[0].DateTimeToAxisValue(anToken.DataContracts[i].Date); points[i].Y = anToken.DataContracts[i].Value; } series.Points = points; m_chart.ViewXY.PointLineSeries.Add(series); double minX = m_chart.ViewXY.PointLineSeries.SelectMany(o => o.Points).Select(o => o.X).Min(); double maxX = m_chart.ViewXY.PointLineSeries.SelectMany(o => o.Points).Select(o => o.X).Max(); m_chart.ViewXY.XAxes[0].SetRange(minX, maxX); double maxValue = anToken.DataContracts.Select(o => o.Value).Max(); double minValue = anToken.DataContracts.Select(o => o.Value).Min(); if (minValue < axisY.Minimum + 5) { axisY.Minimum = minValue - 5; } if (maxValue > axisY.Maximum - 5) { axisY.Maximum = maxValue + 5; } } } else if (token is DivFreChannelToken) { var divToken = token as DivFreChannelToken; string unit = string.Empty; switch (divToken.DataContracts[0].Unit) { case 0: unit = "分频-m/s2"; break; case 1: unit = "分频-mm/s"; break; case 2: unit = "分频-um"; break; } var axisY = m_chart.ViewXY.YAxes.Where(o => o.Units.Text == unit).SingleOrDefault(); if (axisY == null) { axisY = new AxisY(m_chart.ViewXY); axisY.Title.Font = new WPFFont(System.Drawing.FontFamily.GenericSansSerif, 10, System.Drawing.FontStyle.Regular); axisY.AxisThickness = 2; axisY.AxisColor = Color.FromArgb(100, 135, 205, 238); if (unit == "分频-m/s2") { axisY.Title.Text = "加速度(" + unit + ")"; } else if (unit == "分频-mm/s") { axisY.Title.Text = "速度(" + unit + ")"; } else if (unit == "分频-um") { axisY.Title.Text = "位移(" + unit + ")"; } axisY.Units.Text = unit; axisY.SetRange(0, 10); axisY.SegmentIndex = 0; m_chart.ViewXY.YAxes.Add(axisY); m_chart.ViewXY.AxisLayout.Segments[0].Height = 2; if (m_chart.ViewXY.Annotations.Count == 0) { CreateAnnotation(); } } Random rand = new Random(); PointLineSeries series = new PointLineSeries(m_chart.ViewXY, m_chart.ViewXY.XAxes[0], axisY); series.MouseInteraction = false; series.Title.Text = divToken.Channel.FreDescription + "(" + unit + ")"; var parentSeries = m_chart.ViewXY.PointLineSeries.Where(o => (o.Tag is VibrationChannelToken) && (((VibrationChannelToken)o.Tag).Channel.ChannelID == divToken.Channel.ChannelID)).SingleOrDefault(); if (parentSeries != null) { series.LineStyle.Color = parentSeries.LineStyle.Color; series.Title.Color = parentSeries.Title.Color; } else { int count = m_chart.ViewXY.PointLineSeries.Where(o => o.Tag is DivFreChannelToken).Count(); while (count > 15) { count -= 15; } Color color = DefaultColors.SeriesForBlackBackgroundWPF[count]; series.LineStyle.Color = color; series.Title.Color = color; } series.LineStyle.Pattern = LinePattern.Dot; series.LineStyle.AntiAliasing = LineAntialias.Normal; series.LineStyle.Width = 1; series.Tag = token; SeriesPoint[] points = new SeriesPoint[divToken.DataContracts.Length]; for (int i = 0; i < points.Length; i++) { points[i].X = m_chart.ViewXY.XAxes[0].DateTimeToAxisValue(divToken.DataContracts[i].Date); points[i].Y = divToken.DataContracts[i].FreMV; } series.Points = points; m_chart.ViewXY.PointLineSeries.Add(series); double minX = m_chart.ViewXY.PointLineSeries.SelectMany(o => o.Points).Select(o => o.X).Min(); double maxX = m_chart.ViewXY.PointLineSeries.SelectMany(o => o.Points).Select(o => o.X).Max(); m_chart.ViewXY.XAxes[0].SetRange(minX, maxX); double maxValue = divToken.DataContracts.Select(o => o.FreMV).Max(); double minValue = divToken.DataContracts.Select(o => o.FreMV).Min(); if (minValue < axisY.Minimum + 5) { axisY.Minimum = minValue - 5; } if (maxValue > axisY.Maximum - 5) { axisY.Maximum = maxValue + 5; } } m_chart.ViewXY.Annotations[0].AssignYAxisIndex = -1; m_chart.ViewXY.Annotations[0].AssignYAxisIndex = 0; m_chart.EndUpdate(); if (m_chart.ViewXY.LineSeriesCursors[0].ValueAtXAxis <m_chart.ViewXY.XAxes[0].Minimum || m_chart.ViewXY.LineSeriesCursors[0].ValueAtXAxis> m_chart.ViewXY.XAxes[0].Maximum) { m_chart.ViewXY.LineSeriesCursors[0].ValueAtXAxis = (m_chart.ViewXY.XAxes[0].Minimum + m_chart.ViewXY.XAxes[0].Maximum) / 2.0; } else { UpdateCursorResult(m_chart.ViewXY.LineSeriesCursors[0].ValueAtXAxis); } } catch (Exception ex) { EventAggregatorService.Instance.EventAggregator.GetEvent <ThrowExceptionEvent>().Publish(Tuple.Create <string, Exception>("数据回放-通频趋势-添加通道", ex)); m_chart.EndUpdate(); } }
public Form1() { InitializeComponent(); // Create chart instance and store it member variable. var chart = new LightningChartUltimate(/*Type your License key here...*/); // Set chart control into the parent container. chart.Parent = this; //Set form as parent chart.Dock = DockStyle.Fill; //Maximize to parent client area // Prepare data for line-series. var rand = new Random(); int pointCounter = 70; var data = new SeriesPoint[pointCounter]; for (int i = 0; i < pointCounter; i++) { data[i].X = (double)i; data[i].Y = rand.Next(0, 100); } // Add PointLineSeries for variable-interval data, progressing by X. var series = new PointLineSeries(chart.ViewXY, chart.ViewXY.XAxes[0], chart.ViewXY.YAxes[0]); series.LineStyle.Color = Color.Orange; series.Title.Text = "Random data"; series.Points = data; chart.ViewXY.PointLineSeries.Add(series); // Prepare new data for new line-series with differen algorithm. data = new SeriesPoint[pointCounter]; for (int i = 0; i < pointCounter; i++) { data[i].X = (double)i; data[i].Y = Math.Sin(i * 0.2) * 50 + 50; } // Color for second axis and series Color color = Color.FromArgb(255, 255, 67, 0); // 1. Create y-axis instance var newAxisY = new AxisY(chart.ViewXY); newAxisY.AxisColor = color; newAxisY.MajorGrid.Visible = false; // 2. Add the y-axis into list of YAxes chart.ViewXY.YAxes.Add(newAxisY); // 3. Add one more PointLineSeries for sinusoidal data. // Configure by setting another color and pattern for the line. var series2 = new PointLineSeries(); // = new PointLineSeries(chart.ViewXY, chart.ViewXY.XAxes[0], newAxisY /*(or chart.ViewXY.YAxes[1])*/); series2.LineStyle.Color = color; series2.LineStyle.Pattern = LinePattern.DashDot; series2.Title.Text = "Sinus data"; series2.Points = data; // 4. If PointLineSeries constructor is empty or with wrong axes instances. // Assign axis index to apply current series to specific axes. series2.AssignXAxisIndex = 0; series2.AssignYAxisIndex = 1; // 5. Add the series into list of point-line-series. chart.ViewXY.PointLineSeries.Add(series2); // Auto-scale X and Y axes. chart.ViewXY.ZoomToFit(); #region Hiden polishing CusomizeChart(chart); #endregion }
private void OnChannelAdded(ChannelToken token) { try { m_chart.BeginUpdate(); var axisYnone = m_chart.ViewXY.YAxes.Where(o => o.Units.Text == "none").SingleOrDefault(); m_chart.ViewXY.YAxes.Remove(axisYnone); #region if (token is BaseDivfreChannelToken) { var vToken = token as BaseDivfreChannelToken; string unit = (vToken.DataContracts[0].Unit == null) ? "" : vToken.DataContracts[0].Unit; var axisY = m_chart.ViewXY.YAxes.Where(o => o.Units.Text == unit).SingleOrDefault(); if (axisY == null) { axisY = new AxisY(m_chart.ViewXY); axisY.Title.Font = new WpfFont(System.Drawing.FontFamily.GenericSansSerif, 10, System.Drawing.FontStyle.Regular); axisY.AxisThickness = 2; axisY.AxisColor = Color.FromArgb(0xff, 0xff, 0xff, 0xff);//Color.FromArgb(100, 135, 205, 238); if (unit == "m/s^2") { axisY.Title.Text = "加速度(" + unit + ")"; } else if (unit == "mm/s") { axisY.Title.Text = "速度(" + unit + ")"; } else if (unit == "um") { axisY.Title.Text = "位移(" + unit + ")"; } else { axisY.Title.Text = unit; } axisY.Units.Text = unit; axisY.SetRange(0, 10); axisY.SegmentIndex = 0; m_chart.ViewXY.YAxes.Add(axisY); m_chart.ViewXY.AxisLayout.Segments[0].Height = 2; if (m_chart.ViewXY.Annotations.Count == 0) { CreateAnnotation(); } } PointLineSeries series = new PointLineSeries(m_chart.ViewXY, m_chart.ViewXY.XAxes[0], axisY); series.MouseInteraction = false; series.Title.Text = vToken.DisplayName + "(" + unit + ")"; var childSeries = m_chart.ViewXY.PointLineSeries.Where(o => (o.Tag is DivFreChannelToken) && (((DivFreChannelToken)o.Tag).Guid == vToken.Guid)).SingleOrDefault(); if (childSeries != null) { series.LineStyle.Color = childSeries.LineStyle.Color; series.Title.Color = childSeries.Title.Color; } else { int count = m_chart.ViewXY.PointLineSeries.Where(o => o.Tag is BaseWaveChannelToken).Count(); while (count > 15) { count -= 15; } Color color = DefaultColors.SeriesForBlackBackgroundWpf[count]; series.LineStyle.Color = color; series.Title.Color = color; } series.LineStyle.AntiAliasing = LineAntialias.Normal; series.LineStyle.Width = 1; series.Tag = token; SeriesPoint[] points = new SeriesPoint[vToken.DataContracts.Count]; for (int i = 0; i < points.Length; i++) { points[i].X = m_chart.ViewXY.XAxes[0].DateTimeToAxisValue(vToken.DataContracts[i].ACQDatetime); points[i].Y = vToken.DataContracts[i].Result.Value; } series.Points = points; m_chart.ViewXY.PointLineSeries.Add(series); double minX = m_chart.ViewXY.PointLineSeries.SelectMany(o => o.Points).Select(o => o.X).Min(); double maxX = m_chart.ViewXY.PointLineSeries.SelectMany(o => o.Points).Select(o => o.X).Max(); m_chart.ViewXY.XAxes[0].SetRange(minX, maxX); double maxValue = vToken.DataContracts.Select(o => o.Result.Value).Max(); double minValue = vToken.DataContracts.Select(o => o.Result.Value).Min(); if (minValue < axisY.Minimum + 5) { axisY.Minimum = minValue - 5; } if (maxValue > axisY.Maximum - 5) { axisY.Maximum = maxValue + 5; } } #endregion #region else if (token is BaseAlarmChannelToken) { var anToken = token as BaseAlarmChannelToken; if (anToken.DataContracts != null) { string unit = (anToken.DataContracts[0].Unit == null) ? "": anToken.DataContracts[0].Unit; var axisY = m_chart.ViewXY.YAxes.Where(o => o.Units.Text == unit).SingleOrDefault(); if (axisY == null) { axisY = new AxisY(m_chart.ViewXY); axisY.Title.Font = new WpfFont(System.Drawing.FontFamily.GenericSansSerif, 10, System.Drawing.FontStyle.Regular); axisY.AxisThickness = 2; axisY.AxisColor = Color.FromArgb(0xff, 0xff, 0xff, 0xff);//Color.FromArgb(100, 135, 205, 238); if (unit == "°C") { axisY.Title.Text = "温度(" + unit + ")"; } else if (unit == "Pa") { axisY.Title.Text = "压力(" + unit + ")"; } else if (unit == "rpm") { axisY.Title.Text = "转速(" + unit + ")"; } else { axisY.Title.Text = unit; } axisY.Units.Text = unit; axisY.SetRange(0, 10); axisY.SegmentIndex = 1; m_chart.ViewXY.YAxes.Add(axisY); m_chart.ViewXY.AxisLayout.Segments[1].Height = 1; if (m_chart.ViewXY.Annotations.Count == 0) { CreateAnnotation(); } } PointLineSeries series = new PointLineSeries(m_chart.ViewXY, m_chart.ViewXY.XAxes[0], axisY); series.MouseInteraction = false; series.Title.Text = anToken.DisplayName + "(" + unit + ")"; int count = m_chart.ViewXY.PointLineSeries.Where(o => o.Tag is BaseAlarmChannelToken).Count(); while (count > 15) { count -= 15; } Color color = DefaultColors.SeriesForBlackBackgroundWpf[count]; series.LineStyle.Color = color; series.Title.Color = color; series.LineStyle.AntiAliasing = LineAntialias.Normal; series.LineStyle.Width = 1; series.Tag = token; SeriesPoint[] points = new SeriesPoint[anToken.DataContracts.Count]; for (int i = 0; i < points.Length; i++) { points[i].X = m_chart.ViewXY.XAxes[0].DateTimeToAxisValue(anToken.DataContracts[i].ACQDatetime); points[i].Y = anToken.DataContracts[i].Result.Value; } series.Points = points; m_chart.ViewXY.PointLineSeries.Add(series); double minX = m_chart.ViewXY.PointLineSeries.SelectMany(o => o.Points).Select(o => o.X).Min(); double maxX = m_chart.ViewXY.PointLineSeries.SelectMany(o => o.Points).Select(o => o.X).Max(); m_chart.ViewXY.XAxes[0].SetRange(minX, maxX); double maxValue = anToken.DataContracts.Select(o => o.Result.Value).Max(); double minValue = anToken.DataContracts.Select(o => o.Result.Value).Min(); if (minValue < axisY.Minimum + 5) { axisY.Minimum = minValue - 5; } if (maxValue > axisY.Maximum - 5) { axisY.Maximum = maxValue + 5; } } } #endregion #region else if (token is DivFreChannelToken) { var divToken = token as DivFreChannelToken; string unit = (divToken.SlotDataContracts[0].Unit == null) ? "" : divToken.SlotDataContracts[0].Unit; var axisY = m_chart.ViewXY.YAxes.Where(o => o.Units.Text == unit).SingleOrDefault(); if (axisY == null) { axisY = new AxisY(m_chart.ViewXY); axisY.Title.Font = new WpfFont(System.Drawing.FontFamily.GenericSansSerif, 10, System.Drawing.FontStyle.Regular); axisY.AxisThickness = 2; axisY.AxisColor = Color.FromArgb(0xff, 0xff, 0xff, 0xff);//Color.FromArgb(100, 135, 205, 238); if (unit == "分频-m/s^2") { axisY.Title.Text = "加速度(" + unit + ")"; } else if (unit == "分频-mm/s") { axisY.Title.Text = "速度(" + unit + ")"; } else if (unit == "分频-um") { axisY.Title.Text = "位移(" + unit + ")"; } axisY.Units.Text = unit; axisY.SetRange(0, 10); axisY.SegmentIndex = 0; m_chart.ViewXY.YAxes.Add(axisY); m_chart.ViewXY.AxisLayout.Segments[0].Height = 1; if (m_chart.ViewXY.Annotations.Count == 0) { CreateAnnotation(); } } Random rand = new Random(); PointLineSeries series = new PointLineSeries(m_chart.ViewXY, m_chart.ViewXY.XAxes[0], axisY); series.MouseInteraction = false; series.Title.Text = divToken.DataContracts[0].DescriptionFre + "(" + unit + ")"; var parentSeries = m_chart.ViewXY.PointLineSeries.Where(o => (o.Tag is BaseWaveChannelToken) && (((BaseWaveChannelToken)o.Tag).Guid == divToken.Guid)).SingleOrDefault(); if (parentSeries != null) { series.LineStyle.Color = parentSeries.LineStyle.Color; series.Title.Color = parentSeries.Title.Color; } else { int count = m_chart.ViewXY.PointLineSeries.Where(o => o.Tag is DivFreChannelToken).Count(); while (count > 15) { count -= 15; } Color color = DefaultColors.SeriesForBlackBackgroundWpf[count]; series.LineStyle.Color = color; series.Title.Color = color; } series.LineStyle.Pattern = LinePattern.Dot; series.LineStyle.AntiAliasing = LineAntialias.Normal; series.LineStyle.Width = 1; series.Tag = token; SeriesPoint[] points = new SeriesPoint[divToken.DataContracts.Count]; for (int i = 0; i < points.Length; i++) { var time = (from p in divToken.SlotDataContracts where p.RecordLab == divToken.DataContracts[i].RecordLab select p.ACQDatetime).FirstOrDefault(); if (time == null) { continue; } points[i].X = m_chart.ViewXY.XAxes[0].DateTimeToAxisValue(time); points[i].Y = divToken.DataContracts[i].Result.Value; } series.Points = points; m_chart.ViewXY.PointLineSeries.Add(series); double minX = m_chart.ViewXY.PointLineSeries.SelectMany(o => o.Points).Select(o => o.X).Min(); double maxX = m_chart.ViewXY.PointLineSeries.SelectMany(o => o.Points).Select(o => o.X).Max(); m_chart.ViewXY.XAxes[0].SetRange(minX, maxX); double maxValue = divToken.DataContracts.Select(o => o.Result.Value).Max(); double minValue = divToken.DataContracts.Select(o => o.Result.Value).Min(); if (minValue < axisY.Minimum + 5) { axisY.Minimum = minValue - 5; } if (maxValue > axisY.Maximum - 5) { axisY.Maximum = maxValue + 5; } } #endregion m_chart.ViewXY.Annotations[0].AssignYAxisIndex = -1; m_chart.ViewXY.Annotations[0].AssignYAxisIndex = 0; m_chart.EndUpdate(); if (m_chart.ViewXY.LineSeriesCursors[0].ValueAtXAxis <m_chart.ViewXY.XAxes[0].Minimum || m_chart.ViewXY.LineSeriesCursors[0].ValueAtXAxis> m_chart.ViewXY.XAxes[0].Maximum) { m_chart.ViewXY.LineSeriesCursors[0].ValueAtXAxis = (m_chart.ViewXY.XAxes[0].Minimum + m_chart.ViewXY.XAxes[0].Maximum) / 2.0; } else { UpdateCursorResult(m_chart.ViewXY.LineSeriesCursors[0].ValueAtXAxis); } } catch (Exception ex) { EventAggregatorService.Instance.EventAggregator.GetEvent <ThrowExceptionEvent>().Publish(Tuple.Create <string, Exception>("数据回放-趋势趋势-添加通道", ex)); m_chart.EndUpdate(); } }
public MainWindow() { InitializeComponent(); // Create chart instance and store it member variable var chart = new LightningChartUltimate(/*Set your License key here..*/); // Set chart control into the parent container. (Content as Grid).Children.Add(chart); // Prepare data for line-series. var rand = new Random(); int pointCounter = 70; var data = new SeriesPoint[pointCounter]; for (int i = 0; i < pointCounter; i++) { data[i].X = (double)i; data[i].Y = rand.Next(0, 100); } // Add PointLineSeries for variable-interval data, progressing by X. var series = new PointLineSeries(chart.ViewXY, chart.ViewXY.XAxes[0], chart.ViewXY.YAxes[0]); series.LineStyle.Color = Colors.Orange; series.Title.Text = "Random data"; series.Points = data; chart.ViewXY.PointLineSeries.Add(series); // 1. Prepare new data for new line-series with differen algorithm. data = new SeriesPoint[pointCounter]; for (int i = 0; i < pointCounter; i++) { data[i].X = (double)i; data[i].Y = Math.Sin(i * 0.2) * 50 + 50; } // 2. Add one more PointLineSeries for sinusoidal data. // Configure by setting another color and pattern for the line. var series2 = new PointLineSeries(chart.ViewXY, chart.ViewXY.XAxes[0], chart.ViewXY.YAxes[0]); series2.LineStyle.Color = Color.FromArgb(255, 255, 67, 0); series2.LineStyle.Pattern = LinePattern.DashDot; series2.Title.Text = "Sinus data"; // 3. Set data-points into series. series2.Points = data; // 4. Add the series into list of point-line-series. chart.ViewXY.PointLineSeries.Add(series2); // Auto-scale X and Y axes. chart.ViewXY.ZoomToFit(); #region Hiden polishing CusomizeChart(chart); #endregion }
private void ViewModel_SignalAddedPoint(IEnumerable <SignalToken> tokens) { try { _chart.BeginUpdate(); foreach (var token in tokens) { PointLineSeries series = _chart.ViewXY.PointLineSeries.Where(o => o.Tag == token).SingleOrDefault(); AxisY axisY = _chart.ViewXY.YAxes.Where(o => o.Tag == token).SingleOrDefault(); if (series.PointCount == 0 && token.BaseAlarmSignal.Result != null) { if (token.BaseAlarmSignal.Result > 0) { axisY.SetRange(token.BaseAlarmSignal.Result.Value * 0.5, token.BaseAlarmSignal.Result.Value * 1.5); } else { axisY.Maximum = token.BaseAlarmSignal.Result.Value * 0.5; axisY.Minimum = token.BaseAlarmSignal.Result.Value * 1.5; } } List <TrendPointData> datas = new List <TrendPointData>(); DateTime lasttime = new DateTime(); if (series.Points != null && series.Points.Count() > 0) { lasttime = _chart.ViewXY.XAxes[0].AxisValueToDateTime(series.Points.Select(p => p.X).Max()); } datas.AddRange(token.BaseAlarmSignal.BufferData.Where(p => p.ACQDateTime > lasttime)); if (token.BaseAlarmSignal.ACQDatetime > lasttime) { datas.Add(new TrendPointData(token.BaseAlarmSignal.ACQDatetime.Value, token.BaseAlarmSignal.Result.Value, token.BaseAlarmSignal.Unit, (int)token.BaseAlarmSignal.AlarmGrade)); } if (datas.Count == 0)//无数据直接返回 { continue; } SeriesPoint[] points = new SeriesPoint[1]; string unit = token.BaseAlarmSignal.Unit; for (int i = 0; i < datas.Count; i++) { m_dLatestX = _chart.ViewXY.XAxes[0].DateTimeToAxisValue(datas[i].ACQDateTime); points[0].X = m_dLatestX; points[0].Y = datas[i].Result; points[0].Tag = datas[i].Unit; AddMarker(series, points[0], datas[i].AlarmGrade); series.AddPoints(points, false); } } } catch (Exception ex) { EventAggregatorService.Instance.EventAggregator.GetEvent <ThrowExceptionEvent>().Publish(Tuple.Create <string, Exception>("趋势画面-实时刷新", ex)); } finally { if (_chart.ViewXY.LineSeriesCursors[0].ValueAtXAxis <_chart.ViewXY.XAxes[0].Minimum || _chart.ViewXY.LineSeriesCursors[0].ValueAtXAxis> _chart.ViewXY.XAxes[0].Maximum) { _chart.ViewXY.LineSeriesCursors[0].ValueAtXAxis = (_chart.ViewXY.XAxes[0].Minimum + _chart.ViewXY.XAxes[0].Maximum) / 2.0; } else if (chkTrace.IsChecked == true) { _chart.ViewXY.LineSeriesCursors[0].ValueAtXAxis = m_dLatestX; } _chart.EndUpdate(); } }
private void ViewModel_SignalRefresh(IEnumerable <SignalToken> tokens, DateTime time, double size, bool refresh) { try { _chart.BeginUpdate(); _chart.ViewXY.PointLineSeries.ForEach(p => p.SeriesEventMarkers.Clear()); foreach (var token in tokens) { PointLineSeries series = _chart.ViewXY.PointLineSeries.Where(o => o.Tag == token).SingleOrDefault(); AxisY axisY = _chart.ViewXY.YAxes.Where(o => o.Tag == token).SingleOrDefault(); if (token is BaseDivfreSignalToken) { var divToken = token as BaseDivfreSignalToken; if (divToken.DataContracts != null && divToken.DataContracts.Count > 0)//加入数据 { SeriesPoint[] points = new SeriesPoint[divToken.DataContracts.Count]; for (int i = 0; i < points.Length; i++) { points[i].X = _chart.ViewXY.XAxes[0].DateTimeToAxisValue(divToken.DataContracts[i].ACQDatetime); points[i].Y = divToken.DataContracts[i].Result.Value; AddMarker(series, points[i], divToken.DataContracts[i].AlarmGrade); } series.Points = points; axisY.Title.Text = divToken.DisplayName + "(" + divToken.DataContracts[0].Unit + ")"; if (refresh == true) { axisY.Maximum = divToken.UpperLimit; axisY.Minimum = divToken.LowerLimit; } } else { series.Clear(); } } else if (token is BaseWaveSignalToken) { var vToken = token as BaseWaveSignalToken; if (vToken.DataContracts != null && vToken.DataContracts.Count > 0)//加入数据 { SeriesPoint[] points = new SeriesPoint[vToken.DataContracts.Count]; for (int i = 0; i < points.Length; i++) { points[i].X = _chart.ViewXY.XAxes[0].DateTimeToAxisValue(vToken.DataContracts[i].ACQDatetime); points[i].Y = vToken.DataContracts[i].Result.Value; AddMarker(series, points[i], vToken.DataContracts[i].AlarmGrade); } series.Points = points; axisY.Title.Text = vToken.DisplayName + "(" + vToken.DataContracts[0].Unit + ")"; if (refresh == true) { axisY.Maximum = vToken.UpperLimit; axisY.Minimum = vToken.LowerLimit; } } else { series.Clear(); } } else if (token is BaseAlarmSignalToken) { var anToken = token as BaseAlarmSignalToken; if (anToken.DataContracts != null && anToken.DataContracts.Count > 0)//加入数据 { SeriesPoint[] points = new SeriesPoint[anToken.DataContracts.Count]; for (int i = 0; i < points.Length; i++) { points[i].X = _chart.ViewXY.XAxes[0].DateTimeToAxisValue(anToken.DataContracts[i].ACQDatetime); points[i].Y = anToken.DataContracts[i].Result.Value; AddMarker(series, points[i], anToken.DataContracts[i].AlarmGrade); } series.Points = points; axisY.Title.Text = anToken.DisplayName + "(" + anToken.DataContracts[0].Unit + ")"; if (refresh == true) { axisY.Maximum = anToken.UpperLimit; axisY.Minimum = anToken.LowerLimit; } } else { series.Clear(); } } } _chart.ViewXY.XAxes[0].SetRange(_chart.ViewXY.XAxes[0].DateTimeToAxisValue(time), _chart.ViewXY.XAxes[0].DateTimeToAxisValue(time.AddHours(size))); _chart.EndUpdate(); if (tokens != null && tokens.Count() > 0) { if (_chart.ViewXY.LineSeriesCursors[0].ValueAtXAxis <_chart.ViewXY.XAxes[0].Minimum || _chart.ViewXY.LineSeriesCursors[0].ValueAtXAxis> _chart.ViewXY.XAxes[0].Maximum) { _chart.ViewXY.LineSeriesCursors[0].ValueAtXAxis = (_chart.ViewXY.XAxes[0].Minimum + _chart.ViewXY.XAxes[0].Maximum) / 2.0; } else { UpdateCursorResult(_chart.ViewXY.LineSeriesCursors[0].ValueAtXAxis); } } } catch (Exception ex) { EventAggregatorService.Instance.EventAggregator.GetEvent <ThrowExceptionEvent>().Publish(Tuple.Create <string, Exception>("趋势-数据翻页", ex)); _chart.EndUpdate(); } }
private void ViewModel_SignalAdded(SignalToken token, DateTime time, double size) { try { _chart.BeginUpdate(); var axisYnone = _chart.ViewXY.YAxes.Where(o => o.Units.Text == "none").SingleOrDefault(); _chart.ViewXY.YAxes.Remove(axisYnone); #region AxisY axisY = new AxisY(_chart.ViewXY); if (token is BaseDivfreSignalToken) { var vToken = token as BaseDivfreSignalToken; string unit = (vToken.DataContracts == null || vToken.DataContracts.Count == 0 || vToken.DataContracts[0].Unit == null) ? "" : vToken.DataContracts[0].Unit; axisY.Title.Font = new WpfFont(System.Drawing.FontFamily.GenericSansSerif, 10, System.Drawing.FontStyle.Regular); axisY.AxisThickness = 2; axisY.AxisColor = vToken.SolidColorBrush.Color;//Color.FromArgb(0xff, 0xff, 0xff, 0xff);//Color.FromArgb(100, 135, 205, 238); axisY.Title.Text = vToken.DisplayName + "(" + unit + ")"; axisY.SetRange(0, 10); axisY.Tag = token; _chart.ViewXY.YAxes.Add(axisY); if (_chart.ViewXY.Annotations.Count == 0) { CreateAnnotation(); } PointLineSeries series = new PointLineSeries(_chart.ViewXY, _chart.ViewXY.XAxes[0], axisY); series.MouseInteraction = false; series.Title.Text = vToken.DisplayName + "(" + unit + ")"; series.LineStyle.Color = token.SolidColorBrush.Color; series.Title.Color = token.SolidColorBrush.Color; series.LineStyle.AntiAliasing = LineAntialias.Normal; series.LineStyle.Width = 1; series.Tag = token; if (vToken.DataContracts != null)//加入数据 { SeriesPoint[] points = new SeriesPoint[vToken.DataContracts.Count]; for (int i = 0; i < points.Length; i++) { points[i].X = _chart.ViewXY.XAxes[0].DateTimeToAxisValue(vToken.DataContracts[i].ACQDatetime); points[i].Y = vToken.DataContracts[i].Result.Value; AddMarker(series, points[i], vToken.DataContracts[i].AlarmGrade); } series.Points = points; } _chart.ViewXY.PointLineSeries.Add(series); if (vToken.DataContracts != null) { axisY.Maximum = vToken.UpperLimit; axisY.Minimum = vToken.LowerLimit; } } #endregion #region else if (token is BaseAlarmSignalToken) { var anToken = token as BaseAlarmSignalToken; if (anToken.DataContracts != null) { string unit = (anToken.DataContracts == null || anToken.DataContracts.Count == 0 || anToken.DataContracts[0].Unit == null) ? "" : anToken.DataContracts[0].Unit; axisY.Title.Font = new WpfFont(System.Drawing.FontFamily.GenericSansSerif, 10, System.Drawing.FontStyle.Regular); axisY.AxisThickness = 2; axisY.AxisColor = anToken.SolidColorBrush.Color; //Color.FromArgb(0xff, 0xff, 0xff, 0xff);//Color.FromArgb(100, 135, 205, 238); axisY.Title.Text = anToken.DisplayName + "(" + unit + ")"; axisY.SetRange(0, 10); axisY.Tag = token; _chart.ViewXY.YAxes.Add(axisY); if (_chart.ViewXY.Annotations.Count == 0) { CreateAnnotation(); } PointLineSeries series = new PointLineSeries(_chart.ViewXY, _chart.ViewXY.XAxes[0], axisY); series.MouseInteraction = false; series.Title.Text = anToken.DisplayName + "(" + unit + ")"; series.LineStyle.Color = token.SolidColorBrush.Color; series.Title.Color = token.SolidColorBrush.Color; series.LineStyle.AntiAliasing = LineAntialias.Normal; series.LineStyle.Width = 1; series.Tag = token; if (anToken.DataContracts != null) { SeriesPoint[] points = new SeriesPoint[anToken.DataContracts.Count]; for (int i = 0; i < points.Length; i++) { points[i].X = _chart.ViewXY.XAxes[0].DateTimeToAxisValue(anToken.DataContracts[i].ACQDatetime); points[i].Y = anToken.DataContracts[i].Result.Value; AddMarker(series, points[i], anToken.DataContracts[i].AlarmGrade); } series.Points = points; } _chart.ViewXY.PointLineSeries.Add(series); if (anToken.DataContracts != null) { axisY.Maximum = anToken.UpperLimit;; axisY.Minimum = anToken.LowerLimit;; } } } #endregion _chart.ViewXY.Annotations[0].AssignYAxisIndex = -1; _chart.ViewXY.Annotations[0].AssignYAxisIndex = 0; _chart.EndUpdate(); _chart.ViewXY.XAxes[0].SetRange(_chart.ViewXY.XAxes[0].DateTimeToAxisValue(time), _chart.ViewXY.XAxes[0].DateTimeToAxisValue(time.AddHours(size))); token.LimitChanged += Token_LimitChanged; axisY.RangeChanged += AxisY_RangeChanged; if (_chart.ViewXY.LineSeriesCursors[0].ValueAtXAxis <_chart.ViewXY.XAxes[0].Minimum || _chart.ViewXY.LineSeriesCursors[0].ValueAtXAxis> _chart.ViewXY.XAxes[0].Maximum) { _chart.ViewXY.LineSeriesCursors[0].ValueAtXAxis = (_chart.ViewXY.XAxes[0].Minimum + _chart.ViewXY.XAxes[0].Maximum) / 2.0; } else { UpdateCursorResult(_chart.ViewXY.LineSeriesCursors[0].ValueAtXAxis); } } catch (Exception ex) { EventAggregatorService.Instance.EventAggregator.GetEvent <ThrowExceptionEvent>().Publish(Tuple.Create <string, Exception>("趋势-添加信号", ex)); _chart.EndUpdate(); } }
public Form1() { InitializeComponent(); // Create chart. var chart = new LightningChartUltimate(); // Disable rendering before updating chart properties to improve performance // and to prevent unnecessary chart redrawing while changing multiple properties. chart.BeginUpdate(); // Set chart control into the parent container. chart.Parent = this; // Set form as parent. chart.Dock = DockStyle.Fill; //Maximize to parent client area. // Generate data for first series. var rand = new Random(); int pointCounter = 70; var data = new SeriesPoint[pointCounter]; for (int i = 0; i < pointCounter; i++) { data[i].X = (double)i; data[i].Y = rand.Next(0, 100); } // Define variables for X- and Y-axis. var axisX = chart.ViewXY.XAxes[0]; var axisY = chart.ViewXY.YAxes[0]; // Create a new PointLineSeries and set new color and line-pattern for it. var series = new PointLineSeries(chart.ViewXY, axisX, axisY); series.LineStyle.Color = Color.Orange; series.Title.Text = "Random data"; series.Points = data; chart.ViewXY.PointLineSeries.Add(series); // Generate new data for second series. data = new SeriesPoint[pointCounter]; for (int i = 0; i < pointCounter; i++) { data[i].X = (double)i; data[i].Y = Math.Sin(i * 0.2) * 50 + 50; } // Define color which will be used for new Y-axis and series coloring. Color color = Color.FromArgb(255, 255, 67, 0); // 1. Create a new Y-axis. var newAxisY = new AxisY(chart.ViewXY); newAxisY.AxisColor = color; newAxisY.MajorGrid.Visible = false; // 2. Add the new Y-axis into list of Y-axes. chart.ViewXY.YAxes.Add(newAxisY); // 3. Create another PointLineSeries and set new color and line-pattern for it. var series2 = new PointLineSeries(chart.ViewXY, axisX, newAxisY); series2.LineStyle.Color = color; series2.LineStyle.Pattern = LinePattern.DashDot; series2.Title.Text = "Sinus data"; series2.Points = data; // If PointLineSeries' constructor is empty or has wrong axes instances, // assign axis index to apply current series to specific axes. series2.AssignXAxisIndex = 0; series2.AssignYAxisIndex = 1; // 4. Add series to chart. chart.ViewXY.PointLineSeries.Add(series2); // Auto-scale X- and Y-axes. chart.ViewXY.ZoomToFit(); #region Hidden polishing CustomizeChart(chart); #endregion // Call EndUpdate to enable rendering again. chart.EndUpdate(); }