source: sasview/sansguiframe/src/sans/guiframe/local_perspectives/data_loader/data_loader.py @ f234d3c

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalccostrafo411magnetic_scattrelease-4.1.1release-4.1.2release-4.2.2release_4.0.1ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since f234d3c was 986da97, checked in by Jae Cho <jhjcho@…>, 12 years ago

Popup dialog on status event with error

  • Property mode set to 100644
File size: 9.4 KB
Line 
1
2"""
3plugin DataLoader responsible of loading data
4"""
5import os
6import sys
7import wx
8import logging
9
10from sans.dataloader.loader import Loader
11import sans.dataloader.data_info as DataInfo
12from sans.guiframe.plugin_base import PluginBase
13from sans.guiframe.events import StatusEvent
14from sans.guiframe.events import NewPlotEvent
15from sans.guiframe.dataFitting import Data1D
16from sans.guiframe.dataFitting import Data2D
17from sans.guiframe.utils import parse_name
18from sans.guiframe.gui_style import GUIFRAME
19from sans.guiframe.gui_manager import DEFAULT_OPEN_FOLDER
20try:
21    # Try to find a local config
22    import imp
23    path = os.getcwd()
24    if(os.path.isfile("%s/%s.py" % (path, 'local_config'))) or \
25        (os.path.isfile("%s/%s.pyc" % (path, 'local_config'))):
26        fObj, path, descr = imp.find_module('local_config', [path])
27        config = imp.load_module('local_config', fObj, path, descr) 
28    else:
29        # Try simply importing local_config
30        import local_config as config
31except:
32    # Didn't find local config, load the default
33    import sans.guiframe.config as config
34
35if config is None:
36    import sans.guiframe.config as config
37   
38       
39extension_list = []
40if config.APPLICATION_STATE_EXTENSION is not None:
41    extension_list.append(config.APPLICATION_STATE_EXTENSION)
42EXTENSIONS = config.PLUGIN_STATE_EXTENSIONS + extension_list   
43PLUGINS_WLIST = config.PLUGINS_WLIST
44APPLICATION_WLIST = config.APPLICATION_WLIST
45
46class Plugin(PluginBase):
47   
48    def __init__(self, standalone=False):
49        PluginBase.__init__(self, name="DataLoader", standalone=standalone)
50        #Default location
51        self._default_save_location = DEFAULT_OPEN_FOLDER
52        self.loader = Loader() 
53        self._data_menu = None 
54       
55    def help(self, evt):
56        """
57        Show a general help dialog.
58        """
59        from help_panel import  HelpWindow
60        frame = HelpWindow(None, -1) 
61        if hasattr(frame, "IsIconized"):
62            if not frame.IsIconized():
63                try:
64                    icon = self.parent.GetIcon()
65                    frame.SetIcon(icon)
66                except:
67                    pass 
68        frame.Show(True)
69       
70    def populate_file_menu(self):
71        """
72        get a menu item and append it under file menu of the application
73        add load file menu item and load folder item
74        """
75        #menu for data files
76        menu_list = []
77        data_file_hint = "load one or more data in the application"
78        menu_list = [('&Load Data File(s)', data_file_hint, self.load_data)]
79        gui_style = self.parent.get_style()
80        style = gui_style & GUIFRAME.MULTIPLE_APPLICATIONS
81        style1 = gui_style & GUIFRAME.DATALOADER_ON
82        if style == GUIFRAME.MULTIPLE_APPLICATIONS:
83            #menu for data from folder
84            data_folder_hint = "load multiple data in the application"
85            menu_list.append(('&Load Data Folder', data_folder_hint, 
86                              self._load_folder))
87        return menu_list
88   
89
90    def load_data(self, event):
91        """
92        Load data
93        """
94        path = None
95        self._default_save_location = self.parent._default_save_location
96        if self._default_save_location == None:
97            self._default_save_location = os.getcwd()
98       
99        cards = self.loader.get_wildcards()
100        temp = [APPLICATION_WLIST] + PLUGINS_WLIST
101        for item in temp:
102            if item in cards:
103                cards.remove(item)
104        wlist =  '|'.join(cards)
105        style = wx.OPEN|wx.FD_MULTIPLE
106        dlg = wx.FileDialog(self.parent, 
107                            "Choose a file", 
108                            self._default_save_location, "",
109                             wlist,
110                             style=style)
111        if dlg.ShowModal() == wx.ID_OK:
112            file_list = dlg.GetPaths()
113            if len(file_list) >= 0 and not(file_list[0]is None):
114                self._default_save_location = os.path.dirname(file_list[0])
115                path = self._default_save_location
116        dlg.Destroy()
117       
118        if path is None or not file_list or file_list[0] is None:
119            return
120        self.parent._default_save_location = self._default_save_location
121        self.get_data(file_list)
122       
123       
124    def can_load_data(self):
125        """
126        if return True, then call handler to laod data
127        """
128        return True
129 
130       
131    def _load_folder(self, event):
132        """
133        Load entire folder
134        """
135        path = None
136        self._default_save_location = self.parent._default_save_location
137        if self._default_save_location == None:
138            self._default_save_location = os.getcwd()
139        dlg = wx.DirDialog(self.parent, "Choose a directory", 
140                           self._default_save_location,
141                            style=wx.DD_DEFAULT_STYLE)
142        if dlg.ShowModal() == wx.ID_OK:
143            path = dlg.GetPath()
144            self._default_save_location = path
145        dlg.Destroy()
146        if path is not None:
147            self._default_save_location = os.path.dirname(path)
148        else:
149            return   
150        file_list = self.get_file_path(path)
151        self.get_data(file_list)
152        self.parent._default_save_location = self._default_save_location
153       
154    def load_error(self, error=None):
155        """
156        Pop up an error message.
157       
158        :param error: details error message to be displayed
159        """
160        if error is not None or str(error).strip() != "":
161            dial = wx.MessageDialog(self.parent, str(error), 'Error Loading File',
162                                wx.OK | wx.ICON_EXCLAMATION)
163            dial.ShowModal() 
164       
165    def get_file_path(self, path):
166        """
167        Receive a list containing folder then return a list of file
168        """
169        if os.path.isdir(path):
170            return [os.path.join(os.path.abspath(path),
171                                  file) for file in os.listdir(path)]
172   
173    def get_data(self, path, format=None):
174        """
175        """
176        message = ""
177        log_msg = ''
178        output = {}
179        any_error = False
180        error_message = ""
181        for p_file in path:
182            info = "info"
183            basename  = os.path.basename(p_file)
184            root, extension = os.path.splitext(basename)
185            if extension.lower() in EXTENSIONS:
186                any_error = True
187                log_msg = "Data Loader cannot "
188                log_msg += "load: %s\n" % str(p_file)
189                log_msg += """Please try to open that file from "open project" """
190                log_msg += """or "open analysis" menu\n"""
191                error_message = log_msg + "\n"
192                logging.info(log_msg)
193                continue
194       
195            try:
196                temp =  self.loader.load(p_file, format)
197                if temp.__class__.__name__ == "list":
198                    for item in temp:
199                        data = self.parent.create_gui_data(item, p_file)
200                        output[data.id] = data
201                else:
202                    data = self.parent.create_gui_data(temp, p_file)
203                    output[data.id] = data
204                message = "Loading Data..." + str(p_file) + "\n"
205                self.load_update(output=output, message=message, info=info)
206            except:
207                any_error = True
208                if error_message == "":
209                     error = "Error: " + str(sys.exc_value) + "\n"
210                     error += "while loading Data: \n%s\n" % str(p_file)
211                     error_message = "The data file you selected could not be loaded.\n"
212                     error_message += "Make sure the content of your file"
213                     error_message += " is properly formatted.\n\n"
214                     error_message += "When contacting the DANSE team, mention the"
215                     error_message += " following:\n%s" % str(error)
216                else:
217                     error_message += "%s\n"% str(p_file)
218                info = "error"
219                self.load_update(output=output, message=error_message, 
220                                  info=info)
221               
222        message = "Loading Data Complete! "
223        message += log_msg
224        if error_message != "":
225            info = 'error'
226        self.load_complete(output=output, error_message=error_message,
227                       message=message, path=path, info=info)
228           
229    def load_update(self, output=None, message="", info="warning"):
230        """
231        print update on the status bar
232        """
233        if message != "":
234            wx.PostEvent(self.parent, StatusEvent(status=message, info='info', 
235                                                  type="progress"))
236    def load_complete(self, output, message="", error_message="", path=None, 
237                      info="warning"):
238        """
239         post message to  status bar and return list of data
240        """
241        wx.PostEvent(self.parent, StatusEvent(status=message, 
242                                              info=info,
243                                              type="stop"))
244        #if error_message != "":
245        #    self.load_error(error_message)
246        self.parent.add_data(data_list=output)
247   
248   
249       
250   
Note: See TracBrowser for help on using the repository browser.