Example #1
0
        private void CreateFAAnnotation()
        {
            AnnotationXY cursorValueDisplay = new AnnotationXY(m_chart.ViewXY, m_chart.ViewXY.XAxes[0], m_chart.ViewXY.YAxes[0]);

            cursorValueDisplay.Style = AnnotationStyle.Rectangle;
            cursorValueDisplay.LocationCoordinateSystem = CoordinateSystem.ScreenCoordinates;
            cursorValueDisplay.LocationScreenCoords     = new PointFloatXY(230, 37);
            cursorValueDisplay.Sizing                = AnnotationXYSizing.Automatic;
            cursorValueDisplay.TextStyle.Font        = new WPFFont(System.Drawing.FontFamily.GenericMonospace, 9.5, System.Drawing.FontStyle.Regular);
            cursorValueDisplay.TextStyle.Color       = Colors.White;
            cursorValueDisplay.Fill.Color            = Color.FromArgb(128, 0, 0, 0);
            cursorValueDisplay.BorderLineStyle.Color = Color.FromArgb(64, 255, 255, 255);
            cursorValueDisplay.BorderLineStyle.Width = 1;
            cursorValueDisplay.Fill.GradientFill     = GradientFill.Solid;
            cursorValueDisplay.TargetMoveByMouse     = false;
            cursorValueDisplay.AnchorAdjustByMouse   = false;
            cursorValueDisplay.ResizeByMouse         = false;
            cursorValueDisplay.RotateByMouse         = false;
            cursorValueDisplay.Shadow.Visible        = false;
            cursorValueDisplay.AutoSizePadding       = 5;
            cursorValueDisplay.Text            = "";
            cursorValueDisplay.ClipInsideGraph = false;
            m_chart.ViewXY.Annotations.Add(cursorValueDisplay);
            Binding b = new Binding();

            b.Source = DataContext as FrequencyDomainDataViewModel;
            b.Path   = new PropertyPath("ShowDetail");
            b.Mode   = BindingMode.TwoWay;
            BindingOperations.SetBinding(cursorValueDisplay, AnnotationXY.VisibleProperty, b);
        }
Example #2
0
        private void UpdateChartAsync(BaseWaveChannelToken[] tokens)
        {
            m_chart.BeginUpdate();

            AnnotationXY annotation = m_chart.ViewXY.Annotations[1];

            for (int k = 0; k < tokens.Length; k++)
            {
                var      series   = m_chart.ViewXY.PointLineSeries.Where(o => o.Tag == tokens[k]).Single();
                string[] branches = annotation.Text.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
                int      index    = m_chart.ViewXY.PointLineSeries.IndexOf(series);

                if (tokens[k].VData != null)
                {
                    int length = tokens[k].VData.FFTLength;
                    if (series.Points == null || series.Points.Length != length)
                    {
                        series.Points = new SeriesPoint[length];
                    }


                    for (int i = 0; i < length; i++)
                    {
                        series.Points[i].X = tokens[k].VData.Frequency[i];
                        series.Points[i].Y = tokens[k].VData.PowerSpectrum[i];
                    }

                    string freText = "F"; // string.Format("{0}-F", index / 2 + 1);
                    string ampText = "A"; // string.Format("{0}-A", index / 2 + 1);

                    var fftValuesDict = tokens[k].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}|", tokens[k].VData.Frequency[item.Key].ToString("0.00"));
                        ampText += string.Format("{0,6}|", item.Value.ToString("0.00"));
                    }
                    branches[index * 2]     = freText;
                    branches[index * 2 + 1] = ampText;
                }
                else
                {
                    series.Clear();
                    branches[index * 2]     = string.Format("{0}:{1,6}|{2,6}|", index / 2 + 1, " ", " ");
                    branches[index * 2 + 1] = string.Format("{0}:{1,6}|{2,6}|", index / 2 + 1, " ", " ");
                }
                series.InvalidateData();
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < branches.Length; i++)
                {
                    sb.AppendLine(branches[i]);
                }
                annotation.Text = sb.ToString().Trim();
            }
            m_chart.ViewXY.ZoomToFit();
            m_chart.EndUpdate();

            m_chart.ViewXY.LineSeriesCursors[0].ValueAtXAxis = (m_chart.ViewXY.XAxes[0].Minimum + m_chart.ViewXY.XAxes[0].Maximum) / 2.0;
        }
Example #3
0
        private void UpdateCursorResult()
        {
            m_chart.BeginUpdate();

            LineSeriesCursor cursor             = m_chart.ViewXY.LineSeriesCursors[0];
            AnnotationXY     cursorValueDisplay = m_chart.ViewXY.Annotations[0];
            float            fTargetYCoord      = m_chart.ViewXY.GetMarginsRect().Bottom;
            double           dY;

            m_chart.ViewXY.YAxes[0].CoordToValue(fTargetYCoord, out dY);
            cursorValueDisplay.TargetAxisValues.X = cursor.ValueAtXAxis;
            cursorValueDisplay.TargetAxisValues.Y = dY;

            StringBuilder sb            = new StringBuilder();
            int           iSeriesNumber = 1;

            string strValue      = "";
            bool   bLabelVisible = false;

            int seriesCount = m_chart.ViewXY.PointLineSeries.Count;

            for (int i = 0; i < seriesCount; i++)
            {
                var series = m_chart.ViewXY.PointLineSeries[i];
                strValue = iSeriesNumber + ":";
                VibrationChannelToken token = series.Tag as VibrationChannelToken;
                if (token.VData != null)
                {
                    bool   bResolvedOK = false;
                    double yValue      = 0;
                    bResolvedOK = SolveValueAccurate(series, cursor.ValueAtXAxis, out yValue);
                    if (bResolvedOK)
                    {
                        bLabelVisible = true;
                        //strValue = string.Format(strChannelStringFormat, iSeriesNumber, Math.Round(yValue, 2), unit);
                        strValue += Math.Round(yValue, 2) + "(" + token.VData.Unit + ")";
                    }
                    else
                    {
                        //strValue = string.Format(strChannelStringFormat, iSeriesNumber, "---", "Unit");
                        strValue += "---" + "(Unit)";
                    }
                }

                sb.AppendLine(strValue);
                iSeriesNumber++;
            }

            sb.AppendLine("频率: " + cursor.ValueAtXAxis.ToString("0.00") + "Hz");
            //Set text
            cursorValueDisplay.Text    = sb.ToString().Trim();
            cursorValueDisplay.Visible = bLabelVisible;

            //Allow chart rendering
            m_chart.EndUpdate();
        }
Example #4
0
        private void OnChannelRemoved(ChannelToken token)
        {
            try
            {
                m_chart.BeginUpdate();
                var serieses = m_chart.ViewXY.PointLineSeries.Where(o => o.Tag == token).ToArray();
                if (serieses.Length > 0)
                {
                    foreach (var series in serieses)
                    {
                        series.Clear();
                        m_chart.ViewXY.PointLineSeries.Remove(series);
                    }

                    var yAxises    = m_chart.ViewXY.YAxes.Where(o => o.Tag == token).ToArray();
                    int firstIndex = m_chart.ViewXY.YAxes.IndexOf(yAxises.First());
                    m_chart.ViewXY.AxisLayout.Segments.RemoveAt(yAxises[0].SegmentIndex);
                    foreach (var axis in yAxises)
                    {
                        m_chart.ViewXY.YAxes.Remove(axis);
                    }
                    if (m_chart.ViewXY.YAxes.Count > firstIndex)
                    {
                        for (int i = firstIndex / 2; i < m_chart.ViewXY.AxisLayout.Segments.Count; i++)
                        {
                            m_chart.ViewXY.YAxes[i * 2].SegmentIndex     = i;
                            m_chart.ViewXY.YAxes[i * 2 + 1].SegmentIndex = i;
                        }
                    }
                    AnnotationXY annotation = m_chart.ViewXY.Annotations[1];
                    var          branches   = annotation.Text.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries).ToList();
                    branches.RemoveRange(firstIndex, 2);
                    StringBuilder sb = new StringBuilder();
                    foreach (var branch in branches)
                    {
                        sb.AppendLine(branch);
                    }
                    annotation.Text = sb.ToString();

                    if (m_chart.ViewXY.YAxes.Count != 0)
                    {
                        m_chart.ViewXY.Annotations[0].AssignYAxisIndex = -1;
                        m_chart.ViewXY.Annotations[0].AssignYAxisIndex = 0;
                    }
                    else
                    {
                        m_chart.ViewXY.Annotations.Clear();
                    }
                }
                m_chart.EndUpdate();
            }
            catch (Exception ex)
            {
                EventAggregatorService.Instance.EventAggregator.GetEvent <ThrowExceptionEvent>().Publish(Tuple.Create <string, Exception>("数据回放-频域-删除通道", ex));
            }
        }
Example #5
0
        private void UpdateChartAsync(VibrationChannelToken[] tokens)
        {
            m_chart.BeginUpdate();

            AnnotationXY annotation = m_chart.ViewXY.Annotations[0];

            for (int k = 0; k < tokens.Length; k++)
            {
                var      series   = m_chart.ViewXY.SampleDataSeries.Where(o => o.Tag == tokens[k]).Single();
                string[] branches = annotation.Text.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);

                if (tokens[k].VData != null)
                {
                    if (cepstrumCheckBox.IsChecked == true)
                    {
                        series.SamplingFrequency = tokens[k].VData.SampleFre / 1000;
                    }
                    else
                    {
                        series.SamplingFrequency = 1;
                    }
                    series.SamplesDouble = tokens[k].VData.FilterWaveform;

                    branches[k + 1] = string.Format("{0,6}|{1,6}|{2,6}|{3,7}|{4,6}|{5,9}|{6,9}|{7,9}|{8,9}|{9,9}|{10,9}",
                                                    tokens[k].VData.AMS.ToString("0.00"),
                                                    tokens[k].VData.PeakValue.ToString("0.00"),
                                                    tokens[k].VData.PeakPeakValue.ToString("0.00"),
                                                    tokens[k].VData.Slope.ToString("0.00"),
                                                    tokens[k].VData.Kurtosis.ToString("0.00"),
                                                    tokens[k].VData.KurtosisValue.ToString("0.00"),
                                                    tokens[k].VData.WaveIndex.ToString("0.00"),
                                                    tokens[k].VData.PeakIndex.ToString("0.00"),
                                                    tokens[k].VData.ImpulsionIndex.ToString("0.00"),
                                                    tokens[k].VData.RootAmplitude.ToString("0.00"),
                                                    tokens[k].VData.ToleranceIndex.ToString("0.00"));
                }
                else
                {
                    series.Clear();
                    branches[k + 1] = string.Format("{0,6}|{1,6}|{2,6}|{3,7}|{4,6}|{5,9}|{6,9}|{7,9}|{8,9}|{9,9}|{10,9}", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ");
                }

                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < branches.Length; i++)
                {
                    sb.AppendLine(branches[i]);
                }
                annotation.Text = sb.ToString().Trim();
            }
            m_chart.ViewXY.FitView();
            m_chart.EndUpdate();
        }
        private void UpdateBox()
        {
            AnnotationXY box  = m_chart.ViewXY.Annotations[0];
            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();

            box.AxisValuesBoundaries.XMin = minX - 5;
            box.AxisValuesBoundaries.XMax = maxX + 5;
            box.AxisValuesBoundaries.YMin = minY;
            box.AxisValuesBoundaries.YMax = maxY;
        }
        /// <summary>
        /// Update point colors, apply the box limits
        /// </summary>
        private void UpdatePointColors()
        {
            m_chart.BeginUpdate();

            if (m_chart.ViewXY.FreeformPointLineSeries.Count > 0)
            {
                string info = "选中比例:";
                foreach (var series in m_chart.ViewXY.FreeformPointLineSeries)
                {
                    SeriesPoint[] points           = series.Points;
                    AnnotationXY  box              = m_chart.ViewXY.Annotations[0];
                    double        boxMinX          = box.AxisValuesBoundaries.XMin;
                    double        boxMaxX          = box.AxisValuesBoundaries.XMax;
                    double        boxMinY          = box.AxisValuesBoundaries.YMin;
                    double        boxMaxY          = box.AxisValuesBoundaries.YMax;
                    int           pointCount       = series.PointCount;
                    Color         colorSelected    = Color.FromArgb(200, 255, 69, 0);
                    Color         colorNotSelected = Color.FromArgb(100, 100, 100, 100);
                    if (series.Tag is BaseAlarmChannelToken)
                    {
                        colorNotSelected = (series.Tag as BaseAlarmChannelToken).SolidColorBrush.Color;
                    }

                    int selectedPointCount = 0;

                    double x, y;
                    for (int i = 0; i < pointCount; i++)
                    {
                        x = points[i].X;
                        y = points[i].Y;

                        if (x >= boxMinX && x <= boxMaxX && y >= boxMinY && y <= boxMaxY)
                        {
                            points[i].PointColor = colorSelected;
                            selectedPointCount++;
                        }
                        else
                        {
                            points[i].PointColor = colorNotSelected;
                        }
                    }
                    series.InvalidateData();

                    info += selectedPointCount.ToString("0") + "/" + pointCount.ToString("0") + " ";
                }
                txtInfo.Text = info;
            }

            m_chart.EndUpdate();
        }
        private void OnChannelRemoved(ChannelToken token)
        {
            try
            {
                m_chart.BeginUpdate();
                var series = m_chart.ViewXY.PointLineSeries.Where(o => o.Tag == token).SingleOrDefault();
                if (series != null)
                {
                    series.Clear();
                    m_chart.ViewXY.PointLineSeries.Remove(series);
                }

                var yAxis = m_chart.ViewXY.YAxes.Where(o => o.Tag == token).SingleOrDefault();
                if (yAxis != null)
                {
                    int firstIndex = m_chart.ViewXY.YAxes.IndexOf(yAxis);
                    m_chart.ViewXY.YAxes.Remove(yAxis);

                    AnnotationXY annotation = m_chart.ViewXY.Annotations[1];
                    var          branches   = annotation.Text.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries).ToList();
                    branches.RemoveRange(firstIndex, 2);
                    StringBuilder sb = new StringBuilder();
                    foreach (var branch in branches)
                    {
                        sb.AppendLine(branch);
                    }
                    annotation.Text = sb.ToString().Trim();
                }

                if (m_chart.ViewXY.YAxes.Count == 0)
                {
                    m_chart.ViewXY.Annotations.Clear();

                    AxisY axisYnone = new AxisY(m_chart.ViewXY);
                    axisYnone.Title.Font    = new WpfFont(System.Drawing.FontFamily.GenericSansSerif, 10, System.Drawing.FontStyle.Regular);
                    axisYnone.AxisThickness = 2;
                    axisYnone.AxisColor     = Color.FromArgb(0xff, 0xff, 0xff, 0xff);//Color.FromArgb(100, 135, 205, 238);
                    axisYnone.Units.Text    = "none";
                    m_chart.ViewXY.YAxes.Add(axisYnone);
                }

                m_chart.EndUpdate();
            }
            catch (Exception ex)
            {
                m_chart.EndUpdate();
                EventAggregatorService.Instance.EventAggregator.GetEvent <ThrowExceptionEvent>().Publish(Tuple.Create <string, Exception>("数据回放-功率谱密度-删除通道", ex));
            }
        }
