/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package test; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.SwingUtilities; import org.das2.datum.InconvertibleUnitsException; import org.python.core.PyJavaInstance; import org.autoplot.ApplicationModel; import org.autoplot.AutoplotUI; import org.autoplot.dom.Application; import org.autoplot.scriptconsole.ExitExceptionHandler; import org.das2.qds.ArrayDataSet; import org.das2.qds.QDataSet; /** * This new class is meant to replace ScriptContext, and fixing a number of * old problems. First, the ScriptContext methods are all static methods, which * meant that any Java instance had just one script context. This has some really * unfortunate results that should have been expected, like Tomcat instances have * coupling between sessions, and a user must decide which DOM scripts will be * run with. Second, ??? * * In python this can be used like so: * ... * @author jbf */ public class PythonScriptContext extends PyJavaInstance { private static final Logger logger= org.das2.util.LoggerManager.getLogger("autoplot"); PythonScriptContext instance; private ApplicationModel model = null; private Application dom= null; private AutoplotUI view = null; public PythonScriptContext( ApplicationModel model ) { this.model= model; this.dom= model.getDocumentModel(); } public PythonScriptContext( AutoplotUI app ) { this.view= app; this.dom= app.getDocumentModel(); this.model= this.dom.getController().getApplicationModel(); } /** * set up the uncaught exception handler for headless applications, like CreatePngWalk. */ private void setUpHeadlessExceptionHandler() { Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread t, Throwable e) { logger.log(Level.SEVERE, "runtime exception: " + e, e); if (e instanceof InconvertibleUnitsException) { // do nothing!!! this is associated with the state change. TODO: this should probably not be here, and it should be caught elsewhere. return; } model.getExceptionHandler().handleUncaught(e); } }); } /** * initialize the model and view. */ private void maybeInitModel() { if (model == null) { model = new ApplicationModel(); model.setExceptionHandler( new ExitExceptionHandler() ); setUpHeadlessExceptionHandler(); model.addDasPeersToAppAndWait(); dom= model.getDocumentModel(); } if ( view!=null ) { if ( SwingUtilities.isEventDispatchThread() ) { if ( !view.isVisible() ) view.setVisible(true); } else { SwingUtilities.invokeLater( new Runnable() { public void run() { if ( !view.isVisible() ) view.setVisible(true); } } ); } } } /** * plot the dataset in the specified dataSource node, using the render type * specified. The renderType parameter is a string identifier, and currently the following are * used: digital spectrogram nnSpectrogram hugeScatter series scatter colorScatter stairSteps * fillToZero digital image pitchAngleDistribution eventsBar vectorPlot orbitPlot contour *
{@code
     *plot( 0, 'label', findgen(20), ripples(20), ripples(20), 'digital' )
     *from org.virbo.autoplot import RenderType
     *plot( 0, 'label', findgen(20), ripples(20), ripples(20), RenderType.digital.toString() )
     *}
* * @param chNum the plot to use. Plots and plot elements are added as necessary to plot the data. * @param label the label for the dependent parameter * @param x QDataSet for the independent parameter for the X values * @param y QDataSet for the independent parameter for the Y values * @param z Rank 1 or Rank 2 QDataSet for the dependent parameter * @param renderType hint at the render type to use, such as "nnSpectrogram" or "digital", */ public void plot( int chNum, String label, QDataSet x, QDataSet y, QDataSet z, String renderType ) { maybeInitModel(); if ( z.rank()==1 ) { ArrayDataSet yds= ArrayDataSet.copy(y); yds.putProperty( QDataSet.RENDER_TYPE, renderType ); yds.putProperty( QDataSet.DEPEND_0, x ); yds.putProperty( QDataSet.PLANE_0, z ); model.setDataSet(chNum, label, yds); } else { ArrayDataSet zds= ArrayDataSet.copy(z); zds.putProperty( QDataSet.RENDER_TYPE, renderType ); if ( x!=null ) zds.putProperty( QDataSet.DEPEND_0, x ); if ( y!=null ) zds.putProperty( QDataSet.DEPEND_1, y ); model.setDataSet(chNum, label, zds); } if ( !SwingUtilities.isEventDispatchThread() ) model.waitUntilIdle(); } }