org.diirt.datasource.graphene.LineGraph2DFunction Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of datasource-graphene Show documentation
Show all versions of datasource-graphene Show documentation
Support for real-time graph rendering with graphene.
/**
* Copyright (C) 2010-14 diirt developers. See COPYRIGHT.TXT
* All rights reserved. Use is subject to license terms. See LICENSE.TXT
*/
package org.diirt.datasource.graphene;
import org.diirt.vtype.VNumberArray;
import org.diirt.vtype.VImage;
import org.diirt.vtype.ValueUtil;
import java.awt.image.BufferedImage;
import java.util.List;
import org.diirt.graphene.*;
import org.diirt.datasource.QueueCollector;
import org.diirt.datasource.ReadFunction;
import static org.diirt.datasource.graphene.ArgumentExpressions.stringArgument;
import org.diirt.vtype.VTable;
import org.diirt.vtype.VType;
/**
*
* @author carcassi
*/
class LineGraph2DFunction implements ReadFunction {
private ReadFunction tableData;
private ReadFunctionArgument xColumnName;
private ReadFunctionArgument yColumnName;
private ReadFunctionArgument tooltipColumnName;
private LineGraph2DRenderer renderer = new LineGraph2DRenderer(300, 200);
private VImage previousImage;
private final QueueCollector rendererUpdateQueue = new QueueCollector<>(100);
LineGraph2DFunction(ReadFunction> tableData,
ReadFunction> xColumnName,
ReadFunction> yColumnName,
ReadFunction> tooltipColumnName) {
this.tableData = new CheckedReadFunction(tableData, "Data", VTable.class, VNumberArray.class);
this.xColumnName = stringArgument(xColumnName, "X Column");
this.yColumnName = stringArgument(yColumnName, "Y Column");
this.tooltipColumnName = stringArgument(tooltipColumnName, "Tooltip Column");
}
public QueueCollector getRendererUpdateQueue() {
return rendererUpdateQueue;
}
@Override
public Graph2DResult readValue() {
VType vType = tableData.readValue();
xColumnName.readNext();
yColumnName.readNext();
tooltipColumnName.readNext();
// Table and columns must be available
if (vType == null || xColumnName.isMissing() || yColumnName.isMissing()) {
return null;
}
// Prepare new dataset
Point2DDataset dataset;
if (vType instanceof VNumberArray) {
dataset = Point2DDatasets.lineData(((VNumberArray) vType).getData());
} else {
dataset = DatasetConversions.point2DDatasetFromVTable((VTable) vType, xColumnName.getValue(), yColumnName.getValue());
}
// Process all renderer updates
List updates = rendererUpdateQueue.readValue();
for (LineGraph2DRendererUpdate rendererUpdate : updates) {
renderer.update(rendererUpdate);
}
// If no size is set, don't calculate anything
if (renderer.getImageHeight() == 0 && renderer.getImageWidth() == 0)
return null;
BufferedImage image = new BufferedImage(renderer.getImageWidth(), renderer.getImageHeight(), BufferedImage.TYPE_3BYTE_BGR);
renderer.draw(image.createGraphics(), dataset);
previousImage = ValueUtil.toVImage(image);
return new Graph2DResult(vType, previousImage,
new GraphDataRange(renderer.getXPlotRange(), dataset.getXStatistics().getRange(), renderer.getXAggregatedRange()),
new GraphDataRange(renderer.getYPlotRange(), dataset.getYStatistics().getRange(), renderer.getYAggregatedRange()),
renderer.getFocusValueIndex());
}
}