Commit 6fdec144aa10b9ad26e03aea10ddc3f6d32db150

Authored by Thiago Franco de Moraes
1 parent 34feaf7f

Added a option to clean the actual mask

invesalius/constants.py
@@ -476,6 +476,7 @@ ID_SWAP_XZ = wx.NewId() @@ -476,6 +476,7 @@ ID_SWAP_XZ = wx.NewId()
476 ID_SWAP_YZ = wx.NewId() 476 ID_SWAP_YZ = wx.NewId()
477 477
478 ID_BOOLEAN_MASK = wx.NewId() 478 ID_BOOLEAN_MASK = wx.NewId()
  479 +ID_CLEAN_MASK = wx.NewId()
479 480
480 #--------------------------------------------------------- 481 #---------------------------------------------------------
481 STATE_DEFAULT = 1000 482 STATE_DEFAULT = 1000
invesalius/data/mask.py
@@ -285,6 +285,12 @@ class Mask(): @@ -285,6 +285,12 @@ class Mask():
285 shape = shape[0] + 1, shape[1] + 1, shape[2] + 1 285 shape = shape[0] + 1, shape[1] + 1, shape[2] + 1
286 self.matrix = numpy.memmap(self.temp_file, mode='w+', dtype='uint8', shape=shape) 286 self.matrix = numpy.memmap(self.temp_file, mode='w+', dtype='uint8', shape=shape)
287 287
  288 + def clean(self):
  289 + self.matrix[1:, 1:, 1:] = 0
  290 + self.matrix[0, :, :] = 1
  291 + self.matrix[:, 0, :] = 1
  292 + self.matrix[:, :, 0] = 1
  293 +
288 def copy(self, copy_name): 294 def copy(self, copy_name):
289 """ 295 """
290 creates and return a copy from the mask instance. 296 creates and return a copy from the mask instance.
invesalius/data/slice_.py
@@ -142,6 +142,7 @@ class Slice(object): @@ -142,6 +142,7 @@ class Slice(object):
142 Publisher.subscribe(self.__set_mask_name, 'Change mask name') 142 Publisher.subscribe(self.__set_mask_name, 'Change mask name')
143 Publisher.subscribe(self.__show_mask, 'Show mask') 143 Publisher.subscribe(self.__show_mask, 'Show mask')
144 Publisher.subscribe(self.__hide_current_mask, 'Hide current mask') 144 Publisher.subscribe(self.__hide_current_mask, 'Hide current mask')
  145 + Publisher.subscribe(self.__clean_current_mask, 'Clean current mask')
145 146
146 Publisher.subscribe(self.__set_current_mask_threshold_limits, 147 Publisher.subscribe(self.__set_current_mask_threshold_limits,
147 'Update threshold limits') 148 'Update threshold limits')
@@ -211,6 +212,7 @@ class Slice(object): @@ -211,6 +212,7 @@ class Slice(object):
211 buffer_.discard_vtk_mask() 212 buffer_.discard_vtk_mask()
212 buffer_.discard_mask() 213 buffer_.discard_mask()
213 214
  215 + Publisher.sendMessage('Show mask', (item, 0))
214 Publisher.sendMessage('Reload actual slice') 216 Publisher.sendMessage('Reload actual slice')
215 217
216 def OnDuplicateMasks(self, pubsub_evt): 218 def OnDuplicateMasks(self, pubsub_evt):
@@ -385,6 +387,14 @@ class Slice(object): @@ -385,6 +387,14 @@ class Slice(object):
385 value = False 387 value = False
386 Publisher.sendMessage('Show mask', (index, value)) 388 Publisher.sendMessage('Show mask', (index, value))
387 389
  390 + def __clean_current_mask(self, pubsub_evt):
  391 + if self.current_mask:
  392 + self.current_mask.clean()
  393 + for buffer_ in self.buffer_slices.values():
  394 + buffer_.discard_vtk_mask()
  395 + buffer_.discard_mask()
  396 + self.current_mask.clear_history()
  397 +
388 def create_temp_mask(self): 398 def create_temp_mask(self):
389 temp_file = tempfile.mktemp() 399 temp_file = tempfile.mktemp()
390 shape = self.matrix.shape 400 shape = self.matrix.shape
@@ -1012,6 +1022,7 @@ class Slice(object): @@ -1012,6 +1022,7 @@ class Slice(object):
1012 1022
1013 if show: 1023 if show:
1014 self.current_mask = mask 1024 self.current_mask = mask
  1025 + Publisher.sendMessage('Show mask', (mask.index, 1))