Example #9
0
        private void ViewModel_SignalRemoved(SignalToken token)
        {
            try
            {
                _chart.BeginUpdate();
                var series = _chart.ViewXY.PointLineSeries.Where(o => o.Tag == token).SingleOrDefault();
                if (series != null)
                {
                    series.Clear();
                    _chart.ViewXY.PointLineSeries.Remove(series);
                }

                var axisY = _chart.ViewXY.YAxes.Where(o => o.Tag == token).SingleOrDefault();
                if (axisY != null)
                {
                    _chart.ViewXY.YAxes.Remove(axisY);
                    if (_chart.ViewXY.YAxes.Count > 0)
                    {
                        _chart.ViewXY.Annotations[0].AssignYAxisIndex = -1;
                        _chart.ViewXY.Annotations[0].AssignYAxisIndex = 0;
                        AnnotationXY cursorValueDisplay = _chart.ViewXY.Annotations[0];
                        float        fTargetYCoord      = _chart.ViewXY.GetMarginsRect().Bottom;
                        double       dY;
                        _chart.ViewXY.YAxes[0].CoordToValue(fTargetYCoord, out dY);
                        cursorValueDisplay.TargetAxisValues.Y = dY;
                    }
                    else
                    {
                        AxisY axisYnone = new AxisY(_chart.ViewXY);
                        axisYnone.Title.Font    = new WpfFont(System.Drawing.FontFamily.GenericSansSerif, 10, System.Drawing.FontStyle.Regular);
                        axisYnone.AxisThickness = 2;
                        axisYnone.AxisColor     = Color.FromArgb(0xff, 0xff, 0xff, 0xff);//Color.FromArgb(100, 135, 205, 238);
                        axisYnone.Units.Text    = "none";
                        _chart.ViewXY.YAxes.Add(axisYnone);
                    }
                }

                _chart.EndUpdate();
            }
            catch (Exception ex)
            {
                EventAggregatorService.Instance.EventAggregator.GetEvent <ThrowExceptionEvent>().Publish(Tuple.Create <string, Exception>("趋势趋势-移除信号", ex));
                _chart.EndUpdate();
            }
        }
        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;
                    }
                }
            }
        }
Example #11
0
        private void OnChannelRemoved(ChannelToken token)
        {
            try
            {
                m_chart.BeginUpdate();
                var series = m_chart.ViewXY.PointLineSeries.Where(o => o.Tag == token).SingleOrDefault();
                if (series != null)
                {
                    series.Clear();
                    m_chart.ViewXY.PointLineSeries.Remove(series);
                }

                var yAxis = m_chart.ViewXY.YAxes.Where(o => o.Tag == token).SingleOrDefault();
                if (yAxis != null)
                {
                    int firstIndex = m_chart.ViewXY.YAxes.IndexOf(yAxis);
                    m_chart.ViewXY.YAxes.Remove(yAxis);

                    AnnotationXY annotation = m_chart.ViewXY.Annotations[1];
                    var          branches   = annotation.Text.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries).ToList();
                    branches.RemoveRange(firstIndex, 2);
                    StringBuilder sb = new StringBuilder();
                    foreach (var branch in branches)
                    {
                        sb.AppendLine(branch);
                    }
                    annotation.Text = sb.ToString().Trim();
                }

                m_chart.EndUpdate();
            }
            catch (Exception ex)
            {
                m_chart.EndUpdate();
                EventAggregatorService.Instance.EventAggregator.GetEvent <ThrowExceptionEvent>().Publish(Tuple.Create <string, Exception>("数据回放-功率谱-删除通道", ex));
            }
        }
Example #12
0
        private void CreateCalloutAnnotation()
        {
            AnnotationXY cursorValueDisplay = new AnnotationXY(m_chart.ViewXY, m_chart.ViewXY.XAxes[0], m_chart.ViewXY.YAxes[0]);

            cursorValueDisplay.Style = AnnotationStyle.Callout;
            cursorValueDisplay.LocationCoordinateSystem = CoordinateSystem.RelativeCoordinatesToTarget;
            cursorValueDisplay.LocationRelativeOffset   = new PointFloatXY(80, -50);
            cursorValueDisplay.Sizing                = AnnotationXYSizing.Automatic;
            cursorValueDisplay.TextStyle.Font        = new WPFFont(System.Drawing.FontFamily.GenericMonospace, 9.5, System.Drawing.FontStyle.Regular);
            cursorValueDisplay.TextStyle.Color       = Colors.White;
            cursorValueDisplay.Fill.Color            = Color.FromArgb(128, 0, 0, 0);
            cursorValueDisplay.BorderLineStyle.Color = Color.FromArgb(64, 255, 255, 255);
            cursorValueDisplay.BorderLineStyle.Width = 1;
            cursorValueDisplay.Fill.GradientFill     = GradientFill.Solid;
            cursorValueDisplay.TargetMoveByMouse     = false;
            cursorValueDisplay.AnchorAdjustByMouse   = false;
            cursorValueDisplay.ResizeByMouse         = false;
            cursorValueDisplay.RotateByMouse         = false;
            cursorValueDisplay.Shadow.Visible        = false;
            cursorValueDisplay.AutoSizePadding       = 5;
            cursorValueDisplay.Text            = "";
            cursorValueDisplay.ClipInsideGraph = false;
            m_chart.ViewXY.Annotations.Add(cursorValueDisplay);
        }
