From 778de3c8d31996cb7b8ed9dbd5487d3c1216c9fe Mon Sep 17 00:00:00 2001 From: Piotr Rozyczko Date: Thu, 25 May 2023 14:18:48 +0200 Subject: [PATCH 1/7] some fixes related to model add/remove --- .../Gui/Pages/Sample/SurfactantTable.qml | 4 ++-- EasyReflectometryApp/Logic/Proxies/Fitter.py | 3 ++- .../Logic/Proxies/Material.py | 1 + EasyReflectometryApp/Logic/Proxies/Model.py | 23 +++++++++++++++---- .../Logic/Proxies/Simulation.py | 4 +++- EasyReflectometryApp/Logic/PyQmlProxy.py | 5 ++-- 6 files changed, 28 insertions(+), 12 deletions(-) diff --git a/EasyReflectometryApp/Gui/Pages/Sample/SurfactantTable.qml b/EasyReflectometryApp/Gui/Pages/Sample/SurfactantTable.qml index a69c110d..0b82ee4e 100644 --- a/EasyReflectometryApp/Gui/Pages/Sample/SurfactantTable.qml +++ b/EasyReflectometryApp/Gui/Pages/Sample/SurfactantTable.qml @@ -69,7 +69,7 @@ EaComponents.TableView { width: EaStyle.Sizes.fontPixelSize * 4.5 headerText: "Solvation" enabled: model.solvation_enabled == "True" - text: (isNaN(surfactantModel.solvation)) ? '--' : surfactantModel.solvation.toFixed(2) + text: (isNaN(surfactantModel.solvation)) ? '--' : surfactantModel.solvation onEditingFinished: ExGlobals.Constants.proxy.model.setCurrentLayersSolvation(text) } @@ -79,7 +79,7 @@ EaComponents.TableView { width: EaStyle.Sizes.fontPixelSize * 4.0 headerText: "APM/Å2" enabled: model.apm_enabled == "True" - text: (isNaN(surfactantModel.apm)) ? '--' : surfactantModel.apm.toFixed(2) + text: (isNaN(surfactantModel.apm)) ? '--' : surfactantModel.apm onEditingFinished: ExGlobals.Constants.proxy.model.setCurrentItemApm(text) } diff --git a/EasyReflectometryApp/Logic/Proxies/Fitter.py b/EasyReflectometryApp/Logic/Proxies/Fitter.py index 03b4b919..7a1d579a 100644 --- a/EasyReflectometryApp/Logic/Proxies/Fitter.py +++ b/EasyReflectometryApp/Logic/Proxies/Fitter.py @@ -185,6 +185,7 @@ def stop_fit(self): self._fitter_thread.stop() def _onSampleChanged(self): - self.sampleChanged.emit() + print(">>> Sample changed") + self.sampleChanged.emit() # this signal has no slots! \ No newline at end of file diff --git a/EasyReflectometryApp/Logic/Proxies/Material.py b/EasyReflectometryApp/Logic/Proxies/Material.py index 38fd527f..6e25d654 100644 --- a/EasyReflectometryApp/Logic/Proxies/Material.py +++ b/EasyReflectometryApp/Logic/Proxies/Material.py @@ -75,6 +75,7 @@ def _setMaterialsAsXml(self): """ Sets the _materials_as_xml object. """ + print(">>> _setMaterialsAsXml") self._materials_as_xml = dicttoxml(self.materialsAsObj).decode() self.materialsAsXmlChanged.emit() diff --git a/EasyReflectometryApp/Logic/Proxies/Model.py b/EasyReflectometryApp/Logic/Proxies/Model.py index defabcc8..cb9911f3 100644 --- a/EasyReflectometryApp/Logic/Proxies/Model.py +++ b/EasyReflectometryApp/Logic/Proxies/Model.py @@ -102,10 +102,10 @@ def modelColor(self): @Property(str, notify=modelsAsXmlChanged) def modelsAsXml(self): - print('>>> itemsAsXml') return self._models_as_xml def _setModelsAsXml(self): + print('>>> _setModelsAsXml') self._models_as_xml = dicttoxml(self.modelsAsObj).decode() self.modelsAsXmlChanged.emit() @@ -137,7 +137,6 @@ def itemsAsObj(self): @Property(str, notify=itemsAsXmlChanged) def itemsAsXml(self): - print('>>> itemsAsXml') return self._items_as_xml def _setItemsAsXml(self): @@ -160,7 +159,6 @@ def layersAsObj(self): @Property(str, notify=layersAsXmlChanged) def layersAsXml(self): - print('>>> layersAsXml') return self._layers_as_xml def _setLayersAsXml(self): @@ -294,19 +292,25 @@ def currentModelIndex(self): @currentModelIndex.setter def currentModelIndex(self, new_index: int): + print('>>> currentModelIndex: ', new_index) if self._current_model_index == new_index or new_index == -1: return + print('>>> currentModelIndex new_index: ', new_index) + if new_index >= len(self._model): + return self._current_model_index = new_index self._onItemsChanged() self._onLayersChanged() self.modelsNameChanged.emit() - self.parent.sampleChanged.emit() # # # # Actions # # # def _onItemsChanged(self): + print('>>> _onItemsChanged') + if self.currentModelIndex >= len(self._model): + return for i in self._model[self.currentModelIndex].structure: for j in i.layers: if i.type == 'Surfactant Layer': @@ -317,6 +321,9 @@ def _onItemsChanged(self): self._setModelsAsXml() def _onLayersChanged(self): + print('>>> _onLayersChanged') + if self.currentModelIndex >= len(self._model): + return for i in self._model[self.currentModelIndex].structure: for j in i.layers: if i.type == 'Surfactant Layer': @@ -401,6 +408,9 @@ def removeModels(self, i: str): """ self._model.remove_model(int(i)) del self._colors[int(i)] + # watch out for gremlins + if self.currentModelIndex == int(i): + self.currentModelIndex = 0 self.modelsNameChanged.emit() self.parent.sampleChanged.emit() @@ -411,6 +421,7 @@ def setCurrentModelsName(self, name): :param sld: New name :type sld: str """ + print('>>> setCurrentModelsName: ', name) if self._model[self.currentModelIndex].name == name: return self._model[self.currentModelIndex].name = name @@ -419,7 +430,9 @@ def setCurrentModelsName(self, name): @Property(str, notify=modelsNameChanged) def currentModelsName(self): - return self._model[self.currentModelIndex].name + if self.currentModelIndex >= len(self._model): + return '' + return self._model[self.currentModelIndex].name # # Items diff --git a/EasyReflectometryApp/Logic/Proxies/Simulation.py b/EasyReflectometryApp/Logic/Proxies/Simulation.py index c2f111f6..16e18824 100644 --- a/EasyReflectometryApp/Logic/Proxies/Simulation.py +++ b/EasyReflectometryApp/Logic/Proxies/Simulation.py @@ -147,9 +147,11 @@ def _setExperimentalData(self): # self.parent._project_proxy.projectInfoChanged.emit() def _onCalculatedDataChanged(self): + print('>>> _onCalculatedDataChanged') self._updateCalculatedData() def _onSimulationParametersChanged(self): + print('>>> _onSimulationParametersChanged') self.calculatedDataChanged.emit() # # # @@ -157,7 +159,7 @@ def _onSimulationParametersChanged(self): # # # def _updateCalculatedData(self): - + print('>>> _updateCalculatedData') # if not self.experimentLoaded:# and not self.experimentSkipped: # return diff --git a/EasyReflectometryApp/Logic/PyQmlProxy.py b/EasyReflectometryApp/Logic/PyQmlProxy.py index 5e54547d..981f4f76 100644 --- a/EasyReflectometryApp/Logic/PyQmlProxy.py +++ b/EasyReflectometryApp/Logic/PyQmlProxy.py @@ -64,11 +64,10 @@ def __init__(self, parent=None): self.sampleChanged.connect(self._material_proxy._setMaterialsAsXml) self.sampleChanged.connect(self._model_proxy._onLayersChanged) self.sampleChanged.connect(self._model_proxy._onItemsChanged) - self.sampleChanged.connect( - self._simulation_proxy._onSimulationParametersChanged) + self.sampleChanged.connect(self._parameter_proxy._onParametersChanged) self.layersChanged.connect(self._fitter_proxy._onSampleChanged) - self.sampleChanged.connect(self._simulation_proxy._onCalculatedDataChanged) + self.sampleChanged.connect(self._simulation_proxy._onCalculatedDataChanged) # calls _updateCalculatedData self.sampleChanged.connect(self._undoredo_proxy.undoRedoChanged) # Screen recorder From 1390393a6e841c151eb7e07c73f36541acb04849 Mon Sep 17 00:00:00 2001 From: Piotr Rozyczko Date: Tue, 30 May 2023 12:30:29 +0200 Subject: [PATCH 2/7] xmltodict -> XMLSerializer + other assorted fixes --- .../Gui/Components/AnalysisFitables.qml | 2 +- .../Gui/Components/ApplicationWindow.qml | 2 +- .../Gui/Pages/Sample/MultiLayerTable.qml | 3 +- .../Gui/Pages/Sample/SideBarAdvanced.qml | 4 +- .../Gui/Pages/Sample/SideBarBasic.qml | 8 ++-- EasyReflectometryApp/Logic/Proxies/Fitter.py | 2 - .../Logic/Proxies/Material.py | 5 +-- EasyReflectometryApp/Logic/Proxies/Model.py | 40 ++++++++++++------- .../Logic/Proxies/Parameter.py | 11 +++-- EasyReflectometryApp/Logic/Proxies/State.py | 9 ++--- EasyReflectometryApp/Logic/PyQmlProxy.py | 4 ++ 11 files changed, 52 insertions(+), 38 deletions(-) diff --git a/EasyReflectometryApp/Gui/Components/AnalysisFitables.qml b/EasyReflectometryApp/Gui/Components/AnalysisFitables.qml index 30fedc20..a5259b12 100644 --- a/EasyReflectometryApp/Gui/Components/AnalysisFitables.qml +++ b/EasyReflectometryApp/Gui/Components/AnalysisFitables.qml @@ -25,7 +25,7 @@ EaComponents.TableView { //xml: ExGlobals.Constants.proxy.fitablesListAsXml xml: ExGlobals.Constants.proxy.parameter.parametersAsXml - query: "/root/item" + query: "/data/item" XmlRole { name: "id"; query: "id/string()" } XmlRole { name: "number"; query: "number/number()" } diff --git a/EasyReflectometryApp/Gui/Components/ApplicationWindow.qml b/EasyReflectometryApp/Gui/Components/ApplicationWindow.qml index d9974502..90dbfe46 100644 --- a/EasyReflectometryApp/Gui/Components/ApplicationWindow.qml +++ b/EasyReflectometryApp/Gui/Components/ApplicationWindow.qml @@ -335,7 +335,7 @@ EaComponents.ApplicationWindow { model: XmlListModel { xml: ExGlobals.Constants.proxy.state.statusModelAsXml - query: "/root/item" + query: "/data/item" XmlRole { name: "label"; query: "label/string()" } XmlRole { name: "value"; query: "value/string()" } diff --git a/EasyReflectometryApp/Gui/Pages/Sample/MultiLayerTable.qml b/EasyReflectometryApp/Gui/Pages/Sample/MultiLayerTable.qml index 16fd5bf6..b59bcf63 100644 --- a/EasyReflectometryApp/Gui/Pages/Sample/MultiLayerTable.qml +++ b/EasyReflectometryApp/Gui/Pages/Sample/MultiLayerTable.qml @@ -17,7 +17,8 @@ EaComponents.TableView { property int layersIndex: ExGlobals.Constants.proxy.model.currentLayersIndex + 1 xml: ExGlobals.Constants.proxy.model.layersAsXml - query: `/root/item[${itemsTable.currentIndex + 1}]/layers/item` + // query: `/root/item[${itemsTable.currentIndex + 1}]/layers/item` + query: `/data/item/layers` XmlRole { name: "thick"; query: "thickness/value/number()" } XmlRole { name: "rough"; query: "roughness/value/number()" } diff --git a/EasyReflectometryApp/Gui/Pages/Sample/SideBarAdvanced.qml b/EasyReflectometryApp/Gui/Pages/Sample/SideBarAdvanced.qml index 0cc00e70..f6e770fb 100644 --- a/EasyReflectometryApp/Gui/Pages/Sample/SideBarAdvanced.qml +++ b/EasyReflectometryApp/Gui/Pages/Sample/SideBarAdvanced.qml @@ -123,7 +123,7 @@ EaComponents.SideBarColumn { textRole: ExGlobals.Variables.iconifiedNames ? "iconified_label" : "label" model: XmlListModel { xml: ExGlobals.Constants.proxy.parameter.parametersAsXml - query: "/root/item" + query: "/data/item" XmlRole { name: "label"; query: "label/string()" } onXmlChanged: dependentParCurrentIndex = dependentPar.currentIndex } @@ -160,7 +160,7 @@ EaComponents.SideBarColumn { textRole: ExGlobals.Variables.iconifiedNames ? "iconified_label" : "label" model: XmlListModel { xml: ExGlobals.Constants.proxy.parameter.parametersAsXml - query: "/root/item" + query: "/data/item" XmlRole { name: "label"; query: "label/string()" } // XmlRole { name: "iconified_label"; query: "iconified_label_with_index/string()" } onXmlChanged: independentParCurrentIndex = independentPar.currentIndex diff --git a/EasyReflectometryApp/Gui/Pages/Sample/SideBarBasic.qml b/EasyReflectometryApp/Gui/Pages/Sample/SideBarBasic.qml index f1f87857..5c6bc416 100644 --- a/EasyReflectometryApp/Gui/Pages/Sample/SideBarBasic.qml +++ b/EasyReflectometryApp/Gui/Pages/Sample/SideBarBasic.qml @@ -34,7 +34,7 @@ EaComponents.SideBarColumn { property int materialsIndex: ExGlobals.Constants.proxy.material.currentMaterialsIndex + 1 xml: ExGlobals.Constants.proxy.material.materialsAsXml - query: "/root/item" + query: "/data/item" XmlRole { name: "color"; query: "color/string()" } XmlRole { name: "label"; query: "name/string()" } @@ -176,7 +176,8 @@ EaComponents.SideBarColumn { // property int itemsIndex: ExGlobals.Constants.proxy.model.currentItemsIndex + 1 xml: ExGlobals.Constants.proxy.model.modelsAsXml - query: "/root/item" + // query: "/root/item" + query: "/data/item" XmlRole { name: "color"; query: "color/string()" } XmlRole { name: "label"; query: "name/string()" } @@ -292,7 +293,8 @@ EaComponents.SideBarColumn { property int itemsIndex: ExGlobals.Constants.proxy.model.currentItemsIndex + 1 xml: ExGlobals.Constants.proxy.model.itemsAsXml - query: "/root/item" + // query: "/root/item" + query: "/data/item" XmlRole { name: "label"; query: "name/string()" } XmlRole { name: "type"; query: "type/string()" } diff --git a/EasyReflectometryApp/Logic/Proxies/Fitter.py b/EasyReflectometryApp/Logic/Proxies/Fitter.py index 7a1d579a..39b38d3c 100644 --- a/EasyReflectometryApp/Logic/Proxies/Fitter.py +++ b/EasyReflectometryApp/Logic/Proxies/Fitter.py @@ -1,8 +1,6 @@ __author__ = 'github.com/arm61' import sys -from dicttoxml import dicttoxml -from distutils.util import strtobool from PySide2.QtCore import Signal, QThread, QObject, Property, Slot diff --git a/EasyReflectometryApp/Logic/Proxies/Material.py b/EasyReflectometryApp/Logic/Proxies/Material.py index 6e25d654..6d452c22 100644 --- a/EasyReflectometryApp/Logic/Proxies/Material.py +++ b/EasyReflectometryApp/Logic/Proxies/Material.py @@ -1,12 +1,11 @@ __author__ = 'github.com/arm61' -from dicttoxml import dicttoxml - from matplotlib import cm, colors from PySide2.QtCore import QObject, Signal, Property, Slot from easyCore import borg +from easyCore.Utils.io.xml import XMLSerializer from EasyReflectometry.sample.material import Material from EasyReflectometry.sample.materials import Materials @@ -76,7 +75,7 @@ def _setMaterialsAsXml(self): Sets the _materials_as_xml object. """ print(">>> _setMaterialsAsXml") - self._materials_as_xml = dicttoxml(self.materialsAsObj).decode() + self._materials_as_xml = XMLSerializer().encode({"item":self.materialsAsObj}, data_only=True) self.materialsAsXmlChanged.emit() @Property(list, notify=materialsChanged) diff --git a/EasyReflectometryApp/Logic/Proxies/Model.py b/EasyReflectometryApp/Logic/Proxies/Model.py index cb9911f3..bd689794 100644 --- a/EasyReflectometryApp/Logic/Proxies/Model.py +++ b/EasyReflectometryApp/Logic/Proxies/Model.py @@ -1,11 +1,11 @@ __author__ = 'github.com/arm61' from ast import Mult -from dicttoxml import dicttoxml from PySide2.QtCore import QObject, Signal, Property, Slot from easyCore import np, borg +from easyCore.Utils.io.xml import XMLSerializer from easyCore.Utils.UndoRedo import property_stack_deco from EasyReflectometry.sample.layer import Layer @@ -106,7 +106,7 @@ def modelsAsXml(self): def _setModelsAsXml(self): print('>>> _setModelsAsXml') - self._models_as_xml = dicttoxml(self.modelsAsObj).decode() + self._models_as_xml = XMLSerializer().encode({"item":self.modelsAsObj}, data_only=True) self.modelsAsXmlChanged.emit() @Property(list, notify=modelsNameChanged) @@ -129,6 +129,8 @@ def itemsNamesConstrain(self): @property def itemsAsObj(self): _items_as_obj = [] + if self.currentModelIndex >= len(self._model): + return [] for i in self._model[self.currentModelIndex].structure: dictionary = {'name': i.name} dictionary['type'] = i.type @@ -140,7 +142,7 @@ def itemsAsXml(self): return self._items_as_xml def _setItemsAsXml(self): - self._items_as_xml = dicttoxml(self.itemsAsObj).decode() + self._items_as_xml = XMLSerializer().encode({"item":self.itemsAsObj}, data_only=True) self.itemsAsXmlChanged.emit() @property @@ -162,7 +164,7 @@ def layersAsXml(self): return self._layers_as_xml def _setLayersAsXml(self): - self._layers_as_xml = dicttoxml(self.layersAsObj).decode() + self._layers_as_xml = XMLSerializer().encode({"item":self.layersAsObj}, data_only=True) self.layersAsXmlChanged.emit() @Property(int, notify=itemsIndexChanged) @@ -179,6 +181,8 @@ def currentItemsIndex(self, new_index: int): @Property(int, notify=modelChanged) def currentItemsRepetitions(self): + if self.currentItemsIndex >= len(self._model[self.currentModelIndex].structure): + return 1 if self._model[self.currentModelIndex].structure[ self.currentItemsIndex].type != 'Repeating Multi-layer': return 1 @@ -198,6 +202,9 @@ def currentItemsRepetitions(self, new_repetitions: int): @Property(str, notify=modelChanged) def currentItemsType(self): + # sometimes in the process of removing an item, the model is not yet updated + if self.currentItemsIndex >= len(self._model[self.currentModelIndex].structure): + return '' return self._model[self.currentModelIndex].structure[self.currentItemsIndex].type @currentItemsType.setter @@ -409,10 +416,12 @@ def removeModels(self, i: str): self._model.remove_model(int(i)) del self._colors[int(i)] # watch out for gremlins - if self.currentModelIndex == int(i): - self.currentModelIndex = 0 - self.modelsNameChanged.emit() - self.parent.sampleChanged.emit() + # if self.currentModelIndex == int(i): + # self.currentModelIndex = 0 + # Are these two really necessary? + # self.modelsNameChanged.emit() + # self.parent.sampleChanged.emit() + self.itemsNameChanged.emit() # firing _onParametersChanged @Slot(str) def setCurrentModelsName(self, name): @@ -597,7 +606,10 @@ def setCurrentItemsName(self, name): @Property(str, notify=itemsNameChanged) def currentItemsName(self): - return self._model[self.currentModelIndex].structure[self.currentItemsIndex].name + # sometimes in the process of removing an item, the model is not yet updated + if self.currentItemsIndex >= len(self._model[self.currentModelIndex].structure): + return '' + return self._model[self.currentModelIndex].structure[self.currentItemsIndex].name # # Layers @@ -710,6 +722,7 @@ def removeLayers(self, i: str): :param i: Index of the layer :type i: str """ + print(">>> Removing layer: ", i) self._model[self.currentModelIndex].structure[0].layers[0].thickness.enabled = True self._model[self.currentModelIndex].structure[0].layers[0].roughness.enabled = True self._model[self.currentModelIndex].structure[-1].layers[-1].thickness.enabled = True @@ -827,17 +840,16 @@ def currentSurfactantSolventRoughness(self, x): self._model[self.currentModelIndex].structure[self.currentItemsIndex].constrain_solvent_roughness(solvent.roughness) self.parent.layersChanged.emit() - - # # # - # Calculations + # # # + # Calculations # # # def getPureModelReflectometry(self, x): return self._pure.interface.fit_func(x, self._pure.uid) - + def getPureModelSld(self): return self._pure.interface.sld_profile(self._pure.uid) def resetModel(self): self._structure = self._defaultStructure() - self._model = Models.from_pars(self._defaultModel(structure=self._structure, interface=self.parent._interface)) \ No newline at end of file + self._model = Models.from_pars(self._defaultModel(structure=self._structure, interface=self.parent._interface)) diff --git a/EasyReflectometryApp/Logic/Proxies/Parameter.py b/EasyReflectometryApp/Logic/Proxies/Parameter.py index 70e8528d..88938686 100644 --- a/EasyReflectometryApp/Logic/Proxies/Parameter.py +++ b/EasyReflectometryApp/Logic/Proxies/Parameter.py @@ -1,11 +1,10 @@ __author__ = 'github.com/arm61' from typing import Union -from dicttoxml import dicttoxml from distutils.util import strtobool from PySide2.QtCore import QObject, Signal, Property, Slot from easyCore.Fitting.Constraints import ObjConstraint, NumericConstraint, FunctionalConstraint - +from easyCore.Utils.io.xml import XMLSerializer from easyCore import borg from easyCore import np from easyCore.Utils.classTools import generatePath @@ -88,8 +87,7 @@ def parametersAsXml(self): return self._parameters_as_xml def _setParametersAsXml(self): - self._parameters_as_xml = dicttoxml(self._parameters_as_obj, - attr_type=False).decode() + self._parameters_as_xml = XMLSerializer().encode({"item":self._parameters_as_obj}, data_only=True) self.parametersAsXmlChanged.emit() @Slot(str) @@ -279,8 +277,9 @@ def constraintsList(self): @Property(str, notify=parametersAsObjChanged) def constraintsAsXml(self): - xml = dicttoxml(self.constraintsList(), attr_type=False) - xml = xml.decode() + # xml = dicttoxml(self.constraintsList(), attr_type=False) + xml = XMLSerializer().encode({"item":self.constraintsList()}, data_only=True) + # xml = xml.decode() return xml @Slot(int) diff --git a/EasyReflectometryApp/Logic/Proxies/State.py b/EasyReflectometryApp/Logic/Proxies/State.py index 063ade84..c06b8696 100644 --- a/EasyReflectometryApp/Logic/Proxies/State.py +++ b/EasyReflectometryApp/Logic/Proxies/State.py @@ -1,11 +1,9 @@ __author__ = 'github.com/arm61' -from dicttoxml import dicttoxml - from PySide2.QtCore import QObject, Signal, Property, Slot from easyCore import np - +from easyCore.Utils.io.xml import XMLSerializer class StateProxy(QObject): @@ -64,8 +62,9 @@ def statusModelAsXml(self): "value": f'{self.parent._fitter_proxy.eFitter.easy_f.current_engine.name} ({self.parent._minimizer_proxy._current_minimizer_method_name})' }] - xml = dicttoxml(model, attr_type=False) - xml = xml.decode() + # xml = dicttoxml(model, attr_type=False) + # xml = xml.decode() + xml = XMLSerializer().encode({"item":model}, data_only=True) return xml # # # diff --git a/EasyReflectometryApp/Logic/PyQmlProxy.py b/EasyReflectometryApp/Logic/PyQmlProxy.py index 981f4f76..86f95745 100644 --- a/EasyReflectometryApp/Logic/PyQmlProxy.py +++ b/EasyReflectometryApp/Logic/PyQmlProxy.py @@ -49,9 +49,13 @@ def __init__(self, parent=None): # Sample Connections self.layersMaterialsChanged.connect(self._model_proxy._onLayersChanged) self.layersSelectionChanged.connect(self._model_proxy._onLayersChanged) + + self.layersChanged.connect(self._model_proxy._onLayersChanged) self.layersChanged.connect(self._parameter_proxy._onParametersChanged) self.layersChanged.connect(self._simulation_proxy._onCalculatedDataChanged) + + self._material_proxy.materialsChanged.connect(self._parameter_proxy._onParametersChanged) self._model_proxy.itemsNameChanged.connect(self._parameter_proxy._onParametersChanged) self.itemsChanged.connect(self._model_proxy._onItemsChanged) From 2c1e9b3ac48325f0090702b6865e92693b4aa481 Mon Sep 17 00:00:00 2001 From: Piotr Rozyczko Date: Wed, 31 May 2023 14:34:23 +0200 Subject: [PATCH 3/7] experiment-less analysis now allows for calculator change --- EasyReflectometryApp/Logic/Proxies/Calculator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EasyReflectometryApp/Logic/Proxies/Calculator.py b/EasyReflectometryApp/Logic/Proxies/Calculator.py index a6528225..6cbb6a22 100644 --- a/EasyReflectometryApp/Logic/Proxies/Calculator.py +++ b/EasyReflectometryApp/Logic/Proxies/Calculator.py @@ -35,7 +35,7 @@ def currentCalculatorIndex(self, new_index: int): return new_name = self.calculatorNames[new_index] - model = self.parent._model_proxy.currentModelIndex + model = self.parent._model_proxy._model[self.parent._model_proxy.currentModelIndex] if self.parent._data_proxy.experimentLoaded: model = self.parent._data_proxy._data[self.parent._data_proxy.currentDataIndex].model From 5c39e445deaa4f90071219d9884cb45231c71356 Mon Sep 17 00:00:00 2001 From: Piotr Rozyczko Date: Wed, 31 May 2023 15:06:08 +0200 Subject: [PATCH 4/7] Allow experiment-less projects to be loaded --- EasyReflectometryApp/Logic/Proxies/Project.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/EasyReflectometryApp/Logic/Proxies/Project.py b/EasyReflectometryApp/Logic/Proxies/Project.py index 5ba0808a..d0bb793d 100644 --- a/EasyReflectometryApp/Logic/Proxies/Project.py +++ b/EasyReflectometryApp/Logic/Proxies/Project.py @@ -237,8 +237,10 @@ def _loadProject(self): for layer in structure.layers: self.parent._material_proxy._materials.append(layer.material) model.interface = self.parent._interface - for material in Materials.from_dict(descr['materials_not_in_model']): - self.parent._material_proxy._materials.append(material) + mats = descr['materials_not_in_model'] + if mats['data']: + for material in Materials.from_dict(mats): + self.parent._material_proxy._materials.append(material) # experiment if 'experiments' in descr: From 9b966df982996e52e3e1cc00d2eceb72f57dadb5 Mon Sep 17 00:00:00 2001 From: Piotr Rozyczko Date: Tue, 6 Jun 2023 11:27:45 +0200 Subject: [PATCH 5/7] Fixed project info layout --- .../Gui/Pages/Project/MainContentDescription.qml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/EasyReflectometryApp/Gui/Pages/Project/MainContentDescription.qml b/EasyReflectometryApp/Gui/Pages/Project/MainContentDescription.qml index f4ace3e8..61f78ee4 100644 --- a/EasyReflectometryApp/Gui/Pages/Project/MainContentDescription.qml +++ b/EasyReflectometryApp/Gui/Pages/Project/MainContentDescription.qml @@ -52,10 +52,10 @@ Rectangle { text: ExGlobals.Constants.proxy.project.currentProjectPath } - EaElements.Label { - text: ExGlobals.Constants.proxy.project.projectInfoAsJson.samples + //EaElements.Label { + // text: ExGlobals.Constants.proxy.project.projectInfoAsJson.samples //onEditingFinished: ExGlobals.Constants.proxy.editProjectInfo("samples", text) - } + //} EaElements.Label { font.bold: true From 1d8bf807338927336a48de4e7f35b30069f760eb Mon Sep 17 00:00:00 2001 From: Piotr Rozyczko Date: Tue, 6 Jun 2023 12:06:57 +0200 Subject: [PATCH 6/7] make sure model view is updated on project reset. Normally, this would be another slot in the main proxy, but we are introducing race condition for the projectInfoChanged signal and it's better to explicitly call the updater. --- EasyReflectometryApp/Logic/Proxies/Project.py | 1 + 1 file changed, 1 insertion(+) diff --git a/EasyReflectometryApp/Logic/Proxies/Project.py b/EasyReflectometryApp/Logic/Proxies/Project.py index d0bb793d..6321808f 100644 --- a/EasyReflectometryApp/Logic/Proxies/Project.py +++ b/EasyReflectometryApp/Logic/Proxies/Project.py @@ -341,6 +341,7 @@ def saveReport(self, filepath): def resetProject(self): self._project_created = False self._project_info = self._defaultProjectInfo() + self.parent._model_proxy._setModelsAsXml() self.projectInfoChanged.emit() @Slot(str, float, float) From bdbac5155b74e3afef0f20b66d49f0ed9807cf56 Mon Sep 17 00:00:00 2001 From: rozyczko Date: Mon, 14 Aug 2023 15:05:35 +0200 Subject: [PATCH 7/7] Fixed proper display of layers --- EasyReflectometryApp/Gui/Pages/Sample/MultiLayerTable.qml | 7 +++---- EasyReflectometryApp/Gui/Pages/Sample/SideBarBasic.qml | 1 - EasyReflectometryApp/Logic/Proxies/Model.py | 1 - 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/EasyReflectometryApp/Gui/Pages/Sample/MultiLayerTable.qml b/EasyReflectometryApp/Gui/Pages/Sample/MultiLayerTable.qml index b59bcf63..daaad653 100644 --- a/EasyReflectometryApp/Gui/Pages/Sample/MultiLayerTable.qml +++ b/EasyReflectometryApp/Gui/Pages/Sample/MultiLayerTable.qml @@ -17,8 +17,7 @@ EaComponents.TableView { property int layersIndex: ExGlobals.Constants.proxy.model.currentLayersIndex + 1 xml: ExGlobals.Constants.proxy.model.layersAsXml - // query: `/root/item[${itemsTable.currentIndex + 1}]/layers/item` - query: `/data/item/layers` + query: `/data/item[${itemsTable.currentIndex + 1}]/layers` XmlRole { name: "thick"; query: "thickness/value/number()" } XmlRole { name: "rough"; query: "roughness/value/number()" } @@ -60,7 +59,7 @@ EaComponents.TableView { horizontalAlignment: Text.AlignHCenter width: EaStyle.Sizes.fontPixelSize * 10.0 headerText: "Thickness/Å" - enabled: model.thick_enabled == "true" + enabled: model.thick_enabled == "True" text: (isNaN(layersModel.thick)) ? '--' : layersModel.thick.toFixed(2) onEditingFinished: ExGlobals.Constants.proxy.model.setCurrentLayersThickness(text) } @@ -70,7 +69,7 @@ EaComponents.TableView { horizontalAlignment: Text.AlignHCenter width: EaStyle.Sizes.fontPixelSize * 10.0 headerText: "Upper Roughness/Å" - enabled: model.rough_enabled == "true" + enabled: model.rough_enabled == "True" text: (isNaN(layersModel.rough)) ? '--' : layersModel.rough.toFixed(2) onEditingFinished: ExGlobals.Constants.proxy.model.setCurrentLayersRoughness(text) } diff --git a/EasyReflectometryApp/Gui/Pages/Sample/SideBarBasic.qml b/EasyReflectometryApp/Gui/Pages/Sample/SideBarBasic.qml index 5c6bc416..9ded876c 100644 --- a/EasyReflectometryApp/Gui/Pages/Sample/SideBarBasic.qml +++ b/EasyReflectometryApp/Gui/Pages/Sample/SideBarBasic.qml @@ -293,7 +293,6 @@ EaComponents.SideBarColumn { property int itemsIndex: ExGlobals.Constants.proxy.model.currentItemsIndex + 1 xml: ExGlobals.Constants.proxy.model.itemsAsXml - // query: "/root/item" query: "/data/item" XmlRole { name: "label"; query: "name/string()" } diff --git a/EasyReflectometryApp/Logic/Proxies/Model.py b/EasyReflectometryApp/Logic/Proxies/Model.py index bd689794..7a896730 100644 --- a/EasyReflectometryApp/Logic/Proxies/Model.py +++ b/EasyReflectometryApp/Logic/Proxies/Model.py @@ -328,7 +328,6 @@ def _onItemsChanged(self): self._setModelsAsXml() def _onLayersChanged(self): - print('>>> _onLayersChanged') if self.currentModelIndex >= len(self._model): return for i in self._model[self.currentModelIndex].structure: