Commit fe7f43678c80ba9096f34ede2558e9ae4e5aabb1

Authored by Thiago Franco de Moraes
1 parent 0c8690e6

Improvements in performance of canvas

invesalius/data/styles.py
@@ -405,7 +405,7 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): @@ -405,7 +405,7 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle):
405 slice_number, self.radius)) 405 slice_number, self.radius))
406 n = len(m.points)-1 406 n = len(m.points)-1
407 self.creating = n, m, mr 407 self.creating = n, m, mr
408 - Publisher.sendMessage('Update slice viewer') 408 + self.viewer.UpdateCanvas()
409 self.viewer.scroll_enabled = False 409 self.viewer.scroll_enabled = False
410 return 410 return
411 411
@@ -427,7 +427,7 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): @@ -427,7 +427,7 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle):
427 427
428 n, (m, mr) = 1, self.measures.measures[self._ori][slice_number][-1] 428 n, (m, mr) = 1, self.measures.measures[self._ori][slice_number][-1]
429 self.creating = n, m, mr 429 self.creating = n, m, mr
430 - Publisher.sendMessage('Update slice viewer') 430 + self.viewer.UpdateCanvas()
431 self.viewer.scroll_enabled = False 431 self.viewer.scroll_enabled = False
432 432
433 def OnReleaseMeasurePoint(self, obj, evt): 433 def OnReleaseMeasurePoint(self, obj, evt):
@@ -436,7 +436,7 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): @@ -436,7 +436,7 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle):
436 x, y, z = self._get_pos_clicked() 436 x, y, z = self._get_pos_clicked()
437 idx = self.measures._list_measures.index((m, mr)) 437 idx = self.measures._list_measures.index((m, mr))
438 Publisher.sendMessage('Change measurement point position', (idx, n, (x, y, z))) 438 Publisher.sendMessage('Change measurement point position', (idx, n, (x, y, z)))
439 - Publisher.sendMessage('Update slice viewer') 439 + self.viewer.UpdateCanvas()
440 self.selected = None 440 self.selected = None
441 self.viewer.scroll_enabled = True 441 self.viewer.scroll_enabled = True
442 442
@@ -446,13 +446,13 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): @@ -446,13 +446,13 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle):
446 n, m, mr = self.selected 446 n, m, mr = self.selected
447 idx = self.measures._list_measures.index((m, mr)) 447 idx = self.measures._list_measures.index((m, mr))
448 Publisher.sendMessage('Change measurement point position', (idx, n, (x, y, z))) 448 Publisher.sendMessage('Change measurement point position', (idx, n, (x, y, z)))
449 - Publisher.sendMessage('Update slice viewer') 449 + self.viewer.UpdateCanvas()
450 450
451 elif self.creating: 451 elif self.creating:
452 n, m, mr = self.creating 452 n, m, mr = self.creating
453 idx = self.measures._list_measures.index((m, mr)) 453 idx = self.measures._list_measures.index((m, mr))
454 Publisher.sendMessage('Change measurement point position', (idx, n, (x, y, z))) 454 Publisher.sendMessage('Change measurement point position', (idx, n, (x, y, z)))
455 - Publisher.sendMessage('Update slice viewer') 455 + self.viewer.UpdateCanvas()
456 456
457 else: 457 else:
458 mx, my = self.viewer.interactor.GetEventPosition() 458 mx, my = self.viewer.interactor.GetEventPosition()
@@ -468,7 +468,7 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): @@ -468,7 +468,7 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle):
468 Publisher.sendMessage("Remove incomplete measurements") 468 Publisher.sendMessage("Remove incomplete measurements")
469 self.creating = None 469 self.creating = None
470 self.selected = None 470 self.selected = None
471 - Publisher.sendMessage('Update slice viewer') 471 + self.viewer.UpdateCanvas()
472 self.viewer.scroll_enabled = True 472 self.viewer.scroll_enabled = True
473 473
474 def CleanUp(self): 474 def CleanUp(self):
invesalius/data/viewer_slice.py
@@ -109,6 +109,7 @@ class ContourMIPConfig(wx.Panel): @@ -109,6 +109,7 @@ class ContourMIPConfig(wx.Panel):
109 self.SetAutoLayout(1) 109 self.SetAutoLayout(1)
110 110
111 self.orientation = orientation 111 self.orientation = orientation
  112 + self.canvas = None
112 113
113 self.mip_size_spin.Bind(wx.EVT_SPINCTRL, self.OnSetMIPSize) 114 self.mip_size_spin.Bind(wx.EVT_SPINCTRL, self.OnSetMIPSize)
114 self.border_spin.Bind(wx.EVT_SPINCTRL, self.OnSetMIPBorder) 115 self.border_spin.Bind(wx.EVT_SPINCTRL, self.OnSetMIPBorder)
@@ -152,6 +153,8 @@ class CanvasRendererCTX: @@ -152,6 +153,8 @@ class CanvasRendererCTX:
152 self.canvas_renderer = viewer.slice_data.canvas_renderer 153 self.canvas_renderer = viewer.slice_data.canvas_renderer
153 self._size = self.canvas_renderer.GetSize() 154 self._size = self.canvas_renderer.GetSize()
154 self.gc = None 155 self.gc = None
  156 + self.last_cam_modif_time = -1
  157 + self.modified = True