Example #13
0
 private void OnChannelRemoved(ChannelToken token)
 {
     try
     {
         m_chart.BeginUpdate();
         var series = m_chart.ViewXY.PointLineSeries.Where(o => o.Tag == token).SingleOrDefault();
         if (series != null)
         {
             series.Clear();
             m_chart.ViewXY.PointLineSeries.Remove(series);
             string unit = string.Empty;
             if (token is BaseDivfreChannelToken)
             {
                 if (((BaseDivfreChannelToken)token).DataContracts != null && ((BaseDivfreChannelToken)token).DataContracts.Count > 0)
                 {
                     unit = ((BaseDivfreChannelToken)token).DataContracts[0].Unit;
                 }
             }
             else if (token is BaseWaveChannelToken)
             {
                 if (((BaseWaveChannelToken)token).DataContracts != null && ((BaseWaveChannelToken)token).DataContracts.Count > 0)
                 {
                     unit = ((BaseWaveChannelToken)token).DataContracts[0].Unit;
                 }
             }
             else if (token is BaseAlarmChannelToken)
             {
                 if (((BaseAlarmChannelToken)token).DataContracts != null && ((BaseAlarmChannelToken)token).DataContracts.Count > 0)
                 {
                     unit = ((BaseAlarmChannelToken)token).DataContracts[0].Unit;
                 }
             }
             else if (token is DivFreChannelToken)
             {
                 if (((DivFreChannelToken)token).SlotDataContracts != null && ((DivFreChannelToken)token).SlotDataContracts.Count > 0)
                 {
                     unit = ((DivFreChannelToken)token).SlotDataContracts[0].Unit;
                 }
             }
             if (!string.IsNullOrEmpty(unit))
             {
                 var units = m_chart.ViewXY.PointLineSeries.Select(o => Regex.Matches(o.Title.Text, @"\(([^)]*)\)").Cast <Match>().Select(x => x.Groups[1].Value).Last()).ToArray();
                 if (!units.Contains(unit))
                 {
                     var axisY = m_chart.ViewXY.YAxes.Where(o => o.Units.Text == unit).SingleOrDefault();
                     if (axisY != null)
                     {
                         int segmentIndex = axisY.SegmentIndex;
                         m_chart.ViewXY.YAxes.Remove(axisY);
                         if (m_chart.ViewXY.YAxes.Where(o => o.SegmentIndex == segmentIndex).Count() == 0)
                         {
                             m_chart.ViewXY.AxisLayout.Segments[segmentIndex].Height = 0;
                         }
                         if (m_chart.ViewXY.YAxes.Count > 0)
                         {
                             m_chart.ViewXY.Annotations[0].AssignYAxisIndex = -1;
                             m_chart.ViewXY.Annotations[0].AssignYAxisIndex = 0;
                             AnnotationXY cursorValueDisplay = m_chart.ViewXY.Annotations[0];
                             float        fTargetYCoord      = m_chart.ViewXY.GetMarginsRect().Bottom;
                             double       dY;
                             m_chart.ViewXY.YAxes[0].CoordToValue(fTargetYCoord, out dY);
                             cursorValueDisplay.TargetAxisValues.Y = dY;
                         }
                         else
                         {
                             AxisY axisYnone = new AxisY(m_chart.ViewXY);
                             axisYnone.Title.Font    = new WpfFont(System.Drawing.FontFamily.GenericSansSerif, 10, System.Drawing.FontStyle.Regular);
                             axisYnone.AxisThickness = 2;
                             axisYnone.AxisColor     = Color.FromArgb(0xff, 0xff, 0xff, 0xff);//Color.FromArgb(100, 135, 205, 238);
                             axisYnone.Units.Text    = "none";
                             m_chart.ViewXY.YAxes.Add(axisYnone);
                         }
                     }
                 }
             }
         }
         m_chart.EndUpdate();
     }
     catch (Exception ex)
     {
         EventAggregatorService.Instance.EventAggregator.GetEvent <ThrowExceptionEvent>().Publish(Tuple.Create <string, Exception>("数据回放-趋势趋势-移除通道", ex));
         m_chart.EndUpdate();
     }
 }
Example #14
0
        private void HandleVibrationMessage(VibrationMessage message)
        {
            try
            {
                m_chart.BeginUpdate();

                var fftLength   = message.Frequency.Length;
                var series      = m_chart.ViewXY.PointLineSeries[0];
                var phaseSeries = m_chart.ViewXY.PointLineSeries[1];

                if (series.Points == null || series.Points.Length != fftLength)
                {
                    series.Points = new SeriesPoint[fftLength];
                }
                if (phaseSeries.Points == null || phaseSeries.Points.Length != fftLength)
                {
                    phaseSeries.Points = new SeriesPoint[fftLength];
                }
                for (int i = 0; i < fftLength; i++)
                {
                    series.Points[i].X = message.Frequency[i];
                    series.Points[i].Y = message.Amplitude[i];

                    phaseSeries.Points[i].X = message.Frequency[i];
                    phaseSeries.Points[i].Y = message.Phase[i];
                }

                if (m_chart.ViewXY.Annotations[1].Visible)
                {
                    LineSeriesCursor lineSeriesCursor = m_chart.ViewXY.LineSeriesCursors[0];
                    int index = GetNearestPointIndex(series, lineSeriesCursor.ValueAtXAxis);
                    if (index == -1)
                    {
                        m_chart.ViewXY.Annotations[1].Text = string.Empty;
                    }
                    else
                    {
                        SeriesPoint point = series.Points[index];
                        m_chart.ViewXY.Annotations[1].Text = string.Format("幅值:{0}", Math.Round(point.Y, 3)) + "\r\n" + string.Format("频率:{0}", Math.Round(point.X, 3));
                    }
                }

                m_chart.ViewXY.PointLineSeries[0].InvalidateData();
                m_chart.ViewXY.PointLineSeries[1].InvalidateData();
                AnnotationXY  spectrumAnnotation = m_chart.ViewXY.Annotations[0];
                StringBuilder spectrumSB         = new StringBuilder();
                spectrumSB.AppendLine("频率" + "  " + "幅值");

                var fftValuesDict = message.Amplitude.Select((s, i) => new { Key = i, Value = s }).OrderByDescending(o => o.Value).Take(6);
                foreach (var item in fftValuesDict)
                {
                    spectrumSB.AppendLine(message.Frequency[item.Key].ToString("0.00") + "; " + item.Value.ToString("0.00"));
                }

                spectrumAnnotation.Text = spectrumSB.ToString().Trim();

                //if (fitViewCheckBox.IsChecked == true)
                //{
                m_chart.ViewXY.ZoomToFit();
                // }
                m_chart.EndUpdate();
            }
            catch (Exception ex)
            {
                m_chart.EndUpdate();
            }
        }
