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