Commit c0b00a9c292c3bc5a7e9566762f2592c69cce8e6

Authored by Thiago Franco de Moraes
1 parent 364be345

added a ok button to the dialog to config watershed

Showing 1 changed file with 52 additions and 42 deletions   Show diff stats
invesalius/gui/dialogs.py
... ... @@ -104,7 +104,7 @@ class ResizeImageDialog(wx.Dialog):
104 104 pos=wx.DefaultPosition,
105 105 style=wx.DEFAULT_DIALOG_STYLE)
106 106 self.PostCreate(pre)
107   -
  107 +
108 108 lbl_message = wx.StaticText(self, -1, _("InVesalius is running on a 32-bit operating system or has insufficient memory. \nIf you want to work with 3D surfaces or volume rendering, \nit is recommended to reduce the medical images resolution."))
109 109 icon = wx.ArtProvider.GetBitmap(wx.ART_WARNING, wx.ART_MESSAGE_BOX, (32,32))
110 110 bmp = wx.StaticBitmap(self, -1, icon)
... ... @@ -143,7 +143,7 @@ class ResizeImageDialog(wx.Dialog):
143 143 sizer_general.Fit(self)
144 144 self.Layout()
145 145 self.Centre()
146   -
  146 +
147 147 def SetValue(self, value):
148 148 self.num_ctrl_porcent.SetValue(value)
149 149  
... ... @@ -611,7 +611,7 @@ class NewMask(wx.Dialog):
611 611 thresh_min, thresh_max = project.threshold_modes[_("Bone")]
612 612 original_colour = random.choice(const.MASK_COLOUR)
613 613 self.colour = original_colour
614   - colour = [255*i for i in original_colour]
  614 + colour = [255*i for i in original_colour]
615 615 colour.append(100)
616 616 gradient = grad.GradientSlider(self, -1, int(bound_min),
617 617 int(bound_max),
... ... @@ -673,7 +673,7 @@ class NewMask(wx.Dialog):
673 673 proj = prj.Project()
674 674 if thresh in proj.threshold_modes.values():
675 675 preset_name = proj.threshold_modes.get_key(thresh)[0]
676   - index = self.thresh_list.index(preset_name)
  676 + index = self.thresh_list.index(preset_name)
677 677 self.combo_thresh.SetSelection(index)
678 678 else:
679 679 index = self.thresh_list.index(_("Custom"))
... ... @@ -797,7 +797,7 @@ def ShowAboutDialog(parent):
797 797 "Sebastian Hilbert",
798 798 "Semarang Pari"]
799 799  
800   - #info.DocWriters = ["Fabio Francisco da Silva (PT)"]
  800 + #info.DocWriters = ["Fabio Francisco da Silva (PT)"]
801 801  
802 802 info.Artists = ["Otavio Henrique Junqueira Amorim"]
803 803  
... ... @@ -1101,7 +1101,7 @@ class SurfaceCreationOptionsPanel(wx.Panel):
1101 1101 import constants as const
1102 1102 import data.surface as surface
1103 1103 import project as prj
1104   -
  1104 +
1105 1105 wx.Panel.__init__(self, parent, ID)
1106 1106  
1107 1107 # LINE 1: Surface name
... ... @@ -1208,7 +1208,7 @@ class CAOptions(wx.Panel):
1208 1208 def __init__(self, parent):
1209 1209 wx.Panel.__init__(self, parent, -1)
1210 1210 self._build_widgets()
1211   -
  1211 +
