diff --git a/invesalius/data/styles.py b/invesalius/data/styles.py index 56b882e..24110a4 100644 --- a/invesalius/data/styles.py +++ b/invesalius/data/styles.py @@ -40,6 +40,7 @@ from scipy.ndimage import watershed_ift, generate_binary_structure from skimage.morphology import watershed from skimage import filter +from gui import dialogs from .measures import MeasureData from . import floodfill @@ -1750,7 +1751,15 @@ class ReorientImageInteractorStyle(DefaultInteractorStyle): buffer_.discard_image() -class FlooFillMaskInteractorStyle(DefaultInteractorStyle): +class FFillConfig(object): + __metaclass__= utils.Singleton + def __init__(self): + self.dlg_visible = False + self.target = "2D" + + +class FloodFillMaskInteractorStyle(DefaultInteractorStyle): + dialog = None def __init__(self, viewer): DefaultInteractorStyle.__init__(self, viewer) @@ -1761,6 +1770,13 @@ class FlooFillMaskInteractorStyle(DefaultInteractorStyle): self.slice_actor = viewer.slice_data.actor self.slice_data = viewer.slice_data + self.config = FFillConfig() + + if not self.config.dlg_visible: + self.config.dlg_visible = True + dlg_ffill = dialogs.FFillOptionsDialog(self.config) + dlg_ffill.Show() + self.viewer.slice_.do_threshold_to_all_slices() self.AddObserver("LeftButtonPressEvent", self.OnFFClick) @@ -1793,7 +1809,7 @@ class FlooFillMaskInteractorStyle(DefaultInteractorStyle): cp_mask = mask.copy() from_3d = True - if from_3d: + if self.config.target == "3D": neighbor_iter = ((-1, 0, 0), (1, 0, 0), (0, -1, 0), @@ -1806,11 +1822,11 @@ class FlooFillMaskInteractorStyle(DefaultInteractorStyle): (0, -1, 0), (0, 1, 0)) - neighbor_iter = [] - for i in xrange(-1, 2): - for j in xrange(-1, 2): - for k in xrange(-1, 2): - neighbor_iter.append((i, j, k)) + # neighbor_iter = [] + # for i in xrange(-1, 2): + # for j in xrange(-1, 2): + # for k in xrange(-1, 2): + # neighbor_iter.append((i, j, k)) if iren.GetControlKey(): t0 = 254 @@ -1887,7 +1903,7 @@ def get_style(style): const.SLICE_STATE_EDITOR: EditorInteractorStyle, const.SLICE_STATE_WATERSHED: WaterShedInteractorStyle, const.SLICE_STATE_REORIENT: ReorientImageInteractorStyle, - const.SLICE_STATE_MASK_FFILL: FlooFillMaskInteractorStyle, + const.SLICE_STATE_MASK_FFILL: FloodFillMaskInteractorStyle, } return STYLES[style] diff --git a/invesalius/gui/dialogs.py b/invesalius/gui/dialogs.py index 083227a..5c57e0d 100644 --- a/invesalius/gui/dialogs.py +++ b/invesalius/gui/dialogs.py @@ -1838,3 +1838,47 @@ def BitmapNotSameSize(): dlg.ShowModal() dlg.Destroy() + + +class FFillOptionsDialog(wx.Dialog): + def __init__(self, config): + pre = wx.PreDialog() + pre.Create(wx.GetApp().GetTopWindow(), -1, _(u'Floodfill'), style=wx.DEFAULT_DIALOG_STYLE|wx.FRAME_FLOAT_ON_PARENT) + self.PostCreate(pre) + + self.config = config + + self._init_gui() + + def _init_gui(self): + sizer = wx.GridBagSizer(3, 1) + + flag_labels = wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL + + self.target = wx.RadioBox(self, -1, _(u"Target"), + choices=[_(u"Slice"), _(u"Volume")], + style=wx.NO_BORDER | wx.HORIZONTAL) + + if self.config.target == "2D": + self.target.SetSelection(0) + else: + self.target.SetSelection(1) + + sizer.Add(self.target, (0, 0)) + + self.SetSizer(sizer) + sizer.Fit(self) + self.Layout() + + self.target.Bind(wx.EVT_RADIOBOX, self.OnSetTarget) + self.Bind(wx.EVT_CLOSE, self.OnClose) + + def OnSetTarget(self, evt): + if self.target.GetSelection() == 0: + self.config.target = "2D" + else: + self.config.target = "3D" + + def OnClose(self, evt): + self.config.dlg_visible = False + evt.Skip() -- libgit2 0.21.2