Changeset 2eeda93 in sasview for src/sas/qtgui/MainWindow
- Timestamp:
- Oct 19, 2018 7:25:25 AM (6 years ago)
- 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
- Location:
- src/sas/qtgui/MainWindow
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
src/sas/qtgui/MainWindow/DataExplorer.py
r345b3b3 r2eeda93 235 235 self.readProject(filename) 236 236 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 237 251 def saveProject(self): 238 252 """ … … 256 270 with open(filename, 'w') as outfile: 257 271 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.') 258 307 259 308 def allDataForModel(self, model): … … 275 324 return all_data 276 325 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 280 350 """ 281 351 data = self.allDataForModel(self.model) … … 289 359 raise ValueError("Inconsistent data in Project file.") 290 360 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() 303 368 # save datas 304 369 GuiUtils.saveData(outfile, all_data) 305 return306 370 307 371 def readProject(self, filename): … … 311 375 with open(filename, 'r') as infile: 312 376 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 = [] 316 406 #self.model.beginResetModel() 317 for key, value in all_data.items():407 for key, value in data.items(): 318 408 # key - cardinal number of dataset 319 409 # value - main dataset, [dependant filesets] 320 410 # add the main index 411 if not value: continue 321 412 new_data = value[0] 322 413 assert isinstance(new_data, (Data1D, Data2D)) … … 325 416 new_item = GuiUtils.createModelItemWithPlot(new_data, new_data.filename) 326 417 new_item.setCheckState(is_checked) 418 items.append(new_item) 327 419 model = self.theory_model 328 420 if new_data.is_data: … … 337 429 assert isinstance(plot, (Data1D, Data2D)) 338 430 GuiUtils.updateModelItemWithPlot(new_item, plot, plot.name) 431 return items 339 432 340 433 def deleteFile(self, event): … … 455 548 retval = msgbox.exec_() 456 549 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_() 457 569 458 570 def freezeCheckedData(self): -
src/sas/qtgui/MainWindow/GuiManager.py
r6040cd7 r2eeda93 244 244 if self._current_perspective: 245 245 self._current_perspective.setClosable() 246 #self._workspace.workspace.removeSubWindow(self._current_perspective)247 246 self._current_perspective.close() 248 247 self._workspace.workspace.removeSubWindow(self._current_perspective) … … 548 547 """ 549 548 """ 550 print("actionOpen_Analysis TRIGGERED")549 self.filesWidget.loadAnalysis() 551 550 pass 552 551 … … 561 560 Menu File/Save Analysis 562 561 """ 563 self.communicate.saveAnalysisSignal.emit() 562 per = self.perspective() 563 if not isinstance(per, FittingWindow): 564 return 565 # get fit page serialization 566 params = per.getSerializedFitpage() 567 data_id = per.currentTabDataId() 568 tab_id = per.currentTab.tab_id 569 data = self.filesWidget.getDataForID(data_id) 570 analysis = {} 571 analysis['fit_data'] = data 572 analysis['fit_params'] = params 573 574 self.filesWidget.saveAnalysis(analysis, tab_id) 575 576 pass 564 577 565 578 def actionQuit(self): … … 1023 1036 """ 1024 1037 self._workspace.actionReport.setEnabled(False) 1038 self._workspace.actionOpen_Analysis.setEnabled(False) 1039 self._workspace.actionSave_Analysis.setEnabled(False) 1040 if hasattr(perspective, 'isSerializable') and perspective.isSerializable(): 1041 self._workspace.actionOpen_Analysis.setEnabled(True) 1042 self._workspace.actionSave_Analysis.setEnabled(True) 1043 1025 1044 if isinstance(perspective, Perspectives.PERSPECTIVES["Fitting"]): 1026 1045 self.checkAnalysisOption(self._workspace.actionFitting)
Note: See TracChangeset
for help on using the changeset viewer.