From 0fda2ba3ff49bdc1ffc6833f658e2164af187008 Mon Sep 17 00:00:00 2001 From: Roy Ben-Shabat Date: Tue, 16 Jan 2018 12:17:10 +0200 Subject: Embedded RealTimeGraphEx library to solution. Added graphs to technician view. Implemented simple sensors data test using Machine Emulator. --- .../FastGraphs/RealTimeGraphExLineScroll.cs | 251 +++++++++++++++++++++ 1 file changed, 251 insertions(+) create mode 100644 Software/Visual_Studio/SideChains/RealTimeGraphEx/FastGraphs/RealTimeGraphExLineScroll.cs (limited to 'Software/Visual_Studio/SideChains/RealTimeGraphEx/FastGraphs/RealTimeGraphExLineScroll.cs') diff --git a/Software/Visual_Studio/SideChains/RealTimeGraphEx/FastGraphs/RealTimeGraphExLineScroll.cs b/Software/Visual_Studio/SideChains/RealTimeGraphEx/FastGraphs/RealTimeGraphExLineScroll.cs new file mode 100644 index 000000000..216683d39 --- /dev/null +++ b/Software/Visual_Studio/SideChains/RealTimeGraphEx/FastGraphs/RealTimeGraphExLineScroll.cs @@ -0,0 +1,251 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Threading; +using RealTimeGraphEx.Models; +using RealTimeGraphEx.DataSeries; +using RealTimeGraphEx.Controllers; +using System.Runtime.ExceptionServices; + +namespace RealTimeGraphEx.FastGraphs +{ + /// + /// Represents a real-time graph with a single scrollable line. + /// + public class RealTimeGraphExLineScroll : RealTimeGraphExBase + { + #region Protected Fields + + protected ConcurrentpointsList graphPolygon; + protected int updateCounter; + + #endregion + + #region Cross Thread Fields + + protected GraphController _graphController; + protected int _maxPoints; + protected double _scaleFactor; + protected Color _stroke; + protected Color _fill; + protected bool _fillGraph; + protected List _markers; + + #endregion + + #region Properties + + /// + /// Gets or sets the maximum vectorsCollection to display on the graph (default 1000, affects performance). + /// + public int MaxPoints + { + get { return (int)GetValue(MaxPointsProperty); } + set { SetValue(MaxPointsProperty, value); } + } + public static readonly DependencyProperty MaxPointsProperty = + DependencyProperty.Register("MaxPoints", typeof(int), typeof(RealTimeGraphExLineScroll), new PropertyMetadata(1000, new PropertyChangedCallback(CrossModelChanged))); + + + /// + /// Gets or sets the graph fill color. + /// + public Color Stroke + { + get { return (Color)GetValue(StrokeProperty); } + set { SetValue(StrokeProperty, value); } + } + public static readonly DependencyProperty StrokeProperty = + DependencyProperty.Register("Stroke", typeof(Color), typeof(RealTimeGraphExLineScroll), new PropertyMetadata(Colors.Black, new PropertyChangedCallback(CrossModelChanged))); + + /// + /// Gets or sets the graph fill color. + /// + public Color Fill + { + get { return (Color)GetValue(FillProperty); } + set { SetValue(FillProperty, value); } + } + public static readonly DependencyProperty FillProperty = + DependencyProperty.Register("Fill", typeof(Color), typeof(RealTimeGraphExLineScroll), new PropertyMetadata(Colors.Gray, new PropertyChangedCallback(CrossModelChanged))); + + /// + /// Gets or sets whether the graph will be rendered using the Fill color property. + /// + public bool FillGraph + { + get { return (bool)GetValue(FillGraphProperty); } + set { SetValue(FillGraphProperty, value); } + } + public static readonly DependencyProperty FillGraphProperty = + DependencyProperty.Register("FillGraph", typeof(bool), typeof(RealTimeGraphExLineScroll), new PropertyMetadata(false, new PropertyChangedCallback(CrossModelChanged))); + + + /// + /// Gets or sets the IDataSeries used to push data vectorsCollection to the graph. + /// + public GraphController Controller + { + get { return (GraphController)GetValue(ControllerProperty); } + set { SetValue(ControllerProperty, value); } + } + public static readonly DependencyProperty ControllerProperty = + DependencyProperty.Register("Controller", typeof(GraphController), typeof(RealTimeGraphExLineScroll), new PropertyMetadata(null, new PropertyChangedCallback(GraphControllerChanged))); + private static void GraphControllerChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + var control = d as RealTimeGraphExLineScroll; + + if (control.Controller != null) + { + control.Controller.RegisterMethods(control.ClearGraph, control.StartPushThread, control.SetPaused, control.ChangeRenderMode, control.OnPushMarker); + control._graphController = control.Controller; + } + } + + #endregion + + #region Constructors + + public RealTimeGraphExLineScroll() + : base() + { + graphPolygon = new ConcurrentpointsList(); + _markers = new List(); + } + + #endregion + + #region Override Methods + + protected override void OnSizeChanged(object sender, SizeChangedEventArgs e) + { + OnSetCrossThreadFields(); + } + + protected override void OnSetCrossThreadFields() + { + base.OnSetCrossThreadFields(); + + this.Dispatcher.Invoke(() => + { + _maxPoints = MaxPoints; + _scaleFactor = _width / _maxPoints; + _graphController = Controller; + _stroke = Stroke; + _fillGraph = FillGraph; + _fill = Fill; + + }, DispatcherPriority.Send); + } + + protected override void OnClearGraph() + { + base.OnClearGraph(); + _graphController.dataSeries.ClearPoints(); + graphPolygon.Clear(); + } + + protected internal override void OnRenderGraph() + { + if (_graphController != null && _graphController.dataSeries.Points != null && _graphController.dataSeries.Points.Count > 0 && _width > 1 && _height > 1) + { + var points = _graphController.dataSeries.Points.GetAndClearAllPoints(); + + if (!_isPaused) + { + + for (int i = 0; i < points.Count; i++) + { + double value = points[i]; + NormalizeValue(ref value); + + graphPolygon.Add(value); + + xValueCounter += _scaleFactor; + } + + if (graphPolygon.Count > _maxPoints + 1) + { + xValueCounter -= (_scaleFactor * (graphPolygon.Count - (_maxPoints + 1))); + graphPolygon.RemoveFromStart(graphPolygon.Count - (_maxPoints + 1)); + } + } + + updateCounter++; + + if (updateCounter >= 1) + { + updateCounter = 0; + + if (!_disableRendering) + { + WriteableBitmap bmp = BitmapFactory.New((int)_mainWidth, (int)_mainHeight); + bmp.Clear(Colors.Transparent); + + OnDrawVisuals(bmp); + + bmp.Freeze(); + + img.Dispatcher.BeginInvoke(new Action(() => + { + img.Source = bmp; + }), System.Windows.Threading.DispatcherPriority.Send); + } + } + } + } + + protected override void OnZoomingComplete(Point transformOrigin, double scaleX, double scaleY) + { + base.OnZoomingComplete(transformOrigin, scaleX, scaleY); + } + + #endregion + + #region Virtual Methods + + protected virtual void OnPushMarker() + { + + } + + /// + /// Calculate the scaling factor for the current graph width. + /// + /// + protected virtual double GetPolygonScaleFactor() + { + return _width / (graphPolygon.Count - 1); + } + + /// + /// Draw the actual polygon on the image. + /// + /// + [HandleProcessCorruptedStateExceptions] + protected virtual void OnDrawVisuals(WriteableBitmap bmp) + { + Color stroke = _graphController.dataSeries.GetStrokeColor() != null ? _graphController.dataSeries.GetStrokeColor().Value : _stroke; + Color fill = _graphController.dataSeries.GetFillColor() != null ? _graphController.dataSeries.GetFillColor().Value : _fill; + + double scale = GetPolygonScaleFactor(); + + OnBeforeRenderingVisuals(bmp, scale); + + if (_fillGraph) //Fill Graph + { + bmp.FillPolygon(graphPolygon.ToPolygonPointsFill(_offSetX, _offSetY, _mainWidth, _mainHeight, scale, ConvertYToImageYFliped), fill); + } + + DrawPolyline(bmp, graphPolygon.ToPolygonPoints(_offSetX, _offSetY, scale, ConvertYToImageYFliped), stroke); + + OnAfterRenderingVisuals(bmp, scale); + } + #endregion + } +} -- cgit v1.3.1 From d36a5ab7115ec53405622e4437cd3f8f615d515d Mon Sep 17 00:00:00 2001 From: Roy Ben-Shabat Date: Wed, 24 Jan 2018 19:32:14 +0200 Subject: Added support for multi sensor frame on developer module graph. --- Software/DB/Tango.mdf | Bin 75497472 -> 75497472 bytes Software/DB/Tango_log.ldf | Bin 8388608 -> 8388608 bytes .../ViewModels/MainViewVM.cs | 44 +++++++-- .../Controls/IRealTimeGraph.cs | 48 +++++++++ .../Controls/RealTimeGraphControl.xaml | 2 +- .../Controls/RealTimeGraphControl.xaml.cs | 15 ++- .../Controls/RealTimeGraphMultiControl.xaml | 95 ++++++++++++++++++ .../Controls/RealTimeGraphMultiControl.xaml.cs | 107 +++++++++++++++++++++ .../Resources/MaterialDesign.xaml | 40 ++++++++ .../Tango.MachineStudio.Common.csproj | 8 ++ .../FastGraphs/RealTimeGraphExLineScroll.cs | 12 --- .../RealTimeGraphEx/RealTimeGraphExBase.cs | 11 +++ .../RealTimeGraphEx/RealTimeGraphExMultiBase.cs | 12 --- .../Tango.Core/Helpers/ColorHelper.cs | 11 +++ 14 files changed, 370 insertions(+), 35 deletions(-) create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/IRealTimeGraph.cs create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphMultiControl.xaml create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphMultiControl.xaml.cs (limited to 'Software/Visual_Studio/SideChains/RealTimeGraphEx/FastGraphs/RealTimeGraphExLineScroll.cs') diff --git a/Software/DB/Tango.mdf b/Software/DB/Tango.mdf index 27da03f9b..875b88771 100644 Binary files a/Software/DB/Tango.mdf and b/Software/DB/Tango.mdf differ diff --git a/Software/DB/Tango_log.ldf b/Software/DB/Tango_log.ldf index bdff96627..3a65c84fa 100644 Binary files a/Software/DB/Tango_log.ldf and b/Software/DB/Tango_log.ldf differ diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/ViewModels/MainViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/ViewModels/MainViewVM.cs index 590474f9d..dc3ba0ec5 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/ViewModels/MainViewVM.cs +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Developer/ViewModels/MainViewVM.cs @@ -1,10 +1,13 @@ using GalaSoft.MvvmLight.Ioc; +using RealTimeGraphEx.Controllers; +using RealTimeGraphEx.DataSeries; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Windows.Media; using Tango.Core.Commands; using Tango.DAL.Observables; using Tango.MachineStudio.Common.Controls; @@ -124,11 +127,11 @@ namespace Tango.MachineStudio.Developer.ViewModels set { _availableSensors = value; RaisePropertyChangedAuto(); } } - private ObservableCollection _graphs; + private ObservableCollection _graphs; /// /// Gets or sets the collection of displayed graph controls. /// - public ObservableCollection Graphs + public ObservableCollection Graphs { get { return _graphs; } set { _graphs = value; RaisePropertyChangedAuto(); } @@ -180,7 +183,7 @@ namespace Tango.MachineStudio.Developer.ViewModels AvailableSensors = Adapter.Sensors.ToObservableCollection(); } - Graphs = new ObservableCollection(); + Graphs = new ObservableCollection(); } /// @@ -338,16 +341,39 @@ namespace Tango.MachineStudio.Developer.ViewModels { if (Graphs.Count < 8) { - RealTimeGraphControl graphControl = new RealTimeGraphControl(); + IRealTimeGraph graphControl = null; + + if (!sensor.MultiChannel) + { + graphControl = new RealTimeGraphControl(); + } + else + { + graphControl = new RealTimeGraphMultiControl(); + GraphMultiController controller = new GraphMultiController(); + + for (int i = 0; i < sensor.ChannelCount; i++) + { + controller.AddSeries(new DataYSeries() + { + Name = sensor.Description.First().ToString() + (i + 1), + UseFillAndStroke = true, + Stroke = new SolidColorBrush(Core.Helpers.ColorHelper.GetRandomColor()) + }); + } + + graphControl.Controller = controller; + } + graphControl.Tag = sensor; graphControl.SensorName = sensor.Description; graphControl.SensorUnits = sensor.Units; - graphControl.Graph.Minimum = sensor.Min; - graphControl.Graph.Maximum = sensor.Max; - graphControl.Graph.MaxPoints = Common.Helpers.GraphsHelper.GetMaxPoints(sensor.PointsPerFrame); + graphControl.InnerGraph.Minimum = sensor.Min; + graphControl.InnerGraph.Maximum = sensor.Max; + graphControl.InnerGraph.MaxPoints = Common.Helpers.GraphsHelper.GetMaxPoints(sensor.PointsPerFrame); graphControl.GraphRemoveButtonPressed += (sender, __) => { - RemoveGraph(sender as RealTimeGraphControl); + RemoveGraph(sender as IRealTimeGraph); }; Graphs.Add(graphControl); AvailableSensors.Remove(sensor); @@ -362,7 +388,7 @@ namespace Tango.MachineStudio.Developer.ViewModels /// Removes the graph. /// /// The graph. - public void RemoveGraph(RealTimeGraphControl graph) + public void RemoveGraph(IRealTimeGraph graph) { Graphs.Remove(graph); AvailableSensors.Insert(0, graph.Tag as Sensor); diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/IRealTimeGraph.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/IRealTimeGraph.cs new file mode 100644 index 000000000..5ca930c91 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/IRealTimeGraph.cs @@ -0,0 +1,48 @@ +using RealTimeGraphEx; +using RealTimeGraphEx.Controllers; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.MachineStudio.Common.Controls +{ + public interface IRealTimeGraph + { + /// + /// Gets or sets the name of the sensor. + /// + String SensorName { get; set; } + + /// + /// Gets or sets the tag. + /// + Object Tag { get; set; } + + /// + /// Gets or sets the sensor units. + /// + String SensorUnits { get; set; } + + /// + /// Occurs when the graph remove button has been pressed. + /// + event EventHandler GraphRemoveButtonPressed; + + /// + /// Occurs when the graph full screen button has been pressed. + /// + event EventHandler GraphFullScreenButtonPressed; + + /// + /// Gets or sets the inner real-time graph control. + /// + RealTimeGraphExBase InnerGraph { get; set; } + + /// + /// Gets or sets the inner graph controller. + /// + GraphControllerBase Controller { get; set; } + } +} diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphControl.xaml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphControl.xaml index 687bc6030..449cea493 100644 --- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphControl.xaml +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphControl.xaml @@ -67,7 +67,7 @@ - + diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphControl.xaml.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphControl.xaml.cs index 6396ab91a..359e52823 100644 --- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphControl.xaml.cs +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphControl.xaml.cs @@ -14,13 +14,15 @@ using System.Windows.Media.Animation; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; +using RealTimeGraphEx; +using RealTimeGraphEx.Controllers; namespace Tango.MachineStudio.Common.Controls { /// /// Interaction logic for RealTimeGraphControl.xaml /// - public partial class RealTimeGraphControl : UserControl + public partial class RealTimeGraphControl : UserControl, IRealTimeGraph { #region Properties @@ -46,6 +48,15 @@ namespace Tango.MachineStudio.Common.Controls public static readonly DependencyProperty SensorUnitsProperty = DependencyProperty.Register("SensorUnits", typeof(String), typeof(RealTimeGraphControl), new PropertyMetadata(null)); + /// + /// Gets or sets the inner real-time graph control. + /// + public RealTimeGraphExBase InnerGraph { get; set; } + + /// + /// Gets or sets the inner graph controller. + /// + public GraphControllerBase Controller { get; set; } #endregion @@ -59,6 +70,8 @@ namespace Tango.MachineStudio.Common.Controls public RealTimeGraphControl() { InitializeComponent(); + InnerGraph = Graph; + Controller = new GraphController(); } private void OnGraphFullScreen(object sender, RoutedEventArgs e) diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphMultiControl.xaml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphMultiControl.xaml new file mode 100644 index 000000000..23573e574 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphMultiControl.xaml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphMultiControl.xaml.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphMultiControl.xaml.cs new file mode 100644 index 000000000..5cb69b786 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/RealTimeGraphMultiControl.xaml.cs @@ -0,0 +1,107 @@ +using RealTimeGraphEx; +using RealTimeGraphEx.Controllers; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Tango.MachineStudio.Common.Controls +{ + /// + /// Interaction logic for RealTimeGraphControl.xaml + /// + public partial class RealTimeGraphMultiControl : UserControl , IRealTimeGraph + { + #region Properties + + /// + /// Gets or sets the name of the sensor. + /// + public String SensorName + { + get { return (String)GetValue(SensorNameProperty); } + set { SetValue(SensorNameProperty, value); } + } + public static readonly DependencyProperty SensorNameProperty = + DependencyProperty.Register("SensorName", typeof(String), typeof(RealTimeGraphMultiControl), new PropertyMetadata(null)); + + /// + /// Gets or sets the sensor units. + /// + public String SensorUnits + { + get { return (String)GetValue(SensorUnitsProperty); } + set { SetValue(SensorUnitsProperty, value); } + } + public static readonly DependencyProperty SensorUnitsProperty = + DependencyProperty.Register("SensorUnits", typeof(String), typeof(RealTimeGraphMultiControl), new PropertyMetadata(null)); + + /// + /// Gets or sets the inner real-time graph control. + /// + public RealTimeGraphExBase InnerGraph { get; set; } + + /// + /// Gets or sets the inner graph controller. + /// + public GraphControllerBase Controller { get; set; } + + #endregion + + #region Events + + public event EventHandler GraphRemoveButtonPressed; + public event EventHandler GraphFullScreenButtonPressed; + + #endregion + + public RealTimeGraphMultiControl() + { + InitializeComponent(); + InnerGraph = Graph; + Controller = new GraphMultiController(); + } + + private void OnGraphFullScreen(object sender, RoutedEventArgs e) + { + GraphFullScreenButtonPressed?.Invoke(this, new EventArgs()); + } + + private void Graph_MouseEnter(object sender, MouseEventArgs e) + { + Grid mainGrid = sender as Grid; + var headerGrid = mainGrid.Children.OfType().ToList().First(); + ThicknessAnimation ani = new ThicknessAnimation(); + ani.To = new Thickness(0, 0, 0, 0); + ani.Duration = TimeSpan.FromSeconds(0.2); + headerGrid.BeginAnimation(Grid.MarginProperty, ani); + } + + private void Graph_MouseLeave(object sender, MouseEventArgs e) + { + Grid mainGrid = sender as Grid; + var headerGrid = mainGrid.Children.OfType().ToList().First(); + ThicknessAnimation ani = new ThicknessAnimation(); + ani.To = new Thickness(0, -35, 0, 0); + ani.Duration = TimeSpan.FromSeconds(0.2); + headerGrid.BeginAnimation(Grid.MarginProperty, ani); + } + + private void OnGraphRemove(object sender, RoutedEventArgs e) + { + GraphRemoveButtonPressed?.Invoke(this, new EventArgs()); + } + } +} diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Resources/MaterialDesign.xaml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Resources/MaterialDesign.xaml index cc18c31c5..8c5464930 100644 --- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Resources/MaterialDesign.xaml +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Resources/MaterialDesign.xaml @@ -267,6 +267,46 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Tango.MachineStudio.Common.csproj b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Tango.MachineStudio.Common.csproj index b89ec2e09..bc7f00d58 100644 --- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Tango.MachineStudio.Common.csproj +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Tango.MachineStudio.Common.csproj @@ -71,6 +71,10 @@ + + + RealTimeGraphMultiControl.xaml + RealTimeGraphControl.xaml @@ -103,6 +107,10 @@ + + MSBuild:Compile + Designer + Designer MSBuild:Compile diff --git a/Software/Visual_Studio/SideChains/RealTimeGraphEx/FastGraphs/RealTimeGraphExLineScroll.cs b/Software/Visual_Studio/SideChains/RealTimeGraphEx/FastGraphs/RealTimeGraphExLineScroll.cs index 216683d39..a2260030c 100644 --- a/Software/Visual_Studio/SideChains/RealTimeGraphEx/FastGraphs/RealTimeGraphExLineScroll.cs +++ b/Software/Visual_Studio/SideChains/RealTimeGraphEx/FastGraphs/RealTimeGraphExLineScroll.cs @@ -40,18 +40,6 @@ namespace RealTimeGraphEx.FastGraphs #region Properties - /// - /// Gets or sets the maximum vectorsCollection to display on the graph (default 1000, affects performance). - /// - public int MaxPoints - { - get { return (int)GetValue(MaxPointsProperty); } - set { SetValue(MaxPointsProperty, value); } - } - public static readonly DependencyProperty MaxPointsProperty = - DependencyProperty.Register("MaxPoints", typeof(int), typeof(RealTimeGraphExLineScroll), new PropertyMetadata(1000, new PropertyChangedCallback(CrossModelChanged))); - - /// /// Gets or sets the graph fill color. /// diff --git a/Software/Visual_Studio/SideChains/RealTimeGraphEx/RealTimeGraphExBase.cs b/Software/Visual_Studio/SideChains/RealTimeGraphEx/RealTimeGraphExBase.cs index cf8d6c0fe..c1ed37474 100644 --- a/Software/Visual_Studio/SideChains/RealTimeGraphEx/RealTimeGraphExBase.cs +++ b/Software/Visual_Studio/SideChains/RealTimeGraphEx/RealTimeGraphExBase.cs @@ -349,6 +349,17 @@ namespace RealTimeGraphEx public static readonly DependencyProperty ZoomDirectionProperty = DependencyProperty.Register("ZoomDirection", typeof(ZoomDirectionEnum), typeof(RealTimeGraphExBase), new PropertyMetadata(ZoomDirectionEnum.Both)); + /// + /// Gets or sets the maximum points to display on the graph (default 1000). + /// + public int MaxPoints + { + get { return (int)GetValue(MaxPointsProperty); } + set { SetValue(MaxPointsProperty, value); } + } + public static readonly DependencyProperty MaxPointsProperty = + DependencyProperty.Register("MaxPoints", typeof(int), typeof(RealTimeGraphExBase), new PropertyMetadata(1000, new PropertyChangedCallback(CrossModelChanged))); + #endregion #region Cross Thread Fields diff --git a/Software/Visual_Studio/SideChains/RealTimeGraphEx/RealTimeGraphExMultiBase.cs b/Software/Visual_Studio/SideChains/RealTimeGraphEx/RealTimeGraphExMultiBase.cs index d9edc478e..108ff4ea3 100644 --- a/Software/Visual_Studio/SideChains/RealTimeGraphEx/RealTimeGraphExMultiBase.cs +++ b/Software/Visual_Studio/SideChains/RealTimeGraphEx/RealTimeGraphExMultiBase.cs @@ -22,18 +22,6 @@ namespace RealTimeGraphEx #region Properties - /// - /// Gets or sets the maximum points to display on the graph (default 1000). - /// - public int MaxPoints - { - get { return (int)GetValue(MaxPointsProperty); } - set { SetValue(MaxPointsProperty, value); } - } - public static readonly DependencyProperty MaxPointsProperty = - DependencyProperty.Register("MaxPoints", typeof(int), typeof(RealTimeGraphExMultiBase), new PropertyMetadata(1000, new PropertyChangedCallback(CrossModelChanged))); - - /// /// Gets or sets the collection of data series to display on the graph. /// diff --git a/Software/Visual_Studio/Tango.Core/Helpers/ColorHelper.cs b/Software/Visual_Studio/Tango.Core/Helpers/ColorHelper.cs index c5ebc7474..3d0532985 100644 --- a/Software/Visual_Studio/Tango.Core/Helpers/ColorHelper.cs +++ b/Software/Visual_Studio/Tango.Core/Helpers/ColorHelper.cs @@ -12,6 +12,8 @@ namespace Tango.Core.Helpers /// public static class ColorHelper { + private static Random rnd = new Random(); + /// /// Converts the specified color to integer. /// @@ -36,5 +38,14 @@ namespace Tango.Core.Helpers byte b = (byte)(integer >> 0); return Color.FromArgb(a, r, g, b); } + + /// + /// Returns a random color. + /// + /// + public static Color GetRandomColor() + { + return Color.FromRgb((byte)rnd.Next(256), (byte)rnd.Next(256), (byte)rnd.Next(256)); + } } } -- cgit v1.3.1