Commit fde332251d5e4622f107d9c0ca94f6d63d4fc389

Authored by Thiago Franco de Moraes
1 parent 9f54b6b7
Exists in master

Update progress inside region growing dialog

invesalius/data/styles.py
@@ -2600,6 +2600,7 @@ class SelectMaskPartsInteractorStyle(DefaultInteractorStyle): @@ -2600,6 +2600,7 @@ class SelectMaskPartsInteractorStyle(DefaultInteractorStyle):
2600 class FFillSegmentationConfig(metaclass=utils.Singleton): 2600 class FFillSegmentationConfig(metaclass=utils.Singleton):
2601 def __init__(self): 2601 def __init__(self):
2602 self.dlg_visible = False 2602 self.dlg_visible = False
  2603 + self.dlg = None
2603 self.target = "2D" 2604 self.target = "2D"
2604 self.con_2d = 4 2605 self.con_2d = 4
2605 self.con_3d = 6 2606 self.con_3d = 6
@@ -2634,7 +2635,6 @@ class FloodFillSegmentInteractorStyle(DefaultInteractorStyle): @@ -2634,7 +2635,6 @@ class FloodFillSegmentInteractorStyle(DefaultInteractorStyle):
2634 self.slice_data = viewer.slice_data 2635 self.slice_data = viewer.slice_data
2635 2636
2636 self.config = FFillSegmentationConfig() 2637 self.config = FFillSegmentationConfig()
2637 - self.dlg_ffill = None  
2638 2638
2639 self._progr_title = _(u"Region growing") 2639 self._progr_title = _(u"Region growing")
2640 self._progr_msg = _(u"Segmenting ...") 2640 self._progr_msg = _(u"Segmenting ...")
@@ -2652,14 +2652,14 @@ class FloodFillSegmentInteractorStyle(DefaultInteractorStyle): @@ -2652,14 +2652,14 @@ class FloodFillSegmentInteractorStyle(DefaultInteractorStyle):
2652 self.config.t1 = int(_max) 2652 self.config.t1 = int(_max)
2653 2653
2654 self.config.dlg_visible = True 2654 self.config.dlg_visible = True
2655 - self.dlg_ffill = dialogs.FFillSegmentationOptionsDialog(self.config)  
2656 - self.dlg_ffill.Show() 2655 + self.config.dlg = dialogs.FFillSegmentationOptionsDialog(self.config)
  2656 + self.config.dlg.Show()
2657 2657
2658 def CleanUp(self): 2658 def CleanUp(self):
2659 - if (self.dlg_ffill is not None) and (self.config.dlg_visible): 2659 + if (self.config.dlg is not None) and (self.config.dlg_visible):
2660 self.config.dlg_visible = False 2660 self.config.dlg_visible = False
2661 - self.dlg_ffill.Destroy()  
2662 - self.dlg_ffill = None 2661 + self.config.dlg.Destroy()
  2662 + self.config.dlg = None
2663 2663
2664 def OnFFClick(self, obj, evt): 2664 def OnFFClick(self, obj, evt):
2665 if (self.viewer.slice_.buffer_slices[self.orientation].mask is None): 2665 if (self.viewer.slice_.buffer_slices[self.orientation].mask is None):
@@ -2787,22 +2787,28 @@ class FloodFillSegmentInteractorStyle(DefaultInteractorStyle): @@ -2787,22 +2787,28 @@ class FloodFillSegmentInteractorStyle(DefaultInteractorStyle):
2787 with futures.ThreadPoolExecutor(max_workers=1) as executor: 2787 with futures.ThreadPoolExecutor(max_workers=1) as executor:
2788 future = executor.submit(self.do_rg_confidence, image, mask, (x, y, z), bstruct) 2788 future = executor.submit(self.do_rg_confidence, image, mask, (x, y, z), bstruct)
2789 2789
2790 - dlg = wx.ProgressDialog(self._progr_title, self._progr_msg, parent=wx.GetApp().GetTopWindow(), style=wx.PD_APP_MODAL|wx.PD_AUTO_HIDE) 2790 + self.config.dlg.panel_ffill_progress.Enable()
  2791 + self.config.dlg.panel_ffill_progress.StartTimer()
