org.diirt.datasource.graphene.BubbleGraph2DFunction 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 java.awt.image.BufferedImage;
import java.util.List;
import org.diirt.graphene.BubbleGraph2DRenderer;
import org.diirt.graphene.BubbleGraph2DRendererUpdate;
import org.diirt.graphene.Point3DWithLabelDataset;
import org.diirt.datasource.QueueCollector;
import org.diirt.datasource.ReadFunction;
import org.diirt.vtype.VImage;
import org.diirt.vtype.VTable;
import org.diirt.vtype.ValueUtil;
import static org.diirt.datasource.graphene.ArgumentExpressions.*;
/**
* @author shroffk
*
*/
public class BubbleGraph2DFunction implements ReadFunction {
private ReadFunction extends VTable> tableData;
private ReadFunctionArgument xColumnName;
private ReadFunctionArgument yColumnName;
private ReadFunctionArgument sizeColumnName;
private ReadFunctionArgument colorColumnName;
private BubbleGraph2DRenderer renderer = new BubbleGraph2DRenderer(300,
200);
private VImage previousImage;
private final QueueCollector rendererUpdateQueue = new QueueCollector<>(
100);
public BubbleGraph2DFunction(ReadFunction> tableData,
ReadFunction> xColumnName,
ReadFunction> yColumnName,
ReadFunction> sizeColumnName,
ReadFunction> colorColumnName) {
this.tableData = new CheckedReadFunction<>(tableData, "Data", VTable.class);
this.xColumnName = stringArgument(xColumnName, "X Column");
this.yColumnName = stringArgument(yColumnName, "Y Column");
this.sizeColumnName = stringArgument(sizeColumnName, "Size Column");
this.colorColumnName = stringArgument(colorColumnName, "Color Column");
}
public QueueCollector getRendererUpdateQueue() {
return rendererUpdateQueue;
}
@Override
public Graph2DResult readValue() {
VTable vTable = tableData.readValue();
xColumnName.readNext();
yColumnName.readNext();
sizeColumnName.readNext();
colorColumnName.readNext();
// Table and columns must be available
if (vTable == null || xColumnName.isMissing() || yColumnName.isMissing() || sizeColumnName.isMissing() || colorColumnName.isMissing()) {
return null;
}
// Prepare new dataset
Point3DWithLabelDataset dataset = DatasetConversions.point3DDatasetFromVTable(vTable, xColumnName.getValue(), yColumnName.getValue(), sizeColumnName.getValue(), colorColumnName.getValue());
List updates = rendererUpdateQueue
.readValue();
for (BubbleGraph2DRendererUpdate scatterGraph2DRendererUpdate : updates) {
renderer.update(scatterGraph2DRendererUpdate);
}
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);
int focusValueIndex = -1;
if (renderer.getFocusValueIndex() != null) {
focusValueIndex = renderer.getFocusValueIndex();
}
return new Graph2DResult(vTable, previousImage,
new GraphDataRange(renderer.getXPlotRange(), renderer.getXPlotRange(), renderer.getXAggregatedRange()), new GraphDataRange(
renderer.getYPlotRange(), renderer.getYPlotRange(), renderer.getYAggregatedRange()),
focusValueIndex);
}
}