diff --git a/invesalius/data/mask.py b/invesalius/data/mask.py index e97fd8b..15224d5 100644 --- a/invesalius/data/mask.py +++ b/invesalius/data/mask.py @@ -12,4 +12,5 @@ class Mask(): self.threshold_range = const.THRESHOLD_RANGE self.name = const.MASK_NAME_PATTERN %(Mask.general_index+1) self.edition_threshold_range = const.THRESHOLD_RANGE + self.is_shown = 1 \ No newline at end of file diff --git a/invesalius/data/slice_.py b/invesalius/data/slice_.py index 792e80c..9979e37 100644 --- a/invesalius/data/slice_.py +++ b/invesalius/data/slice_.py @@ -17,6 +17,7 @@ class Slice(object): def __init__(self): self.imagedata = None self.__bind_events() + self.current_mask = None def __bind_events(self): ps.Publisher().subscribe(self.SetThresholdRange, 'Set threshold values') @@ -30,9 +31,33 @@ class Slice(object): 'Create surface from index') ps.Publisher().subscribe(self.UpdateCursorPosition, 'Update cursor position in slice') + ps.Publisher().subscribe(self.ShowMask, 'Show mask') + + + def ShowMask(self, pubsub_evt): + + # This is necessary because wx events are calling this before it was created + if self.current_mask: + mask_index, value = pubsub_evt.data + + proj = Project() + proj.mask_dict[mask_index].is_shown = value + + + if (mask_index == self.current_mask.index): + if value: + self.blend_filter.SetOpacity(1, self.current_mask.opacity) + else: + + self.blend_filter.SetOpacity(1, 0) + self.blend_filter.Update() + ps.Publisher().sendMessage('Update slice viewer') + + def CreateSurfaceFromIndex(self, pubsub_evt): mask_index = pubsub_evt.data + proj = Project() mask = proj.mask_dict[mask_index] @@ -65,24 +90,29 @@ class Slice(object): self.current_mask = future_mask colour = future_mask.colour - self.ChangeCurrentMaskColour(colour) + self.ChangeCurrentMaskColour(colour, update=False) imagedata = future_mask.imagedata self.img_colours_mask.SetInput(imagedata) + if self.current_mask.is_shown: + self.blend_filter.SetOpacity(1, self.current_mask.opacity) + else: + + self.blend_filter.SetOpacity(1, 0) + self.blend_filter.Update() + ps.Publisher().sendMessage('Set mask threshold in notebook', (self.current_mask.index, self.current_mask.threshold_range)) ps.Publisher().sendMessage('Set threshold values in gradient', self.current_mask.threshold_range) + ps.Publisher().sendMessage('Select mask name in combo', mask_index) ps.Publisher().sendMessage('Update slice viewer') - def ChangeCurrentMaskColour(self, colour): - try: - self.current_mask - except AttributeError: - pass - else: + def ChangeCurrentMaskColour(self, colour, update=True): + # This is necessary because wx events are calling this before it was created + if self.current_mask: (r,g,b) = colour scalar_range = int(self.imagedata.GetScalarRange()[1]) self.current_mask.colour = colour @@ -94,11 +124,12 @@ class Slice(object): ps.Publisher().sendMessage('Change mask colour in notebook', (self.current_mask.index, (r,g,b))) ps.Publisher().sendMessage('Set GUI items colour', colour_wx) - ps.Publisher().sendMessage('Update slice viewer') + if update: + ps.Publisher().sendMessage('Update slice viewer') def GetOutput(self): - return self.blend_imagedata.GetOutput() + return self.cast_filter.GetOutput() def SetInput(self, imagedata): self.imagedata = imagedata @@ -110,18 +141,18 @@ class Slice(object): mask_opacity = self.current_mask.opacity # blend both imagedatas, so it can be inserted into viewer - blend_imagedata = vtk.vtkImageBlend() - blend_imagedata.SetBlendModeToNormal() - blend_imagedata.SetOpacity(0, 1) - blend_imagedata.SetOpacity(1, mask_opacity) - blend_imagedata.SetInput(0, imagedata_bg) - blend_imagedata.SetInput(1, imagedata_mask) - blend_imagedata.SetBlendModeToNormal() - blend_imagedata.GetOutput().ReleaseDataFlagOn() - #self.blend_imagedata = blend_imagedata - - #blend_imagedata.Update() - #extent = blend_imagedata.GetOutput().GetWholeExtent() + blend_filter = vtk.vtkImageBlend() + blend_filter.SetBlendModeToNormal() + blend_filter.SetOpacity(0, 1) + if self.current_mask.is_shown: + blend_filter.SetOpacity(1, mask_opacity) + else: + blend_filter.SetOpacity(1, 0) + blend_filter.SetInput(0, imagedata_bg) + blend_filter.SetInput(1, imagedata_mask) + blend_filter.SetBlendModeToNormal() + blend_filter.GetOutput().ReleaseDataFlagOn() + self.blend_filter = blend_filter # global values CURSOR_X = -1 # SAGITAL @@ -133,7 +164,7 @@ class Slice(object): cross = vtk.vtkImageCursor3D() cross.GetOutput().ReleaseDataFlagOn() - cross.SetInput(blend_imagedata.GetOutput()) + cross.SetInput(blend_filter.GetOutput()) cross.SetCursorPosition(CURSOR_X, CURSOR_Y, CURSOR_Z) cross.SetCursorValue(CURSOR_VALUE) cross.SetCursorRadius(CURSOR_RADIUS) @@ -146,7 +177,7 @@ class Slice(object): cast.SetOutputScalarTypeToUnsignedChar() cast.Update() - self.blend_imagedata = cast + self.cast_filter = cast def UpdateCursorPosition(self, pubsub_evt): @@ -154,11 +185,9 @@ class Slice(object): new_pos = pubsub_evt.data self.cross.SetCursorPosition(new_pos) self.cross.Modified() - self.blend_imagedata.Update() - ps.Publisher().sendMessage('Update slice viewer', None) - + self.cast_filter.Update() + ps.Publisher().sendMessage('Update slice viewer') - def __create_background(self, imagedata): thresh_min, thresh_max = imagedata.GetScalarRange() @@ -208,15 +237,19 @@ class Slice(object): # when this is not the first instance, user will have defined a name if name is not None: + print "new mask, we will check if it will be shown" future_mask.name = name + if future_mask.is_shown: + self.blend_filter.SetOpacity(1, future_mask.opacity) + else: + self.blend_filter.SetOpacity(1, 0) + self.blend_filter.Update() # insert new mask into project and retrieve its index proj = Project() proj.AddMask(future_mask.index, future_mask) - imagedata1 = proj.mask_dict[0].imagedata - # update gui related to mask ps.Publisher().sendMessage('Add mask', (future_mask.index, @@ -227,7 +260,6 @@ class Slice(object): self.current_mask = future_mask - def __create_mask(self, imagedata): # create new mask instance and insert it into project self.CreateMask(imagedata=imagedata) diff --git a/invesalius/data/surface.py b/invesalius/data/surface.py index b05927c..8d258b5 100644 --- a/invesalius/data/surface.py +++ b/invesalius/data/surface.py @@ -35,7 +35,6 @@ class SurfaceManager(): """ def __init__(self): - print "surface manager was created" self.actors_dict = {} self.__bind_events() diff --git a/invesalius/data/viewer_slice.py b/invesalius/data/viewer_slice.py index a09b5c9..d5e7a5d 100755 --- a/invesalius/data/viewer_slice.py +++ b/invesalius/data/viewer_slice.py @@ -173,8 +173,7 @@ class Viewer(wx.Panel): coord[index] = extent_max[index] elif coord[index] < extent_min[index]: coord[index] = extent_min[index] - - print "New coordinate: ", coord + #print "New coordinate: ", coord return coord diff --git a/invesalius/gui/data_notebook.py b/invesalius/gui/data_notebook.py index bf5cbbe..52ecbb6 100644 --- a/invesalius/gui/data_notebook.py +++ b/invesalius/gui/data_notebook.py @@ -93,17 +93,17 @@ class MasksListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin): def __init_image_list(self): self.imagelist = wx.ImageList(16, 16) - image = wx.Image("../icons/object_visible.jpg") + image = wx.Image("../icons/object_invisible.jpg") bitmap = wx.BitmapFromImage(image.Scale(16, 16)) bitmap.SetWidth(16) bitmap.SetHeight(16) - img_check = self.imagelist.Add(bitmap) - - image = wx.Image("../icons/object_invisible.jpg") + img_null = self.imagelist.Add(bitmap) + + image = wx.Image("../icons/object_visible.jpg") bitmap = wx.BitmapFromImage(image.Scale(16, 16)) bitmap.SetWidth(16) bitmap.SetHeight(16) - img_null = self.imagelist.Add(bitmap) + img_check = self.imagelist.Add(bitmap) self.SetImageList(self.imagelist, wx.IMAGE_LIST_SMALL) @@ -113,35 +113,37 @@ class MasksListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin): print "Editing label", evt.GetLabel() #print evt.GetImage() #print evt.GetId() - #print evt.GetIndex() - print "--------" - print evt.m_oldItemIndex - print evt.m_itemIndex - index = evt.GetIndex() + print evt.GetIndex() + #print "--------" + #print evt.m_oldItemIndex + #print evt.m_itemIndex + #index = evt.GetIndex() #print dir(evt) - print "Get item data:", self.GetItemData(index) - print "Get item position:", self.GetItemPosition(index) - print "Get next item:", self.GetNextItem(index) + #print "Get item data:", self.GetItemData(index) + #print "Get item position:", self.GetItemPosition(index) + #print "Get next item:", self.GetNextItem(index) evt.Skip() def OnItemActivated(self, evt): print "OnItemActivated" self.ToggleItem(evt.m_itemIndex) + def OnCheckItem(self, index, flag): - # TODO: use pubsub to communicate to models + if flag: - print "checked, ", index - else: - print "unchecked, ", index + for key in self.mask_list_index.keys(): + if key != index: + self.SetItemImage(key, 0) + ps.Publisher().sendMessage('Change mask selected',index) + ps.Publisher().sendMessage('Show mask', (index, flag)) def CreateColourBitmap(self, colour): """ Create a wx Image with a mask colour. colour: colour in rgb format(0 - 1) """ - print "Colour", colour image = self.image_gray new_image = Image.new("RGB", image.size) for x in xrange(image.size[0]): @@ -157,24 +159,19 @@ class MasksListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin): def InsertNewItem(self, index=0, label="Mask 1", threshold="(1000, 4500)", colour=None): - print "InsertNewItem" self.InsertStringItem(index, "") self.SetStringItem(index, 1, label, imageId=self.mask_list_index[index]) self.SetStringItem(index, 2, threshold) - - print "Get item data:", self.GetItemData(index) - print "Get item position:", self.GetItemPosition(index) - print "Get next item:", self.GetNextItem(index) - # FindItem - # FindItemData - # FindItemAtPos + self.SetItemImage(index, 1) + for key in self.mask_list_index.keys(): + if key != index: + self.SetItemImage(key, 0) def AddMask(self, pubsub_evt): index, mask_name, threshold_range, colour = pubsub_evt.data image = self.CreateColourBitmap(colour) image_index = self.imagelist.Add(image) - print "image_index: ", image_index self.mask_list_index[index] = image_index self.InsertNewItem(index, mask_name, str(threshold_range)) @@ -292,11 +289,7 @@ class SurfacesListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin): self.ToggleItem(evt.m_itemIndex) def OnCheckItem(self, index, flag): - # TODO: use pubsub to communicate to models - if flag: - print "checked, ", index - else: - print "unchecked, ", index + ps.Publisher().sendMessage('Show surface', (index, not flag)) @@ -417,7 +410,6 @@ class AnnotationsListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin): self.imagelist = wx.ImageList(16, 16) image = wx.Image("../icons/object_visible.jpg") - #image = wx.Image("../img/object_visible-v2.jpg") bitmap = wx.BitmapFromImage(image.Scale(16, 16)) bitmap.SetWidth(16) bitmap.SetHeight(16) @@ -439,6 +431,7 @@ class AnnotationsListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin): def OnItemActivated(self, evt): self.ToggleItem(evt.m_itemIndex) + print m_itemIndex def OnCheckItem(self, index, flag): # TODO: use pubsub to communicate to models diff --git a/invesalius/gui/task_slice.py b/invesalius/gui/task_slice.py index 8bef1cb..25d7b91 100644 --- a/invesalius/gui/task_slice.py +++ b/invesalius/gui/task_slice.py @@ -285,12 +285,18 @@ class MaskProperties(wx.Panel): ps.Publisher().subscribe(self.SetItemsColour, 'Set GUI items colour') ps.Publisher().subscribe(self.SetThresholdValues, 'Set threshold values in gradient') + ps.Publisher().subscribe(self.SelectMaskName, 'Select mask name in combo') def __bind_events_wx(self): self.combo_thresh.Bind(wx.EVT_COMBOBOX, self.OnComboThresh) self.Bind(grad.EVT_THRESHOLD_CHANGE, self.OnSlideChanged, self.gradient) + def SelectMaskName(self, pubsub_evt): + index = pubsub_evt.data + self.combo_mask_name.SetSelection(index) + print dir(self.combo_mask_name) + def SetThresholdValues(self, pubsub_evt): thresh_min, thresh_max = pubsub_evt.data self.bind_evt_gradient = False @@ -308,6 +314,7 @@ class MaskProperties(wx.Panel): mask_thresh = evt_pubsub.data[2] mask_colour = [int(c*255) for c in evt_pubsub.data[3]] index = self.combo_mask_name.Append(mask_name) + self.combo_mask_name.SetSelection(index) self.button_colour.SetColour(mask_colour) self.gradient.SetColour(mask_colour) self.combo_mask_name.SetSelection(index) diff --git a/invesalius/invesalius.py b/invesalius/invesalius.py index 62a7f8c..3f94741 100755 --- a/invesalius/invesalius.py +++ b/invesalius/invesalius.py @@ -33,7 +33,6 @@ class InVesalius(wx.App): self.main = Frame(None) self.control = Controller(self.main) self.SetAppName("InVesalius 3.0") - self.SetTopWindow(self.main) return True def ShowFrame(self): -- libgit2 0.21.2