Commit 50d89b6284ad34c1afd8f13cd4d003b5f690a976
1 parent
a167ab76
Exists in
master
and in
68 other branches
STL: Comments / code cleanup
Showing
1 changed file
with
119 additions
and
82 deletions
Show diff stats
invesalius/invesalius.py
@@ -16,66 +16,97 @@ | @@ -16,66 +16,97 @@ | ||
16 | # COMERCIALIZACAO ou de ADEQUACAO A QUALQUER PROPOSITO EM | 16 | # COMERCIALIZACAO ou de ADEQUACAO A QUALQUER PROPOSITO EM |
17 | # PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais | 17 | # PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais |
18 | # detalhes. | 18 | # detalhes. |
19 | -#-------------------------------------------------------------------------- | 19 | +#------------------------------------------------------------------------- |
20 | + | ||
20 | import multiprocessing | 21 | import multiprocessing |
21 | -from optparse import OptionParser | 22 | +import optparse as op |
22 | import os | 23 | import os |
23 | import sys | 24 | import sys |
24 | 25 | ||
25 | -from session import Session | 26 | +import wx |
27 | +import wx.lib.pubsub as ps | ||
28 | + | ||
26 | import gui.language_dialog as lang_dlg | 29 | import gui.language_dialog as lang_dlg |
27 | import i18n | 30 | import i18n |
31 | +import session as ses | ||
28 | import utils | 32 | import utils |
29 | 33 | ||
34 | +# ------------------------------------------------------------------ | ||
30 | 35 | ||
31 | -# TODO: This should be called during installation | ||
32 | -# ---------------------------------------------------------------------- | ||
33 | - | ||
34 | -path = os.path.join(os.path.expanduser('~'), ".invesalius", "presets") | ||
35 | - | ||
36 | -try: | ||
37 | - os.makedirs(path) | ||
38 | -except OSError: | ||
39 | - #print "Warning: Directory (probably) exists" | ||
40 | - pass | ||
41 | -# ---------------------------------------------------------------------- | 36 | +class InVesalius(wx.App): |
37 | + """ | ||
38 | + InVesalius wxPython application class. | ||
39 | + """ | ||
40 | + def OnInit(self): | ||
41 | + """ | ||
42 | + Initialize splash screen and main frame. | ||
43 | + """ | ||
44 | + self.SetAppName("InVesalius 3") | ||
45 | + splash = SplashScreen() | ||
46 | + self.control = splash.control | ||
47 | + self.frame = splash.main | ||
48 | + splash.Show() | ||
49 | + return True | ||
42 | 50 | ||
43 | -import wx | ||
44 | -import wx.lib.pubsub as ps | 51 | + def MacOpenFile(self, filename): |
52 | + """ | ||
53 | + Open drag & drop files under darwin | ||
54 | + """ | ||
55 | + path = os.path.abspath(filename) | ||
56 | + ps.Publisher().sendMessage('Open project', path) | ||
45 | 57 | ||
58 | +# ------------------------------------------------------------------ | ||
46 | 59 | ||
47 | class SplashScreen(wx.SplashScreen): | 60 | class SplashScreen(wx.SplashScreen): |
61 | + """ | ||
62 | + Splash screen to be shown in InVesalius initialization. | ||
63 | + """ | ||
48 | def __init__(self): | 64 | def __init__(self): |
65 | + # Splash screen image will depend on currently language | ||
49 | lang = False | 66 | lang = False |
50 | - save_session = False | ||
51 | - session = Session() | 67 | + |
68 | + # Language information is available in session configuration | ||
69 | + # file. First we need to check if this file exist, if now, it | ||
70 | + # should be created | ||
71 | + create_session = False | ||
72 | + session = ses.Session() | ||
52 | if not (session.ReadSession()): | 73 | if not (session.ReadSession()): |
53 | - save_session = True | 74 | + create_session = True |
54 | 75 | ||
55 | - if not(session.ReadLanguage()): | 76 | + # Check if there is a language set (if session file exists |
77 | + if session.ReadLanguage(): | ||
78 | + lang = session.GetLanguage() | ||
79 | + _ = i18n.InstallLanguage(lang) | ||
56 | 80 | ||
57 | - ldlg = lang_dlg.LanguageDialog() | 81 | + # If no language is set into session file, show dialog so |
82 | + # user can select language | ||
83 | + else: | ||
84 | + dialog = lang_dlg.LanguageDialog() | ||
58 | 85 | ||
86 | + # FIXME: This works ok in linux2, darwin and win32, | ||
87 | + # except on win64, due to wxWidgets bug | ||
59 | try: | 88 | try: |
60 | - if (ldlg.ShowModal() == wx.ID_OK): | ||
61 | - lang = ldlg.GetSelectedLanguage() | 89 | + ok = (dialog.ShowModal() == wx.ID_OK) |
90 | + except wx._core.PyAssertionError: | ||
91 | + ok = True | ||
92 | + finally: | ||
93 | + if ok: | ||
94 | + lang = dialog.GetSelectedLanguage() | ||
62 | session.SetLanguage(lang) | 95 | session.SetLanguage(lang) |
63 | _ = i18n.InstallLanguage(lang) | 96 | _ = i18n.InstallLanguage(lang) |
64 | - except(wx._core.PyAssertionError): #TODO: error win64 | ||
65 | - lang = ldlg.GetSelectedLanguage() | ||
66 | - session.SetLanguage(lang) | ||
67 | - _ = i18n.InstallLanguage(lang) | ||
68 | - else: | ||
69 | - lang = session.GetLanguage() | ||
70 | - _ = i18n.InstallLanguage(lang) | ||
71 | 97 | ||
72 | - if (save_session): | 98 | + # Session file should be created... So we set the recent |
99 | + # choosen language | ||
100 | + if (create_session): | ||
73 | session.CreateItens() | 101 | session.CreateItens() |
74 | session.SetLanguage(lang) | 102 | session.SetLanguage(lang) |
75 | session.CreateSessionFile() | 103 | session.CreateSessionFile() |
76 | 104 | ||
105 | + # Only after language was defined, splash screen will be | ||
106 | + # shown | ||
77 | if lang: | 107 | if lang: |
78 | - if (lang.startswith('pt')): #Necessy, pt noted as pt_BR | 108 | + # For pt_BR, splash_pt.png should be used |
109 | + if (lang.startswith('pt')): | ||
79 | icon_file = "splash_pt.png" | 110 | icon_file = "splash_pt.png" |
80 | else: | 111 | else: |
81 | icon_file = "splash_" + lang + ".png" | 112 | icon_file = "splash_" + lang + ".png" |
@@ -84,18 +115,22 @@ class SplashScreen(wx.SplashScreen): | @@ -84,18 +115,22 @@ class SplashScreen(wx.SplashScreen): | ||
84 | 115 | ||
85 | bmp = wx.Image(path).ConvertToBitmap() | 116 | bmp = wx.Image(path).ConvertToBitmap() |
86 | 117 | ||
87 | - wx.SplashScreen.__init__(self, bitmap=bmp, | ||
88 | - splashStyle=wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT, | ||
89 | - milliseconds=1500, id=-1, parent=None) | 118 | + style = wx.SPLASH_TIMEOUT | wx.SPLASH_CENTRE_ON_SCREEN |
119 | + wx.SplashScreen.__init__(self, | ||
120 | + bitmap=bmp, | ||
121 | + splashStyle=style, | ||
122 | + milliseconds=1500, | ||
123 | + id=-1, | ||
124 | + parent=None) | ||
90 | self.Bind(wx.EVT_CLOSE, self.OnClose) | 125 | self.Bind(wx.EVT_CLOSE, self.OnClose) |
91 | 126 | ||
127 | + # Importing takes sometime, therefore it will be done | ||
128 | + # while splash is being shown | ||
92 | from gui.frame import Frame | 129 | from gui.frame import Frame |
93 | from control import Controller | 130 | from control import Controller |
94 | from project import Project | 131 | from project import Project |
95 | 132 | ||
96 | - print "antes primeiro import session" | ||
97 | self.main = Frame(None) | 133 | self.main = Frame(None) |
98 | - print "depois primeiro import session" | ||
99 | self.control = Controller(self.main) | 134 | self.control = Controller(self.main) |
100 | 135 | ||
101 | self.fc = wx.FutureCall(1, self.ShowMain) | 136 | self.fc = wx.FutureCall(1, self.ShowMain) |
@@ -106,72 +141,57 @@ class SplashScreen(wx.SplashScreen): | @@ -106,72 +141,57 @@ class SplashScreen(wx.SplashScreen): | ||
106 | evt.Skip() | 141 | evt.Skip() |
107 | self.Hide() | 142 | self.Hide() |
108 | 143 | ||
109 | - # if the timer is still running then go ahead and show the | 144 | + # If the timer is still running then go ahead and show the |
110 | # main frame now | 145 | # main frame now |
111 | if self.fc.IsRunning(): | 146 | if self.fc.IsRunning(): |
112 | self.fc.Stop() | 147 | self.fc.Stop() |
113 | - | ||
114 | - #session = Session() | ||
115 | - #if not (session.ReadSession()): | ||
116 | - # session.CreateItens() | ||
117 | - | ||
118 | - #lang = session.GetLanguage() | ||
119 | - #print lang | ||
120 | - | ||
121 | - #i18n.InstallLanguage(lang) | ||
122 | self.ShowMain() | 148 | self.ShowMain() |
123 | 149 | ||
124 | - | ||
125 | def ShowMain(self): | 150 | def ShowMain(self): |
151 | + # Show main frame | ||
126 | self.main.Show() | 152 | self.main.Show() |
127 | 153 | ||
128 | if self.fc.IsRunning(): | 154 | if self.fc.IsRunning(): |
129 | self.Raise() | 155 | self.Raise() |
130 | 156 | ||
131 | -class InVesalius(wx.App): | ||
132 | - def OnInit(self): | ||
133 | - self.SetAppName("InVesalius 3") | ||
134 | - splash = SplashScreen() | ||
135 | - self.control = splash.control | ||
136 | - self.frame = splash.main | ||
137 | - splash.Show() | 157 | +# ------------------------------------------------------------------ |
138 | 158 | ||
139 | - return True | ||
140 | 159 | ||
141 | - def MacOpenFile(self, filename): | ||
142 | - path = os.path.abspath(file) | ||
143 | - ps.Publisher().sendMessage('Open project', path) | ||
144 | 160 | ||
145 | def parse_comand_line(): | 161 | def parse_comand_line(): |
146 | """ | 162 | """ |
147 | Handle command line arguments. | 163 | Handle command line arguments. |
148 | """ | 164 | """ |
149 | - parser = OptionParser() | 165 | + session = ses.Session() |
150 | 166 | ||
151 | - # Add comand line option debug(-d or --debug) to print all pubsub message is | ||
152 | - # being sent | ||
153 | - parser.add_option("-d", "--debug", action="store_true", dest="debug") | ||
154 | - parser.add_option("-i", "--import", action="store", dest="dicom_dir") | 167 | + # Parse command line arguments |
168 | + parser = op.OptionParser() | ||
155 | 169 | ||
156 | - options, args = parser.parse_args() | 170 | + # -d or --debug: print all pubsub messagessent |
171 | + parser.add_option("-d", "--debug", | ||
172 | + action="store_true", | ||
173 | + dest="debug") | ||
157 | 174 | ||
158 | - session = Session() | 175 | + # -i or --import: import DICOM directory |
176 | + # chooses largest series | ||
177 | + parser.add_option("-i", "--import", | ||
178 | + action="store", | ||
179 | + dest="dicom_dir") | ||
180 | + options, args = parser.parse_args() | ||
159 | 181 | ||
182 | + # If debug argument... | ||
160 | if options.debug: | 183 | if options.debug: |
161 | - # The user passed the debug option? | ||
162 | - # Yes! | ||
163 | - # Then all pubsub message must be printed. | ||
164 | ps.Publisher().subscribe(print_events, ps.ALL_TOPICS) | 184 | ps.Publisher().subscribe(print_events, ps.ALL_TOPICS) |
165 | - | ||
166 | session.debug = 1 | 185 | session.debug = 1 |
167 | 186 | ||
187 | + # If import DICOM argument... | ||
168 | if options.dicom_dir: | 188 | if options.dicom_dir: |
169 | - # The user passed directory to me? | ||
170 | import_dir = options.dicom_dir | 189 | import_dir = options.dicom_dir |
171 | ps.Publisher().sendMessage('Import directory', import_dir) | 190 | ps.Publisher().sendMessage('Import directory', import_dir) |
172 | return True | 191 | return True |
173 | 192 | ||
174 | # Check if there is a file path somewhere in what the user wrote | 193 | # Check if there is a file path somewhere in what the user wrote |
194 | + # In case there is, try opening as it was a inv3 | ||
175 | else: | 195 | else: |
176 | i = len(args) | 196 | i = len(args) |
177 | while i: | 197 | while i: |
@@ -186,27 +206,44 @@ def parse_comand_line(): | @@ -186,27 +206,44 @@ def parse_comand_line(): | ||
186 | 206 | ||
187 | 207 | ||
188 | def print_events(data): | 208 | def print_events(data): |
209 | + """ | ||
210 | + Print pubsub messages | ||
211 | + """ | ||
189 | utils.debug(data.topic) | 212 | utils.debug(data.topic) |
190 | 213 | ||
191 | def main(): | 214 | def main(): |
215 | + """ | ||
216 | + Initialize InVesalius GUI | ||
217 | + """ | ||
192 | application = InVesalius(0) | 218 | application = InVesalius(0) |
193 | parse_comand_line() | 219 | parse_comand_line() |
194 | application.MainLoop() | 220 | application.MainLoop() |
195 | 221 | ||
196 | if __name__ == '__main__': | 222 | if __name__ == '__main__': |
197 | - | ||
198 | # Needed in win 32 exe | 223 | # Needed in win 32 exe |
199 | if hasattr(sys,"frozen") and sys.frozen == "windows_exe": | 224 | if hasattr(sys,"frozen") and sys.frozen == "windows_exe": |
200 | - multiprocessing.freeze_support() | ||
201 | - | ||
202 | - folder_log = os.path.join(os.path.expanduser('~'), '.invesalius', 'logs') | ||
203 | - | ||
204 | - if not os.path.isdir(folder_log): | ||
205 | - os.makedirs(folder_log) | ||
206 | - path = os.path.join(folder_log, "stderr.log") | ||
207 | - sys.stderr = open(path, "w") | ||
208 | - | ||
209 | - # Add current directory to PYTHONPATH | 225 | + multiprocessing.freeze_support() |
226 | + | ||
227 | + # Create raycasting presets' folder, if it doens't exist | ||
228 | + dirpath = os.path.join(os.path.expanduser('~'), | ||
229 | + ".invesalius", | ||
230 | + "presets") | ||
231 | + if not os.path.isdir(dirpath): | ||
232 | + os.makedirs(dirpath) | ||
233 | + | ||
234 | + # Create logs' folder, if it doesn't exist | ||
235 | + dirpath = os.path.join(os.path.expanduser('~'), | ||
236 | + ".invesalius", | ||
237 | + "logs") | ||
238 | + if not os.path.isdir(dirpath): | ||
239 | + os.makedirs(dirpath) | ||
240 | + | ||
241 | + # Set system standard error output to file | ||
242 | + path = os.path.join(dirpath, "stderr.log") | ||
243 | + sys.stderr = open(path, "w") | ||
244 | + | ||
245 | + # Add current directory to PYTHONPATH, so other classes can | ||
246 | + # import modules as they were on root invesalius folder | ||
210 | sys.path.append(".") | 247 | sys.path.append(".") |
211 | 248 | ||
212 | # Init application | 249 | # Init application |