Example #15
0
        private void UpdateChartAsync(IEnumerable <VibrationChannelToken> tokens)
        {
            m_chart.BeginUpdate();
            foreach (var token in tokens)
            {
                var series      = m_chart.ViewXY.PointLineSeries.Where(o => o.Tag == token).First();
                var phaseSeries = m_chart.ViewXY.PointLineSeries.Where(o => o.Tag == token).Last();
                int index       = m_chart.ViewXY.PointLineSeries.IndexOf(series);

                AnnotationXY annotation = m_chart.ViewXY.Annotations[1];
                string[]     branches   = annotation.Text.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
                if (token.VData != null)
                {
                    int length = token.VData.FFTLength;
                    if (series.Points == null || series.Points.Length != length)
                    {
                        series.Points = new SeriesPoint[length];
                    }
                    if (phaseSeries.Points == null || phaseSeries.Points.Length != length)
                    {
                        phaseSeries.Points = new SeriesPoint[length];
                    }

                    for (int i = 0; i < length; i++)
                    {
                        series.Points[i].X      = token.VData.Frequency[i];
                        series.Points[i].Y      = token.VData.Amplitude[i];
                        phaseSeries.Points[i].X = token.VData.Frequency[i];
                        phaseSeries.Points[i].Y = token.VData.Phase[i];
                    }

                    string freText = "F"; // string.Format("{0}-F", index / 2 + 1);
                    string ampText = "A"; // string.Format("{0}-A", index / 2 + 1);

                    var fftValuesDict = token.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}|", token.VData.Frequency[item.Key].ToString("0.00"));
                        ampText += string.Format("{0,6}|", item.Value.ToString("0.00"));
                    }
                    branches[index]     = freText;
                    branches[index + 1] = ampText;
                }
                else
                {
                    series.Clear();
                    phaseSeries.Clear();
                    branches[index]     = string.Format("{0}:{1,6}|{2,6}|", index / 2 + 1, " ", " ");
                    branches[index + 1] = string.Format("{0}:{1,6}|{2,6}|", index / 2 + 1, " ", " ");
                }
                series.InvalidateData();
                phaseSeries.InvalidateData();
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < branches.Length; i++)
                {
                    sb.AppendLine(branches[i]);
                }
                annotation.Text = sb.ToString().Trim();
            }
            m_chart.ViewXY.FitView();
            m_chart.EndUpdate();
        }
Example #16
0
        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));
            }
        }
Example #17
0
        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);
                if (m_chart.ViewXY.Annotations.Count == 0)
                {
                    CreateAnnotation();
                }
                AnnotationXY annotation = m_chart.ViewXY.Annotations[0];
                int          count      = m_chart.ViewXY.SampleDataSeries.Count;
                while (count > 15)
                {
                    count -= 15;
                }
                Color            color  = DefaultColors.SeriesForBlackBackgroundWPF[count];
                SampleDataSeries series = new SampleDataSeries(m_chart.ViewXY, m_chart.ViewXY.XAxes[0], axisY);
                series.SampleFormat           = SampleFormat.DoubleFloat;
                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;

                //Update Annotation
                StringBuilder sb       = new StringBuilder();
                string[]      branches = annotation.Text.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
                for (int i = 0; i < branches.Length; i++)
                {
                    sb.AppendLine(branches[i]);
                }
                string text = string.Format("{0}:", m_chart.ViewXY.YAxes.Count);
                if (vToken.VData != null)
                {
                    series.SamplesDouble = vToken.VData.Waveform;
                    axisY.Title.Text    += "\r\n" + "  (" + vToken.VData.Unit + ")";
                    text = string.Format("{0,6}|{1,6}|{2,6}|{3,7}|{4,6}|{5,9}|{6,9}|{7,9}|{8,9}|{9,9}|{10,9}",
                                         vToken.VData.AMS.ToString("0.00"),
                                         vToken.VData.PeakValue.ToString("0.00"),
                                         vToken.VData.PeakPeakValue.ToString("0.00"),
                                         vToken.VData.Slope.ToString("0.00"),
                                         vToken.VData.Kurtosis.ToString("0.00"),
                                         vToken.VData.KurtosisValue.ToString("0.00"),
                                         vToken.VData.WaveIndex.ToString("0.00"),
                                         vToken.VData.PeakIndex.ToString("0.00"),
                                         vToken.VData.ImpulsionIndex.ToString("0.00"),
                                         vToken.VData.RootAmplitude.ToString("0.00"),
                                         vToken.VData.ToleranceIndex.ToString("0.00"));
                }
                sb.Append(text);
                annotation.Text = sb.ToString().Trim();
                m_chart.ViewXY.SampleDataSeries.Add(series);

                m_chart.ViewXY.FitView();
                m_chart.EndUpdate();
            }
            catch (Exception ex)
            {
                m_chart.EndUpdate();
                EventAggregatorService.Instance.EventAggregator.GetEvent <ThrowExceptionEvent>().Publish(Tuple.Create <string, Exception>("数据回放-时域-添加通道", ex));
            }
        }
