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

Last change on this file since 1eafef1 was 1eafef1, checked in by Adam Washington <adam.washington@…>, 7 years ago

Unify enum function into GuiUtils?

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