155 self._init_canvas() 158 self._init_canvas()
156 viewer.slice_data.renderer.AddObserver("StartEvent", self.OnPaint) 159 viewer.slice_data.renderer.AddObserver("StartEvent", self.OnPaint)
157 160
@@ -191,14 +194,23 @@ class CanvasRendererCTX: @@ -191,14 +194,23 @@ class CanvasRendererCTX:
191 self.bitmap = wx.EmptyBitmapRGBA(w, h) 194 self.bitmap = wx.EmptyBitmapRGBA(w, h)
192 self.image = wx.ImageFromBuffer(w, h, self.rgb, self.alpha) 195 self.image = wx.ImageFromBuffer(w, h, self.rgb, self.alpha)
193 196
  197 + self.modified = True
  198 +
194 def OnPaint(self, evt, obj): 199 def OnPaint(self, evt, obj):
195 - self._array[:] = 0  
196 size = self.canvas_renderer.GetSize() 200 size = self.canvas_renderer.GetSize()
197 w, h = size 201 w, h = size
198 if self._size != size: 202 if self._size != size:
199 self._size = size 203 self._size = size
200 self._resize_canvas(w, h) 204 self._resize_canvas(w, h)
201 205
  206 + cam_modif_time = self.viewer.cam.GetMTime()
  207 + if (not self.modified) and cam_modif_time == self.last_cam_modif_time:
  208 + return
  209 +
  210 + self.last_cam_modif_time = cam_modif_time
  211 +
  212 + self._array[:] = 0
  213 +
202 coord = vtk.vtkCoordinate() 214 coord = vtk.vtkCoordinate()
203 215
204 self.image.SetDataBuffer(self.rgb) 216 self.image.SetDataBuffer(self.rgb)
@@ -236,6 +248,7 @@ class CanvasRendererCTX: @@ -236,6 +248,7 @@ class CanvasRendererCTX:
236 self.bitmap.CopyToBuffer(self._array, wx.BitmapBufferFormat_RGBA) 248 self.bitmap.CopyToBuffer(self._array, wx.BitmapBufferFormat_RGBA)
237 249
238 self._cv_image.Modified() 250 self._cv_image.Modified()
  251 + self.modified = False
239 252
240 def draw_line(self, pos0, pos1, arrow_start=False, arrow_end=False, colour=(255, 0, 0, 128), width=2, style=wx.SOLID): 253 def draw_line(self, pos0, pos1, arrow_start=False, arrow_end=False, colour=(255, 0, 0, 128), width=2, style=wx.SOLID):
241 """ 254 """
@@ -976,6 +989,12 @@ class Viewer(wx.Panel): @@ -976,6 +989,12 @@ class Viewer(wx.Panel):
976 'Change mask colour') 989 'Change mask colour')
977 Publisher.subscribe(self.UpdateRender, 990 Publisher.subscribe(self.UpdateRender,
978 'Update slice viewer') 991 'Update slice viewer')
  992 + Publisher.subscribe(self.UpdateRender,
  993 + 'Update slice viewer %s' % self.orientation)
  994 + Publisher.subscribe(self.UpdateCanvas,
  995 + 'Redraw canvas')
  996 + Publisher.subscribe(self.UpdateCanvas,
  997 + 'Redraw canvas %s' % self.orientation)
979 Publisher.subscribe(self.ChangeSliceNumber, 998 Publisher.subscribe(self.ChangeSliceNumber,
980 ('Set scroll position', 999 ('Set scroll position',
981 self.orientation)) 1000 self.orientation))
@@ -1205,7 +1224,7 @@ class Viewer(wx.Panel): @@ -1205,7 +1224,7 @@ class Viewer(wx.Panel):
1205 self.cam = self.slice_data.renderer.GetActiveCamera() 1224 self.cam = self.slice_data.renderer.GetActiveCamera()
1206 self.__build_cross_lines() 1225 self.__build_cross_lines()
1207 1226
1208 - canvas = CanvasRendererCTX(self) 1227 + self.canvas = CanvasRendererCTX(self)
1209 1228
1210 # Set the slice number to the last slice to ensure the camera if far 1229 # Set the slice number to the last slice to ensure the camera if far
1211 # enough to show all slices. 1230 # enough to show all slices.
@@ -1322,6 +1341,11 @@ class Viewer(wx.Panel): @@ -1322,6 +1341,11 @@ class Viewer(wx.Panel):
1322 print "Updating viewer", self.orientation 1341 print "Updating viewer", self.orientation
1323 self.interactor.Render() 1342 self.interactor.Render()
1324 1343
  1344 + def UpdateCanvas(self, evt=None):
  1345 + print "Updating viewer and canvas", self.orientation
  1346 + self.canvas.modified = True
  1347 + self.interactor.Render()
  1348 +
1325 def __configure_scroll(self): 1349 def __configure_scroll(self):
1326 actor = self.slice_data_list[0].actor 1350 actor = self.slice_data_list[0].actor
1327 number_of_slices = self.layout[0] * self.layout[1] 1351 number_of_slices = self.layout[0] * self.layout[1]