From 065ed130a6c7ca9e064bc36be743274c1ca5ca20 Mon Sep 17 00:00:00 2001 From: Alexandre Gobbo Date: Tue, 12 Aug 2014 16:41:58 +0200 Subject: [PATCH] Adapting to plot v2: Abstraction of graphs & new implementations: JZY3D, JavaFX, JFreeChart --- ch.psi.fda/ReleaseNotes.md | 2 + ch.psi.fda/pom.xml | 11 +- .../fda/ui/visualizer/SeriesDataFilter.java | 2 + .../ch/psi/fda/ui/visualizer/Visualizer.java | 217 ++++++++++-------- .../visualizer/XYSeriesArrayDataFilter.java | 14 +- .../fda/ui/visualizer/XYSeriesDataFilter.java | 31 +-- .../visualizer/XYZSeriesArrayDataFilter.java | 11 + .../ui/visualizer/XYZSeriesDataFilter.java | 11 + 8 files changed, 178 insertions(+), 121 deletions(-) diff --git a/ch.psi.fda/ReleaseNotes.md b/ch.psi.fda/ReleaseNotes.md index 6d44b51..bf83cd2 100644 --- a/ch.psi.fda/ReleaseNotes.md +++ b/ch.psi.fda/ReleaseNotes.md @@ -1,2 +1,4 @@ +# 3.1.0 + * Abstracted interfaces of plot package and implemented JZY3d, JFreeChart and JavaFX # 3.0.1 * Update the fda.properties file and replace ch.psi.fda.aq.data.baseDirectory with ch.psi.fda.aq.data.dir. \ No newline at end of file diff --git a/ch.psi.fda/pom.xml b/ch.psi.fda/pom.xml index 6ea429a..9fdbeab 100644 --- a/ch.psi.fda/pom.xml +++ b/ch.psi.fda/pom.xml @@ -36,12 +36,6 @@ 2.4.1 - - ch.psi - plot - 1.1.31 - - com.google.inject guice @@ -97,6 +91,11 @@ 4.8.2 test + + ${project.groupId} + plot + 2.0-SNAPSHOT + diff --git a/ch.psi.fda/src/main/java/ch/psi/fda/ui/visualizer/SeriesDataFilter.java b/ch.psi.fda/src/main/java/ch/psi/fda/ui/visualizer/SeriesDataFilter.java index 9d953d7..43a65c2 100644 --- a/ch.psi.fda/src/main/java/ch/psi/fda/ui/visualizer/SeriesDataFilter.java +++ b/ch.psi.fda/src/main/java/ch/psi/fda/ui/visualizer/SeriesDataFilter.java @@ -20,6 +20,7 @@ package ch.psi.fda.ui.visualizer; import ch.psi.plot.Plot; +import ch.psi.plot.PlotSeries; public interface SeriesDataFilter { /** @@ -27,4 +28,5 @@ public interface SeriesDataFilter { * @return */ public Plot getPlot(); + public PlotSeries getSeries(); } diff --git a/ch.psi.fda/src/main/java/ch/psi/fda/ui/visualizer/Visualizer.java b/ch.psi.fda/src/main/java/ch/psi/fda/ui/visualizer/Visualizer.java index 51fc3b4..11bfe50 100644 --- a/ch.psi.fda/src/main/java/ch/psi/fda/ui/visualizer/Visualizer.java +++ b/ch.psi.fda/src/main/java/ch/psi/fda/ui/visualizer/Visualizer.java @@ -19,16 +19,6 @@ package ch.psi.fda.ui.visualizer; -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; - -import javax.swing.JPanel; -import javax.swing.SwingUtilities; - -import com.google.common.eventbus.Subscribe; - import ch.psi.fda.messages.DataMessage; import ch.psi.fda.messages.EndOfStreamMessage; import ch.psi.fda.messages.StreamDelimiterMessage; @@ -38,12 +28,20 @@ import ch.psi.fda.vdescriptor.XYSeries; import ch.psi.fda.vdescriptor.XYZSeries; import ch.psi.fda.vdescriptor.YSeries; import ch.psi.fda.vdescriptor.YZSeries; +import ch.psi.plot.LinePlot; +import ch.psi.plot.LinePlotBase; +import ch.psi.plot.LinePlotSeries; +import ch.psi.plot.MatrixPlot; +import ch.psi.plot.MatrixPlotBase; +import ch.psi.plot.MatrixPlotSeries; import ch.psi.plot.Plot; -import ch.psi.plot.xy.LinePlot; -import ch.psi.plot.xy.XYSeriesCollectionP; -import ch.psi.plot.xy.XYSeriesP; -import ch.psi.plot.xyz.MatrixPlot; -import ch.psi.plot.xyz.MatrixPlotData; +import com.google.common.eventbus.Subscribe; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; /** * Visualizer for visualizing data @@ -61,62 +59,83 @@ public class Visualizer { private List filters; private boolean first = true; - - public Visualizer(VDescriptor vdescriptor){ + public Visualizer(VDescriptor vdescriptor){ + this(vdescriptor,null,null); + } + public Visualizer(VDescriptor vdescriptor, String linePlotImpl, String matrixPlotImpl){ + if (linePlotImpl==null){ + linePlotImpl="jfree"; + } + if (matrixPlotImpl==null){ + matrixPlotImpl="jfree"; + } filters = new ArrayList(); - for(ch.psi.fda.vdescriptor.Plot vplot: vdescriptor.getPlots()){ - if(vplot instanceof ch.psi.fda.vdescriptor.LinePlot){ - ch.psi.fda.vdescriptor.LinePlot lp = (ch.psi.fda.vdescriptor.LinePlot) vplot; - - // Create plot for visualization - ch.psi.plot.xy.LinePlot plot = new ch.psi.plot.xy.LinePlot(lp.getTitle()); - - for(Series s: lp.getData()){ - if(s instanceof XYSeries){ - XYSeries sxy = (XYSeries)s; - XYSeriesDataFilter filter = new XYSeriesDataFilter(sxy.getX(), sxy.getY(), plot); - filter.setSeriesName(sxy.getY()); - filters.add(filter); - } - else if(s instanceof YSeries){ - YSeries sy = (YSeries)s; - - XYSeriesArrayDataFilter filter = new XYSeriesArrayDataFilter(sy.getY(), plot); -// filter.setMaxSeries(lp.getMaxSeries()*lp.getY().size()); // Workaround - keep for each array max series -// filter.setOffset(lp.getOffset()); -// filter.setSize(lp.getSize()); - filter.setSeriesName(sy.getY()); - filters.add(filter); - } - } - - } - else if(vplot instanceof ch.psi.fda.vdescriptor.MatrixPlot){ - - // MatrixPlot does currently not support RegionPositioners because of the - // plotting problems this would cause. If regions of the positioner have different - // step sizes it is not easily possible (without (specialized) rasterization) to plot the data. - - ch.psi.fda.vdescriptor.MatrixPlot lp = (ch.psi.fda.vdescriptor.MatrixPlot) vplot; - MatrixPlotData data = new MatrixPlotData(lp.getMinX(), lp.getMaxX(), lp.getnX(), lp.getMinY(), lp.getMaxY(), lp.getnY()); - MatrixPlot plot = new MatrixPlot(lp.getTitle(), data); - - for(Series s: lp.getData()){ - if(s instanceof XYZSeries){ - XYZSeries sxyz = (XYZSeries) s; - filters.add(new XYZSeriesDataFilter(sxyz.getX(), sxyz.getY(), sxyz.getZ(), plot)); - - } - else if(s instanceof YZSeries){ - YZSeries syz = (YZSeries) s; - XYZSeriesArrayDataFilter filter = new XYZSeriesArrayDataFilter(syz.getY(), syz.getZ(), 0, 0, plot); - filters.add(filter); - - } - } - } + try{ + for(ch.psi.fda.vdescriptor.Plot vplot: vdescriptor.getPlots()){ + if(vplot instanceof ch.psi.fda.vdescriptor.LinePlot){ + ch.psi.fda.vdescriptor.LinePlot lp = (ch.psi.fda.vdescriptor.LinePlot) vplot; + + // Create plot for visualization + LinePlot plot = LinePlotBase.newPlot(linePlotImpl); + plot.setTitle(lp.getTitle()); + + for(Series s: lp.getData()){ + if(s instanceof XYSeries){ + XYSeries sxy = (XYSeries)s; + XYSeriesDataFilter filter = new XYSeriesDataFilter(sxy.getX(), sxy.getY(), plot); + filter.setSeriesName(sxy.getY()); + filters.add(filter); + } + else if(s instanceof YSeries){ + YSeries sy = (YSeries)s; + + XYSeriesArrayDataFilter filter = new XYSeriesArrayDataFilter(sy.getY(), plot); + // filter.setMaxSeries(lp.getMaxSeries()*lp.getY().size()); // Workaround - keep for each array max series + // filter.setOffset(lp.getOffset()); + // filter.setSize(lp.getSize()); + filter.setSeriesName(sy.getY()); + filters.add(filter); + } + } + + } + else if(vplot instanceof ch.psi.fda.vdescriptor.MatrixPlot){ + + // MatrixPlot does currently not support RegionPositioners because of the + // plotting problems this would cause. If regions of the positioner have different + // step sizes it is not easily possible (without (specialized) rasterization) to plot the data. + + ch.psi.fda.vdescriptor.MatrixPlot lp = (ch.psi.fda.vdescriptor.MatrixPlot) vplot; + MatrixPlotSeries data = new MatrixPlotSeries("", lp.getMinX(), lp.getMaxX(), lp.getnX(), lp.getMinY(), lp.getMaxY(), lp.getnY()); + MatrixPlot plot = MatrixPlotBase.newPlot(matrixPlotImpl); + plot.setTitle(lp.getTitle()); + plot.addSeries(data); + + for(Series s: lp.getData()){ + if(s instanceof XYZSeries){ + XYZSeries sxyz = (XYZSeries) s; + XYZSeriesDataFilter filter=new XYZSeriesDataFilter(sxyz.getX(), sxyz.getY(), sxyz.getZ(), plot); + filter.setSeries(data); + filters.add(filter); + + } + else if(s instanceof YZSeries){ + YZSeries syz = (YZSeries) s; + XYZSeriesArrayDataFilter filter = new XYZSeriesArrayDataFilter(syz.getY(), syz.getZ(), 0, 0, plot); + filter.setSeries(data); + filters.add(filter); + + } + } + } + } } + catch (Exception ex) { + // Ignore if something goes wrong while adding a datapoint + logger.log(Level.SEVERE, null, ex); + } + } @@ -135,7 +154,7 @@ public class Visualizer { for (SeriesDataFilter f: filters) { Plot plot = f.getPlot(); if(plot instanceof MatrixPlot){ - ((MatrixPlotData) ((MatrixPlot)plot).getData()).clear(); + f.getSeries().clear(); } } clearPlot = false; @@ -145,15 +164,15 @@ public class Visualizer { if(filter instanceof XYSeriesDataFilter){ XYSeriesDataFilter xyfilter = (XYSeriesDataFilter) filter; - if(xyfilter.getActualSeries()==null || xyfilter.isNewseries()){ + if(xyfilter.getSeries()==null || xyfilter.isNewseries()){ // First series that is filled by this filter! - XYSeriesP s = new XYSeriesP(xyfilter.getSeriesName() + " " + ecount + "-" + xyfilter.getCount()); - ((LinePlot)xyfilter.getPlot()).getData().addSeries(s); - xyfilter.setActualSeries(s); + LinePlotSeries s = new LinePlotSeries(xyfilter.getSeriesName() + " " + ecount + "-" + xyfilter.getCount()); + ((LinePlot)xyfilter.getPlot()).addSeries(s); + xyfilter.setSeries(s); xyfilter.setNewseries(false); } - XYSeriesP series = xyfilter.getActualSeries(); // TODO Does not work with multiple series filter per plot !!!! + LinePlotSeries series = xyfilter.getSeries(); // TODO Does not work with multiple series filter per plot !!!! // There might be other values than double in the data, therefore we have to check for it Object dX = message.getData(xyfilter.getIdX()); @@ -168,7 +187,9 @@ public class Visualizer { } // Add Data to the series - series.add(dataX , dataY, updateAtStreamElement); +/* + series.add(dataX , dataY, updateAtStreamElement);*/ + series.appendData(dataX , dataY); } if(filter instanceof XYSeriesArrayDataFilter){ final XYSeriesArrayDataFilter xyfilter = (XYSeriesArrayDataFilter) filter; @@ -179,31 +200,39 @@ public class Visualizer { @Override public void run() { - XYSeriesP series = new XYSeriesP(xyfilter.getSeriesName() + "-" + xyfilter.getCount()); // Series name must be unique + LinePlotSeries series = new LinePlotSeries(xyfilter.getSeriesName() + "-" + xyfilter.getCount()); // Series name must be unique xyfilter.incrementCount(); // ((LinePlot)xyfilter.getPlot()).getData().removeAllSeries(); // Remove all series from the data // If we can agree only to display one series at a time also a clear() on the actual series is better - XYSeriesCollectionP sc = ((LinePlot)xyfilter.getPlot()).getData(); - sc.addSeries(series); + ((LinePlot)xyfilter.getPlot()).addSeries(series); + xyfilter.setSeries(series); // Remove outdated series - if(sc.getSeriesCount()>xyfilter.getMaxSeries()){ + if(((LinePlot)xyfilter.getPlot()).getNumberOfSeries()>xyfilter.getMaxSeries()){ // Remove oldest series - sc.removeSeries(0); + ((LinePlot)xyfilter.getPlot()).removeSeries(((LinePlot)xyfilter.getPlot()).getSeries(0)); } double[] data = message.getData(xyfilter.getIdY()); + + // Copy data starting from offset to size int size = data.length; int offset = xyfilter.getOffset(); if(xyfilter.getSize()>0 && offset+xyfilter.getSize()