package com.remainsoftware.ece2013.nebula.visualization; /******************************************************************************* * Copyright (c) 2010 Oak Ridge National Laboratory. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html ******************************************************************************/ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import org.eclipse.draw2d.LightweightSystem; import org.eclipse.nebula.visualization.widgets.datadefinition.ColorMap; import org.eclipse.nebula.visualization.widgets.datadefinition.ColorMap.PredefinedColorMap; import org.eclipse.nebula.visualization.widgets.figures.IntensityGraphFigure; import org.eclipse.nebula.visualization.widgets.figures.IntensityGraphFigure.IROIListener; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; /** * A live updated Intensity Graph example * * @author Xihui Chen * */ public class IntensityGraphExample { private static int count = 0; private static final int DataHeight = 1024; private static final int DataWidth = 1280; private ScheduledFuture<?> future; private ScheduledExecutorService scheduler; @PostConstruct public void main(Composite parent) { parent.setLayout(new FillLayout()); Canvas canvas = new Canvas(parent, SWT.NONE); // use LightweightSystem to create the bridge between SWT and draw2D final LightweightSystem lws = new LightweightSystem(canvas); // Create Intensity Graph final IntensityGraphFigure intensityGraph = new IntensityGraphFigure(); // Create Simulation Data final short[] simuData = new short[DataWidth * DataHeight * 2]; final short[] data = new short[DataWidth * DataHeight]; int seed = count++; for (int i = 0; i < DataHeight; i++) { for (int j = 0; j < DataWidth; j++) { int x = j - DataWidth; int y = i - DataHeight; int p = (int) Math.sqrt(x * x + y * y); simuData[i * DataWidth + j] = (short) (Math.sin(p * 2 * Math.PI / DataWidth + seed * Math.PI / 100) * 100); } } // Configure intensityGraph.setMax(100); intensityGraph.setMin(-100); intensityGraph.setDataHeight(DataHeight); intensityGraph.setDataWidth(DataWidth); intensityGraph.setColorMap(new ColorMap(PredefinedColorMap.JET, true, true)); intensityGraph.addROI("ROI 1", new IROIListener() { @Override public void roiUpdated(int xIndex, int yIndex, int width, int height) { System.out.println("Region of Interest: (" + xIndex + ", " + yIndex + ", " + width + ", " + height + ")"); } }, null); lws.setContents(intensityGraph); scheduler = Executors.newScheduledThreadPool(1); future = scheduler.scheduleAtFixedRate(new Runnable() { @Override public void run() { System.arraycopy(simuData, count % DataWidth, data, 0, DataWidth * DataHeight); Display.getDefault().asyncExec(new Runnable() { public void run() { count++; intensityGraph.setDataArray(simuData); } }); } }, 100, 10, TimeUnit.MILLISECONDS); } @PreDestroy void dispose() { future.cancel(true); scheduler.shutdown(); } }