Example #18
0
        private void UpdateCursorResult(double xValue)
        {
            try
            {
                _chart.BeginUpdate();
                List <BaseWaveSignalToken> channelList = new List <BaseWaveSignalToken>();
                AnnotationXY cursorValueDisplay        = _chart.ViewXY.Annotations[0];
                float        fTargetYCoord             = _chart.ViewXY.GetMarginsRect().Bottom;
                double       dY;
                _chart.ViewXY.YAxes[0].CoordToValue(fTargetYCoord, out dY);
                cursorValueDisplay.TargetAxisValues.X = xValue;
                cursorValueDisplay.TargetAxisValues.Y = dY;

                StringBuilder sb            = new StringBuilder();
                int           iSeriesNumber = 1;

                string strChannelStringFormat = "{0}: {1}({2})";
                string strValue      = "";
                bool   bLabelVisible = false;

                foreach (PointLineSeries series in _chart.ViewXY.PointLineSeries)
                {
                    strValue = "";
                    int index = GetNearestIndex(series, xValue);
                    bLabelVisible = true;
                    if (series.Tag is BaseDivfreSignalToken)
                    {
                        BaseDivfreSignalToken token = series.Tag as BaseDivfreSignalToken;
                        token.CurrentIndex = index;
                        channelList.Add(token);
                        if (index != -1)
                        {
                            var    contract = token.DataContracts[index]; //. series.Points[index].Tag as VInfoTableAMSContract;
                            string unit     = contract.Unit;
                            strValue = string.Format("{0}: {1}({2})|{3}", token.DisplayName, Math.Round(contract.Result ?? 0.0, 3), unit, Math.Round(contract.RPM ?? 0.0, 3));
                            token.DeviceHourlySelectedResult = Math.Round(contract.Result ?? 0.0, 3);
                            token.SelectedTime = _chart.ViewXY.XAxes[0].AxisValueToDateTime(xValue);
                        }
                        else
                        {
                            strValue = string.Format(strChannelStringFormat, token.DisplayName, "---", "Unit");
                        }
                    }
                    else if (series.Tag is BaseWaveSignalToken)
                    {
                        BaseWaveSignalToken token = series.Tag as BaseWaveSignalToken;
                        token.CurrentIndex = index;
                        channelList.Add(token);
                        if (index != -1)
                        {
                            var    contract = token.DataContracts[index]; //. series.Points[index].Tag as VInfoTableAMSContract;
                            string unit     = contract.Unit;
                            strValue = string.Format("{0}: {1}({2})", token.DisplayName, Math.Round(contract.Result ?? 0.0, 3), unit);
                            token.DeviceHourlySelectedResult = Math.Round(contract.Result ?? 0.0, 3);
                            token.SelectedTime = _chart.ViewXY.XAxes[0].AxisValueToDateTime(xValue);
                        }
                        else
                        {
                            strValue = string.Format(strChannelStringFormat, token.DisplayName, "---", "Unit");
                        }
                    }
                    else if (series.Tag is BaseAlarmSignalToken)
                    {
                        BaseAlarmSignalToken token = series.Tag as BaseAlarmSignalToken;
                        if (index != -1)
                        {
                            var    contract = token.DataContracts[index]; //series.Points[index].Tag as AnInfoTableAMSContract;
                            string unit     = contract.Unit;
                            strValue = string.Format(strChannelStringFormat, token.DisplayName, Math.Round(contract.Result ?? 0.0, 3), unit);
                            token.DeviceHourlySelectedResult = Math.Round(contract.Result ?? 0.0, 3);
                            token.SelectedTime = _chart.ViewXY.XAxes[0].AxisValueToDateTime(xValue);
                        }
                        else
                        {
                            strValue = string.Format(strChannelStringFormat, token.DisplayName, "---", "Unit");
                        }
                    }

                    sb.AppendLine(strValue);
                    // series.Title.Text = strValue;
                    iSeriesNumber++;
                }
                sb.AppendLine("Time: " + _chart.ViewXY.XAxes[0].TimeString(xValue, "yyyy-MM-dd HH:mm:ss"));
                ////Set text
                cursorValueDisplay.Text    = sb.ToString().Trim();
                cursorValueDisplay.Visible = bLabelVisible;
                //Allow chart rendering
                _chart.EndUpdate();

                if (channelList.Count > 0)
                {
                    ViewModel.TrackChanged(channelList);
                }
            }
            catch (Exception ex)
            {
                EventAggregatorService.Instance.EventAggregator.GetEvent <ThrowExceptionEvent>().Publish(Tuple.Create <string, Exception>("数据回放-趋势趋势-Track", ex));
                _chart.EndUpdate();
            }
        }
        private void CreateChart()
        {
            gridChart.Children.Clear();
            if (m_chart != null)
            {
                m_chart.Dispose();
                m_chart = null;
            }

            //Create new chart
            m_chart = new LightningChartUltimate();

            //Disable rendering, strongly recommended before updating chart properties
            m_chart.BeginUpdate();
            m_chart.Title.Visible = false;

            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.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;

            // Configure x-axis.
            AxisX axisX = m_chart.ViewXY.XAxes[0];

            axisX.ScrollMode = XAxisScrollMode.None;
            axisX.ValueType  = AxisValueType.Number;

            //Add annotation as selection box
            AnnotationXY box = new AnnotationXY(m_chart.ViewXY, axisX, m_chart.ViewXY.YAxes[0]);

            box.Style               = AnnotationStyle.Rectangle;
            box.RotateByMouse       = false;
            box.AnchorAdjustByMouse = false;
            box.TargetMoveByMouse   = false;
            box.Behind              = false;
            box.Fill.Color          = Color.FromArgb(50, 255, 165, 0);
            box.Fill.GradientColor  = Color.FromArgb(50, 255, 140, 0);
            box.Shadow.Visible      = false;
            box.TextStyle.Visible   = false;
            box.Sizing              = AnnotationXYSizing.AxisValuesBoundaries;
            box.ResizedByMouse     += box_ResizedByMouse;
            box.MovedByMouse       += box_MovedByMouse;
            box.AxisValuesBoundaries.SetValues(0, 100, 0, 100);
            box.NibStyle.Color = Colors.Yellow;
            m_chart.ViewXY.Annotations.Add(box);

            //Create annotation for showing the nearest point info
            AnnotationXY annot = new AnnotationXY(m_chart.ViewXY, m_chart.ViewXY.XAxes[0], m_chart.ViewXY.YAxes[0]);

            annot.Fill.Color             = Color.FromArgb(180, 30, 30, 30);
            annot.Fill.GradientFill      = GradientFill.Solid;
            annot.BorderLineStyle.Color  = Color.FromArgb(50, 255, 255, 255);
            annot.Shadow.Visible         = false;
            annot.TargetCoordinateSystem = AnnotationTargetCoordinates.AxisValues;
            annot.Visible                  = false; //Don't show before the data point has been found
            annot.MouseInteraction         = false;
            annot.LocationCoordinateSystem = CoordinateSystem.RelativeCoordinatesToTarget;
            annot.LocationRelativeOffset.X = 0;
            annot.LocationRelativeOffset.Y = -40;
            annot.TextStyle.Color          = Colors.White;
            annot.Style = AnnotationStyle.Rectangle;
            m_chart.ViewXY.Annotations.Add(annot);

            m_chart.ViewXY.LegendBoxes[0].Visible        = true;
            m_chart.ViewXY.LegendBoxes[0].Layout         = LegendBoxLayout.VerticalColumnSpan;
            m_chart.ViewXY.LegendBoxes[0].Fill.Style     = RectFillStyle.None;
            m_chart.ViewXY.LegendBoxes[0].Shadow.Visible = false;
            m_chart.ViewXY.LegendBoxes[0].BorderWidth    = 0;
            m_chart.ViewXY.LegendBoxes[0].Position       = LegendBoxPositionXY.TopRight;
            m_chart.ViewXY.LegendBoxes[0].Offset.SetValues(-80, 10);
            m_chart.ViewXY.LegendBoxes[0].SeriesTitleFont = new WpfFont(System.Drawing.FontFamily.GenericSansSerif, 9, System.Drawing.FontStyle.Regular);

            //Add a series
            //AddSeries();

            //UpdatePointColors();

            m_chart.ViewXY.ZoomToFit();

            m_chart.MouseMove += new MouseEventHandler(m_chart_MouseMove);

            //Allow chart rendering
            m_chart.EndUpdate();

            gridChart.Children.Add(m_chart);

            showCheckBox.Checked   += showCheckBox_Checked;
            showCheckBox.Unchecked += showCheckBox_Checked;
        }
