Skip to content
63 changes: 39 additions & 24 deletions Packages/vcs/Lib/VTKPlots.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@ def __init__(self,parent):
self.AddObserver("LeftButtonReleaseEvent", parent.leftButtonReleaseEvent )
self.AddObserver( "ModifiedEvent", parent.configureEvent )
self.AddObserver( "ConfigureEvent", parent.configureEvent )

if sys.platform == "darwin":
self.AddObserver( "RenderEvent", parent.renderEvent )

class VTKVCSBackend(object):
def __init__(self,canvas,renWin=None, debug=False,bg=None):
self._lastSize = None
Expand All @@ -41,16 +43,15 @@ def __init__(self,canvas,renWin=None, debug=False,bg=None):
self.plotRenderers = set()
self.renderer = None
self._plot_keywords = ['renderer',]
self.numberOfPlotCalls = 0
self.numberOfPlotCalls = 0
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This line isn't needed, it's the same instruction as the line before it.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ping!

self.renderWindowSize=None
if renWin is not None:
self.renWin = renWin
if renWin.GetInteractor() is None and self.bg is False:
self.createDefaultInteractor()
self.logo = None

# def applicationFocusChanged(self):
# for plotApp in self.plotApps.values():
# if hasattr(plotApp, 'refresh'): plotApp.refresh()
if sys.platform == "darwin":
self.reRender = False

def setAnimationStepper( self, stepper ):
for plot in self.plotApps.values():
Expand All @@ -61,12 +62,36 @@ def interact(self,*args,**kargs):
warnings.warn("Cannot interact if you did not open the canvas yet")
return
interactor = self.renWin.GetInteractor()
## Mac seems to handle events a bit differently
## Need to add observers on renWin
## Linux is fine w/o it so no need to do it
if sys.platform == "darwin":
self.renWin.AddObserver( "RenderEvent", self.renderEvent )
self.renWin.AddObserver("LeftButtonPressEvent", self.leftButtonPressEvent )
self.renWin.AddObserver("LeftButtonReleaseEvent", self.leftButtonReleaseEvent )
self.renWin.AddObserver( "ModifiedEvent", self.configureEvent )
self.renWin.AddObserver( "ConfigureEvent", self.configureEvent )
self.renWin.AddObserver( "EndEvent",self.endEvent)
if interactor is None:
warnings.warn("Cannot start interaction. Blank plot?")
return
warnings.warn("Press 'Q' to exit interactive mode and continue script execution")
interactor.Start()

def endEvent(self,obj,event):
if self.renWin is not None:
if self.reRender:
self.reRender = False
self._lastSize = None
self.renWin.Render()

def renderEvent(self,caller,evt):
renwin = self.renWin if (caller == None) else caller
window_size = renwin.GetSize()
if ( window_size <> self.renderWindowSize ):
self.configureEvent(caller,evt)
self.renderWindowSize = window_size

def leftButtonPressEvent(self,obj,event):
xy = self.renWin.GetInteractor().GetEventPosition()
sz = self.renWin.GetSize()
Expand Down Expand Up @@ -146,16 +171,17 @@ def leftButtonPressEvent(self,obj,event):

def leftButtonReleaseEvent(self,obj,event):
self.clickRenderer.RemoveAllViewProps()
self.clickRenderer.Render()
self.renWin.RemoveRenderer(self.clickRenderer)
self.renWin.Render()

def configureEvent(self,obj,ev):
sz = self.renWin.GetSize()
if self._lastSize == sz: # or (self._lastSize is None and hasattr(self,"fromVistrails")):
if self._lastSize == sz:
# We really only care about resize event
# this is mainly to avoid segfault vwith Vistraisl which does
# not catch configure Events but only modifiedEvents....
if self.renWin is not None and sys.platform == "darwin":
self.renWin.Render()
return
self._lastSize = sz
plots_args = []
Expand All @@ -181,13 +207,16 @@ def configureEvent(self,obj,ev):
self.createLogo()
if self.renWin.GetSize()!=(0,0):
self.scaleLogo()
if self.renWin is not None and sys.platform == "darwin":
self.renWin.Render()
if sys.platform == "darwin":
## ON mac somehow we need to issue an extra Render after resize
self.reRender = True

def clear(self):
if self.renWin is None: #Nothing to clear
return
renderers = self.renWin.GetRenderers()
# plot_renderers = [ id(g.plot.renderer) for g in self.plotApps.values() ]
# print " ------------------------------------ ------------------------------------ CLEAR: %s ------------------------------------ ------------------------------------ " % str( plot_renderers )
renderers.InitTraversal()
ren = renderers.GetNextItem()
hasValidRenderer = True if ren is not None else False
Expand All @@ -204,7 +233,6 @@ def clear(self):
def createDefaultInteractor( self, ren=None ):
defaultInteractor = self.renWin.GetInteractor()
if defaultInteractor is None:
#defaultInteractor = vtk.vtkGenericRenderWindowInteractor()
defaultInteractor = vtk.vtkRenderWindowInteractor()
self.vcsInteractorStyle = VCSInteractorStyle(self)
if ren:
Expand Down Expand Up @@ -310,7 +338,6 @@ def close(self):
self.renWin = None

def geometry(self,x,y,*args):
#screenSize = self.renWin.GetScreenSize()
self.renWin.SetSize(x,y)

def flush(self):
Expand All @@ -331,8 +358,6 @@ def plot(self,data1,data2,template,gtype,gname,bg,*args,**kargs):
self.renWin.SetOffScreenRendering(True)
self.renWin.SetSize(self.canvas.bgX,self.canvas.bgY)
self.cell_coordinates=kargs.get( 'cell_coordinates', None )
#self.renWin.Render()
#screenSize = self.renWin.GetScreenSize()
if gtype == "text":
tt,to = gname.split(":::")
tt = vcs.elements["texttable"][tt]
Expand Down Expand Up @@ -649,13 +674,6 @@ def plotVector(self,data1,data2,tmpl,gm):
glyphFilter.SetInputArrayToProcess(1,0,0,0,"vectors")
glyphFilter.SetScaleFactor(2.*gm.scale)

#if cellData:
# if ug.IsA("vtkUnstructuredGrid"):
# glyphFilter.SetInputConnection(cln.GetOutputPort())
# else:
# glyphFilter.SetInputConnection(c2p.GetOutputPort())
#else:
# glyphFilter.SetInputData(ug)
glyphFilter.SetInputData(ug)

mapper = vtk.vtkPolyDataMapper()
Expand Down Expand Up @@ -875,7 +893,6 @@ def plot2D(self,data1,data2,tmpl,gm):
for j,color in enumerate(COLS[i]):
r,g,b = cmap.index[color]
lut.SetTableValue(j,r/100.,g/100.,b/100.)
#print l[j],vcs.colors.rgb2str(r*2.55,g*2.55,b*2.55),l[j+1]
mapper.SetLookupTable(lut)
mapper.SetScalarRange(0,len(l)-1)
mapper.SetScalarModeToUseCellData()
Expand Down Expand Up @@ -933,8 +950,6 @@ def plot2D(self,data1,data2,tmpl,gm):
for k in legend.keys():
legend[float(numpy.ma.log10(legend[k]))] = legend[k]
del(legend[k])
#dx = (levs[-1]-levs[0])/(gm.color_2-gm.color_1+1)
#levs = numpy.arange(levs[0],levs[-1]+dx,dx)

cols = range(gm.color_1,gm.color_2+1)
else:
Expand Down