/// <summary> /// Creates a new GraphableSensor based on the given Graphablesensor /// </summary> /// <param name="baseSensor">The sensor to base it on</param> /// <param name="lowerTimeBound">The lowest time value allowed</param> /// <param name="upperTimeBound">The highest time value allowed</param> public GraphableSensor(GraphableSensor baseSensor, DateTime lowerTimeBound, DateTime upperTimeBound) { Debug.WriteLine("Lower Time Bound {0} Upper Time Bound {1}", lowerTimeBound, upperTimeBound); Sensor = baseSensor.Sensor; Colour = baseSensor.Colour; LowerBound = lowerTimeBound; UpperBound = upperTimeBound; BoundsSet = true; DataPoints = null; }
public static void RenderChartToImage(Chart elementToRender, GraphableSensor[] sensors, int width, int height, bool renderFullDataSeries, string filename) { if (elementToRender == null) return; Debug.WriteLine("Turning on immediate invalidate"); //Force immediate invalidation InvalidationHandler.ForceImmediateInvalidate = true; Debug.WriteLine("Creating new chart"); var clone = new Chart(); clone.Width = clone.Height = double.NaN; clone.HorizontalAlignment = HorizontalAlignment.Stretch; clone.VerticalAlignment = VerticalAlignment.Stretch; clone.Margin = new Thickness(); clone.Title = elementToRender.Title; clone.XAxis = new DateTimeAxis { Title = "Date" }; clone.YAxis = new LinearAxis { Range = (IRange<double>)elementToRender.YAxis.Range, Title = elementToRender.YAxis.Title }; for (var i = 0; i < elementToRender.Series.Count; i++) { var series = elementToRender.Series[i]; var sensor = sensors[i]; if (sensor.Sensor.Name != series.DataSeries.Title) { Debug.WriteLine("Mismatched titles! Oh Dear!"); continue; } var lineSeries = new LineSeries { LineStroke = ((LineSeries)series).LineStroke, DataSeries = renderFullDataSeries ? new DataSeries<DateTime, float>(sensor.Sensor.Name, sensor.DataPoints) : series.DataSeries }; clone.Series.Add(lineSeries); } var size = new Size(width, height); Debug.WriteLine("Rendering new chart of size {0}", size); clone.Measure(size); clone.Arrange(new Rect(size)); clone.UpdateLayout(); var renderer = new RenderTargetBitmap(width, height, 96d, 96d, PixelFormats.Pbgra32); renderer.Render(clone); var pngEncoder = new PngBitmapEncoder(); pngEncoder.Frames.Add(BitmapFrame.Create(renderer)); Debug.WriteLine("Saving to file"); using (var file = File.Create(filename)) { pngEncoder.Save(file); } Debug.WriteLine("Turning off immediate invalidate"); //Reset the invalidation handler InvalidationHandler.ForceImmediateInvalidate = false; EventLogger.LogInfo(null, "Image Exporter", "Saved graph as image to: " + filename); }
/// <summary> /// Deletes a sensor from the current dataset /// </summary> /// <param name="gSensor">The sensor to remove</param> public void DeleteSensor(GraphableSensor gSensor) { if (!Common.Confirm("Are you sure?", string.Format("Do you really want to delete {0}?", gSensor.Sensor.Name))) return; CurrentDataset.DeleteSensor(gSensor.Sensor); if (_sensorsToGraph.Contains(gSensor)) _sensorsToGraph.Remove(gSensor); if (SensorsToCheckMethodsAgainst.Contains(gSensor.Sensor)) SensorsToCheckMethodsAgainst.Remove(gSensor.Sensor); _graphableSensors = null; NotifyOfPropertyChange(() => GraphableSensors); }
/// <summary> /// Handles when a sensors trace colour is changed /// </summary> /// <param name="args">The colour change arguments</param> /// <param name="owner">The sensor whose colour was changed</param> public void ColourChanged(RoutedPropertyChangedEventArgs<Color> args, GraphableSensor owner) { if (ChartSeries == null) return; var matchingLineSeries = ChartSeries.FirstOrDefault(x => { var dataPoints = x.DataSeries as DataSeries<DateTime, float>; return dataPoints != null && dataPoints.Title == owner.Sensor.Name; }); if (matchingLineSeries == null) return; Debug.Print("Matched to graphed line series {0} attempting to update", matchingLineSeries.Name); matchingLineSeries.LineStroke = new SolidColorBrush(args.NewValue); NotifyOfPropertyChange(() => ChartSeries); }
/// <summary> /// Adds a sensor to the graph /// </summary> /// <param name="graphableSensor">The sensor to add to the graph</param> /// <param name="updateGraph">Whether or not to update the graph or not</param> public void AddToGraph(GraphableSensor graphableSensor, bool updateGraph = true) { if (graphableSensor.BoundsSet) graphableSensor.RemoveBounds(); if (_sensorsToGraph.FirstOrDefault(x => x.BoundsSet) != null) graphableSensor.SetUpperAndLowerBounds(StartTime, EndTime); AddToEditingSensors(graphableSensor); _sensorsToGraph.Add(graphableSensor); Debug.Print("{0} was added to the graph list", graphableSensor.Sensor); DisableFeatures(); UpdateGraph(_sensorsToGraph.Count < 2); //UpdateDetectionMethodGraphableSensors(); EnableFeatures(); UpdateUndoRedo(); NotifyOfPropertyChange(() => UncheckAllSensors); }
/// <summary> /// Adds a sensor to the list of sensors used for editing /// </summary> /// <param name="graphableSensor">The sensor to add</param> public void AddToEditingSensors(GraphableSensor graphableSensor) { SensorsToCheckMethodsAgainst.Add(graphableSensor.Sensor); graphableSensor.Sensor.PropertyChanged += SensorPropertyChanged; UpdateDetectionMethodGraphableSensors(); NotifyOfPropertyChange(() => SensorsForEditing); CheckTheseMethodsForThisSensor(_detectionMethods.Where(x => x.IsEnabled), graphableSensor.Sensor); UpdateDataTable(); }
/// <summary> /// Adds a new meta data object to the sensor /// </summary> /// <param name="sensor">The sensor to recieve a new meta data object</param> /// <param name="keyPressEvent">The key press used to fire the method</param> /// <param name="sender">The origin of the event</param> public void AddNewMetaData(GraphableSensor sensor, KeyEventArgs keyPressEvent, ComboBox sender) { if (keyPressEvent.Key != Key.Enter) return; Debug.Print("Enter key pressed creating new meta data"); Debug.Print("Sender {0} Sensor {1}", sender, sensor); var newMetaData = new SensorMetaData(sender.Text); sensor.Sensor.MetaData.Add(newMetaData); sensor.Sensor.CurrentMetaData = newMetaData; }
public void SetUp() { var rawSensor = new Sensor("Temperature", "Temperature at 30m", 40, 20, "C", 20, null); rawSensor.AddState(new SensorState(rawSensor, DateTime.Now)); _baseDate = DateTime.Now; rawSensor.CurrentState.Values.Add(_baseDate, 15); rawSensor.CurrentState.Values.Add(_baseDate.AddMinutes(15), 20); rawSensor.CurrentState.Values.Add(_baseDate.AddMinutes(30), 25); _gSensor = new GraphableSensor(rawSensor); }