Commit 71982a56fb47656d9a9c47e89ba93f5413812e09
Committed by
GitHub
1 parent
a7c8e435
Exists in
master
and in
6 other branches
Adds threshold, manual segmentation and watershed to segmentation menu (#80)
Adds threshold, manual segmentation and watershed to segmentation menu
Showing
5 changed files
with
50 additions
and
9 deletions
Show diff stats
invesalius/constants.py
... | ... | @@ -528,6 +528,9 @@ ID_FLOODFILL_MASK = wx.NewId() |
528 | 528 | ID_FILL_HOLE_AUTO = wx.NewId() |
529 | 529 | ID_REMOVE_MASK_PART = wx.NewId() |
530 | 530 | ID_SELECT_MASK_PART = wx.NewId() |
531 | +ID_MANUAL_SEGMENTATION = wx.NewId() | |
532 | +ID_WATERSHED_SEGMENTATION = wx.NewId() | |
533 | +ID_THRESHOLD_SEGMENTATION = wx.NewId() | |
531 | 534 | ID_FLOODFILL_SEGMENTATION = wx.NewId() |
532 | 535 | ID_CROP_MASK = wx.NewId() |
533 | 536 | ... | ... |
invesalius/data/slice_.py
... | ... | @@ -196,10 +196,10 @@ class Slice(object): |
196 | 196 | Publisher.subscribe(self.__redo_edition, 'Redo edition') |
197 | 197 | |
198 | 198 | Publisher.subscribe(self._fill_holes_auto, 'Fill holes automatically') |
199 | - | |
199 | + | |
200 | 200 | def GetMaxSliceNumber(self, orientation): |
201 | 201 | shape = self.matrix.shape |
202 | - | |
202 | + | |
203 | 203 | # Because matrix indexing starts with 0 so the last slice is the shape |
204 | 204 | # minu 1. |
205 | 205 | if orientation == 'AXIAL': | ... | ... |
invesalius/gui/frame.py
... | ... | @@ -449,6 +449,19 @@ class Frame(wx.Frame): |
449 | 449 | elif id == const.ID_REORIENT_IMG: |
450 | 450 | self.OnReorientImg() |
451 | 451 | |
452 | + elif id == const.ID_THRESHOLD_SEGMENTATION: | |
453 | + Publisher.sendMessage("Show panel", const.ID_THRESHOLD_SEGMENTATION) | |
454 | + Publisher.sendMessage('Enable style', const.STATE_DEFAULT) | |
455 | + | |
456 | + elif id == const.ID_MANUAL_SEGMENTATION: | |
457 | + Publisher.sendMessage("Show panel", const.ID_MANUAL_SEGMENTATION) | |
458 | + Publisher.sendMessage('Enable style', const.SLICE_STATE_EDITOR) | |
459 | + | |
460 | + elif id == const.ID_WATERSHED_SEGMENTATION: | |
461 | + Publisher.sendMessage("Show panel", const.ID_WATERSHED_SEGMENTATION) | |
462 | + # Publisher.sendMessage('Disable actual style') | |
463 | + Publisher.sendMessage('Enable style', const.SLICE_STATE_WATERSHED) | |
464 | + | |
452 | 465 | elif id == const.ID_FLOODFILL_MASK: |
453 | 466 | self.OnFillHolesManually() |
454 | 467 | |
... | ... | @@ -664,7 +677,12 @@ class MenuBar(wx.MenuBar): |
664 | 677 | const.ID_FLIP_Z, |
665 | 678 | const.ID_SWAP_XY, |
666 | 679 | const.ID_SWAP_XZ, |
667 | - const.ID_SWAP_YZ,] | |
680 | + const.ID_SWAP_YZ, | |
681 | + const.ID_THRESHOLD_SEGMENTATION, | |
682 | + const.ID_MANUAL_SEGMENTATION, | |
683 | + const.ID_WATERSHED_SEGMENTATION, | |
684 | + const.ID_THRESHOLD_SEGMENTATION, | |
685 | + const.ID_FLOODFILL_SEGMENTATION,] | |
668 | 686 | self.__init_items() |
669 | 687 | self.__bind_events() |
670 | 688 | |
... | ... | @@ -784,6 +802,9 @@ class MenuBar(wx.MenuBar): |
784 | 802 | |
785 | 803 | # Segmentation Menu |
786 | 804 | segmentation_menu = wx.Menu() |
805 | + self.threshold_segmentation = segmentation_menu.Append(const.ID_THRESHOLD_SEGMENTATION, _(u"Threshold")) | |
806 | + self.manual_segmentation = segmentation_menu.Append(const.ID_MANUAL_SEGMENTATION, _(u"Manual segmentation")) | |
807 | + self.watershed_segmentation = segmentation_menu.Append(const.ID_WATERSHED_SEGMENTATION, _(u"Watershed")) | |
787 | 808 | self.ffill_segmentation = segmentation_menu.Append(const.ID_FLOODFILL_SEGMENTATION, _(u"Region growing")) |
788 | 809 | self.ffill_segmentation.Enable(False) |
789 | 810 | ... | ... |
invesalius/gui/task_slice.py
... | ... | @@ -342,6 +342,7 @@ class InnerFoldPanel(wx.Panel): |
342 | 342 | Publisher.subscribe(self.OnRetrieveStyle, 'Retrieve task slice style') |
343 | 343 | Publisher.subscribe(self.OnDisableStyle, 'Disable task slice style') |
344 | 344 | Publisher.subscribe(self.OnCloseProject, 'Close project data') |
345 | + Publisher.subscribe(self.OnColapsePanel, 'Show panel') | |
345 | 346 | |
346 | 347 | def OnFoldPressCaption(self, evt): |
347 | 348 | id = evt.GetTag().GetId() |
... | ... | @@ -388,6 +389,19 @@ class InnerFoldPanel(wx.Panel): |
388 | 389 | def OnCloseProject(self, pubsub_evt): |
389 | 390 | self.fold_panel.Expand(self.fold_panel.GetFoldPanel(0)) |
390 | 391 | |
392 | + def OnColapsePanel(self, pubsub_evt): | |
393 | + panel_seg_id = { | |
394 | + const.ID_THRESHOLD_SEGMENTATION: 0, | |
395 | + const.ID_MANUAL_SEGMENTATION: 1, | |
396 | + const.ID_WATERSHED_SEGMENTATION: 2 | |
397 | + } | |
398 | + | |
399 | + try: | |
400 | + _id = panel_seg_id[pubsub_evt.data] | |
401 | + self.fold_panel.Expand(self.fold_panel.GetFoldPanel(_id)) | |
402 | + except KeyError: | |
403 | + pass | |
404 | + | |
391 | 405 | def GetMaskSelected(self): |
392 | 406 | x= self.mask_prop_panel.GetMaskSelected() |
393 | 407 | return self.mask_prop_panel.GetMaskSelected() | ... | ... |
invesalius/style.py
... | ... | @@ -78,10 +78,10 @@ class StyleStateManager(object): |
78 | 78 | const.STATE_DEFAULT |
79 | 79 | |
80 | 80 | def AddState(self, state): |
81 | - | |
81 | + | |
82 | 82 | level = const.STYLE_LEVEL[state] |
83 | 83 | max_level = max(self.stack.keys()) |
84 | - | |
84 | + | |
85 | 85 | # Insert new state into stack |
86 | 86 | self.stack[level] = state |
87 | 87 | |
... | ... | @@ -93,7 +93,7 @@ class StyleStateManager(object): |
93 | 93 | level = const.STYLE_LEVEL[state] |
94 | 94 | if level in self.stack.keys(): |
95 | 95 | max_level = max(self.stack.keys()) |
96 | - | |
96 | + | |
97 | 97 | # Remove item from stack |
98 | 98 | self.stack.pop(level) |
99 | 99 | |
... | ... | @@ -104,9 +104,12 @@ class StyleStateManager(object): |
104 | 104 | # level in stack has been removed |
105 | 105 | if level == max_level: |
106 | 106 | new_state = self.stack[new_max_level] |
107 | - | |
107 | + | |
108 | 108 | return self.stack[new_max_level] |
109 | - | |
109 | + | |
110 | 110 | max_level = max(self.stack.keys()) |
111 | 111 | return self.stack[max_level] |
112 | - | |
112 | + | |
113 | + def RemoveActualState(self): | |
114 | + max_level = max(self.stack.keys()) | |
115 | + return self.stack.pop(max_level) | ... | ... |