Commit 7f8d5bc7b184335accd755464fc8a174c9956f92
1 parent
705d3adf
Exists in
master
and in
6 other branches
ENH: Created a new class to store each render, actor, slice_number
Showing
3 changed files
with
63 additions
and
49 deletions
Show diff stats
.gitattributes
@@ -87,6 +87,7 @@ invesalius/data/mask.py -text | @@ -87,6 +87,7 @@ invesalius/data/mask.py -text | ||
87 | invesalius/data/orientation.py -text | 87 | invesalius/data/orientation.py -text |
88 | invesalius/data/polydata_utils.py -text | 88 | invesalius/data/polydata_utils.py -text |
89 | invesalius/data/slice_.py -text | 89 | invesalius/data/slice_.py -text |
90 | +invesalius/data/slice_data.py -text | ||
90 | invesalius/data/styles.py -text | 91 | invesalius/data/styles.py -text |
91 | invesalius/data/surface.py -text | 92 | invesalius/data/surface.py -text |
92 | invesalius/data/viewer.py -text | 93 | invesalius/data/viewer.py -text |
invesalius/data/viewer_slice.py
@@ -29,6 +29,8 @@ import constants as const | @@ -29,6 +29,8 @@ import constants as const | ||
29 | import project | 29 | import project |
30 | import cursor_actors as ca | 30 | import cursor_actors as ca |
31 | 31 | ||
32 | +from slice_data import SliceData | ||
33 | + | ||
32 | class Viewer(wx.Panel): | 34 | class Viewer(wx.Panel): |
33 | 35 | ||
34 | def __init__(self, prnt, orientation='AXIAL'): | 36 | def __init__(self, prnt, orientation='AXIAL'): |
@@ -42,10 +44,10 @@ class Viewer(wx.Panel): | @@ -42,10 +44,10 @@ class Viewer(wx.Panel): | ||
42 | self.mouse_pressed = 0 | 44 | self.mouse_pressed = 0 |
43 | 45 | ||
44 | # All renderers and image actors in this viewer | 46 | # All renderers and image actors in this viewer |
45 | - self.image_windows = [] | ||
46 | - # The layout from image_window, the first is number of cols, the second | 47 | + self.slice_data_list = [] |
48 | + # The layout from slice_data, the first is number of cols, the second | ||
47 | # is the number of rows | 49 | # is the number of rows |
48 | - self.layout = (1, 1) | 50 | + self.layout = (2, 2) |
49 | 51 | ||
50 | self.__init_gui() | 52 | self.__init_gui() |
51 | 53 | ||
@@ -96,7 +98,6 @@ class Viewer(wx.Panel): | @@ -96,7 +98,6 @@ class Viewer(wx.Panel): | ||
96 | self.cam = ren.GetActiveCamera() | 98 | self.cam = ren.GetActiveCamera() |
97 | self.ren = ren | 99 | self.ren = ren |
98 | 100 | ||
99 | - | ||
100 | def append_mode(self, mode): | 101 | def append_mode(self, mode): |
101 | 102 | ||
102 | # Retrieve currently set modes | 103 | # Retrieve currently set modes |
@@ -161,7 +162,7 @@ class Viewer(wx.Panel): | @@ -161,7 +162,7 @@ class Viewer(wx.Panel): | ||
161 | cursor = ca.CursorCircle() | 162 | cursor = ca.CursorCircle() |
162 | self.cursor = cursor | 163 | self.cursor = cursor |
163 | 164 | ||
164 | - cursor.set_orientation(self.orientation) | 165 | + cursor.SetOrientation(self.orientation) |
165 | coordinates = {"SAGITAL": [self.slice_number, 0, 0], | 166 | coordinates = {"SAGITAL": [self.slice_number, 0, 0], |
166 | "CORONAL": [0, self.slice_number, 0], | 167 | "CORONAL": [0, self.slice_number, 0], |
167 | "AXIAL": [0, 0, self.slice_number]} | 168 | "AXIAL": [0, 0, self.slice_number]} |
@@ -174,7 +175,6 @@ class Viewer(wx.Panel): | @@ -174,7 +175,6 @@ class Viewer(wx.Panel): | ||
174 | self.interactor.Render() | 175 | self.interactor.Render() |
175 | self.cursor = cursor | 176 | self.cursor = cursor |
176 | 177 | ||
177 | - | ||
178 | def OnMouseClick(self, obj, evt_vtk): | 178 | def OnMouseClick(self, obj, evt_vtk): |
179 | self.mouse_pressed = 1 | 179 | self.mouse_pressed = 1 |
180 | 180 | ||
@@ -186,13 +186,13 @@ class Viewer(wx.Panel): | @@ -186,13 +186,13 @@ class Viewer(wx.Panel): | ||
186 | 186 | ||
187 | mouse_x, mouse_y = self.interactor.GetEventPosition() | 187 | mouse_x, mouse_y = self.interactor.GetEventPosition() |
188 | render = self.interactor.FindPokedRenderer(mouse_x, mouse_y) | 188 | render = self.interactor.FindPokedRenderer(mouse_x, mouse_y) |
189 | - image_window = self.get_image_window(render) | 189 | + slice_data = self.get_slice_data(render) |
190 | self.pick.Pick(mouse_x, mouse_y, 0, render) | 190 | self.pick.Pick(mouse_x, mouse_y, 0, render) |
191 | 191 | ||
192 | coord = self.get_coordinate_cursor() | 192 | coord = self.get_coordinate_cursor() |
193 | self.cursor.SetPosition(coord) | 193 | self.cursor.SetPosition(coord) |
194 | self.cursor.SetEditionPosition( | 194 | self.cursor.SetEditionPosition( |
195 | - self.get_coordinate_cursor_edition(image_window)) | 195 | + self.get_coordinate_cursor_edition(slice_data)) |
196 | self.__update_cursor_position(coord) | 196 | self.__update_cursor_position(coord) |
197 | #render.Render() | 197 | #render.Render() |
198 | 198 | ||
@@ -213,12 +213,12 @@ class Viewer(wx.Panel): | @@ -213,12 +213,12 @@ class Viewer(wx.Panel): | ||
213 | def OnBrushMove(self, obj, evt_vtk): | 213 | def OnBrushMove(self, obj, evt_vtk): |
214 | mouse_x, mouse_y = self.interactor.GetEventPosition() | 214 | mouse_x, mouse_y = self.interactor.GetEventPosition() |
215 | render = self.interactor.FindPokedRenderer(mouse_x, mouse_y) | 215 | render = self.interactor.FindPokedRenderer(mouse_x, mouse_y) |
216 | - image_window = self.get_image_window(render) | 216 | + slice_data = self.get_slice_data(render) |
217 | self.pick.Pick(mouse_x, mouse_y, 0, render) | 217 | self.pick.Pick(mouse_x, mouse_y, 0, render) |
218 | coord = self.get_coordinate_cursor() | 218 | coord = self.get_coordinate_cursor() |
219 | self.cursor.SetPosition(coord) | 219 | self.cursor.SetPosition(coord) |
220 | self.cursor.SetEditionPosition( | 220 | self.cursor.SetEditionPosition( |
221 | - self.get_coordinate_cursor_edition(image_window)) | 221 | + self.get_coordinate_cursor_edition(slice_data)) |
222 | self.__update_cursor_position(coord) | 222 | self.__update_cursor_position(coord) |
223 | 223 | ||
224 | if self._brush_cursor_op == const.BRUSH_ERASE: | 224 | if self._brush_cursor_op == const.BRUSH_ERASE: |
@@ -249,10 +249,10 @@ class Viewer(wx.Panel): | @@ -249,10 +249,10 @@ class Viewer(wx.Panel): | ||
249 | ps.Publisher().sendMessage(('Set scroll position', 'AXIAL'), | 249 | ps.Publisher().sendMessage(('Set scroll position', 'AXIAL'), |
250 | coord[2]) | 250 | coord[2]) |
251 | 251 | ||
252 | - def get_image_window(self, render): | ||
253 | - for i in self.image_windows: | ||
254 | - if i[0] is render: | ||
255 | - return i | 252 | + def get_slice_data(self, render): |
253 | + for slice_data in self.slice_data_list: | ||
254 | + if slice_data.renderer is render: | ||
255 | + return slice_data | ||
256 | 256 | ||
257 | def get_coordinate(self): | 257 | def get_coordinate(self): |
258 | # Find position | 258 | # Find position |
@@ -297,9 +297,10 @@ class Viewer(wx.Panel): | @@ -297,9 +297,10 @@ class Viewer(wx.Panel): | ||
297 | x, y, z = self.pick.GetPickPosition() | 297 | x, y, z = self.pick.GetPickPosition() |
298 | return x, y, z | 298 | return x, y, z |
299 | 299 | ||
300 | - def get_coordinate_cursor_edition(self, image_window): | 300 | + def get_coordinate_cursor_edition(self, slice_data): |
301 | # Find position | 301 | # Find position |
302 | - actor, slice_number = image_window[1::] | 302 | + actor = slice_data.actor |
303 | + slice_number = slice_data.number | ||
303 | x, y, z = self.pick.GetPickPosition() | 304 | x, y, z = self.pick.GetPickPosition() |
304 | 305 | ||
305 | # First we fix the position origin, based on vtkActor bounds | 306 | # First we fix the position origin, based on vtkActor bounds |
@@ -369,10 +370,9 @@ class Viewer(wx.Panel): | @@ -369,10 +370,9 @@ class Viewer(wx.Panel): | ||
369 | for j in xrange(self.layout[1]): | 370 | for j in xrange(self.layout[1]): |
370 | position = ((i*proportion_x, j * proportion_y, | 371 | position = ((i*proportion_x, j * proportion_y, |
371 | (i+1)*proportion_x, (j+1)*proportion_y)) | 372 | (i+1)*proportion_x, (j+1)*proportion_y)) |
372 | - ren, actor = self.create_slice_window(image) | ||
373 | - ren.SetViewport(position) | ||
374 | - self.image_windows.append([ren, actor, 0]) | ||
375 | - | 373 | + slice_data = self.create_slice_window(image) |
374 | + slice_data.renderer.SetViewport(position) | ||
375 | + self.slice_data_list.append(slice_data) | ||
376 | 376 | ||
377 | def SetInput(self, imagedata): | 377 | def SetInput(self, imagedata): |
378 | self.imagedata = imagedata | 378 | self.imagedata = imagedata |
@@ -385,11 +385,11 @@ class Viewer(wx.Panel): | @@ -385,11 +385,11 @@ class Viewer(wx.Panel): | ||
385 | if slice_.imagedata is None: | 385 | if slice_.imagedata is None: |
386 | slice_.SetInput(imagedata) | 386 | slice_.SetInput(imagedata) |
387 | 387 | ||
388 | - | ||
389 | #actor = vtk.vtkImageActor() | 388 | #actor = vtk.vtkImageActor() |
390 | #actor.SetInput(slice_.GetOutput()) | 389 | #actor.SetInput(slice_.GetOutput()) |
391 | self.load_renderers(slice_.GetOutput()) | 390 | self.load_renderers(slice_.GetOutput()) |
392 | - ren, actor = self.image_windows[0][:2] | 391 | + ren = self.slice_data_list[0].renderer |
392 | + actor = self.slice_data_list[0].actor | ||
393 | actor_bound = actor.GetBounds() | 393 | actor_bound = actor.GetBounds() |
394 | self.actor = actor | 394 | self.actor = actor |
395 | self.ren = ren | 395 | self.ren = ren |
@@ -411,11 +411,14 @@ class Viewer(wx.Panel): | @@ -411,11 +411,14 @@ class Viewer(wx.Panel): | ||
411 | 411 | ||
412 | #ren.AddActor(actor) | 412 | #ren.AddActor(actor) |
413 | #ren.AddActor(text_actor) | 413 | #ren.AddActor(text_actor) |
414 | - for ren, actor, n in self.image_windows: | ||
415 | - self.__update_camera(ren, actor, n) | 414 | + for slice_data in self.slice_data_list: |
415 | + self.__update_camera(slice_data) | ||
416 | 416 | ||
417 | + number_of_slices = self.layout[0] * self.layout[1] | ||
417 | max_slice_number = actor.GetSliceNumberMax() / \ | 418 | max_slice_number = actor.GetSliceNumberMax() / \ |
418 | - (self.layout[0] * self.layout[1]) | 419 | + number_of_slices |
420 | + if actor.GetSliceNumberMax() % number_of_slices: | ||
421 | + max_slice_number += 1 | ||
419 | self.scroll.SetScrollbar(wx.SB_VERTICAL, 1, max_slice_number, | 422 | self.scroll.SetScrollbar(wx.SB_VERTICAL, 1, max_slice_number, |
420 | max_slice_number) | 423 | max_slice_number) |
421 | self.set_scroll_position(0) | 424 | self.set_scroll_position(0) |
@@ -459,23 +462,26 @@ class Viewer(wx.Panel): | @@ -459,23 +462,26 @@ class Viewer(wx.Panel): | ||
459 | 462 | ||
460 | def set_orientation(self, orientation): | 463 | def set_orientation(self, orientation): |
461 | self.orientation = orientation | 464 | self.orientation = orientation |
462 | - for ren, actor, n in self.image_windows: | ||
463 | - self.__update_camera(ren, actor, n) | 465 | + for slice_data in self.slice_data_list: |
466 | + self.__update_camera(slice_data) | ||
464 | 467 | ||
465 | - def create_slice_window(self, image): | ||
466 | - render = vtk.vtkRenderer() | ||
467 | - self.interactor.GetRenderWindow().AddRenderer(render) | 468 | + def create_slice_window(self, imagedata): |
469 | + renderer = vtk.vtkRenderer() | ||
470 | + self.interactor.GetRenderWindow().AddRenderer(renderer) | ||
468 | actor = vtk.vtkImageActor() | 471 | actor = vtk.vtkImageActor() |
469 | - actor.SetInput(image) | ||
470 | - render.AddActor(actor) | ||
471 | - return render, actor | ||
472 | - | ||
473 | - def __update_camera(self, ren, actor, pos): | 472 | + actor.SetInput(imagedata) |
473 | + renderer.AddActor(actor) | ||
474 | + slice_data = SliceData() | ||
475 | + slice_data.renderer = renderer | ||
476 | + slice_data.actor = actor | ||
477 | + return slice_data | ||
478 | + | ||
479 | + def __update_camera(self, slice_data): | ||
474 | orientation = self.orientation | 480 | orientation = self.orientation |
475 | proj = project.Project() | 481 | proj = project.Project() |
476 | orig_orien = proj.original_orientation | 482 | orig_orien = proj.original_orientation |
477 | 483 | ||
478 | - cam = ren.GetActiveCamera() | 484 | + cam = slice_data.renderer.GetActiveCamera() |
479 | cam.SetFocalPoint(0, 0, 0) | 485 | cam.SetFocalPoint(0, 0, 0) |
480 | cam.SetViewUp(const.SLICE_POSITION[orig_orien][0][self.orientation]) | 486 | cam.SetViewUp(const.SLICE_POSITION[orig_orien][0][self.orientation]) |
481 | cam.SetPosition(const.SLICE_POSITION[orig_orien][1][self.orientation]) | 487 | cam.SetPosition(const.SLICE_POSITION[orig_orien][1][self.orientation]) |
@@ -483,14 +489,16 @@ class Viewer(wx.Panel): | @@ -483,14 +489,16 @@ class Viewer(wx.Panel): | ||
483 | cam.OrthogonalizeViewUp() | 489 | cam.OrthogonalizeViewUp() |
484 | cam.ParallelProjectionOn() | 490 | cam.ParallelProjectionOn() |
485 | 491 | ||
486 | - self.__update_display_extent(actor, ren, pos) | 492 | + self.__update_display_extent(slice_data) |
487 | 493 | ||
488 | - ren.ResetCamera() | ||
489 | - ren.Render() | 494 | + slice_data.renderer.ResetCamera() |
495 | + slice_data.renderer.Render() | ||
490 | 496 | ||
491 | - def __update_display_extent(self, actor, render, pos): | 497 | + def __update_display_extent(self, slice_data): |
492 | e = self.imagedata.GetWholeExtent() | 498 | e = self.imagedata.GetWholeExtent() |
493 | proj = project.Project() | 499 | proj = project.Project() |
500 | + | ||
501 | + pos = slice_data.number | ||
494 | 502 | ||
495 | x = (pos, pos, e[2], e[3], e[4], e[5]) | 503 | x = (pos, pos, e[2], e[3], e[4], e[5]) |
496 | y = (e[0], e[1], pos, pos, e[4], e[5]) | 504 | y = (e[0], e[1], pos, pos, e[4], e[5]) |
@@ -503,9 +511,8 @@ class Viewer(wx.Panel): | @@ -503,9 +511,8 @@ class Viewer(wx.Panel): | ||
503 | elif(proj.original_orientation == const.CORONAL): | 511 | elif(proj.original_orientation == const.CORONAL): |
504 | new_extent = {"SAGITAL": x,"CORONAL": z,"AXIAL": y} | 512 | new_extent = {"SAGITAL": x,"CORONAL": z,"AXIAL": y} |
505 | 513 | ||
506 | - actor.SetDisplayExtent(new_extent[self.orientation]) | ||
507 | - render.ResetCameraClippingRange() | ||
508 | - #render.Render() | 514 | + slice_data.actor.SetDisplayExtent(new_extent[self.orientation]) |
515 | + slice_data.renderer.ResetCameraClippingRange() | ||
509 | 516 | ||
510 | def UpdateRender(self, evt): | 517 | def UpdateRender(self, evt): |
511 | self.interactor.Render() | 518 | self.interactor.Render() |
@@ -542,13 +549,14 @@ class Viewer(wx.Panel): | @@ -542,13 +549,14 @@ class Viewer(wx.Panel): | ||
542 | def set_slice_number(self, index): | 549 | def set_slice_number(self, index): |
543 | self.text_actor.SetInput(str(index)) | 550 | self.text_actor.SetInput(str(index)) |
544 | self.slice_number = index | 551 | self.slice_number = index |
545 | - for n, window in enumerate(self.image_windows): | ||
546 | - ren, actor = window[:2] | 552 | + for n, slice_data in enumerate(self.slice_data_list): |
553 | + ren = slice_data.renderer | ||
554 | + actor = slice_data.actor | ||
547 | pos = self.layout[0] * self.layout[1] * index + n | 555 | pos = self.layout[0] * self.layout[1] * index + n |
548 | - print pos | ||
549 | - self.__update_display_extent(actor, ren, pos) | ||
550 | - self.image_windows[n][2] = pos | ||
551 | 556 | + max = actor.GetSliceNumberMax() | |
557 | + if pos < max: | ||
558 | + slice_data.number = pos | ||
559 | + self.__update_display_extent(slice_data) | ||
552 | 560 | ||
553 | position = {"SAGITAL": {0: self.slice_number}, | 561 | position = {"SAGITAL": {0: self.slice_number}, |
554 | "CORONAL": {1: self.slice_number}, | 562 | "CORONAL": {1: self.slice_number}, |