diff --git a/Packages/vcs/Lib/VTKPlots.py b/Packages/vcs/Lib/VTKPlots.py index b19a71fe81..b926800758 100644 --- a/Packages/vcs/Lib/VTKPlots.py +++ b/Packages/vcs/Lib/VTKPlots.py @@ -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 @@ -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 + 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(): @@ -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() @@ -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 = [] @@ -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 @@ -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: @@ -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): @@ -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] @@ -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() @@ -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() @@ -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: