source: sasview/src/sas/qtgui/DensityPanel.py @ 1d85b5e

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalc
Last change on this file since 1d85b5e was 1d85b5e, checked in by Piotr Rozyczko <rozyczko@…>, 8 years ago

Linked two new calculators to the Gui Manager.

  • Property mode set to 100644
File size: 5.7 KB
Line 
1# global
2import logging
3import functools
4
5from periodictable import formula as Formula
6
7from PyQt4 import QtGui, QtCore
8
9# Local UI
10from UI.DensityPanel import Ui_DensityPanel
11
12def enum(*sequential, **named):
13    enums = dict(zip(sequential, range(len(sequential))), **named)
14    return type('Enum', (), enums)
15
16MODEL = enum(
17    'MOLECULAR_FORMULA',
18    'MOLAR_MASS',
19    'MOLAR_VOLUME',
20    'MASS_DENSITY',
21)
22
23MODES = enum(
24    'VOLUME_TO_DENSITY',
25    'DENSITY_TO_VOLUME',
26)
27
28def toMolarMass(formula):
29    AVOGADRO = 6.02214129e23
30
31    try:
32        f = Formula(str(formula))
33        return "%g" % (f.molecular_mass * AVOGADRO)
34    except:
35        return ""
36
37
38class FormulaValidator(QtGui.QValidator):
39    def __init__(self, parent=None):
40        super(FormulaValidator, self).__init__(parent)
41 
42    def validate(self, input, pos):
43        try:
44            Formula(str(input))
45            self._setStyleSheet("")
46            return QtGui.QValidator.Acceptable, pos
47
48        except Exception as e:
49            self._setStyleSheet("background-color:pink;")
50            return QtGui.QValidator.Intermediate, pos
51
52    def _setStyleSheet(self, value):
53        try:
54            if self.parent():
55                self.parent().setStyleSheet(value)
56        except:
57            pass
58
59
60class DensityPanel(QtGui.QDialog):
61
62    def __init__(self, parent=None):
63        super(DensityPanel, self).__init__()
64
65        self.mode = None
66        self.manager = parent
67        self.setupUi()
68        self.setupModel()
69        self.setupMapper()
70
71    def setupUi(self):
72        self.ui = Ui_DensityPanel()
73        self.ui.setupUi(self)
74
75        # set validators
76        self.ui.editMolecularFormula.setValidator(FormulaValidator(self.ui.editMolecularFormula))
77
78        rx = QtCore.QRegExp("[+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?")
79        self.ui.editMolarVolume.setValidator(QtGui.QRegExpValidator(rx, self.ui.editMolarVolume))
80        self.ui.editMassDensity.setValidator(QtGui.QRegExpValidator(rx, self.ui.editMassDensity))
81
82        # signals
83        self.ui.editMolarVolume.textEdited.connect(functools.partial(self.setMode, MODES.VOLUME_TO_DENSITY))
84        self.ui.editMassDensity.textEdited.connect(functools.partial(self.setMode, MODES.DENSITY_TO_VOLUME))
85
86        self.ui.buttonBox.button(QtGui.QDialogButtonBox.Reset).clicked.connect(self.modelReset)
87        self.ui.buttonBox.button(QtGui.QDialogButtonBox.Help).clicked.connect(self.displayHelp)
88
89    def setupModel(self):
90        self.model = QtGui.QStandardItemModel(self)
91        self.model.setItem(MODEL.MOLECULAR_FORMULA, QtGui.QStandardItem())
92        self.model.setItem(MODEL.MOLAR_MASS       , QtGui.QStandardItem())
93        self.model.setItem(MODEL.MOLAR_VOLUME     , QtGui.QStandardItem())
94        self.model.setItem(MODEL.MASS_DENSITY     , QtGui.QStandardItem())
95
96        self.model.dataChanged.connect(self.dataChanged)
97
98        self.modelReset()
99
100    def setupMapper(self):
101        self.mapper = QtGui.QDataWidgetMapper(self)
102        self.mapper.setModel(self.model)
103        self.mapper.setOrientation(QtCore.Qt.Vertical)
104
105        self.mapper.addMapping(self.ui.editMolecularFormula, MODEL.MOLECULAR_FORMULA)
106        self.mapper.addMapping(self.ui.editMolarMass       , MODEL.MOLAR_MASS)
107        self.mapper.addMapping(self.ui.editMolarVolume     , MODEL.MOLAR_VOLUME)
108        self.mapper.addMapping(self.ui.editMassDensity     , MODEL.MASS_DENSITY)
109
110        self.mapper.toFirst()
111
112    def dataChanged(self, top, bottom):
113        for index in xrange(top.row(), bottom.row() + 1):
114            if index == MODEL.MOLECULAR_FORMULA:
115                molarMass = toMolarMass(self.model.item(MODEL.MOLECULAR_FORMULA).text())
116                self.model.item(MODEL.MOLAR_MASS).setText(molarMass)
117
118                if self.mode == MODES.VOLUME_TO_DENSITY:
119                    self._updateDensity()
120                elif self.mode == MODES.DENSITY_TO_VOLUME:
121                    self._updateVolume()
122
123            elif index == MODEL.MOLAR_VOLUME and self.mode == MODES.VOLUME_TO_DENSITY:
124                self._updateDensity()
125
126            elif index == MODEL.MASS_DENSITY and self.mode == MODES.DENSITY_TO_VOLUME:
127                self._updateVolume()
128
129    def setMode(self, mode):
130        self.mode = mode
131
132    def _updateDensity(self):
133        try:
134            molarMass = float(toMolarMass(self.model.item(MODEL.MOLECULAR_FORMULA).text()))
135            molarVolume = float(self.model.item(MODEL.MOLAR_VOLUME).text())
136
137            molarDensity = molarMass / molarVolume
138            self.model.item(MODEL.MASS_DENSITY).setText(str(molarDensity))
139
140        except:
141            self.model.item(MODEL.MASS_DENSITY).setText("")
142
143    def _updateVolume(self):
144        try:
145            molarMass = float(toMolarMass(self.model.item(MODEL.MOLECULAR_FORMULA).text()))
146            molarDensity = float(self.model.item(MODEL.MASS_DENSITY).text())
147
148            molarVolume = molarMass / molarDensity
149            self.model.item(MODEL.MOLAR_VOLUME).setText(str(molarVolume))
150
151        except:
152            self.model.item(MODEL.MOLAR_VOLUME).setText("")
153
154    def modelReset(self):
155        #self.model.beginResetModel()
156        try:
157            self.setMode(None)
158            self.model.item(MODEL.MOLECULAR_FORMULA).setText("H2O")
159            self.model.item(MODEL.MOLAR_VOLUME     ).setText("")
160            self.model.item(MODEL.MASS_DENSITY     ).setText("")
161        finally:
162            pass
163            #self.model.endResetModel()
164
165    def displayHelp(self):
166        try:
167            location = self.manager.HELP_DIRECTORY_LOCATION + \
168                "/user/sasgui/perspectives/calculator/density_calculator_help.html"
169            self.manager._helpView.load(QtCore.QUrl(location))
170            self.manager._helpView.show()
171        except AttributeError:
172            # No manager defined - testing and standalone runs
173            pass
Note: See TracBrowser for help on using the repository browser.