From e27a0488054ea995e180865f1f49adf3ef107a49 Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Mon, 30 Sep 2024 12:13:40 +0200 Subject: [PATCH 1/5] most working --- EasyReflectometryApp/Logic/Proxies/Project.py | 498 ++++++++++-------- 1 file changed, 277 insertions(+), 221 deletions(-) diff --git a/EasyReflectometryApp/Logic/Proxies/Project.py b/EasyReflectometryApp/Logic/Proxies/Project.py index 242156f3..c702ef79 100644 --- a/EasyReflectometryApp/Logic/Proxies/Project.py +++ b/EasyReflectometryApp/Logic/Proxies/Project.py @@ -1,7 +1,7 @@ __author__ = 'github.com/arm61' import os -import datetime +#import datetime import json from PySide2.QtCore import QObject @@ -13,12 +13,13 @@ import matplotlib.gridspec as gridspec import numpy as np -from easyscience import global_object +#from easyscience import global_object from easyApp.Logic.Utils.Utils import generalizePath -from easyreflectometry.sample import MaterialCollection -from easyreflectometry.model.model_collection import ModelCollection +#from easyreflectometry.sample import MaterialCollection +#from easyreflectometry.model import ModelCollection +from easyreflectometry import Project -from ..DataStore import DataSet1D +#from ..DataStore import DataSet1D class ProjectProxy(QObject): dummySignal = Signal() @@ -29,11 +30,12 @@ class ProjectProxy(QObject): def __init__(self, parent=None): super().__init__(parent) self.parent = parent + self._project = Project() self._project_created = False - self._project_info = self._defaultProjectInfo() - self.project_save_filepath = "" - self._currentProjectPath = os.path.expanduser('~') +# self._project_info = self._defaultProjectInfo() +# self.project_save_filepath = "" +# self._currentProjectPath = os.path.expanduser('~') self._report = "" @@ -41,14 +43,14 @@ def __init__(self, parent=None): # Defaults # # # - def _defaultProjectInfo(self): - return dict( - name="Example Project", - # location=os.path.join(os.path.expanduser("~"), "Example Project"), - short_description="reflectometry, 1D", - samples="None", - experiments="None", - modified=datetime.datetime.now().strftime("%d.%m.%Y %H:%M")) + # def _defaultProjectInfo(self): + # return dict( + # name="Example Project", + # # location=os.path.join(os.path.expanduser("~"), "Example Project"), + # short_description="reflectometry, 1D", + # samples="None", + # experiments="None", + # modified=datetime.datetime.now().strftime("%d.%m.%Y %H:%M")) # # # # Setters and getters @@ -67,11 +69,13 @@ def projectCreated(self, created: bool): @Property('QVariant', notify=projectInfoChanged) def projectInfoAsJson(self): - return self._project_info + return self._project._info +# return self._project_info @projectInfoAsJson.setter def projectInfoAsJson(self, json_str): - self._project_info = json.loads(json_str) +# self._project_info = json.loads(json_str) + self._project._info = json.loads(json_str) self.projectInfoChanged.emit() @Property(str, notify=projectInfoChanged) @@ -87,23 +91,31 @@ def projectInfoAsCif(self): @Slot(str, str) def editProjectInfo(self, key, value): if key == 'location': - self.currentProjectPath = value + self._project.current_path = value +# self.currentProjectPath = value return else: - if self._project_info[key] == value: + # if self._project_info[key] == value: + # return + # self._project_info[key] = value + if self._project._info[key] == value: return - self._project_info[key] = value + self._project._info[key] = value self.projectInfoChanged.emit() @Property(str, notify=projectInfoChanged) def currentProjectPath(self): - return self._currentProjectPath +# return self._currentProjectPath + return str(self._project.current_path) @currentProjectPath.setter def currentProjectPath(self, new_path): - if self._currentProjectPath == new_path: + if self._project.current_path == new_path: return - self._currentProjectPath = new_path + self._project.current_path = new_path + # if self._currentProjectPath == new_path: + # return + # self._currentProjectPath = new_path self.projectInfoChanged.emit() # # # @@ -112,213 +124,255 @@ def currentProjectPath(self, new_path): @Slot() def createProject(self): - projectPath = self.currentProjectPath - mainCif = os.path.join(projectPath, 'project.cif') - samplesPath = os.path.join(projectPath, 'samples') - experimentsPath = os.path.join(projectPath, 'experiments') - calculationsPath = os.path.join(projectPath, 'calculations') - if not os.path.exists(projectPath): - os.makedirs(projectPath) - os.makedirs(samplesPath) - os.makedirs(experimentsPath) - os.makedirs(calculationsPath) - with open(mainCif, 'w') as file: - file.write(self.projectInfoAsCif) - else: - print(f"ERROR: Directory {projectPath} already exists") - - @Slot() - def saveProject(self): - self._saveProject() - self.parent._state_proxy.stateChanged.emit(False) + self._project.create_project_dir() + self._project.default_model() + self._relayCreated() + self.saveProject() + # self.parent._model_proxy._model = self._project._models + # self.parent._material_proxy._materials = self._project._materials + # self._project_created = True + + # self.projectCreatedChanged.emit() + # self.parent.sampleChanged.emit() + # self.parent._state_proxy.stateChanged.emit(False) + + def _relayCreated(self): + self.parent._model_proxy._model = self._project._models + self.parent._material_proxy._materials = self._project._materials + self._project_created = True - @Slot(str) - def loadProjectAs(self, filepath): - self._loadProjectAs(filepath) - self.parent._state_proxy.stateChanged.emit(False) - - @Slot() - def loadProject(self): - self._loadProject() + self.projectCreatedChanged.emit() + self.parent.sampleChanged.emit() self.parent._state_proxy.stateChanged.emit(False) - @Property(str, notify=dummySignal) - def projectFilePath(self): - return self.project_save_filepath - - def _saveProject(self): - """ - """ - projectPath = self.currentProjectPath - project_save_filepath = os.path.join(projectPath, 'project.json') - materials_in_model = [] - for model in self.parent._model_proxy._model: - for assembly in model.sample: - for layer in assembly.layers: - materials_in_model.append(layer.material) - materials_not_in_model = [] - for material in self.parent._material_proxy._materials: - if material not in materials_in_model: - materials_not_in_model.append(material) - descr = { - 'model': - self.parent._model_proxy._model.as_dict(skip=['interface']), - 'materials_not_in_model': - MaterialCollection(materials_not_in_model).as_dict(skip=['interface']) - } - - if self.parent._data_proxy._data.experiments: - descr['experiments'] = [] - descr['experiments_models'] = [] - descr['experiments_names'] = [] - for experiment in self.parent._data_proxy._data.experiments: - if self.parent._data_proxy._data.experiments[0].xe is not None: - descr['experiments'].append([ - experiment.x, experiment.y, experiment.ye, experiment.xe - ]) - else: - descr['experiments'].append([experiment.x, experiment.y, experiment.ye]) - descr['experiments_models'].append(experiment.model.name) - descr['experiments_names'].append(experiment.name) - - descr['experiment_skipped'] = self.parent._data_proxy._experiment_skipped - descr['project_info'] = self._project_info - descr['interface'] = [self.parent._interface.current_interface_name] + # projectPath = self.currentProjectPath + # mainCif = os.path.join(projectPath, 'project.cif') + # samplesPath = os.path.join(projectPath, 'samples') + # experimentsPath = os.path.join(projectPath, 'experiments') + # calculationsPath = os.path.join(projectPath, 'calculations') + # if not os.path.exists(projectPath): + # os.makedirs(projectPath) + # os.makedirs(samplesPath) + # os.makedirs(experimentsPath) + # os.makedirs(calculationsPath) + # with open(mainCif, 'w') as file: + # file.write(self.projectInfoAsCif) + # else: + # print(f"ERROR: Directory {projectPath} already exists") - descr['colors'] = self.parent._model_proxy._colors - descr['minimizer'] = { - 'engine': self.parent._fitter_proxy.eFitter.easy_f.minimizer.name, - 'method': self.parent._minimizer_proxy._current_minimizer_method_name - } - content_json = json.dumps(descr, indent=4, default=self.default) - path = generalizePath(project_save_filepath) - self.createFile(path, content_json) - - def default(self, obj): - if type(obj).__module__ == np.__name__: - if isinstance(obj, np.ndarray): - return obj.tolist() - else: - return obj.item() - raise TypeError('Unknown type:', type(obj)) - - def _loadProjectAs(self, filepath): - """ - """ - self.project_load_filepath = filepath - print("LoadProjectAs " + filepath) - self.loadProject() + @Slot(str) + def loadProjectAs(self, filepath): +# self._loadProjectAs(filepath) + self._project.load_project_json(generalizePath(filepath)) + self._relayCreated() + # self.parent._model_proxy._model = self._project._models + # self.parent._material_proxy._materials = self._project._materials + # self._project_created = True - def _loadProject(self): - """ - """ - path = generalizePath(self.project_load_filepath) - if not os.path.isfile(path): - print("Failed to find project: '{0}'".format(path)) - return - self.currentProjectPath = os.path.split(path)[0] - with open(path, 'r') as xml_file: - descr: dict = json.load(xml_file) - - self.parent._model_proxy._model = None - self.parent._material_proxy._materials = None - self.parent._model_proxy._colors = None - materials_in_model = [] - - global_object.map._clear() - - interface_name = descr.get('interface', None) - for i, inter in enumerate(interface_name): - if inter is not None: - old_interface_name = self.parent._interface.current_interface_name - if old_interface_name != inter: - self.parent._interface.switch(inter) - - self.parent._model_proxy._colors = descr['colors'] - - self.parent._model_proxy._model = ModelCollection.from_dict(descr['model']) - for model in self.parent._model_proxy._model: - for sample in model.sample: - for layer in sample.layers: - materials_in_model.append(layer.material) - model.interface = self.parent._interface - - - mats = descr['materials_not_in_model'] - mats['populate_if_none'] = False - if not mats['data']: - mats['data'] = None - material_collection = MaterialCollection.from_dict(mats) - for material in materials_in_model: - if material not in material_collection: - material_collection.append(material) - self.parent._material_proxy._materials = material_collection - - # experiment - if 'experiments' in descr: - #self.parent._data_proxy.experimentLoaded = True - for i, e in enumerate(descr['experiments']): - x = np.array(e[0]) - y = np.array(e[1]) - ye = np.array(e[2]) - if len(e) == 4: - xe = np.array(e[3]) - else: - xe = np.zeros_like(ye) - name = descr['experiments_names'][i] - model_name = descr['experiments_models'][i] - model = None - for i in self.parent._model_proxy._model: - if i.name == model_name: - model = i - break - ds = DataSet1D(name=name, x=x, y=y, ye=ye, xe=xe, - model=model, - x_label='q (1/angstrom)', - y_label='Reflectivity') - self.parent._data_proxy._data.append(ds) - - self.parent._data_proxy.experimentLoaded = True - self.parent._data_proxy.experimentSkipped = False - self.parent._data_proxy.experimentChanged.emit() - self.parent._parameter_proxy._onParametersChanged() + # self.projectCreatedChanged.emit() + # self.parent._state_proxy.stateChanged.emit(False) + # self.parent.sampleChanged.emit() - else: - # delete existing experiment - try: - for index, data in enumerate(self.parent.data): - data.removeExperiment(index) - except TypeError: - pass - self.parent._data_proxy.experimentLoaded = False - if descr['experiment_skipped']: - self.parent._data_proxy.experimentSkipped = True - self.parent._data_proxy.experimentSkippedChanged.emit() - else: - self.parent._data_proxy.experimentSkipped = False - - # project info - self.projectInfoAsJson = json.dumps(descr['project_info']) - self.parent.sampleChanged.emit() + @Slot() + def loadProject(self): +# self._loadProject() + self._project.load_project_json() + self._relayCreated() + # self.parent._model_proxy._model = self._project._models + # self.parent._material_proxy._materials = self._project._materials + # self._project_created = True - new_minimizer_settings = descr.get('minimizer', None) - if new_minimizer_settings is not None: - new_engine = new_minimizer_settings['engine'] - new_method = new_minimizer_settings['method'] - new_engine_index = self.parent._minimizer_proxy.minimizerNames.index(new_engine) - self.currentMinimizerIndex = new_engine_index - try: - new_method_index = self.parent._minimizer_proxy.minimizerNames.index(new_method) - except ValueError: - new_method_index = self.parent._minimizer_proxy.minimizerNames[0] - self.currentMinimizerMethodIndex = new_method_index + # self.projectCreatedChanged.emit() + # self.parent._state_proxy.stateChanged.emit(False) + # self.parent.sampleChanged.emit() - self.parent._undoredo_proxy.resetUndoRedoStack() + @Slot() + def saveProject(self): + self._project.save_project_json() +# self._saveProject() + self.parent._state_proxy.stateChanged.emit(False) - self.projectCreated = True + @Property(str, notify=dummySignal) + def projectFilePath(self): + return self._project.path_project_json +# return self.project_save_filepath + + # def _saveProject(self): + # """ + # """ + # projectPath = self.currentProjectPath + # project_save_filepath = os.path.join(projectPath, 'project.json') + # materials_in_model = [] + # for model in self.parent._model_proxy._model: + # for assembly in model.sample: + # for layer in assembly.layers: + # materials_in_model.append(layer.material) + # materials_not_in_model = [] + # for material in self.parent._material_proxy._materials: + # if material not in materials_in_model: + # materials_not_in_model.append(material) + # descr = { + # 'model': + # self.parent._model_proxy._model.as_dict(skip=['interface']), + # 'materials_not_in_model': + # MaterialCollection(materials_not_in_model).as_dict(skip=['interface']) + # } + + # if self.parent._data_proxy._data.experiments: + # descr['experiments'] = [] + # descr['experiments_models'] = [] + # descr['experiments_names'] = [] + # for experiment in self.parent._data_proxy._data.experiments: + # if self.parent._data_proxy._data.experiments[0].xe is not None: + # descr['experiments'].append([ + # experiment.x, experiment.y, experiment.ye, experiment.xe + # ]) + # else: + # descr['experiments'].append([experiment.x, experiment.y, experiment.ye]) + # descr['experiments_models'].append(experiment.model.name) + # descr['experiments_names'].append(experiment.name) + + # descr['experiment_skipped'] = self.parent._data_proxy._experiment_skipped + # descr['project_info'] = self._project_info + + # descr['interface'] = [self.parent._interface.current_interface_name] + + # descr['colors'] = self.parent._model_proxy._colors + + # descr['minimizer'] = { + # 'engine': self.parent._fitter_proxy.eFitter.easy_f.minimizer.name, + # 'method': self.parent._minimizer_proxy._current_minimizer_method_name + # } + + # content_json = json.dumps(descr, indent=4, default=self.default) + # path = generalizePath(project_save_filepath) + # self.createFile(path, content_json) + + # def default(self, obj): + # if type(obj).__module__ == np.__name__: + # if isinstance(obj, np.ndarray): + # return obj.tolist() + # else: + # return obj.item() + # raise TypeError('Unknown type:', type(obj)) + + # def _loadProjectAs(self, filepath): + # """ + # """ + # self.project_load_filepath = filepath + # print("LoadProjectAs " + filepath) + # self.loadProject() + + # def _loadProject(self): + # """ + # """ + # path = generalizePath(self.project_load_filepath) + # if not os.path.isfile(path): + # print("Failed to find project: '{0}'".format(path)) + # return + # self.currentProjectPath = os.path.split(path)[0] + # with open(path, 'r') as xml_file: + # descr: dict = json.load(xml_file) + + # self.parent._model_proxy._model = None + # self.parent._material_proxy._materials = None + # self.parent._model_proxy._colors = None + # materials_in_model = [] + + # global_object.map._clear() + + # interface_name = descr.get('interface', None) + # for i, inter in enumerate(interface_name): + # if inter is not None: + # old_interface_name = self.parent._interface.current_interface_name + # if old_interface_name != inter: + # self.parent._interface.switch(inter) + + # self.parent._model_proxy._colors = descr['colors'] + + # self.parent._model_proxy._model = ModelCollection.from_dict(descr['model']) + # for model in self.parent._model_proxy._model: + # for sample in model.sample: + # for layer in sample.layers: + # materials_in_model.append(layer.material) + # model.interface = self.parent._interface + + + # mats = descr['materials_not_in_model'] + # mats['populate_if_none'] = False + # if not mats['data']: + # mats['data'] = None + # material_collection = MaterialCollection.from_dict(mats) + # for material in materials_in_model: + # if material not in material_collection: + # material_collection.append(material) + # self.parent._material_proxy._materials = material_collection + + # # experiment + # if 'experiments' in descr: + # #self.parent._data_proxy.experimentLoaded = True + # for i, e in enumerate(descr['experiments']): + # x = np.array(e[0]) + # y = np.array(e[1]) + # ye = np.array(e[2]) + # if len(e) == 4: + # xe = np.array(e[3]) + # else: + # xe = np.zeros_like(ye) + # name = descr['experiments_names'][i] + # model_name = descr['experiments_models'][i] + # model = None + # for i in self.parent._model_proxy._model: + # if i.name == model_name: + # model = i + # break + # ds = DataSet1D(name=name, x=x, y=y, ye=ye, xe=xe, + # model=model, + # x_label='q (1/angstrom)', + # y_label='Reflectivity') + # self.parent._data_proxy._data.append(ds) + + # self.parent._data_proxy.experimentLoaded = True + # self.parent._data_proxy.experimentSkipped = False + # self.parent._data_proxy.experimentChanged.emit() + # self.parent._parameter_proxy._onParametersChanged() + + # else: + # # delete existing experiment + # try: + # for index, data in enumerate(self.parent.data): + # data.removeExperiment(index) + # except TypeError: + # pass + # self.parent._data_proxy.experimentLoaded = False + # if descr['experiment_skipped']: + # self.parent._data_proxy.experimentSkipped = True + # self.parent._data_proxy.experimentSkippedChanged.emit() + # else: + # self.parent._data_proxy.experimentSkipped = False + + # # project info + # self.projectInfoAsJson = json.dumps(descr['project_info']) + # self.parent.sampleChanged.emit() + + # new_minimizer_settings = descr.get('minimizer', None) + # if new_minimizer_settings is not None: + # new_engine = new_minimizer_settings['engine'] + # new_method = new_minimizer_settings['method'] + # new_engine_index = self.parent._minimizer_proxy.minimizerNames.index(new_engine) + # self.currentMinimizerIndex = new_engine_index + # try: + # new_method_index = self.parent._minimizer_proxy.minimizerNames.index(new_method) + # except ValueError: + # new_method_index = self.parent._minimizer_proxy.minimizerNames[0] + # self.currentMinimizerMethodIndex = new_method_index + + # self.parent._undoredo_proxy.resetUndoRedoStack() + + # self.projectCreated = True @staticmethod def createFile(path, content): @@ -355,9 +409,11 @@ def saveReport(self, filepath): def resetProject(self): self._project_created = False - self._project_info = self._defaultProjectInfo() - self.parent._model_proxy._setModelsAsXml() + self._project.reset() + self.parent._model_proxy._model = self._project._models +# self.parent._model_proxy._setModelsAsXml() self.projectInfoChanged.emit() + self.parent.sampleChanged.emit() @Slot(str, float, float) def savePlot(self, filename: str, figsize_x: float, figsize_y: float): From 61ccb47e70caa2f7acc74a754989b5a50e196aa8 Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Mon, 30 Sep 2024 12:14:06 +0200 Subject: [PATCH 2/5] pyproject --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index f9c1b9e2..c4405c52 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,7 +31,7 @@ classifiers = [ requires-python = ">=3.9, <3.11" dependencies = [ 'darkdetect>=0.3.1', - 'easyreflectometry @ git+https://github.com/EasyScience/EasyReflectometryLib.git@develop', + 'easyreflectometry @ git+https://github.com/EasyScience/EasyReflectometryLib.git@181-extract-functionalit-for-creating-and-manipulating-a-project-should-be-moved-from-the-app-to-the-lib ', 'easyApp @ git+https://github.com/easyScience/easyApp.git@pyside2', 'scipy<1.14', 'toml>=0.10.2', From 050769deff3242d8b5e561a2208b05b81e6c79d8 Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Mon, 30 Sep 2024 14:03:41 +0200 Subject: [PATCH 3/5] code cleaning --- EasyReflectometryApp/Logic/Proxies/Project.py | 270 +----------------- .../Logic/Proxies/Simulation.py | 41 +-- 2 files changed, 32 insertions(+), 279 deletions(-) diff --git a/EasyReflectometryApp/Logic/Proxies/Project.py b/EasyReflectometryApp/Logic/Proxies/Project.py index c702ef79..eae1ab30 100644 --- a/EasyReflectometryApp/Logic/Proxies/Project.py +++ b/EasyReflectometryApp/Logic/Proxies/Project.py @@ -1,7 +1,6 @@ __author__ = 'github.com/arm61' import os -#import datetime import json from PySide2.QtCore import QObject @@ -13,13 +12,9 @@ import matplotlib.gridspec as gridspec import numpy as np -#from easyscience import global_object from easyApp.Logic.Utils.Utils import generalizePath -#from easyreflectometry.sample import MaterialCollection -#from easyreflectometry.model import ModelCollection from easyreflectometry import Project -#from ..DataStore import DataSet1D class ProjectProxy(QObject): dummySignal = Signal() @@ -33,25 +28,8 @@ def __init__(self, parent=None): self._project = Project() self._project_created = False -# self._project_info = self._defaultProjectInfo() -# self.project_save_filepath = "" -# self._currentProjectPath = os.path.expanduser('~') - self._report = "" - # # # - # Defaults - # # # - - # def _defaultProjectInfo(self): - # return dict( - # name="Example Project", - # # location=os.path.join(os.path.expanduser("~"), "Example Project"), - # short_description="reflectometry, 1D", - # samples="None", - # experiments="None", - # modified=datetime.datetime.now().strftime("%d.%m.%Y %H:%M")) - # # # # Setters and getters # # # @@ -70,11 +48,9 @@ def projectCreated(self, created: bool): @Property('QVariant', notify=projectInfoChanged) def projectInfoAsJson(self): return self._project._info -# return self._project_info @projectInfoAsJson.setter def projectInfoAsJson(self, json_str): -# self._project_info = json.loads(json_str) self._project._info = json.loads(json_str) self.projectInfoChanged.emit() @@ -91,13 +67,9 @@ def projectInfoAsCif(self): @Slot(str, str) def editProjectInfo(self, key, value): if key == 'location': - self._project.current_path = value -# self.currentProjectPath = value + self._project.project_path = value return else: - # if self._project_info[key] == value: - # return - # self._project_info[key] = value if self._project._info[key] == value: return self._project._info[key] = value @@ -105,17 +77,13 @@ def editProjectInfo(self, key, value): @Property(str, notify=projectInfoChanged) def currentProjectPath(self): -# return self._currentProjectPath - return str(self._project.current_path) + return str(self._project.project_path) @currentProjectPath.setter def currentProjectPath(self, new_path): - if self._project.current_path == new_path: + if self._project.project_path == new_path: return - self._project.current_path = new_path - # if self._currentProjectPath == new_path: - # return - # self._currentProjectPath = new_path + self._project.project_path = new_path self.projectInfoChanged.emit() # # # @@ -126,17 +94,10 @@ def currentProjectPath(self, new_path): def createProject(self): self._project.create_project_dir() self._project.default_model() - self._relayCreated() + self._relayProjectChange() self.saveProject() - # self.parent._model_proxy._model = self._project._models - # self.parent._material_proxy._materials = self._project._materials - # self._project_created = True - - # self.projectCreatedChanged.emit() - # self.parent.sampleChanged.emit() - # self.parent._state_proxy.stateChanged.emit(False) - def _relayCreated(self): + def _relayProjectChange(self): self.parent._model_proxy._model = self._project._models self.parent._material_proxy._materials = self._project._materials self._project_created = True @@ -145,234 +106,24 @@ def _relayCreated(self): self.parent.sampleChanged.emit() self.parent._state_proxy.stateChanged.emit(False) - - # projectPath = self.currentProjectPath - # mainCif = os.path.join(projectPath, 'project.cif') - # samplesPath = os.path.join(projectPath, 'samples') - # experimentsPath = os.path.join(projectPath, 'experiments') - # calculationsPath = os.path.join(projectPath, 'calculations') - # if not os.path.exists(projectPath): - # os.makedirs(projectPath) - # os.makedirs(samplesPath) - # os.makedirs(experimentsPath) - # os.makedirs(calculationsPath) - # with open(mainCif, 'w') as file: - # file.write(self.projectInfoAsCif) - # else: - # print(f"ERROR: Directory {projectPath} already exists") - - - @Slot(str) def loadProjectAs(self, filepath): -# self._loadProjectAs(filepath) self._project.load_project_json(generalizePath(filepath)) - self._relayCreated() - # self.parent._model_proxy._model = self._project._models - # self.parent._material_proxy._materials = self._project._materials - # self._project_created = True - - # self.projectCreatedChanged.emit() - # self.parent._state_proxy.stateChanged.emit(False) - # self.parent.sampleChanged.emit() + self._relayProjectChange() @Slot() def loadProject(self): -# self._loadProject() self._project.load_project_json() - self._relayCreated() - # self.parent._model_proxy._model = self._project._models - # self.parent._material_proxy._materials = self._project._materials - # self._project_created = True - - # self.projectCreatedChanged.emit() - # self.parent._state_proxy.stateChanged.emit(False) - # self.parent.sampleChanged.emit() + self._relayProjectChange() @Slot() def saveProject(self): self._project.save_project_json() -# self._saveProject() self.parent._state_proxy.stateChanged.emit(False) @Property(str, notify=dummySignal) def projectFilePath(self): - return self._project.path_project_json -# return self.project_save_filepath - - # def _saveProject(self): - # """ - # """ - # projectPath = self.currentProjectPath - # project_save_filepath = os.path.join(projectPath, 'project.json') - # materials_in_model = [] - # for model in self.parent._model_proxy._model: - # for assembly in model.sample: - # for layer in assembly.layers: - # materials_in_model.append(layer.material) - # materials_not_in_model = [] - # for material in self.parent._material_proxy._materials: - # if material not in materials_in_model: - # materials_not_in_model.append(material) - # descr = { - # 'model': - # self.parent._model_proxy._model.as_dict(skip=['interface']), - # 'materials_not_in_model': - # MaterialCollection(materials_not_in_model).as_dict(skip=['interface']) - # } - - # if self.parent._data_proxy._data.experiments: - # descr['experiments'] = [] - # descr['experiments_models'] = [] - # descr['experiments_names'] = [] - # for experiment in self.parent._data_proxy._data.experiments: - # if self.parent._data_proxy._data.experiments[0].xe is not None: - # descr['experiments'].append([ - # experiment.x, experiment.y, experiment.ye, experiment.xe - # ]) - # else: - # descr['experiments'].append([experiment.x, experiment.y, experiment.ye]) - # descr['experiments_models'].append(experiment.model.name) - # descr['experiments_names'].append(experiment.name) - - # descr['experiment_skipped'] = self.parent._data_proxy._experiment_skipped - # descr['project_info'] = self._project_info - - # descr['interface'] = [self.parent._interface.current_interface_name] - - # descr['colors'] = self.parent._model_proxy._colors - - # descr['minimizer'] = { - # 'engine': self.parent._fitter_proxy.eFitter.easy_f.minimizer.name, - # 'method': self.parent._minimizer_proxy._current_minimizer_method_name - # } - - # content_json = json.dumps(descr, indent=4, default=self.default) - # path = generalizePath(project_save_filepath) - # self.createFile(path, content_json) - - # def default(self, obj): - # if type(obj).__module__ == np.__name__: - # if isinstance(obj, np.ndarray): - # return obj.tolist() - # else: - # return obj.item() - # raise TypeError('Unknown type:', type(obj)) - - # def _loadProjectAs(self, filepath): - # """ - # """ - # self.project_load_filepath = filepath - # print("LoadProjectAs " + filepath) - # self.loadProject() - - # def _loadProject(self): - # """ - # """ - # path = generalizePath(self.project_load_filepath) - # if not os.path.isfile(path): - # print("Failed to find project: '{0}'".format(path)) - # return - # self.currentProjectPath = os.path.split(path)[0] - # with open(path, 'r') as xml_file: - # descr: dict = json.load(xml_file) - - # self.parent._model_proxy._model = None - # self.parent._material_proxy._materials = None - # self.parent._model_proxy._colors = None - # materials_in_model = [] - - # global_object.map._clear() - - # interface_name = descr.get('interface', None) - # for i, inter in enumerate(interface_name): - # if inter is not None: - # old_interface_name = self.parent._interface.current_interface_name - # if old_interface_name != inter: - # self.parent._interface.switch(inter) - - # self.parent._model_proxy._colors = descr['colors'] - - # self.parent._model_proxy._model = ModelCollection.from_dict(descr['model']) - # for model in self.parent._model_proxy._model: - # for sample in model.sample: - # for layer in sample.layers: - # materials_in_model.append(layer.material) - # model.interface = self.parent._interface - - - # mats = descr['materials_not_in_model'] - # mats['populate_if_none'] = False - # if not mats['data']: - # mats['data'] = None - # material_collection = MaterialCollection.from_dict(mats) - # for material in materials_in_model: - # if material not in material_collection: - # material_collection.append(material) - # self.parent._material_proxy._materials = material_collection - - # # experiment - # if 'experiments' in descr: - # #self.parent._data_proxy.experimentLoaded = True - # for i, e in enumerate(descr['experiments']): - # x = np.array(e[0]) - # y = np.array(e[1]) - # ye = np.array(e[2]) - # if len(e) == 4: - # xe = np.array(e[3]) - # else: - # xe = np.zeros_like(ye) - # name = descr['experiments_names'][i] - # model_name = descr['experiments_models'][i] - # model = None - # for i in self.parent._model_proxy._model: - # if i.name == model_name: - # model = i - # break - # ds = DataSet1D(name=name, x=x, y=y, ye=ye, xe=xe, - # model=model, - # x_label='q (1/angstrom)', - # y_label='Reflectivity') - # self.parent._data_proxy._data.append(ds) - - # self.parent._data_proxy.experimentLoaded = True - # self.parent._data_proxy.experimentSkipped = False - # self.parent._data_proxy.experimentChanged.emit() - # self.parent._parameter_proxy._onParametersChanged() - - # else: - # # delete existing experiment - # try: - # for index, data in enumerate(self.parent.data): - # data.removeExperiment(index) - # except TypeError: - # pass - # self.parent._data_proxy.experimentLoaded = False - # if descr['experiment_skipped']: - # self.parent._data_proxy.experimentSkipped = True - # self.parent._data_proxy.experimentSkippedChanged.emit() - # else: - # self.parent._data_proxy.experimentSkipped = False - - # # project info - # self.projectInfoAsJson = json.dumps(descr['project_info']) - # self.parent.sampleChanged.emit() - - # new_minimizer_settings = descr.get('minimizer', None) - # if new_minimizer_settings is not None: - # new_engine = new_minimizer_settings['engine'] - # new_method = new_minimizer_settings['method'] - # new_engine_index = self.parent._minimizer_proxy.minimizerNames.index(new_engine) - # self.currentMinimizerIndex = new_engine_index - # try: - # new_method_index = self.parent._minimizer_proxy.minimizerNames.index(new_method) - # except ValueError: - # new_method_index = self.parent._minimizer_proxy.minimizerNames[0] - # self.currentMinimizerMethodIndex = new_method_index - - # self.parent._undoredo_proxy.resetUndoRedoStack() - - # self.projectCreated = True + return self._project.path_json @staticmethod def createFile(path, content): @@ -410,8 +161,9 @@ def saveReport(self, filepath): def resetProject(self): self._project_created = False self._project.reset() + self._relayProjectChange() + self.parent._model_proxy._model = self._project._models -# self.parent._model_proxy._setModelsAsXml() self.projectInfoChanged.emit() self.parent.sampleChanged.emit() diff --git a/EasyReflectometryApp/Logic/Proxies/Simulation.py b/EasyReflectometryApp/Logic/Proxies/Simulation.py index 756ac01d..b8b376c8 100644 --- a/EasyReflectometryApp/Logic/Proxies/Simulation.py +++ b/EasyReflectometryApp/Logic/Proxies/Simulation.py @@ -177,26 +177,27 @@ def _updateCalculatedData(self): self.parent._plotting_1d_proxy.setPureData(x, self.parent._model_proxy.getPureModelReflectometry(x)) sld_profile = self.parent._model_proxy._pure.interface.sld_profile(self.parent._model_proxy._pure.unique_name) self.parent._plotting_1d_proxy.setSampleSldData(*sld_profile) - - to_use = self.parent._model_proxy._model[self.parent._model_proxy.currentModelIndex] - if self.parent._data_proxy.experimentLoaded: - exp = self.parent._data_proxy._data.experiments[self.parent._data_proxy.currentDataIndex] - x = exp.x - to_use = self.parent._data_proxy._data[self.parent._data_proxy.currentDataIndex].model - - y = self.parent._interface.fit_func(x, to_use.unique_name) - if self._plot_rq4: - y *= (x ** 4) - sld_profile = self.parent._interface.sld_profile(to_use.unique_name) - - self.parent._plotting_1d_proxy.setCalculatedData(x, y) - bkg = np.empty(x.size) - bkg.fill(to_use.background.value) - self.parent._plotting_1d_proxy.setBackgroundData(x, bkg) - scale = np.empty(x.size) - scale.fill(to_use.scale.value) - self.parent._plotting_1d_proxy.setScaleData(x, scale) - self.parent._plotting_1d_proxy.setAnalysisSldData(*sld_profile) + + if self.parent._model_proxy.currentModelIndex < len(self.parent._model_proxy._model): + to_use = self.parent._model_proxy._model[self.parent._model_proxy.currentModelIndex] + if self.parent._data_proxy.experimentLoaded: + exp = self.parent._data_proxy._data.experiments[self.parent._data_proxy.currentDataIndex] + x = exp.x + to_use = self.parent._data_proxy._data[self.parent._data_proxy.currentDataIndex].model + + y = self.parent._interface.fit_func(x, to_use.unique_name) + if self._plot_rq4: + y *= (x ** 4) + sld_profile = self.parent._interface.sld_profile(to_use.unique_name) + + self.parent._plotting_1d_proxy.setCalculatedData(x, y) + bkg = np.empty(x.size) + bkg.fill(to_use.background.value) + self.parent._plotting_1d_proxy.setBackgroundData(x, bkg) + scale = np.empty(x.size) + scale.fill(to_use.scale.value) + self.parent._plotting_1d_proxy.setScaleData(x, scale) + self.parent._plotting_1d_proxy.setAnalysisSldData(*sld_profile) def resetSimulation(self): self._background_as_obj = self._defaultBackground() From 1827b30289c1f77b207562770d43dc735c32c4ea Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Tue, 1 Oct 2024 08:36:08 +0200 Subject: [PATCH 4/5] from project_path to path, update projectInfo on load --- EasyReflectometryApp/Logic/Proxies/Project.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/EasyReflectometryApp/Logic/Proxies/Project.py b/EasyReflectometryApp/Logic/Proxies/Project.py index eae1ab30..a84c6d78 100644 --- a/EasyReflectometryApp/Logic/Proxies/Project.py +++ b/EasyReflectometryApp/Logic/Proxies/Project.py @@ -67,7 +67,7 @@ def projectInfoAsCif(self): @Slot(str, str) def editProjectInfo(self, key, value): if key == 'location': - self._project.project_path = value + self._project.path = value return else: if self._project._info[key] == value: @@ -77,13 +77,13 @@ def editProjectInfo(self, key, value): @Property(str, notify=projectInfoChanged) def currentProjectPath(self): - return str(self._project.project_path) + return str(self._project.path) @currentProjectPath.setter def currentProjectPath(self, new_path): - if self._project.project_path == new_path: + if self._project.path == new_path: return - self._project.project_path = new_path + self._project.path = new_path self.projectInfoChanged.emit() # # # @@ -110,6 +110,7 @@ def _relayProjectChange(self): def loadProjectAs(self, filepath): self._project.load_project_json(generalizePath(filepath)) self._relayProjectChange() + self.projectInfoChanged.emit() @Slot() def loadProject(self): From 0dc7508ce22f1f69728f36f10abb2a4c9e022dd3 Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Tue, 1 Oct 2024 12:14:56 +0200 Subject: [PATCH 5/5] pyproject --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index c4405c52..f9c1b9e2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,7 +31,7 @@ classifiers = [ requires-python = ">=3.9, <3.11" dependencies = [ 'darkdetect>=0.3.1', - 'easyreflectometry @ git+https://github.com/EasyScience/EasyReflectometryLib.git@181-extract-functionalit-for-creating-and-manipulating-a-project-should-be-moved-from-the-app-to-the-lib ', + 'easyreflectometry @ git+https://github.com/EasyScience/EasyReflectometryLib.git@develop', 'easyApp @ git+https://github.com/easyScience/easyApp.git@pyside2', 'scipy<1.14', 'toml>=0.10.2',