Exemple #1
0
        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));
            }
        }
Exemple #2
0
        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));
            }
        }
Exemple #3
0
        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));
            }
        }
Exemple #5
0
        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;
                    }
                }
            }
        }
Exemple #7
0
        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();
            }
        }