Example #20
0
        private void OnChannelRemoved(ChannelToken token)
        {
            try
            {
                m_chart.BeginUpdate();
                var series = m_chart.ViewXY.PointLineSeries.Where(o => o.Tag == token).SingleOrDefault();
                if (series != null)
                {
                    series.Clear();
                    m_chart.ViewXY.PointLineSeries.Remove(series);
                    string unit = string.Empty;
                    if (token is VibrationChannelToken)
                    {
                        if (((VibrationChannelToken)token).DataContracts.Length > 0)
                        {
                            switch (((VibrationChannelToken)token).DataContracts[0].Unit)
                            {
                            case 0:
                                unit = "m/s2";
                                break;

                            case 1:
                                unit = "mm/s";
                                break;

                            case 2:
                                unit = "um";
                                break;
                            }
                        }
                    }
                    else if (token is AnalogChannelToken)
                    {
                        if (((AnalogChannelToken)token).DataContracts.Length > 0)
                        {
                            switch (((AnalogChannelToken)token).DataContracts[0].Unit)
                            {
                            case 3:
                                unit = "°C";
                                break;

                            case 4:
                                unit = "Pa";
                                break;

                            case 5:
                                unit = "rpm";
                                break;
                            }
                        }
                    }
                    else if (token is DivFreChannelToken)
                    {
                        if (((DivFreChannelToken)token).DataContracts.Length > 0)
                        {
                            switch (((DivFreChannelToken)token).DataContracts[0].Unit)
                            {
                            case 0:
                                unit = "分频-m/s2";
                                break;

                            case 1:
                                unit = "分频-mm/s";
                                break;

                            case 2:
                                unit = "分频-um";
                                break;
                            }
                        }
                    }
                    if (!string.IsNullOrEmpty(unit))
                    {
                        var units = m_chart.ViewXY.PointLineSeries.Select(o => Regex.Matches(o.Title.Text, @"\(([^)]*)\)").Cast <Match>().Select(x => x.Groups[1].Value).Last()).ToArray();
                        if (!units.Contains(unit))
                        {
                            var axisY = m_chart.ViewXY.YAxes.Where(o => o.Units.Text == unit).SingleOrDefault();
                            if (axisY != null)
                            {
                                int segmentIndex = axisY.SegmentIndex;
                                m_chart.ViewXY.YAxes.Remove(axisY);
                                if (m_chart.ViewXY.YAxes.Where(o => o.SegmentIndex == segmentIndex).Count() == 0)
                                {
                                    m_chart.ViewXY.AxisLayout.Segments[segmentIndex].Height = 0;
                                }
                                if (m_chart.ViewXY.YAxes.Count > 0)
                                {
                                    m_chart.ViewXY.Annotations[0].AssignYAxisIndex = -1;
                                    m_chart.ViewXY.Annotations[0].AssignYAxisIndex = 0;
                                    AnnotationXY cursorValueDisplay = m_chart.ViewXY.Annotations[0];
                                    float        fTargetYCoord      = m_chart.ViewXY.GetMarginsRect().Bottom;
                                    double       dY;
                                    m_chart.ViewXY.YAxes[0].CoordToValue(fTargetYCoord, out dY);
                                    cursorValueDisplay.TargetAxisValues.Y = dY;
                                }
                            }
                        }
                    }
                }
                m_chart.EndUpdate();
            }
            catch (Exception ex)
            {
                EventAggregatorService.Instance.EventAggregator.GetEvent <ThrowExceptionEvent>().Publish(Tuple.Create <string, Exception>("数据回放-通频趋势-移除通道", ex));
                m_chart.EndUpdate();
            }
        }
        private void OnChannelRemoved(ChannelToken token)
        {
            try
            {
                m_chart.BeginUpdate();
                var serieses = m_chart.ViewXY.PointLineSeries.Where(o => o.Tag == token).ToArray();
                if (serieses.Length > 0)
                {
                    foreach (var series in serieses)
                    {
                        series.Clear();
                        m_chart.ViewXY.PointLineSeries.Remove(series);
                    }

                    var yAxises    = m_chart.ViewXY.YAxes.Where(o => o.Tag == token).ToArray();
                    int firstIndex = m_chart.ViewXY.YAxes.IndexOf(yAxises.First());
                    m_chart.ViewXY.AxisLayout.Segments.RemoveAt(yAxises[0].SegmentIndex);
                    foreach (var axis in yAxises)
                    {
                        m_chart.ViewXY.YAxes.Remove(axis);
                    }
                    if (m_chart.ViewXY.YAxes.Count > firstIndex)
                    {
                        for (int i = firstIndex / 2; i < m_chart.ViewXY.AxisLayout.Segments.Count; i++)
                        {
                            m_chart.ViewXY.YAxes[i * 2].SegmentIndex     = i;
                            m_chart.ViewXY.YAxes[i * 2 + 1].SegmentIndex = i;
                        }
                    }
                    AnnotationXY annotation = m_chart.ViewXY.Annotations[1];
                    var          branches   = annotation.Text.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries).ToList();
                    branches.RemoveRange(firstIndex, 2);
                    StringBuilder sb = new StringBuilder();
                    foreach (var branch in branches)
                    {
                        sb.AppendLine(branch);
                    }
                    annotation.Text = sb.ToString();

                    if (m_chart.ViewXY.YAxes.Count > 0)
                    {
                        m_chart.ViewXY.Annotations[0].AssignYAxisIndex = -1;
                        m_chart.ViewXY.Annotations[0].AssignYAxisIndex = 0;
                    }
                    else
                    {
                        m_chart.ViewXY.Annotations.Clear();

                        AxisY axisYnone = new AxisY(m_chart.ViewXY);
                        axisYnone.Title.Font    = new WpfFont(System.Drawing.FontFamily.GenericSansSerif, 10, System.Drawing.FontStyle.Regular);
                        axisYnone.AxisThickness = 2;
                        axisYnone.AxisColor     = Color.FromArgb(0xff, 0xff, 0xff, 0xff);//Color.FromArgb(100, 135, 205, 238);
                        axisYnone.Units.Text    = "none";
                        m_chart.ViewXY.YAxes.Add(axisYnone);
                    }
                }
                m_chart.EndUpdate();
            }
            catch (Exception ex)
            {
                EventAggregatorService.Instance.EventAggregator.GetEvent <ThrowExceptionEvent>().Publish(Tuple.Create <string, Exception>("数据回放-频域-删除通道", ex));
            }
        }
