Commit a08353c6a0cad8cfffc77b1f3ff785142ef34427

Authored by tfmoraes
1 parent 7480a7f3

ENH: Window width and level is working again

Showing 1 changed file with 80 additions and 26 deletions   Show diff stats
invesalius/data/slice_.py
... ... @@ -28,6 +28,37 @@ from project import Project
28 28 import session as ses
29 29 import utils
30 30  
  31 +class SliceBuffer(object):
  32 + """
  33 + This class is used as buffer that mantains the vtkImageData and numpy array
  34 + from actual slices from each orientation.
  35 + """
  36 + def __init__(self):
  37 + self.index = -1
  38 + self.image = None
  39 + self.mask = None
  40 + self.vtk_image = None
  41 + self.vtk_mask = None
  42 +
  43 + def discard_vtk_mask(self):
  44 + self.vtk_mask = None
  45 +
  46 + def discard_vtk_image(self):
  47 + self.vtk_image = None
  48 +
  49 + def discard_mask(self):
  50 + self.mask = None
  51 +
  52 + def discard_image(self):
  53 + self.image = None
  54 +
  55 + def discard_buffer(self):
  56 + self.index = -1
  57 + self.image = None
  58 + self.mask = None
  59 + self.vtk_image = None
  60 + self.vtk_mask = None
  61 +
31 62  
32 63 class Slice(object):
33 64 __metaclass__= utils.Singleton
... ... @@ -41,9 +72,9 @@ class Slice(object):
41 72 self.blend_filter = None
42 73 self.matrix = None
43 74  
44   - self.buffer_slices = {"AXIAL": [-1, None, None],
45   - "CORONAL": [-1,None, None],
46   - "SAGITAL": [-1, None, None]}
  75 + self.buffer_slices = {"AXIAL": SliceBuffer(),
  76 + "CORONAL": SliceBuffer(),
  77 + "SAGITAL": SliceBuffer()}
47 78  
48 79 self.num_gradient = 0
49 80 self.interaction_style = st.StyleStateManager()
... ... @@ -211,8 +242,9 @@ class Slice(object):
211 242 threshold_range = evt_pubsub.data
212 243 index = self.current_mask.index
213 244 for orientation in self.buffer_slices:
  245 + self.buffer_slices[orientation].discard_vtk_mask()
214 246 self.SetMaskThreshold(index, threshold_range,
215   - self.buffer_slices[orientation][0],
  247 + self.buffer_slices[orientation].index,
216 248 orientation)
217 249 #Clear edited points
218 250 self.current_mask.edited_points = {}
... ... @@ -260,13 +292,23 @@ class Slice(object):
260 292 #---------------------------------------------------------------------------
261 293  
262 294 def GetSlices(self, orientation, slice_number):
263   - if self.buffer_slices[orientation][0] == slice_number:
264   - print "From buffer"
265   - image = self.buffer_slices[orientation][1]
  295 + if self.buffer_slices[orientation].index == slice_number:
  296 + if self.buffer_slices[orientation].vtk_image:
  297 + image = self.buffer_slices[orientation].vtk_image
  298 + else:
  299 + n_image = self.GetImageSlice(orientation, slice_number)
  300 + image = iu.to_vtk(n_image, self.spacing, slice_number, orientation)
  301 + image = self.do_ww_wl(image)
266 302 if self.current_mask and self.current_mask.is_shown:
267   - n_mask = self.buffer_slices[orientation][2]
268   - mask = iu.to_vtk(n_mask, self.spacing, slice_number, orientation)
269   - final_image = self.do_blend(image, self.do_colour_mask(mask))
  303 + if self.buffer_slices[orientation].vtk_mask:
  304 + print "Getting from buffer"
  305 + mask = self.buffer_slices[orientation].vtk_mask
  306 + else:
  307 + print "Do not getting from buffer"
  308 + n_mask = self.GetMaskSlice(orientation, slice_number)
  309 + mask = iu.to_vtk(n_mask, self.spacing, slice_number, orientation)
  310 + mask = self.do_colour_mask(mask)
  311 + final_image = self.do_blend(image, mask)
270 312 else:
271 313 final_image = image
272 314 else:
... ... @@ -277,19 +319,25 @@ class Slice(object):
277 319 if self.current_mask and self.current_mask.is_shown:
278 320 n_mask = self.GetMaskSlice(orientation, slice_number)
279 321 mask = iu.to_vtk(n_mask, self.spacing, slice_number, orientation)
280   - final_image = self.do_blend(image, self.do_colour_mask(mask))
  322 + mask = self.do_colour_mask(mask)
  323 + final_image = self.do_blend(image, mask)
