Commit 30b43a7b7ef99f984f162869e0acef40777bbac8
1 parent
e6b20353
Exists in
ffill_gui
Using combobox to set region growing method
Showing
1 changed file
with
151 additions
and
94 deletions
Show diff stats
invesalius/gui/dialogs.py
| ... | ... | @@ -1906,6 +1906,82 @@ class Panel3DConnectivity(wx.Panel): |
| 1906 | 1906 | self.Layout() |
| 1907 | 1907 | |
| 1908 | 1908 | |
| 1909 | +class PanelFFillThreshold(wx.Panel): | |
| 1910 | + def __init__(self, parent, config, ID=-1, style=wx.TAB_TRAVERSAL|wx.NO_BORDER): | |
| 1911 | + wx.Panel.__init__(self, parent, ID, style=style) | |
| 1912 | + | |
| 1913 | + self.config = config | |
| 1914 | + | |
| 1915 | + self._init_gui() | |
| 1916 | + | |
| 1917 | + def _init_gui(self): | |
| 1918 | + import project as prj | |
| 1919 | + | |
| 1920 | + project = prj.Project() | |
| 1921 | + bound_min, bound_max = project.threshold_range | |
| 1922 | + colour = [i*255 for i in const.MASK_COLOUR[0]] | |
| 1923 | + colour.append(100) | |
| 1924 | + | |
| 1925 | + self.threshold = grad.GradientCtrl(self, -1, int(bound_min), | |
| 1926 | + int(bound_max), self.config.t0, | |
| 1927 | + self.config.t1, colour) | |
| 1928 | + | |
| 1929 | + # sizer | |
| 1930 | + sizer = wx.BoxSizer(wx.VERTICAL) | |
| 1931 | + sizer.AddSpacer(5) | |
| 1932 | + sizer.Add(self.threshold, 0, wx.EXPAND|wx.LEFT|wx.RIGHT, 5) | |
| 1933 | + sizer.AddSpacer(5) | |
| 1934 | + | |
| 1935 | + self.SetSizer(sizer) | |
| 1936 | + sizer.Fit(self) | |
| 1937 | + self.Layout() | |
| 1938 | + | |
| 1939 | + self.Bind(grad.EVT_THRESHOLD_CHANGING, self.OnSlideChanged, self.threshold) | |
| 1940 | + self.Bind(grad.EVT_THRESHOLD_CHANGED, self.OnSlideChanged, self.threshold) | |
| 1941 | + | |
| 1942 | + def OnSlideChanged(self, evt): | |
| 1943 | + self.config.t0 = int(self.threshold.GetMinValue()) | |
| 1944 | + self.config.t1 = int(self.threshold.GetMaxValue()) | |
| 1945 | + print self.config.t0, self.config.t1 | |
| 1946 | + | |
| 1947 | + | |
| 1948 | +class PanelFFillDynamic(wx.Panel): | |
| 1949 | + def __init__(self, parent, config, ID=-1, style=wx.TAB_TRAVERSAL|wx.NO_BORDER): | |
| 1950 | + wx.Panel.__init__(self, parent, ID, style=style) | |
| 1951 | + | |
| 1952 | + self.config = config | |
| 1953 | + | |
| 1954 | + self._init_gui() | |
| 1955 | + | |
| 1956 | + def _init_gui(self): | |
| 1957 | + self.use_ww_wl = wx.CheckBox(self, -1, _(u"Use WW\&WL")) | |
| 1958 | + self.use_ww_wl.SetValue(self.config.use_ww_wl) | |
| 1959 | + | |
| 1960 | + self.deviation_min = wx.SpinCtrl(self, -1, value='%d' % self.config.dev_min, min=0, max=10000) | |
| 1961 | + self.deviation_max = wx.SpinCtrl(self, -1, value='%d' % self.config.dev_max, min=0, max=10000) | |
| 1962 | + | |
| 1963 | + sizer = wx.BoxSizer(wx.VERTICAL) | |
| 1964 | + | |
| 1965 | + sizer.Add(self.use_ww_wl) | |
| 1966 | + sizer.Add(self.deviation_min) | |
| 1967 | + sizer.Add(self.deviation_max) | |
| 1968 | + | |
| 1969 | + self.SetSizer(sizer) | |
| 1970 | + sizer.Fit(self) | |
| 1971 | + self.Layout() | |
| 1972 | + | |
| 1973 | + self.use_ww_wl.Bind(wx.EVT_CHECKBOX, self.OnSetUseWWWL) | |
| 1974 | + self.deviation_min.Bind(wx.EVT_SPINCTRL, self.OnSetDeviation) | |
| 1975 | + self.deviation_max.Bind(wx.EVT_SPINCTRL, self.OnSetDeviation) | |
| 1976 | + | |
| 1977 | + def OnSetUseWWWL(self, evt): | |
| 1978 | + self.config.use_ww_wl = self.use_ww_wl.GetValue() | |
| 1979 | + | |
| 1980 | + def OnSetDeviation(self, evt): | |
| 1981 | + self.config.dev_max = self.deviation_max.GetValue() | |
| 1982 | + self.config.dev_min = self.deviation_min.GetValue() | |
| 1983 | + | |
| 1984 | + | |
| 1909 | 1985 | class FFillOptionsDialog(wx.Dialog): |
| 1910 | 1986 | def __init__(self, title, config): |
| 1911 | 1987 | pre = wx.PreDialog() |
| ... | ... | @@ -1969,7 +2045,7 @@ class FFillOptionsDialog(wx.Dialog): |
| 1969 | 2045 | sizer.AddSpacer(5) |
| 1970 | 2046 | sizer.Add(self.panel3dcon, flag=wx.LEFT|wx.RIGHT|wx.EXPAND, border=7) |
| 1971 | 2047 | sizer.AddSpacer(5) |
| 1972 | - sizer.AddSizer(self.close_btn, 0, flag=wx.ALIGN_RIGHT|wx.RIGHT, border=7) | |
| 2048 | + sizer.Add(self.close_btn, 0, flag=wx.ALIGN_RIGHT|wx.RIGHT, border=7) | |
| 1973 | 2049 | sizer.AddSpacer(5) |
| 1974 | 2050 | |
| 1975 | 2051 | self.SetSizer(sizer) |
| ... | ... | @@ -2113,157 +2189,137 @@ class FFillSegmentationOptionsDialog(wx.Dialog): |
| 2113 | 2189 | Create the widgets. |
| 2114 | 2190 | """ |
| 2115 | 2191 | import project as prj |
| 2192 | + | |
| 2116 | 2193 | # Target |
| 2117 | - self.target_2d = wx.RadioButton(self, -1, _(u"2D - Actual slice"), style=wx.RB_GROUP) | |
| 2118 | - self.target_3d = wx.RadioButton(self, -1, _(u"3D - All slices")) | |
| 2194 | + if sys.platform == "win32": | |
| 2195 | + border_style = wx.SIMPLE_BORDER | |
| 2196 | + else: | |
| 2197 | + border_style = wx.SUNKEN_BORDER | |
| 2198 | + | |
| 2199 | + self.panel_target = PanelTargeFFill(self, style=border_style|wx.TAB_TRAVERSAL) | |
| 2200 | + self.panel2dcon = Panel2DConnectivity(self, style=border_style|wx.TAB_TRAVERSAL) | |
| 2201 | + self.panel3dcon = Panel3DConnectivity(self, style=border_style|wx.TAB_TRAVERSAL) | |
| 2119 | 2202 | |
| 2120 | 2203 | if self.config.target == "2D": |
| 2121 | - self.target_2d.SetValue(1) | |
| 2204 | + self.panel_target.target_2d.SetValue(1) | |
| 2205 | + self.panel2dcon.Enable(1) | |
| 2206 | + self.panel3dcon.Enable(0) | |
| 2122 | 2207 | else: |
| 2123 | - self.target_3d.SetValue(1) | |
| 2208 | + self.panel_target.target_3d.SetValue(1) | |
| 2209 | + self.panel3dcon.Enable(1) | |
| 2210 | + self.panel2dcon.Enable(0) | |
| 2124 | 2211 | |
| 2125 | 2212 | # Connectivity 2D |
| 2126 | - self.conect2D_4 = wx.RadioButton(self, -1, "4", style=wx.RB_GROUP) | |
| 2127 | - self.conect2D_8 = wx.RadioButton(self, -1, "8") | |
| 2128 | - | |
| 2129 | 2213 | if self.config.con_2d == 8: |
| 2130 | - self.conect2D_8.SetValue(1) | |
| 2214 | + self.panel2dcon.conect2D_8.SetValue(1) | |
| 2131 | 2215 | else: |
| 2132 | - self.conect2D_4.SetValue(1) | |
| 2216 | + self.panel2dcon.conect2D_4.SetValue(1) | |
| 2133 | 2217 | self.config.con_2d = 4 |
| 2134 | 2218 | |
| 2135 | 2219 | # Connectivity 3D |
| 2136 | - self.conect3D_6 = wx.RadioButton(self, -1, "6", style=wx.RB_GROUP) | |
| 2137 | - self.conect3D_18 = wx.RadioButton(self, -1, "18") | |
| 2138 | - self.conect3D_26 = wx.RadioButton(self, -1, "26") | |
| 2139 | - | |
| 2140 | 2220 | if self.config.con_3d == 18: |
| 2141 | - self.conect3D_18.SetValue(1) | |
| 2221 | + self.panel3dcon.conect3D_18.SetValue(1) | |
| 2142 | 2222 | elif self.config.con_3d == 26: |
| 2143 | - self.conect3D_26.SetValue(1) | |
| 2223 | + self.panel3dcon.conect3D_26.SetValue(1) | |
| 2144 | 2224 | else: |
| 2145 | - self.conect3D_6.SetValue(1) | |
| 2146 | - | |
| 2147 | - project = prj.Project() | |
| 2148 | - bound_min, bound_max = project.threshold_range | |
| 2149 | - colour = [i*255 for i in const.MASK_COLOUR[0]] | |
| 2150 | - colour.append(100) | |
| 2151 | - self.threshold = grad.GradientCtrl(self, -1, int(bound_min), | |
| 2152 | - int(bound_max), self.config.t0, | |
| 2153 | - self.config.t1, colour) | |
| 2154 | - self.threshold.SetMinSize((250, -1)) | |
| 2225 | + self.panel3dcon.conect3D_6.SetValue(1) | |
| 2155 | 2226 | |
| 2156 | - self.method_threshold = wx.RadioButton(self, -1, _(u"Threshold"), style=wx.RB_GROUP) | |
| 2157 | - self.method_dynamic = wx.RadioButton(self, -1, _(u"Dynamic")) | |
| 2227 | + self.cmb_method = wx.ComboBox(self, -1, choices=(_(u"Threshold"), _(u"Dynamic")), style=wx.CB_READONLY) | |
| 2158 | 2228 | |
| 2159 | 2229 | if self.config.method == 'dynamic': |
| 2160 | - self.method_dynamic.SetValue(1) | |
| 2230 | + self.cmb_method.SetSelection(1) | |
| 2161 | 2231 | else: |
| 2162 | - self.method_threshold.SetValue(1) | |
| 2232 | + self.cmb_method.SetSelection(0) | |
| 2163 | 2233 | self.config.method = 'threshold' |
| 2164 | 2234 | |
| 2165 | - self.use_ww_wl = wx.CheckBox(self, -1, _(u"Use WW\&WL")) | |
| 2166 | - self.use_ww_wl.SetValue(self.config.use_ww_wl) | |
| 2235 | + self.panel_ffill_threshold = PanelFFillThreshold(self, self.config, -1) | |
| 2236 | + self.panel_ffill_threshold.SetMinSize((300, -1)) | |
| 2237 | + self.panel_ffill_threshold.Hide() | |
| 2167 | 2238 | |
| 2168 | - self.deviation_min = wx.SpinCtrl(self, -1, value='%d' % self.config.dev_min, min=0, max=10000) | |
| 2169 | - self.deviation_max = wx.SpinCtrl(self, -1, value='%d' % self.config.dev_max, min=0, max=10000) | |
| 2239 | + self.panel_ffill_dynamic = PanelFFillDynamic(self, self.config, -1) | |
| 2240 | + self.panel_ffill_dynamic.SetMinSize((300, -1)) | |
| 2241 | + self.panel_ffill_dynamic.Hide() | |
| 2242 | + | |
| 2243 | + self.close_btn = wx.Button(self, wx.ID_CLOSE) | |
| 2170 | 2244 | |
| 2171 | 2245 | # Sizer |
| 2172 | 2246 | sizer = wx.BoxSizer(wx.VERTICAL) |
| 2173 | 2247 | |
| 2174 | - sizer.AddSpacer(7) | |
| 2175 | - | |
| 2176 | - sizer.Add(wx.StaticText(self, -1, _(u"Parameters")), flag=wx.LEFT, border=7) | |
| 2177 | 2248 | sizer.AddSpacer(5) |
| 2178 | - sizer.Add(self.target_2d, flag=wx.LEFT, border=9) | |
| 2179 | - sizer.Add(self.target_3d, flag=wx.LEFT, border=9) | |
| 2180 | - | |
| 2181 | - sizer.AddSpacer(7) | |
| 2182 | - | |
| 2183 | - sizer.Add(wx.StaticText(self, -1, _(u"2D Connectivity")), flag=wx.LEFT, border=9) | |
| 2249 | + sizer.Add(wx.StaticText(self, -1, _(u"Parameters")), flag=wx.LEFT, border=5) | |
| 2184 | 2250 | sizer.AddSpacer(5) |
| 2185 | - sizer_2d = wx.BoxSizer(wx.HORIZONTAL) | |
| 2186 | - sizer_2d.Add(self.conect2D_4, flag=wx.LEFT, border=11) | |
| 2187 | - sizer_2d.Add(self.conect2D_8, flag=wx.LEFT, border=11) | |
| 2188 | - sizer.Add(sizer_2d) | |
| 2189 | - | |
| 2190 | - sizer.AddSpacer(7) | |
| 2191 | - | |
| 2192 | - sizer.Add(wx.StaticText(self, -1, _(u"3D Connectivity")), flag=wx.LEFT, border=9) | |
| 2251 | + sizer.Add(self.panel_target, flag=wx.LEFT|wx.RIGHT|wx.EXPAND, border=7) | |
| 2193 | 2252 | sizer.AddSpacer(5) |
| 2194 | - sizer_3d = wx.BoxSizer(wx.HORIZONTAL) | |
| 2195 | - sizer_3d.Add(self.conect3D_6, flag=wx.LEFT, border=11) | |
| 2196 | - sizer_3d.Add(self.conect3D_18, flag=wx.LEFT, border=11) | |
| 2197 | - sizer_3d.Add(self.conect3D_26, flag=wx.LEFT, border=11) | |
| 2198 | - sizer.Add(sizer_3d) | |
| 2199 | - | |
| 2200 | - sizer.AddSpacer(7) | |
| 2201 | - | |
| 2202 | - sizer.Add(wx.StaticText(self, -1, _(u"Method")), flag=wx.LEFT, border=9) | |
| 2253 | + sizer.Add(self.panel2dcon, flag=wx.LEFT|wx.RIGHT|wx.EXPAND, border=7) | |
| 2203 | 2254 | sizer.AddSpacer(5) |
| 2204 | - sizer.Add(self.method_threshold, flag=wx.LEFT, border=11) | |
| 2255 | + sizer.Add(self.panel3dcon, flag=wx.LEFT|wx.RIGHT|wx.EXPAND, border=7) | |
| 2205 | 2256 | sizer.AddSpacer(5) |
| 2206 | - sizer.Add(self.threshold, flag=wx.LEFT|wx.RIGHT|wx.EXPAND, border=13) | |
| 2257 | + | |
| 2258 | + sizer.Add(wx.StaticText(self, -1, _(u"Method")), flag=wx.LEFT, border=9) | |
| 2207 | 2259 | sizer.AddSpacer(5) |
| 2208 | - sizer.Add(self.method_dynamic, flag=wx.LEFT, border=11) | |
| 2260 | + sizer.Add(self.cmb_method, flag=wx.LEFT|wx.RIGHT|wx.EXPAND, border=7) | |
| 2261 | + | |
| 2262 | + if self.config.method == 'dynamic': | |
| 2263 | + self.cmb_method.SetSelection(1) | |
| 2264 | + self.panel_ffill_dynamic.Show() | |
| 2265 | + sizer.Add(self.panel_ffill_dynamic, flag=wx.LEFT, border=11) | |
| 2266 | + else: | |
| 2267 | + self.cmb_method.SetSelection(0) | |
| 2268 | + self.panel_ffill_threshold.Show() | |
| 2269 | + sizer.Add(self.panel_ffill_threshold, flag=wx.LEFT, border=11) | |
| 2270 | + self.config.method = 'threshold' | |
| 2271 | + | |
| 2209 | 2272 | sizer.AddSpacer(5) |
| 2210 | - sizer.Add(self.use_ww_wl, flag=wx.LEFT, border=13) | |
| 2273 | + sizer.Add(self.close_btn, 0, flag=wx.ALIGN_RIGHT|wx.RIGHT, border=5) | |
| 2211 | 2274 | sizer.AddSpacer(5) |
| 2212 | - sizer.Add(self.deviation_min, flag=wx.LEFT, border=13) | |
| 2213 | - sizer.Add(self.deviation_max, flag=wx.LEFT, border=13) | |
| 2214 | - | |
| 2215 | - sizer.AddSpacer(7) | |
| 2216 | 2275 | |
| 2217 | 2276 | self.SetSizer(sizer) |
| 2218 | 2277 | sizer.Fit(self) |
| 2219 | 2278 | self.Layout() |
| 2220 | 2279 | |
| 2221 | 2280 | self.Bind(wx.EVT_RADIOBUTTON, self.OnSetRadio) |
| 2222 | - self.Bind(grad.EVT_THRESHOLD_CHANGING, self.OnSlideChanged, self.threshold) | |
| 2223 | - self.Bind(grad.EVT_THRESHOLD_CHANGED, self.OnSlideChanged, self.threshold) | |
| 2224 | - self.use_ww_wl.Bind(wx.EVT_CHECKBOX, self.OnSetUseWWWL) | |
| 2225 | - self.deviation_min.Bind(wx.EVT_SPINCTRL, self.OnSetDeviation) | |
| 2226 | - self.deviation_max.Bind(wx.EVT_SPINCTRL, self.OnSetDeviation) | |
| 2281 | + self.cmb_method.Bind(wx.EVT_COMBOBOX, self.OnSetMethod) | |
| 2227 | 2282 | self.Bind(wx.EVT_CLOSE, self.OnClose) |
| 2228 | 2283 | |
| 2229 | 2284 | def OnSetRadio(self, evt): |
| 2230 | 2285 | # Target |
| 2231 | - if self.target_2d.GetValue(): | |
| 2286 | + if self.panel_target.target_2d.GetValue(): | |
| 2232 | 2287 | self.config.target = "2D" |
| 2288 | + self.panel2dcon.Enable(1) | |
| 2289 | + self.panel3dcon.Enable(0) | |
| 2233 | 2290 | else: |
| 2234 | 2291 | self.config.target = "3D" |
| 2292 | + self.panel3dcon.Enable(1) | |
| 2293 | + self.panel2dcon.Enable(0) | |
| 2235 | 2294 | |
| 2236 | 2295 | # 2D |
| 2237 | - if self.conect2D_4.GetValue(): | |
| 2296 | + if self.panel2dcon.conect2D_4.GetValue(): | |
| 2238 | 2297 | self.config.con_2d = 4 |
| 2239 | - elif self.conect2D_8.GetValue(): | |
| 2298 | + elif self.panel2dcon.conect2D_8.GetValue(): | |
| 2240 | 2299 | self.config.con_2d = 8 |
| 2241 | 2300 | |
| 2242 | 2301 | # 3D |
| 2243 | - if self.conect3D_6.GetValue(): | |
| 2302 | + if self.panel3dcon.conect3D_6.GetValue(): | |
| 2244 | 2303 | self.config.con_3d = 6 |
| 2245 | - elif self.conect3D_18.GetValue(): | |
| 2304 | + elif self.panel3dcon.conect3D_18.GetValue(): | |
| 2246 | 2305 | self.config.con_3d = 18 |
| 2247 | - elif self.conect3D_26.GetValue(): | |
| 2306 | + elif self.panel3dcon.conect3D_26.GetValue(): | |
| 2248 | 2307 | self.config.con_3d = 26 |
| 2249 | 2308 | |
| 2250 | - # Method | |
| 2251 | - if self.method_threshold.GetValue(): | |
| 2252 | - self.config.method = 'threshold' | |
| 2253 | - else: | |
| 2309 | + def OnSetMethod(self, evt): | |
| 2310 | + if self.cmb_method.GetSelection() == 1: | |
| 2254 | 2311 | self.config.method = 'dynamic' |
| 2312 | + self.panel_ffill_threshold.Hide() | |
| 2313 | + self.panel_ffill_dynamic.Show() | |
| 2314 | + self.GetSizer().Replace(self.panel_ffill_threshold, self.panel_ffill_dynamic) | |
| 2315 | + else: | |
| 2316 | + self.config.method = 'threshold' | |
| 2317 | + self.panel_ffill_dynamic.Hide() | |
| 2318 | + self.panel_ffill_threshold.Show() | |
| 2319 | + self.GetSizer().Replace(self.panel_ffill_dynamic, self.panel_ffill_threshold) | |
| 2255 | 2320 | |
| 2256 | - def OnSlideChanged(self, evt): | |
| 2257 | - self.config.t0 = int(self.threshold.GetMinValue()) | |
| 2258 | - self.config.t1 = int(self.threshold.GetMaxValue()) | |
| 2259 | - print self.config.t0, self.config.t1 | |
| 2260 | - | |
| 2261 | - def OnSetUseWWWL(self, evt): | |
| 2262 | - self.config.use_ww_wl = self.use_ww_wl.GetValue() | |
| 2263 | - | |
| 2264 | - def OnSetDeviation(self, evt): | |
| 2265 | - self.config.dev_max = self.deviation_max.GetValue() | |
| 2266 | - self.config.dev_min = self.deviation_min.GetValue() | |
| 2321 | + self.GetSizer().Fit(self) | |
| 2322 | + self.Layout() | |
| 2267 | 2323 | |
| 2268 | 2324 | def OnClose(self, evt): |
| 2269 | 2325 | if self.config.dlg_visible: |
| ... | ... | @@ -2271,6 +2327,7 @@ class FFillSegmentationOptionsDialog(wx.Dialog): |
| 2271 | 2327 | evt.Skip() |
| 2272 | 2328 | self.Destroy() |
| 2273 | 2329 | |
| 2330 | + | |
| 2274 | 2331 | class CropOptionsDialog(wx.Dialog): |
| 2275 | 2332 | |
| 2276 | 2333 | def __init__(self, config): | ... | ... |