Skip to content

Commit b111b77

Browse files
committed
Merge pull request #40 from donald-e-boyce/materials-gui
lattice parameter interactors on qt gui
2 parents 65bfd6a + f550023 commit b111b77

File tree

3 files changed

+99
-29
lines changed

3 files changed

+99
-29
lines changed

hexrd/qt/materialsdialog.py

Lines changed: 76 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,22 @@
11
from PyQt4 import QtGui, QtCore, uic
22

33
from hexrd.xrd import spacegroup
4+
from hexrd.xrd.material import Material
45
from .resources import resources
56

6-
7-
class Material(object):
8-
9-
# this is just a placeholder
10-
pass
11-
12-
13-
147
class MaterialDialogController(QtGui.QDialog):
158

169

17-
@property
18-
def material(self):
19-
return None
20-
21-
2210
def __init__(self, name=None):
11+
2312
super(MaterialDialogController, self).__init__()
2413
uic.loadUi(resources['materialsdialog.ui'], self)
14+
15+
self._mat = Material()
16+
# in order: a, b, c, alpha, beta, gamma
17+
self._lpboxes = [self.doubleSpinBox_2, self.doubleSpinBox_4,
18+
self.doubleSpinBox_3, self.doubleSpinBox_7,
19+
self.doubleSpinBox_5, self.doubleSpinBox_6 ]
2520
self._config_ui()
2621

2722
self.load_settings()
@@ -43,10 +38,24 @@ def _config_ui(self):
4338

4439
self.spaceGroupComboBox.setCurrentIndex(522)
4540

41+
def _lp_blocksignals(self, tf):
42+
self.doubleSpinBox_2.blockSignals(tf)
43+
self.doubleSpinBox_3.blockSignals(tf)
44+
self.doubleSpinBox_4.blockSignals(tf)
45+
self.doubleSpinBox_5.blockSignals(tf)
46+
self.doubleSpinBox_6.blockSignals(tf)
47+
self.doubleSpinBox_7.blockSignals(tf)
4648

4749
def load_settings(self):
4850
pass
4951

52+
@property
53+
def material(self):
54+
return self._mat
55+
56+
@property
57+
def lpboxes(self):
58+
return self._lpboxes
5059

5160
@QtCore.pyqtSlot(name='on_buttonBox_accepted')
5261
def save_settings(self):
@@ -75,6 +84,60 @@ def set_spacegroup(self, val):
7584
self.hallSymbolComboBox.blockSignals(False)
7685
self.hermannMauguinComboBox.blockSignals(False)
7786

87+
@QtCore.pyqtSlot(int, name='on_spaceGroupComboBox_currentIndexChanged')
88+
def enable_latparams(self, val):
89+
"""enable independent lattice parameters"""
90+
# lattice parameters are stored in the old "ValUnit" class
91+
self._lp_blocksignals(True)
92+
nlp = 6
93+
A = 'angstrom'
94+
D = 'degrees'
95+
m = self.material
96+
sgid = int(self.spaceGroupComboBox.currentText().split(':')[0])
97+
self.material.sgnum = sgid
98+
reqp = m.spaceGroup.reqParams
99+
lprm = m.latticeParameters
100+
for i in range(nlp):
101+
boxi = self.lpboxes[i]
102+
boxi.setEnabled(i in reqp)
103+
u = A if i < 3 else D
104+
boxi.setValue(lprm[i].getVal(u))
105+
self._lp_blocksignals(False)
106+
107+
@QtCore.pyqtSlot(float, name='on_doubleSpinBox_2_valueChanged')
108+
@QtCore.pyqtSlot(float, name='on_doubleSpinBox_3_valueChanged')
109+
@QtCore.pyqtSlot(float, name='on_doubleSpinBox_4_valueChanged')
110+
@QtCore.pyqtSlot(float, name='on_doubleSpinBox_5_valueChanged')
111+
@QtCore.pyqtSlot(float, name='on_doubleSpinBox_6_valueChanged')
112+
@QtCore.pyqtSlot(float, name='on_doubleSpinBox_7_valueChanged')
113+
def set_latparams(self, val):
114+
"""update all the lattice parameter boxes when one changes"""
115+
# note: material takes reduced set of lattice parameters but outputs
116+
# all six
117+
self._lp_blocksignals(True)
118+
nlp = 6
119+
A = 'angstrom'
120+
D = 'degrees'
121+
m = self.material
122+
reqp = m.spaceGroup.reqParams
123+
nreq = len(reqp)
124+
lp_red = nreq*[0.0]
125+
for i in range(nreq):
126+
boxi = self.lpboxes[reqp[i]]
127+
lp_red[i] = boxi.value()
128+
m.latticeParameters = lp_red
129+
lprm = m.latticeParameters
130+
for i in range(nlp):
131+
u = A if i < 3 else D
132+
boxi = self.lpboxes[i]
133+
boxi.setValue(lprm[i].getVal(u))
134+
self._lp_blocksignals(False)
135+
136+
@QtCore.pyqtSlot(name='on_lineEdit_6_editingFinished')
137+
def set_name(self):
138+
n = self.lineEdit_6.text()
139+
print n, type(n)
140+
self.material.name = self.lineEdit_6.text()
78141