281 324 else:
282 325 n_mask = None
283 326 final_image = image
  327 + mask = None
  328 +
  329 + self.buffer_slices[orientation].index = slice_number
  330 + self.buffer_slices[orientation].image = n_image
  331 + self.buffer_slices[orientation].mask = n_mask
  332 + self.buffer_slices[orientation].vtk_image = image
  333 + self.buffer_slices[orientation].vtk_mask = mask
284 334  
285   - self.buffer_slices[orientation] = [slice_number, image, n_mask,
286   - n_image]
287   - self.slice_number = slice_number
288 335 return final_image
289 336  
290 337 def GetImageSlice(self, orientation, slice_number):
291   - if self.buffer_slices[orientation] == slice_number:
292   - n_image = self.buffer_slices[orientation][3]
  338 + if self.buffer_slices[orientation].index == slice_number \
  339 + and self.buffer_slices[orientation].image is not None:
  340 + n_image = self.buffer_slices[orientation].image
293 341 else:
294 342 if orientation == 'AXIAL':
295 343 n_image = numpy.array(self.matrix[slice_number])
... ... @@ -307,6 +355,9 @@ class Slice(object):
307 355 # It's necessary because the first position for each dimension from
308 356 # mask matrix is used as flags to control if the mask in the
309 357 # slice_number position has been generated.
  358 + if self.buffer_slices[orientation].index == slice_number \
  359 + and self.buffer_slices[orientation].mask is not None:
  360 + return self.buffer_slices[orientation].mask
310 361 n = slice_number + 1
311 362 if orientation == 'AXIAL':
312 363 if self.current_mask.matrix[n, 0, 0] == 0:
... ... @@ -413,9 +464,8 @@ class Slice(object):
413 464 self.current_mask.matrix[n+1, 1:, 1:] = m
414 465 else:
415 466 print "Only one slice"
416   - slice_ = self.buffer_slices[orientation][3]
417   - self.buffer_slices[orientation][2] = 255 * ((slice_ >= thresh_min) & (slice_ <= thresh_max))
418   - print self.buffer_slices[orientation][2].dtype
  467 + slice_ = self.buffer_slices[orientation].image
  468 + self.buffer_slices[orientation].mask = 255 * ((slice_ >= thresh_min) & (slice_ <= thresh_max))
419 469  
420 470 # Update viewer
421 471 #ps.Publisher().sendMessage('Update slice viewer')
... ... @@ -437,9 +487,9 @@ class Slice(object):
437 487 proj = Project()
438 488 proj.mask_dict[index].is_shown = value
439 489 if (index == self.current_mask.index):
440   - self.buffer_slices = {"AXIAL": [-1, None, None],
441   - "CORONAL": [-1,None, None],
442   - "SAGITAL": [-1, None, None]}
  490 + for buffer_ in self.buffer_slices:
  491 + buffer_.discard_vtk_mask()
  492 + buffer_.discard_mask()
443 493 ps.Publisher().sendMessage('Reload actual slice')
444 494 #---------------------------------------------------------------------------
445 495 def ErasePixel(self, position):
... ... @@ -498,9 +548,9 @@ class Slice(object):
498 548 print index
499 549 self.SetMaskColour(index, colour, update=False)
500 550  
501   - self.buffer_slices = {"AXIAL": [-1, None, None],
502   - "CORONAL": [-1,None, None],
503   - "SAGITAL": [-1, None, None]}
  551 + self.buffer_slices = {"AXIAL": SliceBuffer(),
  552 + "CORONAL": SliceBuffer(),
  553 + "SAGITAL": SliceBuffer()}
504 554  
505 555 ps.Publisher().sendMessage('Set mask threshold in notebook',
506 556 (index,
... ... @@ -590,8 +640,12 @@ class Slice(object):
590 640 window, level = pubsub_evt.data
591 641 self.window_width = window
592 642 self.window_level = level
  643 +
  644 + for buffer_ in self.buffer_slices.values():
  645 + buffer_.discard_vtk_image()
  646 +
593 647 ps.Publisher().sendMessage('Reload actual slice')
594   - ps.Publisher().sendMessage('Update slice viewer')
  648 +
595 649 #window_level = self.window_level
596 650  
597 651 #if not((window == window_level.GetWindow()) and\
... ...