private void marker_MouseUp(object sender, MouseEventArgs e) { try { MouseButtonEventArgs arg = e as MouseButtonEventArgs; if (arg.ChangedButton == MouseButton.Right) { SeriesEventMarker marker = sender as SeriesEventMarker; marker.MouseUp -= marker_MouseUp; FreeformPointLineSeries fpls = marker.GetOwnerSeries() as FreeformPointLineSeries; int index = fpls.SeriesEventMarkers.IndexOf(marker); if (index == 0 || index == fpls.SeriesEventMarkers.Count - 1) { return; } m_chart.BeginUpdate(); fpls.SeriesEventMarkers.Remove(marker); FitSpline(fpls); m_chart.EndUpdate(); } } catch (Exception ex) { EventAggregatorService.Instance.EventAggregator.GetEvent <ThrowExceptionEvent>().Publish(Tuple.Create <string, Exception>("数据回放-动态拟合-移除点", ex)); } }
private void FplsMouseDoubleClick(object sender, MouseEventArgs e) { try { MouseButtonEventArgs arg = e as MouseButtonEventArgs; if (arg.ChangedButton == MouseButton.Left) { m_chart.BeginUpdate(); FreeformPointLineSeries fpls = sender as FreeformPointLineSeries; double dXValue, dYValue; double dXValue1, dYValue1; int iNearestIndex; Point p = e.GetPosition(m_chart); fpls.SolveNearestDataPointByCoord((Int32)(p.X), (Int32)(p.Y), out dXValue1, out dYValue1, out iNearestIndex); m_chart.ViewXY.XAxes[0].CoordToValue((Int32)(p.X), out dXValue, false); m_chart.ViewXY.YAxes[0].CoordToValue((Int32)(p.Y), out dYValue); p.X = dXValue; p.Y = dYValue; List <SeriesPoint> points = new List <SeriesPoint>(); points.AddRange(fpls.Points); SeriesPoint point = new SeriesPoint(p.X, p.Y); int index = fpls.SeriesEventMarkers.IndexOf(fpls.SeriesEventMarkers.Where(o => o.XValue >= p.X).First()); for (int i = index; i < fpls.SeriesEventMarkers.Count; i++) { fpls.SeriesEventMarkers[i].Label.Text = (i + 2).ToString(); } SeriesEventMarker marker = new SeriesEventMarker(fpls); marker.Label.Text = (index + 1).ToString(); marker.Label.HorizontalAlign = AlignmentHorizontal.Center; marker.Label.Shadow.Style = TextShadowStyle.Off; marker.Label.Shadow.ContrastColor = Color.FromArgb(150, 0, 0, 0); marker.XValue = p.X; marker.YValue = p.Y; marker.Symbol.BorderWidth = 0; marker.Symbol.GradientFill = GradientFillPoint.Edge; marker.Symbol.Color1 = Color.FromArgb(200, 0, 0, 255); marker.Symbol.Color2 = Color.FromArgb(100, 0, 0, 0); marker.VerticalPosition = SeriesEventMarkerVerticalPosition.AtYValue; marker.PositionChanged += marker_PositionChanged; marker.MouseUp += marker_MouseUp; fpls.SeriesEventMarkers.Insert(index, marker); m_chart.EndUpdate(); } } catch (Exception ex) { EventAggregatorService.Instance.EventAggregator.GetEvent <ThrowExceptionEvent>().Publish(Tuple.Create <string, Exception>("数据回放-动态拟合-添加点", ex)); } }
private void FitSpline(FreeformPointLineSeries fpls) { m_chart.BeginUpdate(); int iMarkerCount = fpls.SeriesEventMarkers.Count; double[] aMarkerValuesX = new double[iMarkerCount]; double[] aMarkerValuesY = new double[iMarkerCount]; for (int i = 0; i < iMarkerCount; i++) { SeriesEventMarker marker = fpls.SeriesEventMarkers[i]; aMarkerValuesX[i] = marker.XValue; aMarkerValuesY[i] = marker.YValue; } //One solved point for each pixel in X-dimension double[] aXValues = new double[100]; double dXMin = aMarkerValuesX[0]; double dXMax = aMarkerValuesX[iMarkerCount - 1]; double dXStep = (dXMax - dXMin) / (double)(100 - 1); for (int i = 0; i < 100; i++) { aXValues[i] = dXMin + dXStep * (double)i; } int iOrder = iMarkerCount - 1; //double[] aYValues = MathRoutines.PolynomialRegression(aMarkerValuesX, aMarkerValuesY, aXValues, iOrder); double[] aYValues = new double[100]; CubicSpline naturalSpline = CubicSpline.InterpolateNatural(aMarkerValuesX, aMarkerValuesY); for (int i = 0; i < 100; i++) { aYValues[i] = naturalSpline.Interpolate(aXValues[i]); } if (aYValues != null) { fpls.Clear(); fpls.AddPoints(aXValues, aYValues, false); } m_chart.EndUpdate(); }
private void marker_PositionChanged(SeriesEventMarker sender, double x, double y, ref bool cancelRendering) { try { //Set new value to point having same index than the marker FreeformPointLineSeries fpls = sender.GetOwnerSeries() as FreeformPointLineSeries; int iPointIndex = fpls.SeriesEventMarkers.IndexOf(sender); if (iPointIndex >= 0) { cancelRendering = true; FitSpline(fpls); } } catch (Exception ex) { EventAggregatorService.Instance.EventAggregator.GetEvent <ThrowExceptionEvent>().Publish(Tuple.Create <string, Exception>("数据回放-动态拟合-移动点", ex)); } }
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 m_chart_MouseMove(object sender, MouseEventArgs e) { //Find nearest point and show its values double xValue, yValue; int nearestIndex; Point p = Mouse.GetPosition(m_chart); foreach (var series in m_chart.ViewXY.FreeformPointLineSeries) { if (series.SolveNearestDataPointByCoord((int)p.X, (int)p.Y, out xValue, out yValue, out nearestIndex)) { double xCoord = m_chart.ViewXY.XAxes[0].ValueToCoord(xValue); double yCoord = m_chart.ViewXY.YAxes[0].ValueToCoord(yValue); double dist = Math.Sqrt((xCoord - p.X) * (xCoord - p.X) + (yCoord - p.Y) * (yCoord - p.Y)); if (dist < 20) { m_chart.BeginUpdate(); AnnotationXY annot = m_chart.ViewXY.Annotations[1]; annot.TargetAxisValues.X = xValue; annot.TargetAxisValues.Y = yValue; annot.Text = "X=" + xValue.ToString("f3") + "\n" + "Y=" + yValue.ToString("f3"); annot.Visible = true; SeriesEventMarker marker = series.SeriesEventMarkers[0]; marker.XValue = xValue; marker.YValue = yValue; marker.Visible = true; m_chart.EndUpdate(); } else { series.SeriesEventMarkers[0].Visible = false; } } } }
private void DrawingChart() { m_chart.BeginUpdate(); FreeformPointLineSeries ps = m_chart.ViewXY.FreeformPointLineSeries[0]; if (ViewModel is BaseDivfreChannelToken) { var vChannel = ViewModel as BaseDivfreChannelToken; if (vChannel.DataContracts != null) { SeriesPoint[] points = new SeriesPoint[vChannel.DataContracts.Count]; for (int i = 0; i < vChannel.DataContracts.Count; i++) { points[i].X = (vChannel.DataContracts[i] as IBaseDivfreSlot).RPM ?? 0; points[i].Y = vChannel.DataContracts[i].Result ?? 0; } ps.Points = points; } } else if (ViewModel is DivFreChannelToken) { var divChannel = ViewModel as DivFreChannelToken; if (divChannel.DataContracts != null) { SeriesPoint[] points = new SeriesPoint[divChannel.DataContracts.Count]; for (int i = 0; i < divChannel.DataContracts.Count; i++) { var rpm = (from p in divChannel.SlotDataContracts where p.RecordLab == divChannel.DataContracts[i].RecordLab select p.RPM).FirstOrDefault(); if (rpm == null) { continue; } points[i].X = rpm ?? 0; points[i].Y = divChannel.DataContracts[i].Result ?? 0; } ps.Points = points; } } if (m_chart.ViewXY.FreeformPointLineSeries.Count == 1) { FreeformPointLineSeries fpls = m_chart.ViewXY.FreeformPointLineSeries[0]; double minY = fpls.Points.Take(fpls.PointCount).Select(o => o.Y).Min(); double maxY = fpls.Points.Take(fpls.PointCount).Select(o => o.Y).Max(); double minX = fpls.Points.Take(fpls.PointCount).Select(o => o.X).Min(); double maxX = fpls.Points.Take(fpls.PointCount).Select(o => o.X).Max(); double middleY = minY + (maxY - minY) / 2; string[] seriesTitles = new string[] { "高危", "高警", "正常(高)", "正常(低)", "低警", "低危" }; foreach (var title in seriesTitles) { FreeformPointLineSeries alarmFpls = new FreeformPointLineSeries(m_chart.ViewXY, m_chart.ViewXY.XAxes[0], m_chart.ViewXY.YAxes[0]); alarmFpls.Title.Text = title; // alarmFpls.PointStyle.Shape = Arction.WPF.LightningChartUltimate.Shape.Rectangle; alarmFpls.PointStyle.BorderWidth = 0; alarmFpls.PointStyle.GradientFill = GradientFillPoint.Edge; alarmFpls.PointStyle.Color1 = Color.FromArgb(200, 0, 0, 255); alarmFpls.PointStyle.Color2 = Color.FromArgb(100, 0, 0, 0); alarmFpls.MouseDoubleClick += FplsMouseDoubleClick; m_chart.ViewXY.FreeformPointLineSeries.Add(alarmFpls); double y = 0; if (title == "高危") { alarmFpls.LineStyle.Color = Colors.Red; y = maxY; } else if (title == "高警") { alarmFpls.LineStyle.Color = Colors.Yellow; y = middleY; } else if (title == "正常(高)") { alarmFpls.LineStyle.Color = Colors.Green; y = minY; } else if (title == "正常(低)") { alarmFpls.Visible = false; alarmFpls.LineStyle.Color = Colors.Green; y = -minY; } else if (title == "低警") { alarmFpls.Visible = false; alarmFpls.LineStyle.Color = Colors.Yellow; y = -middleY; } else if (title == "低危") { alarmFpls.Visible = false; alarmFpls.LineStyle.Color = Colors.Red; y = -maxY; } double step = (maxX - minX) / 99; SeriesPoint[] seriesPoints = new SeriesPoint[100]; for (int i = 0; i < 100; i++) { seriesPoints[i].X = minX + step * i; seriesPoints[i].Y = y; } alarmFpls.Points = seriesPoints; for (int i = 0; i < 3; i++) { SeriesEventMarker marker = new SeriesEventMarker(alarmFpls); marker.Label.Text = (i + 1).ToString(); marker.Label.HorizontalAlign = AlignmentHorizontal.Center; marker.Label.Shadow.Style = TextShadowStyle.Off; marker.Label.Shadow.ContrastColor = Color.FromArgb(150, 0, 0, 0); marker.Symbol.BorderWidth = 0; marker.Symbol.GradientFill = GradientFillPoint.Edge; marker.Symbol.Color1 = Color.FromArgb(200, 0, 0, 255); marker.Symbol.Color2 = Color.FromArgb(100, 0, 0, 0); if (i == 0) { marker.XValue = seriesPoints[0].X; marker.YValue = seriesPoints[0].Y; } else if (i == 1) { marker.XValue = seriesPoints[50].X; marker.YValue = seriesPoints[50].Y; } else if (i == 2) { marker.XValue = seriesPoints[99].X; marker.YValue = seriesPoints[99].Y; } marker.VerticalPosition = SeriesEventMarkerVerticalPosition.AtYValue; marker.PositionChanged += marker_PositionChanged; marker.MouseUp += marker_MouseUp; alarmFpls.SeriesEventMarkers.Add(marker); } } } m_chart.ViewXY.ZoomToFit(); m_chart.EndUpdate(); }
private void OnChannelAdded(ChannelToken token) { try { var sameseries = m_chart.ViewXY.FreeformPointLineSeries.Where(o => o.Tag == token).SingleOrDefault(); if (sameseries != null) { return; } m_chart.BeginUpdate(); #region if (token is BaseAlarmChannelToken) { var anToken = token as BaseAlarmChannelToken; string unit = (anToken.DataContracts[0].Unit == null) ? "" : anToken.DataContracts[0].Unit; FreeformPointLineSeries series = new FreeformPointLineSeries(m_chart.ViewXY, m_chart.ViewXY.XAxes[0], m_chart.ViewXY.YAxes[0]); //Make points visible series.PointsVisible = true; //Don't show line series.LineVisible = false; //Set indidividual point color series.IndividualPointColoring = PointColoringTarget.Color1; //Set other point style options series.PointStyle.Shape = Arction.Wpf.Charting.Shape.Circle; series.PointStyle.Height = series.PointStyle.Width = 1; series.PointStyle.BorderColor = anToken.SolidColorBrush.Color; series.PointStyle.Color1 = anToken.SolidColorBrush.Color; //color; series.PointStyle.Color2 = anToken.SolidColorBrush.Color; //color; series.PointStyle.Color3 = anToken.SolidColorBrush.Color; //color; series.PointStyle.BorderWidth = 0f; series.PointStyle.GradientFill = GradientFillPoint.Solid; //Disable mouse interaction from series series.MouseInteraction = false; series.Tag = token; //series.LineStyle.Color = anToken.SolidColorBrush.Color; //color; series.Title.Text = anToken.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); SeriesPoint[] points = new SeriesPoint[anToken.DataContracts.Count]; for (int i = 0; i < points.Length; i++) { if (anToken.DataContracts[i] is IBaseDivfreSlot) { points[i].X = (anToken.DataContracts[i] as IBaseDivfreSlot).RPM.Value; } else { points[i].X = 0; } points[i].Y = anToken.DataContracts[i].Result.Value; } series.Points = points; SeriesEventMarker marker = new SeriesEventMarker(); // Create marker for point size change illusion. marker.Symbol.Height = marker.Symbol.Width = 5; marker.Symbol.BorderColor = anToken.SolidColorBrush.Color; //Colors.Orange; marker.Symbol.BorderWidth = 0; marker.Symbol.Shape = Arction.Wpf.Charting.Shape.Circle; marker.Symbol.GradientFill = GradientFillPoint.Solid; marker.Symbol.Color1 = marker.Symbol.Color2 = marker.Symbol.Color3 = anToken.SolidColorBrush.Color; //Colors.Transparent; marker.MouseInteraction = false; marker.Label.Visible = false; marker.Visible = false; series.SeriesEventMarkers.Add(marker); m_chart.ViewXY.FreeformPointLineSeries.Add(series); double minX = m_chart.ViewXY.FreeformPointLineSeries.SelectMany(o => o.Points).Select(o => o.X).Min(); double maxX = m_chart.ViewXY.FreeformPointLineSeries.SelectMany(o => o.Points).Select(o => o.X).Max(); double minY = m_chart.ViewXY.FreeformPointLineSeries.SelectMany(o => o.Points).Select(o => o.Y).Min(); double maxY = m_chart.ViewXY.FreeformPointLineSeries.SelectMany(o => o.Points).Select(o => o.Y).Max(); m_chart.ViewXY.XAxes[0].SetRange(minX - 20, maxX + 20); m_chart.ViewXY.YAxes[0].SetRange(minY, maxY); } #endregion UpdateBox(); UpdatePointColors(); m_chart.EndUpdate(); } catch (Exception ex) { EventAggregatorService.Instance.EventAggregator.GetEvent <ThrowExceptionEvent>().Publish(Tuple.Create <string, Exception>("数据回放-分布图-添加通道", ex)); m_chart.EndUpdate(); } }