Commit 7afb7ef626eabeb825e856e13e83742f2fdf880f
1 parent
ad70187d
Exists in
master
and in
67 other branches
ENH: Added session with volume rendering and surface interpolation option
Showing
4 changed files
with
57 additions
and
24 deletions
Show diff stats
invesalius/constants.py
@@ -504,3 +504,7 @@ STYLE_LEVEL = {SLICE_STATE_EDITOR: 1, | @@ -504,3 +504,7 @@ STYLE_LEVEL = {SLICE_STATE_EDITOR: 1, | ||
504 | STATE_ZOOM_SL: 2, | 504 | STATE_ZOOM_SL: 2, |
505 | STATE_PAN:2, | 505 | STATE_PAN:2, |
506 | VOLUME_STATE_SEED:1} | 506 | VOLUME_STATE_SEED:1} |
507 | + | ||
508 | +#------------ Prefereces options key ------------ | ||
509 | +RENDERING = 0 | ||
510 | +SURFACE_INTERPOLATION = 1 |
invesalius/gui/frame.py
@@ -74,6 +74,7 @@ class Frame(wx.Frame): | @@ -74,6 +74,7 @@ class Frame(wx.Frame): | ||
74 | # Create aui manager and insert content in it | 74 | # Create aui manager and insert content in it |
75 | self.__init_aui() | 75 | self.__init_aui() |
76 | 76 | ||
77 | + self.preferences = preferences.Preferences(self) | ||
77 | # Initialize bind to pubsub events | 78 | # Initialize bind to pubsub events |
78 | self.__bind_events() | 79 | self.__bind_events() |
79 | self.__bind_events_wx() | 80 | self.__bind_events_wx() |
@@ -324,9 +325,9 @@ class Frame(wx.Frame): | @@ -324,9 +325,9 @@ class Frame(wx.Frame): | ||
324 | evt.Skip() | 325 | evt.Skip() |
325 | 326 | ||
326 | def ShowPreferences(self): | 327 | def ShowPreferences(self): |
327 | - prf = preferences.Preferences(self) | ||
328 | - prf.ShowModal() | ||
329 | - #print "Show Preferences" | 328 | + if self.preferences.ShowModal(): |
329 | + self.preferences.GetPreferences() | ||
330 | + self.preferences.Close() | ||
330 | 331 | ||
331 | def ShowAbout(self): | 332 | def ShowAbout(self): |
332 | """ | 333 | """ |
invesalius/gui/preferences.py
1 | import wx | 1 | import wx |
2 | +import constants as const | ||
2 | 3 | ||
3 | ID = wx.NewId() | 4 | ID = wx.NewId() |
4 | 5 | ||
@@ -10,7 +11,7 @@ except ImportError: # if it's not there locally, try the wxPython lib. | @@ -10,7 +11,7 @@ except ImportError: # if it's not there locally, try the wxPython lib. | ||
10 | 11 | ||
11 | class Preferences(wx.Dialog): | 12 | class Preferences(wx.Dialog): |
12 | 13 | ||
13 | - def __init__( self, parent, id = ID, title = "Preferences", size=wx.DefaultSize,\ | 14 | + def __init__( self, parent, id = ID, title = _("Preferences"), size=wx.DefaultSize,\ |
14 | pos=wx.DefaultPosition, style=wx.DEFAULT_DIALOG_STYLE): | 15 | pos=wx.DefaultPosition, style=wx.DEFAULT_DIALOG_STYLE): |
15 | 16 | ||
16 | pre = wx.PreDialog() | 17 | pre = wx.PreDialog() |
@@ -25,21 +26,21 @@ class Preferences(wx.Dialog): | @@ -25,21 +26,21 @@ class Preferences(wx.Dialog): | ||
25 | self.book = fnb.FlatNotebook(self, wx.ID_ANY, agwStyle=bookStyle) | 26 | self.book = fnb.FlatNotebook(self, wx.ID_ANY, agwStyle=bookStyle) |
26 | sizer.Add(self.book, 80, wx.EXPAND|wx.ALL) | 27 | sizer.Add(self.book, 80, wx.EXPAND|wx.ALL) |
27 | 28 | ||
28 | - self.pnl_volume_rendering = Viewer3D(self) | 29 | + self.pnl_viewer3d = Viewer3D(self) |
29 | self.pnl_language = Language(self) | 30 | self.pnl_language = Language(self) |
30 | 31 | ||
31 | - self.book.AddPage(self.pnl_volume_rendering, "Visualization") | ||
32 | - self.book.AddPage(self.pnl_language, "Language") | 32 | + self.book.AddPage(self.pnl_viewer3d, _("Visualization")) |
33 | + self.book.AddPage(self.pnl_language, _("Language")) | ||
33 | 34 | ||
34 | line = wx.StaticLine(self, -1, size=(20,-1), style=wx.LI_HORIZONTAL) | 35 | line = wx.StaticLine(self, -1, size=(20,-1), style=wx.LI_HORIZONTAL) |
35 | sizer.Add(line, 0, wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.RIGHT|wx.TOP, 5) | 36 | sizer.Add(line, 0, wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.RIGHT|wx.TOP, 5) |
36 | 37 | ||
37 | btnsizer = wx.StdDialogButtonSizer() | 38 | btnsizer = wx.StdDialogButtonSizer() |
38 | 39 | ||
39 | - btn = wx.Button(self, wx.ID_OK, "Apply") | 40 | + btn = wx.Button(self, wx.ID_OK) |
40 | btnsizer.AddButton(btn) | 41 | btnsizer.AddButton(btn) |
41 | 42 | ||
42 | - btn = wx.Button(self, wx.ID_CANCEL, "Cancel") | 43 | + btn = wx.Button(self, wx.ID_CANCEL) |
43 | btnsizer.AddButton(btn) | 44 | btnsizer.AddButton(btn) |
44 | 45 | ||
45 | btnsizer.Realize() | 46 | btnsizer.Realize() |
@@ -48,6 +49,10 @@ class Preferences(wx.Dialog): | @@ -48,6 +49,10 @@ class Preferences(wx.Dialog): | ||
48 | 49 | ||
49 | self.SetSizer(sizer) | 50 | self.SetSizer(sizer) |
50 | sizer.Fit(self) | 51 | sizer.Fit(self) |
52 | + | ||
53 | + def GetPreferences(self): | ||
54 | + | ||
55 | + print ">>>>>>>>>", self.pnl_viewer3d.GetSelection() | ||
51 | 56 | ||
52 | 57 | ||
53 | 58 | ||
@@ -58,28 +63,27 @@ class Viewer3D(wx.Panel): | @@ -58,28 +63,27 @@ class Viewer3D(wx.Panel): | ||
58 | wx.Panel.__init__(self, parent, size = wx.Size(800,600)) | 63 | wx.Panel.__init__(self, parent, size = wx.Size(800,600)) |
59 | 64 | ||
60 | 65 | ||
61 | - box_visualization = wx.StaticBox(self, -1, "Surface") | 66 | + box_visualization = wx.StaticBox(self, -1, _("Surface")) |
62 | bsizer = wx.StaticBoxSizer(box_visualization, wx.VERTICAL) | 67 | bsizer = wx.StaticBoxSizer(box_visualization, wx.VERTICAL) |
63 | 68 | ||
64 | - lbl_inter = wx.StaticText(self, -1, "Interpolation ") | 69 | + lbl_inter = wx.StaticText(self, -1, _("Interpolation ")) |
65 | bsizer.Add(lbl_inter, 0, wx.TOP|wx.LEFT, 10) | 70 | bsizer.Add(lbl_inter, 0, wx.TOP|wx.LEFT, 10) |
66 | 71 | ||
67 | - rb_inter = wx.RadioBox(self, -1, "", wx.DefaultPosition, wx.DefaultSize, | 72 | + rb_inter = self.rb_inter = wx.RadioBox(self, -1, "", wx.DefaultPosition, wx.DefaultSize, |
68 | ['Flat','Gouraud','Phong'], 3, wx.RA_SPECIFY_COLS | wx.NO_BORDER) | 73 | ['Flat','Gouraud','Phong'], 3, wx.RA_SPECIFY_COLS | wx.NO_BORDER) |
69 | 74 | ||
70 | bsizer.Add(rb_inter, 0, wx.TOP|wx.LEFT, 0) | 75 | bsizer.Add(rb_inter, 0, wx.TOP|wx.LEFT, 0) |
71 | 76 | ||
72 | - box_rendering = wx.StaticBox(self, -1, "Volume Rendering") | 77 | + box_rendering = wx.StaticBox(self, -1, _("Volume Rendering")) |
73 | bsizer_ren = wx.StaticBoxSizer(box_rendering, wx.VERTICAL) | 78 | bsizer_ren = wx.StaticBoxSizer(box_rendering, wx.VERTICAL) |
74 | 79 | ||
75 | - lbl_rendering = wx.StaticText(self, -1, "Rendering") | 80 | + lbl_rendering = wx.StaticText(self, -1, _("Rendering")) |
76 | bsizer_ren.Add(lbl_rendering, 0, wx.TOP | wx.LEFT, 10) | 81 | bsizer_ren.Add(lbl_rendering, 0, wx.TOP | wx.LEFT, 10) |
77 | 82 | ||
78 | - rb_rendering = wx.RadioBox(self, -1, "", wx.DefaultPosition, wx.DefaultSize, | 83 | + rb_rendering = self.rb_rendering = wx.RadioBox(self, -1, "", wx.DefaultPosition, wx.DefaultSize, |
79 | ['CPU', 'GPU (Only NVidia video card)'], 3, wx.RA_SPECIFY_COLS | wx.NO_BORDER) | 84 | ['CPU', 'GPU (Only NVidia video card)'], 3, wx.RA_SPECIFY_COLS | wx.NO_BORDER) |
80 | 85 | ||
81 | bsizer_ren.Add(rb_rendering, 0, wx.TOP | wx.LEFT, 0) | 86 | bsizer_ren.Add(rb_rendering, 0, wx.TOP | wx.LEFT, 0) |
82 | - | ||
83 | border = wx.BoxSizer(wx.VERTICAL) | 87 | border = wx.BoxSizer(wx.VERTICAL) |
84 | border.Add(bsizer, 50, wx.EXPAND|wx.ALL, 10) | 88 | border.Add(bsizer, 50, wx.EXPAND|wx.ALL, 10) |
85 | border.Add(bsizer_ren, 50, wx.EXPAND|wx.ALL, 10) | 89 | border.Add(bsizer_ren, 50, wx.EXPAND|wx.ALL, 10) |
@@ -87,6 +91,14 @@ class Viewer3D(wx.Panel): | @@ -87,6 +91,14 @@ class Viewer3D(wx.Panel): | ||
87 | 91 | ||
88 | border.Fit(self) | 92 | border.Fit(self) |
89 | 93 | ||
94 | + | ||
95 | + def GetSelection(self): | ||
96 | + | ||
97 | + options = {const.RENDERING:self.rb_rendering.GetSelection(), | ||
98 | + const.SURFACE_INTERPOLATION:self.rb_inter.GetSelection()} | ||
99 | + | ||
100 | + return options | ||
101 | + | ||
90 | class Language(wx.Panel): | 102 | class Language(wx.Panel): |
91 | 103 | ||
92 | def __init__(self, parent): | 104 | def __init__(self, parent): |
invesalius/session.py
@@ -25,7 +25,6 @@ class Session(object): | @@ -25,7 +25,6 @@ class Session(object): | ||
25 | import constants as const | 25 | import constants as const |
26 | self.project_path = () | 26 | self.project_path = () |
27 | self.debug = False | 27 | self.debug = False |
28 | - | ||
29 | self.project_status = const.PROJ_CLOSE | 28 | self.project_status = const.PROJ_CLOSE |
30 | # const.PROJ_NEW*, const.PROJ_OPEN, const.PROJ_CHANGE*, | 29 | # const.PROJ_NEW*, const.PROJ_OPEN, const.PROJ_CHANGE*, |
31 | # const.PROJ_CLOSE | 30 | # const.PROJ_CLOSE |
@@ -47,7 +46,8 @@ class Session(object): | @@ -47,7 +46,8 @@ class Session(object): | ||
47 | # Recent projects list | 46 | # Recent projects list |
48 | self.recent_projects = [(const.SAMPLE_DIR, "Cranium.inv3")] | 47 | self.recent_projects = [(const.SAMPLE_DIR, "Cranium.inv3")] |
49 | self.last_dicom_folder = '' | 48 | self.last_dicom_folder = '' |
50 | - | 49 | + self.surface_interpolation = 0 |
50 | + self.rendering = 0 | ||
51 | self.CreateSessionFile() | 51 | self.CreateSessionFile() |
52 | 52 | ||
53 | def StopRecording(self, pubsub_evt): | 53 | def StopRecording(self, pubsub_evt): |
@@ -64,13 +64,13 @@ class Session(object): | @@ -64,13 +64,13 @@ class Session(object): | ||
64 | homedir = self.homedir = os.path.expanduser('~') | 64 | homedir = self.homedir = os.path.expanduser('~') |
65 | try: | 65 | try: |
66 | path = os.path.join(self.homedir , | 66 | path = os.path.join(self.homedir , |
67 | - '.invesalius', 'config.backup') | 67 | + '.invesalius', 'config.backup') |
68 | path_dst = os.path.join(self.homedir , | 68 | path_dst = os.path.join(self.homedir , |
69 | - '.invesalius', 'config.cfg') | 69 | + '.invesalius', 'config.cfg') |
70 | shutil.copy(path, path_dst) | 70 | shutil.copy(path, path_dst) |
71 | return True | 71 | return True |
72 | except(IOError): | 72 | except(IOError): |
73 | - return False | 73 | + return False |
74 | 74 | ||
75 | 75 | ||
76 | def CloseProject(self): | 76 | def CloseProject(self): |
@@ -132,6 +132,8 @@ class Session(object): | @@ -132,6 +132,8 @@ class Session(object): | ||
132 | config.set('session', 'status', self.project_status) | 132 | config.set('session', 'status', self.project_status) |
133 | config.set('session','debug', self.debug) | 133 | config.set('session','debug', self.debug) |
134 | config.set('session', 'language', self.language) | 134 | config.set('session', 'language', self.language) |
135 | + config.set('session', 'surface_interpolation', self.surface_interpolation) | ||
136 | + config.set('session', 'rendering', self.rendering) | ||
135 | 137 | ||
136 | config.add_section('project') | 138 | config.add_section('project') |
137 | config.set('project', 'recent_projects', self.recent_projects) | 139 | config.set('project', 'recent_projects', self.recent_projects) |
@@ -204,15 +206,19 @@ class Session(object): | @@ -204,15 +206,19 @@ class Session(object): | ||
204 | self.project_status = config.get('session', 'status') | 206 | self.project_status = config.get('session', 'status') |
205 | self.debug = config.get('session','debug') | 207 | self.debug = config.get('session','debug') |
206 | self.language = config.get('session','language') | 208 | self.language = config.get('session','language') |
209 | + | ||
207 | self.recent_projects = eval(config.get('project','recent_projects')) | 210 | self.recent_projects = eval(config.get('project','recent_projects')) |
208 | self.homedir = config.get('paths','homedir') | 211 | self.homedir = config.get('paths','homedir') |
209 | self.tempdir = config.get('paths','tempdir') | 212 | self.tempdir = config.get('paths','tempdir') |
210 | self.last_dicom_folder = config.get('paths','last_dicom_folder') | 213 | self.last_dicom_folder = config.get('paths','last_dicom_folder') |
211 | self.last_dicom_folder = self.last_dicom_folder.decode('utf-8') | 214 | self.last_dicom_folder = self.last_dicom_folder.decode('utf-8') |
212 | - return True | ||
213 | 215 | ||
214 | - except(ConfigParser.NoSectionError, ConfigParser.NoOptionError, | ||
215 | - ConfigParser.MissingSectionHeaderError, ConfigParser.ParsingError): | 216 | + self.surface_interpolation = config.get('session', 'surface_interpolation') |
217 | + self.rendering = config.get('session', 'rendering') | ||
218 | + #return True | ||
219 | + | ||
220 | + except(ConfigParser.NoSectionError, ConfigParser.MissingSectionHeaderError, | ||
221 | + ConfigParser.ParsingError): | ||
216 | 222 | ||
217 | if (self.RecoveryConfigFile()): | 223 | if (self.RecoveryConfigFile()): |
218 | self.ReadSession() | 224 | self.ReadSession() |
@@ -220,6 +226,14 @@ class Session(object): | @@ -220,6 +226,14 @@ class Session(object): | ||
220 | else: | 226 | else: |
221 | return False | 227 | return False |
222 | 228 | ||
229 | + except(ConfigParser.NoOptionError): | ||
230 | + #Added to fix new version compatibility | ||
231 | + self.surface_interpolation = 0 | ||
232 | + self.rendering = 0 | ||
233 | + | ||
234 | + self.CreateSessionFile() | ||
235 | + return True | ||
236 | + | ||
223 | 237 | ||
224 | class WriteSession(Thread): | 238 | class WriteSession(Thread): |
225 | 239 | ||
@@ -249,6 +263,8 @@ class WriteSession(Thread): | @@ -249,6 +263,8 @@ class WriteSession(Thread): | ||
249 | config.set('session', 'status', self.session.project_status) | 263 | config.set('session', 'status', self.session.project_status) |
250 | config.set('session','debug', self.session.debug) | 264 | config.set('session','debug', self.session.debug) |
251 | config.set('session', 'language', self.session.language) | 265 | config.set('session', 'language', self.session.language) |
266 | + config.set('session', 'surface_interpolation', self.session.surface_interpolation) | ||
267 | + config.set('session', 'rendering', self.session.rendering) | ||
252 | 268 | ||
253 | config.add_section('project') | 269 | config.add_section('project') |
254 | config.set('project', 'recent_projects', self.session.recent_projects) | 270 | config.set('project', 'recent_projects', self.session.recent_projects) |