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