Example #22
0
        private void UpdateCursorResult(double xValue)
        {
            try
            {
                m_chart.BeginUpdate();
                List <VibrationChannelToken> channelList = new List <VibrationChannelToken>();
                AnnotationXY cursorValueDisplay          = m_chart.ViewXY.Annotations[0];
                float        fTargetYCoord = m_chart.ViewXY.GetMarginsRect().Bottom;
                double       dY;
                m_chart.ViewXY.YAxes[0].CoordToValue(fTargetYCoord, out dY);
                cursorValueDisplay.TargetAxisValues.X = xValue;
                cursorValueDisplay.TargetAxisValues.Y = dY;

                StringBuilder sb            = new StringBuilder();
                int           iSeriesNumber = 1;

                string strChannelStringFormat = "{0}: {1}({2})";
                string strValue      = "";
                bool   bLabelVisible = false;

                foreach (PointLineSeries series in m_chart.ViewXY.PointLineSeries)
                {
                    strValue = "";
                    int index = GetNearestIndex(series, xValue);
                    bLabelVisible = true;
                    if (series.Tag is VibrationChannelToken)
                    {
                        VibrationChannelToken token = series.Tag as VibrationChannelToken;
                        token.CurrentIndex = index;
                        channelList.Add(token);
                        if (index != -1)
                        {
                            VInfoTableAMSContract contract = token.DataContracts[index];  //. series.Points[index].Tag as VInfoTableAMSContract;
                            string unit = string.Empty;
                            switch (contract.Unit)
                            {
                            case 0:
                                unit = "m/s2";
                                break;

                            case 1:
                                unit = "mm/s";
                                break;

                            case 2:
                                unit = "mm";
                                break;
                            }
                            strValue = string.Format("{0}: {1}({2})|{3}", token.Channel.Name + token.Channel.MSSN, Math.Round(contract.Value, 3), unit, Math.Round(contract.RPM ?? 0.0, 3));
                        }
                        else
                        {
                            strValue = string.Format(strChannelStringFormat, token.Channel.Name + token.Channel.MSSN, "---", "Unit");
                        }
                    }
                    else if (series.Tag is AnalogChannelToken)
                    {
                        AnalogChannelToken token = series.Tag as AnalogChannelToken;
                        if (index != -1)
                        {
                            AnInfoTableAMSContract contract = token.DataContracts[index]; //series.Points[index].Tag as AnInfoTableAMSContract;
                            string unit = string.Empty;
                            switch (contract.Unit)
                            {
                            case 3:
                                unit = "℃";
                                break;

                            case 4:
                                unit = "Pa";
                                break;

                            case 5:
                                unit = "RPM";
                                break;
                            }
                            strValue = string.Format(strChannelStringFormat, token.Channel.Name + token.Channel.MSSN, Math.Round(contract.Value, 3), unit);
                        }
                        else
                        {
                            strValue = string.Format(strChannelStringFormat, token.Channel.Name + token.Channel.MSSN, "---", "Unit");
                        }
                    }
                    else if (series.Tag is DivFreChannelToken)
                    {
                        DivFreChannelToken token = series.Tag as DivFreChannelToken;
                        if (index != -1)
                        {
                            DivFreTableFreContract contract = token.DataContracts[index];
                            string unit = string.Empty;
                            switch (contract.Unit)
                            {
                            case 0:
                                unit = "分频-m/s2";
                                break;

                            case 1:
                                unit = "分频-mm/s";
                                break;

                            case 2:
                                unit = "分频-mm";
                                break;
                            }
                            strValue = string.Format(strChannelStringFormat, token.Channel.FreDescription, Math.Round(contract.FreMV, 3), unit);
                        }
                        else
                        {
                            strValue = string.Format(strChannelStringFormat, token.Channel.FreDescription, "---", "Unit");
                        }
                    }

                    sb.AppendLine(strValue);
                    // series.Title.Text = strValue;
                    iSeriesNumber++;
                }
                sb.AppendLine("Time: " + m_chart.ViewXY.XAxes[0].TimeString(xValue, "yyyy/MM/dd HH:mm:ss"));
                //Set text
                cursorValueDisplay.Text    = sb.ToString().Trim();
                cursorValueDisplay.Visible = bLabelVisible;
                //Allow chart rendering
                m_chart.EndUpdate();

                if (channelList.Count > 0)
                {
                    viewModel.RaiseTrackChanged(channelList);
                }
            }
            catch (Exception ex)
            {
                EventAggregatorService.Instance.EventAggregator.GetEvent <ThrowExceptionEvent>().Publish(Tuple.Create <string, Exception>("数据回放-通频趋势-Track", ex));
                m_chart.EndUpdate();
            }
        }
Example #23
0
        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));
            }
        }
Example #24
0
        /// <summary>
        /// 温度云图的具体初始化细节
        /// </summary>
        private void CreateCloudChart()
        {
            _chartTempCloud = new LightningChartUltimate();

            // Disable rendering, strongly recommended before updating chart properties.
            _chartTempCloud.BeginUpdate();

            _chartTempCloud.ActiveView = ActiveView.ViewXY;
            _chartTempCloud.Parent     = lightningChartUltimate4;
            _chartTempCloud.Name       = "出铁口铁水温度分布云图";
            _chartTempCloud.Title.Text = "出铁口铁水温度分布云图";
            _chartTempCloud.Dock       = DockStyle.Fill;

            // Setup x-axis.
            _chartTempCloud.ViewXY.XAxes[0].ValueType  = AxisValueType.Number;
            _chartTempCloud.ViewXY.XAxes[0].ScrollMode = XAxisScrollMode.None;
            _chartTempCloud.ViewXY.XAxes[0].SetRange(0, 100);
            _chartTempCloud.ViewXY.XAxes[0].Visible = false;

            // Setup y-axis.
            _chartTempCloud.ViewXY.YAxes[0].SetRange(0, 100);
            _chartTempCloud.ViewXY.YAxes[0].Visible = false;

            // Setup custom style.
            ExampleUtils.SetDarkFlatStyle(_chartTempCloud);

            // Setup legend box.
            _chartTempCloud.ViewXY.LegendBoxes[0].Layout = LegendBoxLayout.Vertical;
            _chartTempCloud.ViewXY.LegendBoxes[0].Offset = new PointIntXY(-15, -70);

            // Prepare intensity series for data.
            _intensityGrid = new IntensityGridSeries(_chartTempCloud.ViewXY, _chartTempCloud.ViewXY.XAxes[0], _chartTempCloud.ViewXY.YAxes[0]);
            _intensityGrid.ContourLineType       = ContourLineTypeXY.None;
            _intensityGrid.Optimization          = IntensitySeriesOptimization.DynamicData;
            _intensityGrid.LegendBoxUnits        = "°C";
            _intensityGrid.LegendBoxValuesFormat = "0";
            _intensityGrid.Title.Text            = "Heat map";
            _intensityGrid.MouseInteraction      = false;


            _chartTempCloud.ViewXY.IntensityGridSeries.Add(_intensityGrid);

            //Create mouse tracking point label
            _mouseTrackAnnotation                       = new AnnotationXY(_chartTempCloud.ViewXY, _chartTempCloud.ViewXY.XAxes[0], _chartTempCloud.ViewXY.YAxes[0]);
            _mouseTrackAnnotation.Fill.Color            = Color.FromArgb(0, 30, 30, 30);
            _mouseTrackAnnotation.Fill.GradientFill     = GradientFill.Solid;
            _mouseTrackAnnotation.BorderLineStyle.Color = Color.FromArgb(10, Color.White);
            //_mouseTrackAnnotation.Style = AnnotationStyle.RoundedRectangle;


            _mouseTrackAnnotation.Shadow.Visible = false;
            //_mouseTrackAnnotation.TargetCoordinateSystem = AnnotationTargetCoordinates.AxisValues;
            //annotation.Visible = false; //Don't show before the data point has been found
            _mouseTrackAnnotation.TextStyle.Color = Color.White;
            _mouseTrackAnnotation.TextStyle.Font  = new Font("Segoe UI", 15f, FontStyle.Bold);
            _mouseTrackAnnotation.Style           = AnnotationStyle.Rectangle;

            _mouseTrackAnnotation.LocationCoordinateSystem = CoordinateSystem.RelativeCoordinatesToTarget;
            _mouseTrackAnnotation.LocationRelativeOffset.SetValues(10, 10);
            _mouseTrackAnnotation.Sizing = AnnotationXYSizing.Automatic;
            _mouseTrackAnnotation.Anchor.SetValues(0, 0); //Anchor to Top-left
            _mouseTrackAnnotation.Visible          = false;
            _mouseTrackAnnotation.MouseInteraction = false;
            _chartTempCloud.ViewXY.Annotations.Add(_mouseTrackAnnotation);

            _intensityGrid.MouseInteraction = true;

            // Allow chart rendering.
            _chartTempCloud.EndUpdate();
        }