From fe7f43678c80ba9096f34ede2558e9ae4e5aabb1 Mon Sep 17 00:00:00 2001 From: Thiago Franco de Moraes Date: Fri, 29 Jul 2016 11:30:23 -0300 Subject: [PATCH] Improvements in performance of canvas --- invesalius/data/styles.py | 12 ++++++------ invesalius/data/viewer_slice.py | 28 ++++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/invesalius/data/styles.py b/invesalius/data/styles.py index 2fee603..51b4242 100644 --- a/invesalius/data/styles.py +++ b/invesalius/data/styles.py @@ -405,7 +405,7 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): slice_number, self.radius)) n = len(m.points)-1 self.creating = n, m, mr - Publisher.sendMessage('Update slice viewer') + self.viewer.UpdateCanvas() self.viewer.scroll_enabled = False return @@ -427,7 +427,7 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): n, (m, mr) = 1, self.measures.measures[self._ori][slice_number][-1] self.creating = n, m, mr - Publisher.sendMessage('Update slice viewer') + self.viewer.UpdateCanvas() self.viewer.scroll_enabled = False def OnReleaseMeasurePoint(self, obj, evt): @@ -436,7 +436,7 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): x, y, z = self._get_pos_clicked() idx = self.measures._list_measures.index((m, mr)) Publisher.sendMessage('Change measurement point position', (idx, n, (x, y, z))) - Publisher.sendMessage('Update slice viewer') + self.viewer.UpdateCanvas() self.selected = None self.viewer.scroll_enabled = True @@ -446,13 +446,13 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): n, m, mr = self.selected idx = self.measures._list_measures.index((m, mr)) Publisher.sendMessage('Change measurement point position', (idx, n, (x, y, z))) - Publisher.sendMessage('Update slice viewer') + self.viewer.UpdateCanvas() elif self.creating: n, m, mr = self.creating idx = self.measures._list_measures.index((m, mr)) Publisher.sendMessage('Change measurement point position', (idx, n, (x, y, z))) - Publisher.sendMessage('Update slice viewer') + self.viewer.UpdateCanvas() else: mx, my = self.viewer.interactor.GetEventPosition() @@ -468,7 +468,7 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): Publisher.sendMessage("Remove incomplete measurements") self.creating = None self.selected = None - Publisher.sendMessage('Update slice viewer') + self.viewer.UpdateCanvas() self.viewer.scroll_enabled = True def CleanUp(self): diff --git a/invesalius/data/viewer_slice.py b/invesalius/data/viewer_slice.py index d3f378c..8d85272 100755 --- a/invesalius/data/viewer_slice.py +++ b/invesalius/data/viewer_slice.py @@ -109,6 +109,7 @@ class ContourMIPConfig(wx.Panel): self.SetAutoLayout(1) self.orientation = orientation + self.canvas = None self.mip_size_spin.Bind(wx.EVT_SPINCTRL, self.OnSetMIPSize) self.border_spin.Bind(wx.EVT_SPINCTRL, self.OnSetMIPBorder) @@ -152,6 +153,8 @@ class CanvasRendererCTX: self.canvas_renderer = viewer.slice_data.canvas_renderer self._size = self.canvas_renderer.GetSize() self.gc = None + self.last_cam_modif_time = -1 + self.modified = True self._init_canvas() viewer.slice_data.renderer.AddObserver("StartEvent", self.OnPaint) @@ -191,14 +194,23 @@ class CanvasRendererCTX: self.bitmap = wx.EmptyBitmapRGBA(w, h) self.image = wx.ImageFromBuffer(w, h, self.rgb, self.alpha) + self.modified = True + def OnPaint(self, evt, obj): - self._array[:] = 0 size = self.canvas_renderer.GetSize() w, h = size if self._size != size: self._size = size self._resize_canvas(w, h) + cam_modif_time = self.viewer.cam.GetMTime() + if (not self.modified) and cam_modif_time == self.last_cam_modif_time: + return + + self.last_cam_modif_time = cam_modif_time + + self._array[:] = 0 + coord = vtk.vtkCoordinate() self.image.SetDataBuffer(self.rgb) @@ -236,6 +248,7 @@ class CanvasRendererCTX: self.bitmap.CopyToBuffer(self._array, wx.BitmapBufferFormat_RGBA) self._cv_image.Modified() + self.modified = False def draw_line(self, pos0, pos1, arrow_start=False, arrow_end=False, colour=(255, 0, 0, 128), width=2, style=wx.SOLID): """ @@ -976,6 +989,12 @@ class Viewer(wx.Panel): 'Change mask colour') Publisher.subscribe(self.UpdateRender, 'Update slice viewer') + Publisher.subscribe(self.UpdateRender, + 'Update slice viewer %s' % self.orientation) + Publisher.subscribe(self.UpdateCanvas, + 'Redraw canvas') + Publisher.subscribe(self.UpdateCanvas, + 'Redraw canvas %s' % self.orientation) Publisher.subscribe(self.ChangeSliceNumber, ('Set scroll position', self.orientation)) @@ -1205,7 +1224,7 @@ class Viewer(wx.Panel): self.cam = self.slice_data.renderer.GetActiveCamera() self.__build_cross_lines() - canvas = CanvasRendererCTX(self) + self.canvas = CanvasRendererCTX(self) # Set the slice number to the last slice to ensure the camera if far # enough to show all slices. @@ -1322,6 +1341,11 @@ class Viewer(wx.Panel): print "Updating viewer", self.orientation self.interactor.Render() + def UpdateCanvas(self, evt=None): + print "Updating viewer and canvas", self.orientation + self.canvas.modified = True + self.interactor.Render() + def __configure_scroll(self): actor = self.slice_data_list[0].actor number_of_slices = self.layout[0] * self.layout[1] -- libgit2 0.21.2