Exemplo n.º 1
0
        private async Task AlgorithmAsync(BaseWaveChannelToken token)
        {
            double sampleFre = token.VData.SampleFre;

            if (token.VData.Trigger == TriggerType.Angle)
            {
                sampleFre = token.VData.RPM * token.VData.TeethNumber / 60;
            }
            int    samplePoint = token.VData.SamplePoint;
            double rpm         = token.VData.RPM;
            var    input       = token.VData.Waveform;

            if (filterCheckBox.IsChecked == true)
            {
                input = await Task.Run(() => { return(ViewModel.Filter(input, samplePoint, sampleFre, rpm)); });
            }
            if (envelopeCheckBox.IsChecked == true)
            {
                input = await Task.Run(() => { return(Algorithm.Instance.Envelope(input, samplePoint)); });
            }
            else if (tffCheckBox.IsChecked == true)
            {
                input = await Task.Run(() => { return(Algorithm.Instance.TFF(input, samplePoint, sampleFre)); });
            }
            else if (cepstrumCheckBox.IsChecked == true)
            {
                input = await Task.Run(() => { return(Algorithm.Instance.Cepstrum(input, samplePoint)); });
            }
            int length = (int)(samplePoint / 2.56) + 1;

            token.VData.PowerSpectrum = Algorithm.Instance.PowerSpectrumAction(input, sampleFre, samplePoint, dbCheckBox.IsChecked.Value).Take(length).ToArray();
        }
Exemplo n.º 2
0
        private void UpdateCursorResult(double xValue)
        {
            m_chart.BeginUpdate();

            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 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 + ":";
                BaseWaveChannelToken token = series.Tag as BaseWaveChannelToken;
                if (token.VData != null)
                {
                    bool   bResolvedOK = false;
                    double yValue      = 0;
                    bResolvedOK = SolveValueAccurate(series, xValue, 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("频率: " + xValue.ToString("0.00") + "Hz");
            //Set text
            cursorValueDisplay.Text    = sb.ToString().Trim();
            cursorValueDisplay.Visible = bLabelVisible;

            //Allow chart rendering
            m_chart.EndUpdate();
        }
        private async Task AlgorithmAsync(BaseWaveChannelToken token)
        {
            double sampleFre = token.VData.SampleFre;

            if (token.VData.Trigger == TriggerType.Angle)
            {
                sampleFre = token.VData.RPM * token.VData.TeethNumber / 60;
            }
            int    samplePoint = token.VData.SamplePoint;
            double rpm         = token.VData.RPM;
            var    input       = token.VData.Waveform;

            if (filterCheckBox.IsChecked == true)
            {
                input = await Task.Run(() => { return(viewModel.Filter(input, samplePoint, sampleFre, rpm)); });
            }
            if (envelopeCheckBox.IsChecked == true)
            {
                input = await Task.Run(() => { return(Algorithm.Instance.Envelope(input, samplePoint)); });
            }
            else if (tffCheckBox.IsChecked == true)
            {
                input = await Task.Run(() => { return(Algorithm.Instance.TFF(input, samplePoint, sampleFre)); });
            }
            else if (cepstrumCheckBox.IsChecked == true)
            {
                input = await Task.Run(() => { return(Algorithm.Instance.Cepstrum(input, samplePoint)); });
            }

            var output = Algorithm.Instance.FFT2AndPhaseAction(input, samplePoint);

            double frequencyInterval = sampleFre / samplePoint;
            int    length            = (int)(samplePoint / 2.56) + 1;

            if (token.VData.Frequency == null || token.VData.Frequency.Length != length)
            {
                token.VData.Frequency = new double[length];
            }
            for (int i = 0; i < length; i++)
            {
                token.VData.Frequency[i] = frequencyInterval * i;
            }
            token.VData.Amplitude = output[0].Take(length).ToArray();
            token.VData.Phase     = output[1].Take(length).ToArray();
        }
Exemplo n.º 4
0
        private void UpdateCursorResult(double xValue)
        {
            try
            {
                m_chart.BeginUpdate();
                List <BaseWaveChannelToken> channelList = new List <BaseWaveChannelToken>();
                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 BaseDivfreChannelToken)
                    {
                        BaseDivfreChannelToken token = series.Tag as BaseDivfreChannelToken;
                        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));
                        }
                        else
                        {
                            strValue = string.Format(strChannelStringFormat, token.DisplayName, "---", "Unit");
                        }
                    }
                    else if (series.Tag is BaseWaveChannelToken)
                    {
                        BaseWaveChannelToken token = series.Tag as BaseWaveChannelToken;
                        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);
                        }
                        else
                        {
                            strValue = string.Format(strChannelStringFormat, token.DisplayName, "---", "Unit");
                        }
                    }
                    else if (series.Tag is BaseAlarmChannelToken)
                    {
                        BaseAlarmChannelToken token = series.Tag as BaseAlarmChannelToken;
                        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);
                        }
                        else
                        {
                            strValue = string.Format(strChannelStringFormat, token.DisplayName, "---", "Unit");
                        }
                    }
                    else if (series.Tag is DivFreChannelToken)
                    {
                        DivFreChannelToken token = series.Tag as DivFreChannelToken;
                        if (index != -1)
                        {
                            var    contract = token.DataContracts[index];
                            string unit     = (from p in token.SlotDataContracts where p.RecordLab == contract.RecordLab select p.Unit).FirstOrDefault();

                            strValue = string.Format(strChannelStringFormat, token.DataContracts[index].DescriptionFre, Math.Round(contract.Result ?? 0.0, 3), unit);
                        }
                        else
                        {
                            strValue = string.Format(strChannelStringFormat, token.DataContracts[index].DescriptionFre, "---", "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();
            }
        }
        private void OnChannelAdded(ChannelToken token)
        {
            try
            {
                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        = 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          = true;

                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        = 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)
                {
                    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));
            }
        }