2791 while not future.done(): 2792 while not future.done():
2792 - dlg.Pulse() 2793 + self.config.dlg.panel_ffill_progress.Pulse()
  2794 + self.config.dlg.Update()
2793 time.sleep(0.1) 2795 time.sleep(0.1)
2794 - dlg.Destroy() 2796 + self.config.dlg.panel_ffill_progress.StopTimer()
  2797 + self.config.dlg.panel_ffill_progress.Disable()
2795 out_mask = future.result() 2798 out_mask = future.result()
2796 else: 2799 else:
2797 out_mask = np.zeros_like(mask) 2800 out_mask = np.zeros_like(mask)
2798 with futures.ThreadPoolExecutor(max_workers=1) as executor: 2801 with futures.ThreadPoolExecutor(max_workers=1) as executor:
2799 future = executor.submit(floodfill.floodfill_threshold, image, [[x, y, z]], t0, t1, 1, bstruct, out_mask) 2802 future = executor.submit(floodfill.floodfill_threshold, image, [[x, y, z]], t0, t1, 1, bstruct, out_mask)
2800 2803
2801 - dlg = wx.ProgressDialog(self._progr_title, self._progr_msg, parent=wx.GetApp().GetTopWindow(), style=wx.PD_APP_MODAL|wx.PD_AUTO_HIDE) 2804 + self.config.dlg.panel_ffill_progress.Enable()
  2805 + self.config.dlg.panel_ffill_progress.StartTimer()
2802 while not future.done(): 2806 while not future.done():
2803 - dlg.Pulse() 2807 + self.config.dlg.panel_ffill_progress.Pulse()
  2808 + self.config.dlg.Update()
2804 time.sleep(0.1) 2809 time.sleep(0.1)
2805 - dlg.Destroy() 2810 + self.config.dlg.panel_ffill_progress.StopTimer()
  2811 + self.config.dlg.panel_ffill_progress.Disable()
2806 2812
2807 mask[out_mask.astype('bool')] = self.config.fill_value 2813 mask[out_mask.astype('bool')] = self.config.fill_value
2808 2814
invesalius/gui/dialogs.py
@@ -2560,6 +2560,41 @@ class PanelFFillConfidence(wx.Panel): @@ -2560,6 +2560,41 @@ class PanelFFillConfidence(wx.Panel):
2560 self.config.confid_iters = self.spin_iters.GetValue() 2560 self.config.confid_iters = self.spin_iters.GetValue()
2561 2561
2562 2562
  2563 +class PanelFFillProgress(wx.Panel):
  2564 + def __init__(self, parent, ID=-1, style=wx.TAB_TRAVERSAL|wx.NO_BORDER):
  2565 + wx.Panel.__init__(self, parent, ID, style=style)
  2566 + self._init_gui()
  2567 +
  2568 + def _init_gui(self):
  2569 + self.progress = wx.Gauge(self, -1)
  2570 + self.lbl_progress_caption = wx.StaticText(self, -1, _("Elapsed time:"))
  2571 + self.lbl_time = wx.StaticText(self, -1, _("00:00:00"))
  2572 +
  2573 + main_sizer = wx.BoxSizer(wx.VERTICAL)
  2574 + main_sizer.Add(self.progress, 0, wx.EXPAND | wx.ALL, 5)
  2575 + time_sizer = wx.BoxSizer(wx.HORIZONTAL)
  2576 + time_sizer.Add(self.lbl_progress_caption, 0, wx.EXPAND, 0)
  2577 + time_sizer.Add(self.lbl_time, 1, wx.EXPAND | wx.LEFT, 5)
  2578 + main_sizer.Add(time_sizer, 0, wx.EXPAND | wx.ALL, 5)
  2579 +
  2580 + self.SetSizer(main_sizer)
  2581 + main_sizer.Fit(self)
  2582 + main_sizer.SetSizeHints(self)
  2583 +
  2584 + def StartTimer(self):
  2585 + self.t0 = time.time()
  2586 +
  2587 + def StopTimer(self):
  2588 + fmt = "%H:%M:%S"
  2589 + self.lbl_time.SetLabel(time.strftime(fmt, time.gmtime(time.time() - self.t0)))
  2590 + self.progress.SetValue(0)
  2591 +
  2592 + def Pulse(self):
  2593 + fmt = "%H:%M:%S"
  2594 + self.lbl_time.SetLabel(time.strftime(fmt, time.gmtime(time.time() - self.t0)))
  2595 + self.progress.Pulse()
  2596 +
  2597 +
