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(); }
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(); }
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)); } }