79142
def not_implemented(self):
80143
dlg = QtGui.QMessageBox.information(

hexrd/qt/resources/materialsdialog.ui

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313
<property name="windowTitle">
1414
<string>Dialog</string>
1515
</property>
16+
<property name="styleSheet">
17+
<string notr="true">QDoubleSpinBox:disabled {background-color: LightGray;}
18+
</string>
19+
</property>
1620
<layout class="QHBoxLayout" name="horizontalLayout_2">
1721
<item>
1822
<layout class="QVBoxLayout" name="verticalLayout">
@@ -277,6 +281,9 @@
277281
</item>
278282
<item row="3" column="3">
279283
<widget class="QDoubleSpinBox" name="doubleSpinBox_4">
284+
<property name="autoFillBackground">
285+
<bool>true</bool>
286+
</property>
280287
<property name="alignment">
281288
<set>Qt::AlignCenter</set>
282289
</property>

hexrd/xrd/material.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ class Material(object):
6767
"""Fractional Atom Position of an atom in the unit cell followed by the
6868
number of electrons within that atom. The max number of electrons is 96.
6969
"""
70-
71-
70+
71+
7272
#
7373
def __init__(self, name=DFLT_NAME, cfgP=None):
7474
"""Constructor for Material
@@ -77,8 +77,8 @@ def __init__(self, name=DFLT_NAME, cfgP=None):
7777
cfgP -- (instance) configuration file parser with
7878
-- the material name as a section
7979
"""
80-
81-
80+
81+
8282
#
8383
self.name = name
8484
self.description = ''
@@ -191,7 +191,7 @@ def _toSixLP(self, sgn, lp):
191191
pass
192192

193193
return lp6
194-
194+
195195
#
196196
# ============================== API
197197
#
@@ -288,8 +288,8 @@ def _set_latticeParameters(self, v):
288288
"""
289289
latticeParameters = property(_get_latticeParameters, _set_latticeParameters,
290290
None, lpdoc)
291-
292-
291+
292+
293293

294294
# property: "name"
295295

@@ -305,27 +305,27 @@ def _set_name(self, v):
305305

306306
name = property(_get_name, _set_name, None,
307307
"Name of material" )
308-
309-
310-
311-
# property: "atominfo"
308+
309+
310+
311+
# property: "atominfo"
312312
def _get_atominfo(self):
313313
"""Set method for name"""
314314
return self._atominfo
315315

316316
def _set_atominfo(self, v):
317317
"""Set method for name"""
318-
if v.shape[1]==4:
318+
if v.shape[1]==4:
319319
self._atominfo= v
320320
else:
321-
print("Improper syntax, array must be n x 4")
321+
print("Improper syntax, array must be n x 4")
322322

323323
return
324324

325325
atominfo = property(_get_atominfo, _set_atominfo, None,
326-
"Information about atomic positions and electron number" )
327-
328-
326+
"Information about atomic positions and electron number" )
327+
328+
329329
#
330330
# ========== Methods
331331
#

0 commit comments

Comments
 (0)