2563 class FFillOptionsDialog(wx.Dialog): 2598 class FFillOptionsDialog(wx.Dialog):
2564 def __init__(self, title, config): 2599 def __init__(self, title, config):
2565 wx.Dialog.__init__(self, wx.GetApp().GetTopWindow(), -1, title, style=wx.DEFAULT_DIALOG_STYLE|wx.FRAME_FLOAT_ON_PARENT|wx.STAY_ON_TOP) 2600 wx.Dialog.__init__(self, wx.GetApp().GetTopWindow(), -1, title, style=wx.DEFAULT_DIALOG_STYLE|wx.FRAME_FLOAT_ON_PARENT|wx.STAY_ON_TOP)
@@ -2817,6 +2852,10 @@ class FFillSegmentationOptionsDialog(wx.Dialog): @@ -2817,6 +2852,10 @@ class FFillSegmentationOptionsDialog(wx.Dialog):
2817 self.panel_ffill_confidence.SetMinSize((250, -1)) 2852 self.panel_ffill_confidence.SetMinSize((250, -1))
2818 self.panel_ffill_confidence.Hide() 2853 self.panel_ffill_confidence.Hide()
2819 2854
  2855 + self.panel_ffill_progress = PanelFFillProgress(self, -1, style=wx.TAB_TRAVERSAL)
  2856 + self.panel_ffill_progress.SetMinSize((250, -1))
  2857 + # self.panel_ffill_progress.Hide()
  2858 +
2820 self.close_btn = wx.Button(self, wx.ID_CLOSE) 2859 self.close_btn = wx.Button(self, wx.ID_CLOSE)
2821 2860
2822 # Sizer 2861 # Sizer
@@ -2873,11 +2912,16 @@ class FFillSegmentationOptionsDialog(wx.Dialog): @@ -2873,11 +2912,16 @@ class FFillSegmentationOptionsDialog(wx.Dialog):
2873 sizer.Add(0, 0, (12, 0)) 2912 sizer.Add(0, 0, (12, 0))
2874 except TypeError: 2913 except TypeError:
2875 sizer.AddStretchSpacer((12, 0)) 2914 sizer.AddStretchSpacer((12, 0))
2876 - sizer.Add(self.close_btn, (13, 0), (1, 6), flag=wx.ALIGN_RIGHT|wx.RIGHT, border=5) 2915 + sizer.Add(self.panel_ffill_progress, (13, 0), (1, 6), flag=wx.ALIGN_RIGHT|wx.RIGHT, border=5)
2877 try: 2916 try:
2878 sizer.Add(0, 0, (14, 0)) 2917 sizer.Add(0, 0, (14, 0))
2879 except TypeError: 2918 except TypeError:
2880 sizer.AddStretchSpacer((14, 0)) 2919 sizer.AddStretchSpacer((14, 0))
  2920 + sizer.Add(self.close_btn, (15, 0), (1, 6), flag=wx.ALIGN_RIGHT|wx.RIGHT, border=5)
  2921 + try:
  2922 + sizer.Add(0, 0, (16, 0))
  2923 + except TypeError:
  2924 + sizer.AddStretchSpacer((16, 0))
2881 2925
2882 self.SetSizer(sizer) 2926 self.SetSizer(sizer)
2883 sizer.Fit(self) 2927 sizer.Fit(self)