Commit fe7f43678c80ba9096f34ede2558e9ae4e5aabb1
1 parent
0c8690e6
Exists in
master
and in
25 other branches
Improvements in performance of canvas
Showing
2 changed files
with
32 additions
and
8 deletions
Show diff stats
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] |