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 | 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] | ... | ... |