# demo custom renderer.  This takes a ds[n,4] and plots dots
# with each record: [x,y,rad,color]
# Note, the plan is to redo how custom renderers are done, so this may change.

from org.das2.qds import SemanticOps
from org.das2.graph import Renderer

import java 
from java.lang import IllegalArgumentException

cb= dom.plots[0].zaxis.controller.getDasAxis()
dom.plots[0].zaxis.visible= True

class MyPCL( java.beans.PropertyChangeListener ):
   def propertyChange(self,e):
      dom.plots[0].controller.dasPlot.invalidateCacheImage()

cb.addPropertyChangeListener( MyPCL() )  #TODO: there's a jython way to do this

class MyRend( Renderer ):
  def render( self, g, xAxis, yAxis, mon=None ):
     ds= self.getDataSet()
     if ds==None: return
     if ( ds.rank()!=2 or ds.length(0)!=4 ):
        self.getParent().postException( self, IllegalArgumentException( "dataset is not ds[n,4]" ) )
        return
     xds= ds[:,0]
     yds= ds[:,1]
     rds= ds[:,2]/2
     cds= ds[:,3]

     xu= SemanticOps.getUnits( xds )
     yu= SemanticOps.getUnits( yds )
     cu= SemanticOps.getUnits( cds )
     ru= SemanticOps.getUnits( rds )

     for i in xrange( yds.length() ):
        x= xAxis.transform( xds.value(i), xu )
        y= yAxis.transform( yds.value(i), yu )        
        g.setColor( Color( cb.rgbTransform( cds.value(i), cu ) ) )
        x2= xAxis.transform( xds.value(i)+rds.value(i), xu ) - x
        g.fillOval( int(x-x2/2),int(y-x2/2),int(x2/2),int(x2/2) )

ds= randn( 1000,4 )

plot( ds, renderer=MyRend(), xrange='-5 to 5', yrange='-5 to 5', zrange='0 to 3' )