@@ -28,7 +28,9 @@ def __init__(self,parent):
2828 self .AddObserver ("LeftButtonReleaseEvent" , parent .leftButtonReleaseEvent )
2929 self .AddObserver ( "ModifiedEvent" , parent .configureEvent )
3030 self .AddObserver ( "ConfigureEvent" , parent .configureEvent )
31-
31+ if sys .platform == "darwin" :
32+ self .AddObserver ( "RenderEvent" , parent .renderEvent )
33+
3234class VTKVCSBackend (object ):
3335 def __init__ (self ,canvas ,renWin = None , debug = False ,bg = None ):
3436 self ._lastSize = None
@@ -41,16 +43,15 @@ def __init__(self,canvas,renWin=None, debug=False,bg=None):
4143 self .plotRenderers = set ()
4244 self .renderer = None
4345 self ._plot_keywords = ['renderer' ,]
44- self .numberOfPlotCalls = 0
46+ self .numberOfPlotCalls = 0
47+ self .renderWindowSize = None
4548 if renWin is not None :
4649 self .renWin = renWin
4750 if renWin .GetInteractor () is None and self .bg is False :
4851 self .createDefaultInteractor ()
4952 self .logo = None
50-
51- # def applicationFocusChanged(self):
52- # for plotApp in self.plotApps.values():
53- # if hasattr(plotApp, 'refresh'): plotApp.refresh()
53+ if sys .platform == "darwin" :
54+ self .reRender = False
5455
5556 def setAnimationStepper ( self , stepper ):
5657 for plot in self .plotApps .values ():
@@ -61,12 +62,36 @@ def interact(self,*args,**kargs):
6162 warnings .warn ("Cannot interact if you did not open the canvas yet" )
6263 return
6364 interactor = self .renWin .GetInteractor ()
65+ ## Mac seems to handle events a bit differently
66+ ## Need to add observers on renWin
67+ ## Linux is fine w/o it so no need to do it
68+ if sys .platform == "darwin" :
69+ self .renWin .AddObserver ( "RenderEvent" , self .renderEvent )
70+ self .renWin .AddObserver ("LeftButtonPressEvent" , self .leftButtonPressEvent )
71+ self .renWin .AddObserver ("LeftButtonReleaseEvent" , self .leftButtonReleaseEvent )
72+ self .renWin .AddObserver ( "ModifiedEvent" , self .configureEvent )
73+ self .renWin .AddObserver ( "ConfigureEvent" , self .configureEvent )
74+ self .renWin .AddObserver ( "EndEvent" ,self .endEvent )
6475 if interactor is None :
6576 warnings .warn ("Cannot start interaction. Blank plot?" )
6677 return
6778 warnings .warn ("Press 'Q' to exit interactive mode and continue script execution" )
6879 interactor .Start ()
6980
81+ def endEvent (self ,obj ,event ):
82+ if self .renWin is not None :
83+ if self .reRender :
84+ self .reRender = False
85+ self ._lastSize = None
86+ self .renWin .Render ()
87+
88+ def renderEvent (self ,caller ,evt ):
89+ renwin = self .renWin if (caller == None ) else caller
90+ window_size = renwin .GetSize ()
91+ if ( window_size <> self .renderWindowSize ):
92+ self .configureEvent (caller ,evt )
93+ self .renderWindowSize = window_size
94+
7095 def leftButtonPressEvent (self ,obj ,event ):
7196 xy = self .renWin .GetInteractor ().GetEventPosition ()
7297 sz = self .renWin .GetSize ()
@@ -146,16 +171,17 @@ def leftButtonPressEvent(self,obj,event):
146171
147172 def leftButtonReleaseEvent (self ,obj ,event ):
148173 self .clickRenderer .RemoveAllViewProps ()
149- self .clickRenderer .Render ()
150174 self .renWin .RemoveRenderer (self .clickRenderer )
151175 self .renWin .Render ()
152176
153177 def configureEvent (self ,obj ,ev ):
154178 sz = self .renWin .GetSize ()
155- if self ._lastSize == sz : # or (self._lastSize is None and hasattr(self,"fromVistrails")):
179+ if self ._lastSize == sz :
156180 # We really only care about resize event
157181 # this is mainly to avoid segfault vwith Vistraisl which does
158182 # not catch configure Events but only modifiedEvents....
183+ if self .renWin is not None and sys .platform == "darwin" :
184+ self .renWin .Render ()
159185 return
160186 self ._lastSize = sz
161187 plots_args = []
@@ -181,13 +207,16 @@ def configureEvent(self,obj,ev):
181207 self .createLogo ()
182208 if self .renWin .GetSize ()!= (0 ,0 ):
183209 self .scaleLogo ()
210+ if self .renWin is not None and sys .platform == "darwin" :
211+ self .renWin .Render ()
212+ if sys .platform == "darwin" :
213+ ## ON mac somehow we need to issue an extra Render after resize
214+ self .reRender = True
184215
185216 def clear (self ):
186217 if self .renWin is None : #Nothing to clear
187218 return
188219 renderers = self .renWin .GetRenderers ()
189- # plot_renderers = [ id(g.plot.renderer) for g in self.plotApps.values() ]
190- # print " ------------------------------------ ------------------------------------ CLEAR: %s ------------------------------------ ------------------------------------ " % str( plot_renderers )
191220 renderers .InitTraversal ()
192221 ren = renderers .GetNextItem ()
193222 hasValidRenderer = True if ren is not None else False
@@ -204,7 +233,6 @@ def clear(self):
204233 def createDefaultInteractor ( self , ren = None ):
205234 defaultInteractor = self .renWin .GetInteractor ()
206235 if defaultInteractor is None :
207- #defaultInteractor = vtk.vtkGenericRenderWindowInteractor()
208236 defaultInteractor = vtk .vtkRenderWindowInteractor ()
209237 self .vcsInteractorStyle = VCSInteractorStyle (self )
210238 if ren :
@@ -310,7 +338,6 @@ def close(self):
310338 self .renWin = None
311339
312340 def geometry (self ,x ,y ,* args ):
313- #screenSize = self.renWin.GetScreenSize()
314341 self .renWin .SetSize (x ,y )
315342
316343 def flush (self ):
@@ -331,8 +358,6 @@ def plot(self,data1,data2,template,gtype,gname,bg,*args,**kargs):
331358 self .renWin .SetOffScreenRendering (True )
332359 self .renWin .SetSize (self .canvas .bgX ,self .canvas .bgY )
333360 self .cell_coordinates = kargs .get ( 'cell_coordinates' , None )
334- #self.renWin.Render()
335- #screenSize = self.renWin.GetScreenSize()
336361 if gtype == "text" :
337362 tt ,to = gname .split (":::" )
338363 tt = vcs .elements ["texttable" ][tt ]
@@ -649,13 +674,6 @@ def plotVector(self,data1,data2,tmpl,gm):
649674 glyphFilter .SetInputArrayToProcess (1 ,0 ,0 ,0 ,"vectors" )
650675 glyphFilter .SetScaleFactor (2. * gm .scale )
651676
652- #if cellData:
653- # if ug.IsA("vtkUnstructuredGrid"):
654- # glyphFilter.SetInputConnection(cln.GetOutputPort())
655- # else:
656- # glyphFilter.SetInputConnection(c2p.GetOutputPort())
657- #else:
658- # glyphFilter.SetInputData(ug)
659677 glyphFilter .SetInputData (ug )
660678
661679 mapper = vtk .vtkPolyDataMapper ()
@@ -875,7 +893,6 @@ def plot2D(self,data1,data2,tmpl,gm):
875893 for j ,color in enumerate (COLS [i ]):
876894 r ,g ,b = cmap .index [color ]
877895 lut .SetTableValue (j ,r / 100. ,g / 100. ,b / 100. )
878- #print l[j],vcs.colors.rgb2str(r*2.55,g*2.55,b*2.55),l[j+1]
879896 mapper .SetLookupTable (lut )
880897 mapper .SetScalarRange (0 ,len (l )- 1 )
881898 mapper .SetScalarModeToUseCellData ()
@@ -933,8 +950,6 @@ def plot2D(self,data1,data2,tmpl,gm):
933950 for k in legend .keys ():
934951 legend [float (numpy .ma .log10 (legend [k ]))] = legend [k ]
935952 del (legend [k ])
936- #dx = (levs[-1]-levs[0])/(gm.color_2-gm.color_1+1)
937- #levs = numpy.arange(levs[0],levs[-1]+dx,dx)
938953
939954 cols = range (gm .color_1 ,gm .color_2 + 1 )
940955 else :
0 commit comments