Ignore:
Timestamp:
Oct 19, 2018 5:25:25 AM (6 years ago)
Author:
Piotr Rozyczko <piotr.rozyczko@…>
Branches:
ESS_GUI, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc
Children:
b8dccb8
Parents:
10d57f6
Message:

Working version of Save/Load? Analysis. SASVIEW-983.
Changed the default behaviour of Category/Model? combos:
Selecting a category does not pre-select the first model now.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/sas/qtgui/MainWindow/DataExplorer.py

    r345b3b3 r2eeda93  
    235235            self.readProject(filename) 
    236236 
     237    def loadAnalysis(self): 
     238        """ 
     239        Called when the "Open Analysis" menu item chosen. 
     240        """ 
     241        kwargs = { 
     242            'parent'    : self, 
     243            'caption'   : 'Open Analysis', 
     244            'filter'    : 'Project (*.fitv);;All files (*.*)', 
     245            'options'   : QtWidgets.QFileDialog.DontUseNativeDialog 
     246        } 
     247        filename = QtWidgets.QFileDialog.getOpenFileName(**kwargs)[0] 
     248        if filename: 
     249            self.readAnalysis(filename) 
     250 
    237251    def saveProject(self): 
    238252        """ 
     
    256270        with open(filename, 'w') as outfile: 
    257271            self.saveDataToFile(outfile) 
     272 
     273    def saveAsAnalysisFile(self, tab_id=1): 
     274        """ 
     275        Show the save as... dialog and return the chosen filepath 
     276        """ 
     277        default_name = "FitPage"+str(tab_id)+".fitv" 
     278 
     279        wildcard = "fitv files (*.fitv)" 
     280        kwargs = { 
     281            'caption'   : 'Save As', 
     282            'directory' : default_name, 
     283            'filter'    : wildcard, 
     284            'parent'    : None, 
     285        } 
     286        # Query user for filename. 
     287        filename_tuple = QtWidgets.QFileDialog.getSaveFileName(**kwargs) 
     288        filename = filename_tuple[0] 
     289        return filename 
     290 
     291    def saveAnalysis(self, data, tab_id=1): 
     292        """ 
     293        Called when the "Save Analysis" menu item chosen. 
     294        """ 
     295        filename = self.saveAsAnalysisFile(tab_id) 
     296        if not filename: 
     297            return 
     298        _, extension = os.path.splitext(filename) 
     299        if not extension: 
     300            filename = '.'.join((filename, 'fitv')) 
     301        self.communicator.statusBarUpdateSignal.emit("Saving analysis... %s\n" % os.path.basename(filename)) 
     302 
     303        with open(filename, 'w') as outfile: 
     304            GuiUtils.saveData(outfile, data) 
     305 
     306        self.communicator.statusBarUpdateSignal.emit('Analysis saved.') 
    258307 
    259308    def allDataForModel(self, model): 
     
    275324        return all_data 
    276325 
    277     def saveDataToFile(self, outfile): 
    278         """ 
    279         Save every dataset to a json file 
     326    def getDataForID(self, id): 
     327        # return the dataset with the given ID 
     328        all_data = [] 
     329        for model in (self.model, self.theory_model): 
     330            for i in range(model.rowCount()): 
     331                properties = {} 
     332                item = model.item(i) 
     333                data = GuiUtils.dataFromItem(item) 
     334                if data is None: continue 
     335                if data.id != id: continue 
     336                # We found the dataset - save it. 
     337                filename = data.filename 
     338                is_checked = item.checkState() 
     339                properties['checked'] = is_checked 
     340                other_datas = GuiUtils.plotsFromFilename(filename, model) 
     341                # skip the main plot 
     342                other_datas = list(other_datas.values())[1:] 
     343                all_data = [data, properties, other_datas] 
     344                break 
     345        return all_data 
     346 
     347    def getAllData(self): 
     348        """ 
     349        converts all datasets into serializable dictionary 
    280350        """ 
    281351        data = self.allDataForModel(self.model) 
     
    289359                raise ValueError("Inconsistent data in Project file.") 
    290360            all_data[key] = value 
    291  
    292         # perspectives 
    293         current_perspective = self._perspective() 
    294         try: 
    295             perspective_dump = current_perspective.getCurrentStateAsXml() 
    296         except Exception: 
    297             ex = "State of " + current_perspective.windowTitle() + \ 
    298                 " cannot be saved." 
    299             logging.error(ex) 
    300         if perspective_dump is not None: 
    301             assert(isinstance(perspective_dump, dict)) 
    302             all_data['perspective'] = perspective_dump 
     361        return all_data 
     362 
     363    def saveDataToFile(self, outfile): 
     364        """ 
     365        Save every dataset to a json file 
     366        """ 
     367        all_data = self.getAllData() 
    303368        # save datas 
    304369        GuiUtils.saveData(outfile, all_data) 
    305         return 
    306370 
    307371    def readProject(self, filename): 
     
    311375        with open(filename, 'r') as infile: 
    312376            all_data = GuiUtils.readDataFromFile(infile) 
    313         # clear the model 
    314         self.model.clear() 
    315  
     377            items = self.updateModelFromData(all_data) 
     378 
     379        pass # debugger 
     380 
     381    def readAnalysis(self, filename): 
     382        """ 
     383        Read out a single dataset and fitpage from file 
     384        """ 
     385        with open(filename, 'r') as infile: 
     386            all_data = GuiUtils.readDataFromFile(infile) 
     387            # simulate full project structure 
     388            all_data_dict = {1:all_data['fit_data']} 
     389            items = self.updateModelFromData(all_data_dict) 
     390            # TODO: allow other perspectives 
     391            # send newly created item to its perspective 
     392            if len(items) > 0: 
     393                self.sendItemToPerspective(items[0]) 
     394            # Make the perspective read the rest of the read data 
     395            self._perspective().updateFromParameters(all_data['fit_params']) 
     396 
     397            pass 
     398 
     399    def updateModelFromData(self, data): 
     400        """ 
     401        Given data from analysis/project file, 
     402        create indices and populate data/theory models 
     403        """ 
     404        # model items for top level datasets 
     405        items = [] 
    316406        #self.model.beginResetModel() 
    317         for key, value in all_data.items(): 
     407        for key, value in data.items(): 
    318408            # key - cardinal number of dataset 
    319409            # value - main dataset, [dependant filesets] 
    320410            # add the main index 
     411            if not value: continue 
    321412            new_data = value[0] 
    322413            assert isinstance(new_data, (Data1D, Data2D)) 
     
    325416            new_item = GuiUtils.createModelItemWithPlot(new_data, new_data.filename) 
    326417            new_item.setCheckState(is_checked) 
     418            items.append(new_item) 
    327419            model = self.theory_model 
    328420            if new_data.is_data: 
     
    337429                assert isinstance(plot, (Data1D, Data2D)) 
    338430                GuiUtils.updateModelItemWithPlot(new_item, plot, plot.name) 
     431        return items 
    339432 
    340433    def deleteFile(self, event): 
     
    455548            retval = msgbox.exec_() 
    456549 
     550    def sendItemToPerspective(self, item): 
     551        """ 
     552        Send the passed item data to the current perspective and set the relevant notifiers 
     553        """ 
     554        # Set the signal handlers 
     555        self.communicator.updateModelFromPerspectiveSignal.connect(self.updateModelFromPerspective) 
     556        selected_items = [item] 
     557        # Notify the GuiManager about the send request 
     558        try: 
     559            self._perspective().setData(data_item=selected_items, is_batch=False) 
     560        except Exception as ex: 
     561            msg = "%s perspective returned the following message: \n%s\n" %(self._perspective().name, str(ex)) 
     562            logging.error(msg) 
     563            msg = str(ex) 
     564            msgbox = QtWidgets.QMessageBox() 
     565            msgbox.setIcon(QtWidgets.QMessageBox.Critical) 
     566            msgbox.setText(msg) 
     567            msgbox.setStandardButtons(QtWidgets.QMessageBox.Ok) 
     568            retval = msgbox.exec_() 
    457569 
    458570    def freezeCheckedData(self): 
Note: See TracChangeset for help on using the changeset viewer.