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