1212 1212 def _build_widgets(self):
1213 1213 sb = wx.StaticBox(self, -1, _('Options'))
1214 1214 self.angle = floatspin.FloatSpin(self, -1, value=0.7, min_val=0.0,
... ... @@ -1222,7 +1222,7 @@ class CAOptions(wx.Panel):
1222 1222 self.min_weight = floatspin.FloatSpin(self, -1, value=0.2, min_val=0.0,
1223 1223 max_val=1.0, increment=0.1,
1224 1224 digits=1)
1225   -
  1225 +
1226 1226 self.steps = wx.SpinCtrl(self, -1, value='10', min=1, max=100)
1227 1227  
1228 1228 layout_sizer = wx.FlexGridSizer(rows=4, cols=2, hgap=5, vgap=5)
... ... @@ -1285,7 +1285,7 @@ class SurfaceMethodPanel(wx.Panel):
1285 1285 self.SetSizer(self.main_sizer)
1286 1286 self.Layout()
1287 1287 self.Fit()
1288   -
  1288 +
1289 1289 if self.mask_edited:
1290 1290 self.cb_types.SetValue(_(u'Context aware smoothing'))
1291 1291 self.ca_options.Enable()
... ... @@ -1324,9 +1324,9 @@ class SurfaceMethodPanel(wx.Panel):
1324 1324 algorithm = self.GetAlgorithmSelected()
1325 1325 options = self.GetOptions()
1326 1326  
1327   - return {"algorithm": algorithm,
  1327 + return {"algorithm": algorithm,
1328 1328 "options": options}
1329   -
  1329 +
1330 1330 def ReloadMethodsOptions(self):
1331 1331 self.cb_types.Clear()
1332 1332 self.cb_types.AppendItems([i for i in sorted(self.alg_types)
... ... @@ -1388,32 +1388,37 @@ class ClutImagedataDialog(wx.Dialog):
1388 1388 if gen_evt:
1389 1389 self.clut_widget._generate_event()
1390 1390  
1391   -
1392   -class WatershedOptions(wx.Panel):
1393   - def __init__(self, parent):
  1391 +
  1392 +class WatershedOptionsPanel(wx.Panel):
  1393 + def __init__(self, parent, config):
1394 1394 wx.Panel.__init__(self, parent)
1395   -
  1395 +
1396 1396 self.algorithms = ("Watershed", "Watershed IFT")
1397 1397 self.con2d_choices = (4, 8)
1398 1398 self.con3d_choices = (6, 18, 26)
1399 1399  
  1400 + self.config = config
  1401 +
1400 1402 self._init_gui()
1401   - self._bind_events()
1402 1403  
1403 1404 def _init_gui(self):
1404 1405 self.choice_algorithm = wx.RadioBox(self, -1, "Algorithm",
1405   - choices=("Watershed", "Watershed IFT"),
  1406 + choices=self.algorithms,
1406 1407 style=wx.NO_BORDER | wx.HORIZONTAL)
  1408 + self.choice_algorithm.SetSelection(self.algorithms.index(self.config.algorithm))
1407 1409  
1408 1410 self.choice_2dcon = wx.RadioBox(self, -1, "2D",
1409 1411 choices=[str(i) for i in self.con2d_choices],
1410 1412 style=wx.NO_BORDER | wx.HORIZONTAL)
  1413 + self.choice_2dcon.SetSelection(self.con2d_choices.index(self.config.con_2d))
1411 1414  
1412 1415 self.choice_3dcon = wx.RadioBox(self, -1, "3D",
1413 1416 choices=[str(i) for i in self.con3d_choices],
1414 1417 style=wx.NO_BORDER | wx.HORIZONTAL)
  1418 + self.choice_3dcon.SetSelection(self.con3d_choices.index(self.config.con_3d))
1415 1419  
1416 1420 self.gaussian_size = wx.SpinCtrl(self, -1, "", min=1, max=10)
  1421 + self.gaussian_size.SetValue(self.config.mg_size)
1417 1422  
1418 1423 box_sizer = wx.StaticBoxSizer(wx.StaticBox(self, -1, "Conectivity"), wx.VERTICAL)
1419 1424 box_sizer.Add(self.choice_2dcon, 0, wx.ALIGN_CENTER_VERTICAL,2)
... ... @@ -1432,47 +1437,52 @@ class WatershedOptions(wx.Panel):
1432 1437 sizer.Fit(self)
1433 1438 self.Layout()
1434 1439  
1435   - def _bind_events(self):
1436   - self.choice_algorithm.Bind(wx.EVT_RADIOBOX, self.OnSetAlgorithm)
1437   - self.gaussian_size.Bind(wx.EVT_SPINCTRL, self.OnSetGaussianSize)
1438   - self.choice_2dcon.Bind(wx.EVT_RADIOBOX, self.OnSetCon2D)
1439   - self.choice_3dcon.Bind(wx.EVT_RADIOBOX, self.OnSetCon3D)
1440   -
1441   - def OnSetAlgorithm(self, evt):
1442   - v = self.algorithms[evt.GetInt()]
1443   - Publisher.sendMessage("Set watershed algorithm", v)
1444   -
1445   - def OnSetGaussianSize(self, evt):
1446   - v = self.gaussian_size.GetValue()
1447   - Publisher.sendMessage("Set watershed gaussian size", v)
1448   -
1449   - def OnSetCon2D(self, evt):
1450   - v = self.con2d_choices[evt.GetInt()]
1451   - Publisher.sendMessage("Set watershed 2d con", v)
1452   -
1453   - def OnSetCon3D(self, evt):
1454   - v = self.con3d_choices[evt.GetInt()]
1455   - Publisher.sendMessage("Set watershed 3d con", v)
  1440 + def apply_options(self):
  1441 + self.config.algorithm = self.algorithms[self.choice_algorithm.GetSelection()]
  1442 + self.config.con_2d = self.con2d_choices[self.choice_2dcon.GetSelection()]
  1443 + self.config.con_3d = self.con3d_choices[self.choice_3dcon.GetSelection()]
  1444 + self.config.mg_size = self.gaussian_size.GetValue()
1456 1445  
1457 1446  
1458 1447 class WatershedOptionsDialog(wx.Dialog):
1459   - def __init__(self):
  1448 + def __init__(self, config):
1460 1449 pre = wx.PreDialog()
1461 1450 pre.Create(wx.GetApp().GetTopWindow(), -1, style=wx.DEFAULT_DIALOG_STYLE|wx.FRAME_FLOAT_ON_PARENT)
1462 1451 self.PostCreate(pre)
1463 1452  
  1453 + self.config = config
  1454 +
1464 1455 self._init_gui()
1465 1456  
1466 1457 def _init_gui(self):
1467   - wop = WatershedOptions(self)
  1458 + wop = WatershedOptionsPanel(self, self.config)
  1459 + self.wop = wop
  1460 +
  1461 + sizer = wx.BoxSizer(wx.VERTICAL)
  1462 +
  1463 + btn_ok = wx.Button(self, wx.ID_OK)
  1464 + btn_ok.SetDefault()
  1465 +
  1466 + btn_cancel = wx.Button(self, wx.ID_CANCEL)
  1467 +
  1468 + btnsizer = wx.StdDialogButtonSizer()
  1469 + btnsizer.AddButton(btn_ok)
  1470 + btnsizer.AddButton(btn_cancel)
  1471 + btnsizer.Realize()
1468 1472  
1469   - sizer = wx.BoxSizer(wx.VERTICAL)
1470 1473 sizer.Add(wop, 0, wx.EXPAND)
  1474 + sizer.Add(btnsizer, 0, wx.EXPAND)
  1475 + sizer.AddSpacer(5)
1471 1476  
1472 1477 self.SetSizer(sizer)
1473 1478 sizer.Fit(self)
1474 1479 self.Layout()
1475 1480  
  1481 + btn_ok.Bind(wx.EVT_BUTTON, self.OnOk)
  1482 +
  1483 + def OnOk(self, evt):
  1484 + self.wop.apply_options()
  1485 + evt.Skip()
1476 1486  
1477 1487 class MaskBooleanDialog(wx.Dialog):
1478 1488 def __init__(self, masks):
... ... @@ -1500,7 +1510,7 @@ class MaskBooleanDialog(wx.Dialog):
1500 1510  
1501 1511 icon_folder = '../icons/'
1502 1512 op_choices = ((_(u"Union"), const.BOOLEAN_UNION, 'bool_union.png'),
1503   - (_(u"Difference"), const.BOOLEAN_DIFF, 'bool_difference.png'),
  1513 + (_(u"Difference"), const.BOOLEAN_DIFF, 'bool_difference.png'),
1504 1514 (_(u"Intersection"), const.BOOLEAN_AND, 'bool_intersection.png'),
1505 1515 (_(u"Exclusive disjunction"), const.BOOLEAN_XOR, 'bool_disjunction.png'))
1506 1516 self.op_boolean = wx.combo.BitmapComboBox(self, -1, op_choices[0][0], choices=[])
... ...