Hallo,
ich lese ständig von einem Gerät Messwerte und zeichne die in einem XY-Graph, solange die Werte unter einer bestimmten Grenze liegen. Und wenn die Grenze überschritten wird, läuft die Aufzeichnung im Hintergrund, also Linie ist unsichtbar. Jetzt kommt meine Frage:
Wenn die Werte wieder unter die Grenze liegen, muss ich mit der Aufzeichnung wieder anfangen. Und ein zeitich begrenzter Abschnitt (z.B. 5 Sekunden) vor dem Unterschreiten muss auch mit aufgezeichnet werden. Also d.h. ich muss letzte 5 Sekunden immer irgendwo speichern, damit ich die später im Graph zeigen lassen kann.
ich habe ein
mit 3 Subloten. Ich zeige jetzt nur eins:
Ich habe zuerst mit ArrayList versucht. Die letzte 5 Sekunden habe ich in einem ArrayList gespeichert. und wenn die Grenze wieder unterschritten wurde, habe ich den Inhalt des ArrayList im Graph aufgezeichnet. Aber ich finde diese Lösung nicht so elegant und das Programm wird auch ein bisschen langsamer. Deswegen wollte ich fragen, wie ich es mit dem Hinzufügen neuer Series hinkriegen kann. Meine Idee ist, dass ich mit dem Überschreiten der Grenze eine neue Serie erzeuge, die immer nur letzte 5 Sekunden speichert. Und diese serie mache ich dann beim Unterschreiten der Grenze wieder sichtbar.
ich habe sowas versucht aber ohne Erfolg:
Wenn die Grenze überschritten wird:
und wenn die Grenze wieder unterschritten wird:
Danke im Voraus.
ich lese ständig von einem Gerät Messwerte und zeichne die in einem XY-Graph, solange die Werte unter einer bestimmten Grenze liegen. Und wenn die Grenze überschritten wird, läuft die Aufzeichnung im Hintergrund, also Linie ist unsichtbar. Jetzt kommt meine Frage:
Wenn die Werte wieder unter die Grenze liegen, muss ich mit der Aufzeichnung wieder anfangen. Und ein zeitich begrenzter Abschnitt (z.B. 5 Sekunden) vor dem Unterschreiten muss auch mit aufgezeichnet werden. Also d.h. ich muss letzte 5 Sekunden immer irgendwo speichern, damit ich die später im Graph zeigen lassen kann.
ich habe ein
Java:
CombinedDomainXYPlot
Java:
aSerie = new TimeSeries("A");
aSerie.setMaximumItemAge(10*60*1000); //!< 10 Minuten Zeitfenster
aDataset = new TimeSeriesCollection(aSerie);
//! Neues NumberAxis("A");
aRange = new DefaultAutoAdjustNumberAxis("A");
aRange.setAxisLineVisible(true);
aRange.setTickMarksVisible(true);
aRange.setNumberFormatOverride(new DecimalFormat("###%"));
aRange.setAutoTickUnitSelection(true);
aRange.setDefaultAutoRange(new Range(0.0, 1.4));
aRange.setRange(0.0, 1.4); //!< y-Acshe: von 0% bis 125%
aRange.setTickLabelsVisible(true);
aRenderer = new XYLineAndShapeRenderer(false, false); //!< (Seriesunsichtbar, Sharpes unsichtbar)
aRenderer.setDrawSeriesLineAsPath(true); //!< minimiert die Anzahl von Java2D-Aufrufen
aRenderer.setSeriesPaint(0, Color.BLACK);
aRenderer.setSeriesStroke(0,
new BasicStroke(2f,
BasicStroke.CAP_BUTT,
BasicStroke.JOIN_BEVEL));
//! Erzeugt ein neues Plot mit den spezifizierten Datensatz, Achsen und Renderer
aPlot = new XYPlot(aDataset, null,
aRange,
aRenderer);
aPlot.addRangeMarker(new ValueMarker(0.0));
plot.add(aPlot, 3);
Ich habe zuerst mit ArrayList versucht. Die letzte 5 Sekunden habe ich in einem ArrayList gespeichert. und wenn die Grenze wieder unterschritten wurde, habe ich den Inhalt des ArrayList im Graph aufgezeichnet. Aber ich finde diese Lösung nicht so elegant und das Programm wird auch ein bisschen langsamer. Deswegen wollte ich fragen, wie ich es mit dem Hinzufügen neuer Series hinkriegen kann. Meine Idee ist, dass ich mit dem Überschreiten der Grenze eine neue Serie erzeuge, die immer nur letzte 5 Sekunden speichert. Und diese serie mache ich dann beim Unterschreiten der Grenze wieder sichtbar.
ich habe sowas versucht aber ohne Erfolg:
Java:
private void makeSeries(){
seriesNumber++;
aSerie = new TimeSeries("A");
aSerie.setMaximumItemAge(5000); // 5 Sekunden
aRenderer.setSeriesLinesVisible(seriesNumber, false);
aDataset.addSeries(aSerie);
}
Wenn die Grenze überschritten wird:
Java:
aDataset.getSeries(seriesNumber).addOrUpdate(packet.getTimestamp(), packet.getA());
und wenn die Grenze wieder unterschritten wird:
Java:
aDataset.getSeries(seriesNumber).addOrUpdate(packet.getTimestamp(), packet.getA());
aDataset.getSeries(seriesNumber).setMaximumItemAge(ZeusMenuBar.getInstance().getZeitfenster()*60); // 10 Minuten Zeitfenster
aRenderer.setSeriesLinesVisible(seriesNumber, true);
Danke im Voraus.