1015 Publisher.sendMessage('Change mask selected', mask.index) 1026 Publisher.sendMessage('Change mask selected', mask.index)
1016 Publisher.sendMessage('Update slice viewer') 1027 Publisher.sendMessage('Update slice viewer')
1017 1028
invesalius/gui/frame.py
@@ -401,6 +401,8 @@ class Frame(wx.Frame): @@ -401,6 +401,8 @@ class Frame(wx.Frame):
401 401
402 elif id == const.ID_BOOLEAN_MASK: 402 elif id == const.ID_BOOLEAN_MASK:
403 self.OnMaskBoolean() 403 self.OnMaskBoolean()
  404 + elif id == const.ID_CLEAN_MASK:
  405 + self.OnCleanMask()
404 406
405 def OnSize(self, evt): 407 def OnSize(self, evt):
406 """ 408 """
@@ -503,11 +505,13 @@ class Frame(wx.Frame): @@ -503,11 +505,13 @@ class Frame(wx.Frame):
503 print "Redo" 505 print "Redo"
504 Publisher.sendMessage('Redo edition') 506 Publisher.sendMessage('Redo edition')
505 507
506 -  
507 def OnMaskBoolean(self): 508 def OnMaskBoolean(self):
508 print "Mask boolean" 509 print "Mask boolean"
509 Publisher.sendMessage('Show boolean dialog') 510 Publisher.sendMessage('Show boolean dialog')
510 - 511 +
  512 + def OnCleanMask(self):
  513 + Publisher.sendMessage('Clean current mask')
  514 + Publisher.sendMessage('Reload actual slice')
511 515
512 # ------------------------------------------------------------------ 516 # ------------------------------------------------------------------
513 # ------------------------------------------------------------------ 517 # ------------------------------------------------------------------
@@ -548,6 +552,7 @@ class MenuBar(wx.MenuBar): @@ -548,6 +552,7 @@ class MenuBar(wx.MenuBar):
548 552
549 sub(self.OnAddMask, "Add mask") 553 sub(self.OnAddMask, "Add mask")
550 sub(self.OnRemoveMasks, "Remove masks") 554 sub(self.OnRemoveMasks, "Remove masks")
  555 + sub(self.OnShowMask, "Show mask")
551 556
552 self.num_masks = 0 557 self.num_masks = 0
553 558
@@ -629,6 +634,10 @@ class MenuBar(wx.MenuBar): @@ -629,6 +634,10 @@ class MenuBar(wx.MenuBar):
629 mask_menu = wx.Menu() 634 mask_menu = wx.Menu()
630 self.bool_op_menu = mask_menu.Append(const.ID_BOOLEAN_MASK, _(u"Boolean operations")) 635 self.bool_op_menu = mask_menu.Append(const.ID_BOOLEAN_MASK, _(u"Boolean operations"))
631 self.bool_op_menu.Enable(False) 636 self.bool_op_menu.Enable(False)
  637 +
  638 + self.clean_mask_menu = mask_menu.Append(const.ID_CLEAN_MASK, _(u"Clean Mask\tCtrl+Shift+A"))
  639 + self.clean_mask_menu.Enable(False)
  640 +
632 file_edit.AppendMenu(-1, _(u"Mask"), mask_menu) 641 file_edit.AppendMenu(-1, _(u"Mask"), mask_menu)
633 642
634 643
@@ -725,19 +734,17 @@ class MenuBar(wx.MenuBar): @@ -725,19 +734,17 @@ class MenuBar(wx.MenuBar):
725 734
726 def OnAddMask(self, pubsub_evt): 735 def OnAddMask(self, pubsub_evt):
727 self.num_masks += 1 736 self.num_masks += 1
728 -  
729 - if self.num_masks >= 2:  
730 - self.bool_op_menu.Enable(True)  
731 - else:  
732 - self.bool_op_menu.Enable(False) 737 + self.bool_op_menu.Enable(self.num_masks >= 2)
733 738
734 def OnRemoveMasks(self, pubsub_evt): 739 def OnRemoveMasks(self, pubsub_evt):
735 self.num_masks -= len(pubsub_evt.data) 740 self.num_masks -= len(pubsub_evt.data)
  741 + self.bool_op_menu.Enable(self.num_masks >= 2)
  742 +
  743 + def OnShowMask(self, pubsub_evt):
  744 + index, value = pubsub_evt.data
  745 + self.clean_mask_menu.Enable(value)
  746 +
736 747
737 - if self.num_masks >= 2:  
738 - self.bool_op_menu.Enable(True)  
739 - else:  
740 - self.bool_op_menu.Enable(False)  
741 # ------------------------------------------------------------------ 748 # ------------------------------------------------------------------
742 # ------------------------------------------------------------------ 749 # ------------------------------------------------------------------
743 # ------------------------------------------------------------------ 750 # ------------------------------------------------------------------