- Timestamp:
- Nov 12, 2018 6:47:59 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:
- e5ae812
- Parents:
- ebcdb02
- git-author:
- Piotr Rozyczko <piotr.rozyczko@…> (10/31/18 06:34:14)
- git-committer:
- Piotr Rozyczko <piotr.rozyczko@…> (11/12/18 06:47:59)
- Location:
- src/sas/qtgui
- Files:
-
- 3 added
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
src/sas/qtgui/Calculators/GenericScatteringCalculator.py
r30e0be0 r133812c7 33 33 trigger_plot_3d = QtCore.pyqtSignal() 34 34 calculationFinishedSignal = QtCore.pyqtSignal() 35 loadingFinishedSignal = QtCore.pyqtSignal(list) 35 36 36 37 def __init__(self, parent=None): … … 104 105 # plots - 3D in real space 105 106 self.calculationFinishedSignal.connect(self.plot_1_2d) 107 108 # notify main thread about file load complete 109 self.loadingFinishedSignal.connect(self.complete_loading) 106 110 107 111 # TODO the option Ellipsoid has not been implemented … … 167 171 str(self.datafile)))) 168 172 self.reader = GenReader(path=str(self.datafile), loader=loader, 169 completefn=self.complete_loading ,173 completefn=self.complete_loading_ex, 170 174 updatefn=self.load_update) 171 175 self.reader.queue() … … 184 188 logging.info(status_type) 185 189 190 def complete_loading_ex(self, data=None): 191 """ 192 Send the finish message from calculate threads to main thread 193 """ 194 self.loadingFinishedSignal.emit(data) 195 186 196 def complete_loading(self, data=None): 187 197 """ Function used in GenRead""" 198 assert isinstance(data, list) 199 assert len(data)==1 200 data = data[0] 188 201 self.cbShape.setEnabled(False) 189 202 try: -
src/sas/qtgui/MainWindow/DataExplorer.py
rebcdb02 r133812c7 49 49 self.parent = guimanager 50 50 self.loader = Loader() 51 52 # Read in default locations 53 self.default_save_location = None 54 self.default_load_location = GuiUtils.DEFAULT_OPEN_FOLDER 55 self.default_project_location = None 56 51 57 self.manager = manager if manager is not None else DataManager() 52 58 self.txt_widget = QtWidgets.QTextEdit(None) … … 99 105 self.communicator.extMaskEditorSignal.connect(self.extShowEditDataMask) 100 106 self.communicator.changeDataExplorerTabSignal.connect(self.changeTabs) 107 self.communicator.forcePlotDisplaySignal.connect(self.displayData) 108 self.communicator.updateModelFromPerspectiveSignal.connect(self.updateModelFromPerspective) 101 109 102 110 self.cbgraph.editTextChanged.connect(self.enableGraphCombo) … … 205 213 Opens the Qt "Open Folder..." dialog 206 214 """ 207 folder = QtWidgets.QFileDialog.getExistingDirectory(self, "Choose a directory", "", 208 QtWidgets.QFileDialog.ShowDirsOnly | QtWidgets.QFileDialog.DontUseNativeDialog) 215 kwargs = { 216 'parent' : self, 217 'caption' : 'Choose a directory', 218 'options' : QtWidgets.QFileDialog.ShowDirsOnly | QtWidgets.QFileDialog.DontUseNativeDialog, 219 'directory' : self.default_load_location 220 } 221 folder = QtWidgets.QFileDialog.getExistingDirectory(**kwargs) 222 209 223 if folder is None: 210 224 return 211 225 212 226 folder = str(folder) 213 214 227 if not os.path.isdir(folder): 215 228 return 216 229 self.default_load_location = folder 217 230 # get content of dir into a list 218 231 path_str = [os.path.join(os.path.abspath(folder), filename) … … 251 264 filename = QtWidgets.QFileDialog.getOpenFileName(**kwargs)[0] 252 265 if filename: 266 self.default_project_location = os.path.dirname(filename) 253 267 self.deleteAllItems() 254 268 self.readProject(filename) … … 276 290 'caption' : 'Save Project', 277 291 'filter' : 'Project (*.json)', 278 'options' : QtWidgets.QFileDialog.DontUseNativeDialog 292 'options' : QtWidgets.QFileDialog.DontUseNativeDialog, 293 'directory' : self.default_project_location 279 294 } 280 295 name_tuple = QtWidgets.QFileDialog.getSaveFileName(**kwargs) … … 282 297 if not filename: 283 298 return 299 self.default_project_location = os.path.dirname(filename) 284 300 _, extension = os.path.splitext(filename) 285 301 if not extension: … … 616 632 Send selected item data to the current perspective and set the relevant notifiers 617 633 """ 618 # Set the signal handlers619 self.communicator.updateModelFromPerspectiveSignal.connect(self.updateModelFromPerspective)620 621 634 def isItemReady(index): 622 635 item = self.model.item(index) … … 903 916 # Try the current item 904 917 main_data = GuiUtils.dataFromItem(plot_item) 918 # 1D dependent plots of 2D sets - special treatment 919 if isinstance(main_data, Data2D) and isinstance(plot_to_show, Data1D): 920 main_data = None 905 921 906 922 # Make sure main data for 2D is always displayed 907 if main_data and not self.isPlotShown(main_data):923 if main_data is not None and not self.isPlotShown(main_data): 908 924 if isinstance(main_data, Data2D): 909 925 self.plotData([(plot_item, main_data)]) … … 923 939 # Plots with main data points on the same chart 924 940 # Get the main data plot 925 if main_data and not self.isPlotShown(main_data):941 if main_data is not None and not self.isPlotShown(main_data): 926 942 new_plots.append((plot_item, main_data)) 927 943 new_plots.append((plot_item, plot_to_show)) … … 1083 1099 # List of known extensions 1084 1100 wlist = self.getWlist() 1085 1086 1101 # Location is automatically saved - no need to keep track of the last dir 1087 1102 # But only with Qt built-in dialog (non-platform native) 1088 paths = QtWidgets.QFileDialog.getOpenFileNames(self, "Choose a file", "", 1089 wlist, None, QtWidgets.QFileDialog.DontUseNativeDialog)[0] 1103 kwargs = { 1104 'parent' : self, 1105 'caption' : 'Choose files', 1106 'filter' : wlist, 1107 'options' : QtWidgets.QFileDialog.DontUseNativeDialog, 1108 'directory' : self.default_load_location 1109 } 1110 paths = QtWidgets.QFileDialog.getOpenFileNames(**kwargs)[0] 1090 1111 if not paths: 1091 1112 return … … 1094 1115 paths = [paths] 1095 1116 1117 self.default_load_location = os.path.dirname(paths[0]) 1096 1118 return paths 1097 1119 … … 1729 1751 raise AttributeError(msg) 1730 1752 1731 # TODO: Assert other properties 1732 1733 # Reset the view 1734 ##self.model.reset() 1735 # Pass acting as a debugger anchor 1753 # send in the new item 1754 self.model.appendRow(model_item) 1736 1755 pass 1737 1756 -
src/sas/qtgui/MainWindow/GuiManager.py
rebcdb02 r133812c7 51 51 52 52 from sas.qtgui.Utilities.AddMultEditor import AddMultEditor 53 from sas.qtgui.Utilities.ImageViewer import ImageViewer 53 54 54 55 logger = logging.getLogger(__name__) … … 352 353 # Exit if yes 353 354 if reply == QMessageBox.Yes: 355 # save the paths etc. 356 self.saveCustomConfig() 354 357 reactor.callFromThread(reactor.stop) 355 358 return True … … 457 460 self._workspace.actionReset.setVisible(False) 458 461 self._workspace.actionStartup_Settings.setVisible(False) 459 self._workspace.actionImage_Viewer.setVisible(False)462 #self._workspace.actionImage_Viewer.setVisible(False) 460 463 self._workspace.actionCombine_Batch_Fit.setVisible(False) 461 464 # orientation viewer set to invisible SASVIEW-1132 … … 825 828 """ 826 829 """ 827 print("actionImage_Viewer TRIGGERED") 828 pass 830 try: 831 self.image_viewer = ImageViewer(self) 832 if sys.platform == "darwin": 833 self.image_viewer.menubar.setNativeMenuBar(False) 834 self.image_viewer.show() 835 except Exception as ex: 836 logging.error(str(ex)) 837 return 829 838 830 839 #============ FITTING ================= … … 1114 1123 elif isinstance(perspective, Perspectives.PERSPECTIVES["Corfunc"]): 1115 1124 self.checkAnalysisOption(self._workspace.actionCorfunc) 1125 1126 def saveCustomConfig(self): 1127 """ 1128 Save the config file based on current session values 1129 """ 1130 # Load the current file 1131 config_content = GuiUtils.custom_config 1132 1133 changed = self.customSavePaths(config_content) 1134 changed = changed or self.customSaveOpenCL(config_content) 1135 1136 if changed: 1137 self.writeCustomConfig(config_content) 1138 1139 def customSavePaths(self, config_content): 1140 """ 1141 Update the config module with current session paths 1142 Returns True if update was done, False, otherwise 1143 """ 1144 changed = False 1145 # Find load path 1146 open_path = GuiUtils.DEFAULT_OPEN_FOLDER 1147 defined_path = self.filesWidget.default_load_location 1148 if open_path != defined_path: 1149 # Replace the load path 1150 config_content.DEFAULT_OPEN_FOLDER = defined_path 1151 changed = True 1152 return changed 1153 1154 def customSaveOpenCL(self, config_content): 1155 """ 1156 Update the config module with current session OpenCL choice 1157 Returns True if update was done, False, otherwise 1158 """ 1159 changed = False 1160 # Find load path 1161 file_value = GuiUtils.SAS_OPENCL 1162 session_value = os.environ.get("SAS_OPENCL", "") 1163 if file_value != session_value: 1164 # Replace the load path 1165 config_content.SAS_OPENCL = session_value 1166 changed = True 1167 return changed 1168 1169 def writeCustomConfig(self, config): 1170 """ 1171 Write custom configuration 1172 """ 1173 from sas import make_custom_config_path 1174 path = make_custom_config_path() 1175 # Just clobber the file - we already have its content read in 1176 with open(path, 'w') as out_f: 1177 out_f.write("#Application appearance custom configuration\n") 1178 for key, item in config.__dict__.items(): 1179 if key[:2] != "__": 1180 if isinstance(item, str): 1181 item = '"' + item + '"' 1182 out_f.write("%s = %s\n" % (key, str(item))) 1183 pass # debugger anchor -
src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
r17e2d502 r133812c7 2448 2448 2449 2449 # If multiple rows selected - toggle all of them, filtering uncheckable 2450 # Switch off signaling from the model to avoid recursion2451 self._model_model.blockSignals(True)2452 2450 # Convert to proper indices and set requested enablement 2453 2451 self.setParameterSelection(status) 2454 self._model_model.blockSignals(False)2455 2452 2456 2453 # update the list of parameters to fit -
src/sas/qtgui/Perspectives/Fitting/GPUOptions.py
rdb05c44 r133812c7 2 2 import os 3 3 import sys 4 import sasmodels5 4 import json 6 5 import platform 7 6 import webbrowser 7 import logging 8 9 import sasmodels 10 import sasmodels.model_test 11 import sasmodels.kernelcl 8 12 9 13 import sas.qtgui.Utilities.GuiUtils as GuiUtils … … 26 30 return QtWidgets.QApplication.translate(context, text, disambig) 27 31 32 logger = logging.getLogger(__name__) 28 33 29 34 class GPUOptions(QtWidgets.QDialog, Ui_GPUOptions): … … 106 111 del os.environ["SAS_OPENCL"] 107 112 # Sasmodels kernelcl doesn't exist when initiated with None 108 if 'sasmodels.kernelcl' in sys.modules: 109 sasmodels.kernelcl.ENV = None 110 from importlib import reload # assumed Python > 3.3 111 reload(sasmodels.core) 113 sasmodels.kernelcl.reset_environment() 112 114 return no_opencl_msg 113 115 … … 123 125 124 126 try: 125 from sasmodels.kernelcl import environment 126 env = environment() 127 env = sasmodels.kernelcl.environment() 127 128 clinfo = [(ctx.devices[0].platform.vendor, 128 129 ctx.devices[0].platform.version, … … 131 132 ctx.devices[0].version) 132 133 for ctx in env.context] 133 except ImportError:134 except Exception: 134 135 clinfo = None 135 136 … … 222 223 clinfo = [] 223 224 cl_platforms = [] 225 224 226 try: 225 227 import pyopencl as cl 226 cl_platforms = cl.get_platforms()227 228 except ImportError: 228 print("pyopencl import failed. Using only CPU computations") 229 except cl.LogicError as e: 230 print(e.value) 229 cl = None 230 231 if cl is None: 232 logger.warn("Unable to import the pyopencl package. It may not " 233 "have been installed. If you wish to use OpenCL, try " 234 "running pip install --user pyopencl") 235 else: 236 try: 237 cl_platforms = cl.get_platforms() 238 except cl.LogicError as err: 239 logger.warn("Unable to fetch the OpenCL platforms. This likely " 240 "means that the opencl drivers for your system are " 241 "not installed.") 242 logger.warn(err) 231 243 232 244 p_index = 0 -
src/sas/qtgui/Plotting/MaskEditor.py
rdce68f6 r133812c7 42 42 layout.setContentsMargins(0, 0, 0, 0) 43 43 self.frame.setLayout(layout) 44 45 self.plotter.plot() 44 46 layout.addWidget(self.plotter) 45 46 self.plotter.plot()47 47 self.subplot = self.plotter.ax 48 48 -
src/sas/qtgui/Plotting/Plotter2D.py
rf5cec7c r133812c7 281 281 new_plot.id = "Circ avg " + self.data.name 282 282 new_plot.is_data = True 283 item = self._item 283 284 if self._item.parent() is not None: 284 285 item = self._item.parent() … … 286 287 287 288 self.manager.communicator.plotUpdateSignal.emit([new_plot]) 289 290 self.manager.communicator.forcePlotDisplaySignal.emit([item, new_plot]) 291 292 # Show the plot 288 293 289 294 def setSlicer(self, slicer): … … 508 513 self.figure.canvas.draw() 509 514 515 def imageShow(self, img, origin=None): 516 """ 517 Show background image 518 :Param img: [imread(path) from matplotlib.pyplot] 519 """ 520 if origin is not None: 521 im = self.ax.imshow(img, origin=origin) 522 else: 523 im = self.ax.imshow(img) 524 510 525 def update(self): 511 526 self.figure.canvas.draw() -
src/sas/qtgui/Plotting/Slicers/AnnulusSlicer.py
r63467b6 r133812c7 148 148 GuiUtils.updateModelItemWithPlot(item, new_plot, new_plot.id) 149 149 self.base.manager.communicator.plotUpdateSignal.emit([new_plot]) 150 self.base.manager.communicator.forcePlotDisplaySignal.emit([item, new_plot]) 150 151 151 152 if self.update_model: -
src/sas/qtgui/Plotting/Slicers/BoxSlicer.py
r63467b6 r133812c7 188 188 new_plot.id = (self.averager.__name__) + self.base.data.name 189 189 new_plot.is_data = True 190 item = self._item 190 191 if self._item.parent() is not None: 191 192 item = self._item.parent() 192 193 GuiUtils.updateModelItemWithPlot(item, new_plot, new_plot.id) 194 self.base.manager.communicator.forcePlotDisplaySignal.emit([item, new_plot]) 193 195 194 196 if self.update_model: -
src/sas/qtgui/Plotting/Slicers/SectorSlicer.py
r63467b6 r133812c7 167 167 new_plot.id = "SectorQ" + self.base.data.name 168 168 new_plot.is_data = True 169 item = self._item 169 170 if self._item.parent() is not None: 170 171 item = self._item.parent() … … 172 173 173 174 self.base.manager.communicator.plotUpdateSignal.emit([new_plot]) 175 self.base.manager.communicator.forcePlotDisplaySignal.emit([item, new_plot]) 174 176 175 177 if self.update_model: -
src/sas/qtgui/Plotting/UI/MaskEditorUI.ui
re20870bc r133812c7 7 7 <x>0</x> 8 8 <y>0</y> 9 <width> 687</width>10 <height> 507</height>9 <width>824</width> 10 <height>453</height> 11 11 </rect> 12 12 </property> -
src/sas/qtgui/Utilities/GenericReader.py
re7a0b2f r133812c7 41 41 try: 42 42 data = self.loader.read(self.path) 43 self.complete(data= data)43 self.complete(data=[data]) 44 44 except: 45 45 # Thread was interrupted, just proceed and re-raise. -
src/sas/qtgui/Utilities/GuiUtils.py
r17e2d502 r133812c7 162 162 DEFAULT_PERSPECTIVE = custom_config.DEFAULT_PERSPECTIVE 163 163 CLEANUP_PLOT = custom_config.CLEANUP_PLOT 164 SAS_OPENCL = custom_config.SAS_OPENCL 164 165 # custom open_path 165 166 open_folder = custom_config.DEFAULT_OPEN_FOLDER … … 182 183 CLEANUP_PLOT = False 183 184 DEFAULT_OPEN_FOLDER = PATH_APP 185 SAS_OPENCL = config.SAS_OPENCL 184 186 185 187 #DEFAULT_STYLE = config.DEFAULT_STYLE … … 294 296 # Plot fitting results (FittingWidget->GuiManager) 295 297 resultPlotUpdateSignal = QtCore.pyqtSignal(list) 298 299 # show the plot as a regular in-workspace object 300 forcePlotDisplaySignal = QtCore.pyqtSignal(list) 296 301 297 302 def updateModelItemWithPlot(item, update_data, name="", checkbox_state=None): -
src/sas/qtgui/Utilities/ReportDialog.py
rcb90b65 r133812c7 10 10 11 11 import sas.qtgui.Utilities.GuiUtils as GuiUtils 12 import sas.qtgui.Utilities.ObjectLibrary as ObjectLibrary 12 13 13 14 from sas.qtgui.Utilities.UI.ReportDialogUI import Ui_ReportDialogUI … … 27 28 28 29 self.data_html, self.data_txt, self.data_images = report_list 30 #self.save_location = None 31 #if 'ReportDialog_directory' in ObjectLibrary.listObjects(): 32 self.save_location = ObjectLibrary.getObject('ReportDialog_directory') 29 33 30 34 # Fill in the table from input data … … 70 74 """ 71 75 # Choose user's home directory 72 location = os.path.expanduser('~') 76 if self.save_location is None: 77 location = os.path.expanduser('~') 78 else: 79 location = self.save_location 73 80 # Use a sensible filename default 74 81 default_name = os.path.join(location, 'fit_report.pdf') … … 78 85 'caption' : 'Save Report', 79 86 # don't use 'directory' in order to remember the previous user choice 80 #'directory': default_name,87 'directory': default_name, 81 88 'filter' : 'PDF file (*.pdf);;HTML file (*.html);;Text file (*.txt)', 82 89 'options' : QtWidgets.QFileDialog.DontUseNativeDialog} … … 87 94 return 88 95 extension = filename_tuple[1] 96 self.save_location = os.path.dirname(filename) 97 # lifetime of this widget is short - keep the reference elsewhere 98 ObjectLibrary.addObject('ReportDialog_directory', self.save_location) 89 99 90 100 try:
Note: See TracChangeset
for help on using the changeset viewer.