Commit b9f1086f35713998fe9bf0b74c48fffaeb44f6ca

Authored by Thiago Franco de Moraes
1 parent 011095a8
Exists in canvas_reeng

More generic code to canvas

invesalius/data/measures.py
@@ -575,7 +575,7 @@ class LinearMeasure(object): @@ -575,7 +575,7 @@ class LinearMeasure(object):
575 points = [] 575 points = []
576 for p in self.points: 576 for p in self.points:
577 coord.SetValue(p) 577 coord.SetValue(p)
578 - cx, cy = coord.GetComputedDisplayValue(canvas.viewer.slice_data.renderer) 578 + cx, cy = coord.GetComputedDisplayValue(canvas.evt_renderer)
579 # canvas.draw_circle((cx, cy), 2.5) 579 # canvas.draw_circle((cx, cy), 2.5)
580 points.append((cx, cy)) 580 points.append((cx, cy))
581 581
invesalius/data/viewer_slice.py
@@ -148,15 +148,25 @@ class ContourMIPConfig(wx.Panel): @@ -148,15 +148,25 @@ class ContourMIPConfig(wx.Panel):
148 148
149 149
150 class CanvasRendererCTX: 150 class CanvasRendererCTX:
151 - def __init__(self, viewer):  
152 - self.viewer = viewer  
153 - self.canvas_renderer = viewer.slice_data.canvas_renderer 151 + def __init__(self, evt_renderer, canvas_renderer):
  152 + """
  153 + A Canvas to render over a vtktRenderer.
  154 +
  155 + Params:
  156 + evt_renderer: a vtkRenderer which this class is going to watch any
  157 + render event to update the canvas content.
  158 + canvas_renderer: the vtkRenderer where the canvas is going to be
  159 + added.
  160 + """
  161 + self.canvas_renderer = canvas_renderer
  162 + self.evt_renderer = evt_renderer
154 self._size = self.canvas_renderer.GetSize() 163 self._size = self.canvas_renderer.GetSize()
  164 + self.draw_list = []
155 self.gc = None 165 self.gc = None
156 self.last_cam_modif_time = -1 166 self.last_cam_modif_time = -1
157 self.modified = True 167 self.modified = True
158 self._init_canvas() 168 self._init_canvas()
159 - viewer.slice_data.renderer.AddObserver("StartEvent", self.OnPaint) 169 + evt_renderer.AddObserver("StartEvent", self.OnPaint)
160 170
161 def _init_canvas(self): 171 def _init_canvas(self):
162 w, h = self._size 172 w, h = self._size
@@ -203,7 +213,7 @@ class CanvasRendererCTX: @@ -203,7 +213,7 @@ class CanvasRendererCTX:
203 self._size = size 213 self._size = size
204 self._resize_canvas(w, h) 214 self._resize_canvas(w, h)
205 215
206 - cam_modif_time = self.viewer.cam.GetMTime() 216 + cam_modif_time = self.evt_renderer.GetActiveCamera().GetMTime()
207 if (not self.modified) and cam_modif_time == self.last_cam_modif_time: 217 if (not self.modified) and cam_modif_time == self.last_cam_modif_time:
208 return 218 return
209 219
@@ -233,10 +243,8 @@ class CanvasRendererCTX: @@ -233,10 +243,8 @@ class CanvasRendererCTX:
233 gc.Scale(1, -1) 243 gc.Scale(1, -1)
234 244
235 modified = False 245 modified = False
236 - for (m, mr) in self.viewer.measures.get(self.viewer.orientation, self.viewer.slice_data.number):  
237 - if not m.visible:  
238 - continue  
239 - mr.draw_to_canvas(gc, self) 246 + for d in self.draw_list:
  247 + d.draw_to_canvas(gc, self)
240 modified = True 248 modified = True
241 249
242 gc.Destroy() 250 gc.Destroy()
@@ -1224,7 +1232,7 @@ class Viewer(wx.Panel): @@ -1224,7 +1232,7 @@ class Viewer(wx.Panel):
1224 self.cam = self.slice_data.renderer.GetActiveCamera() 1232 self.cam = self.slice_data.renderer.GetActiveCamera()
1225 self.__build_cross_lines() 1233 self.__build_cross_lines()
1226 1234
1227 - self.canvas = CanvasRendererCTX(self) 1235 + self.canvas = CanvasRendererCTX(self.slice_data.renderer, self.slice_data.canvas_renderer)
1228 1236
1229 # Set the slice number to the last slice to ensure the camera if far 1237 # Set the slice number to the last slice to ensure the camera if far
1230 # enough to show all slices. 1238 # enough to show all slices.
@@ -1341,6 +1349,16 @@ class Viewer(wx.Panel): @@ -1341,6 +1349,16 @@ class Viewer(wx.Panel):
1341 self.interactor.Render() 1349 self.interactor.Render()
1342 1350
1343 def UpdateCanvas(self, evt=None): 1351 def UpdateCanvas(self, evt=None):
  1352 + for (m, mr) in self.measures.get(self.orientation, self.slice_data.number):
  1353 + try:
  1354 + self.canvas.draw_list.remove(mr)
  1355 + except ValueError:
  1356 + pass
  1357 +
  1358 + for (m, mr) in self.measures.get(self.orientation, self.slice_data.number):
  1359 + if m.visible:
  1360 + self.canvas.draw_list.append(mr)
  1361 +
1344 self.canvas.modified = True 1362 self.canvas.modified = True
1345 self.interactor.Render() 1363 self.interactor.Render()
1346 1364
@@ -1530,14 +1548,12 @@ class Viewer(wx.Panel): @@ -1530,14 +1548,12 @@ class Viewer(wx.Panel):
1530 for actor in self.actors_by_slice_number[index]: 1548 for actor in self.actors_by_slice_number[index]:
1531 self.slice_data.renderer.AddActor(actor) 1549 self.slice_data.renderer.AddActor(actor)
1532 1550
1533 - # for (m, mr) in self.measures.get(self.orientation, self.slice_data.number):  
1534 - # for actor in mr.GetActors():  
1535 - # self.slice_data.renderer.RemoveActor(actor) 1551 + for (m, mr) in self.measures.get(self.orientation, self.slice_data.number):
  1552 + self.canvas.draw_list.remove(mr)
1536 1553
1537 - # for (m, mr) in self.measures.get(self.orientation, index):  
1538 - # mr.renderer = self.slice_data.renderer  
1539 - # for actor in mr.GetActors():  
1540 - # self.slice_data.renderer.AddActor(actor) 1554 + for (m, mr) in self.measures.get(self.orientation, index):
  1555 + if m.visible:
  1556 + self.canvas.draw_list.append(mr)
1541 1557
1542 if self.slice_._type_projection == const.PROJECTION_NORMAL: 1558 if self.slice_._type_projection == const.PROJECTION_NORMAL:
1543 self.slice_data.SetNumber(index) 1559 self.slice_data.SetNumber(index)