def __init__(self, parameter, parent=None): _ParameterWidget.__init__(self, parameter, parent) # Widgets self._txt_lower = MultiNumericalLineEdit() self._txt_upper = MultiNumericalLineEdit() self._cb_unit = AngleComboBox() self._cb_unit.setUnit(u'\u00b0') # Layouts layout = QHBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(self._txt_lower, 1) layout.addWidget(QLabel("-")) layout.addWidget(self._txt_upper, 1) layout.addWidget(self._cb_unit) self.setLayout(layout) # Signals self.valuesChanged.connect(self._onChanged) self.validationRequested.connect(self._onChanged) self._txt_lower.textChanged.connect(self.valuesChanged) self._txt_upper.textChanged.connect(self.valuesChanged) self._cb_unit.currentIndexChanged.connect(self.valuesChanged) self.validationRequested.emit()
def __init__(self, parameter, parent=None): _ParameterWidget.__init__(self, parameter, parent) # Widgets self._lbl_u = QLabel('u') self._lbl_u.setStyleSheet("color: blue") self._txt_u = MultiNumericalLineEdit() self._lbl_v = QLabel('v') self._lbl_v.setStyleSheet("color: blue") self._txt_v = MultiNumericalLineEdit() self._lbl_w = QLabel('w') self._lbl_w.setStyleSheet("color: blue") self._txt_w = MultiNumericalLineEdit() # Layouts layout = QFormLayout() layout.setContentsMargins(0, 0, 0, 0) if sys.platform == 'darwin': # Fix for Mac OS layout.setFieldGrowthPolicy(QFormLayout.FieldGrowthPolicy.ExpandingFieldsGrow) layout.addRow(self._lbl_u, self._txt_u) layout.addRow(self._lbl_v, self._txt_v) layout.addRow(self._lbl_w, self._txt_w) self.setLayout(layout) # Signals self.valuesChanged.connect(self._onChanged) self.validationRequested.connect(self._onChanged) self._txt_u.textChanged.connect(self.valuesChanged) self._txt_v.textChanged.connect(self.valuesChanged) self._txt_w.textChanged.connect(self.valuesChanged) self.validationRequested.emit()
def __init__(self, parameter, parent=None): _ParameterWidget.__init__(self, parameter, parent=parent) # Widgets self._cb_time = TimeComboBox() self._txt_values = MultiNumericalLineEdit() validator = _FactorParameterValidator(parameter, self._cb_time) self._txt_values.setValidator(validator) # Layouts layout = QHBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(self._txt_values, 1) layout.addWidget(self._cb_time) self.setLayout(layout) # Signals self.valuesChanged.connect(self._onChanged) self.validationRequested.connect(self._onChanged) self._txt_values.textChanged.connect(self.valuesChanged) self._cb_time.currentIndexChanged.connect(self.valuesChanged) self.validationRequested.emit()
def createEditor(self, parent, option, index): column = index.column() if column == 1: editor = MultiNumericalLineEdit(parent) editor.setStyleSheet("background: none") editor.setReadOnly(self.isReadOnly()) editor.setValidator(_ThicknessValidator()) return editor
def __init__(self, parameter, parent=None): _ParameterWidget.__init__(self, parameter, parent) # Widgets self._lbl_x = QLabel('x') self._lbl_x.setStyleSheet("color: blue") self._txt_x = MultiNumericalLineEdit() self._lbl_y = QLabel('y') self._lbl_y.setStyleSheet("color: blue") self._txt_y = MultiNumericalLineEdit() self._lbl_z = QLabel('z') self._lbl_z.setStyleSheet("color: blue") self._txt_z = MultiNumericalLineEdit() self._cb_unit = UnitComboBox(parameter.unit) # Layouts layout = QFormLayout() layout.setContentsMargins(0, 0, 0, 0) if sys.platform == 'darwin': # Fix for Mac OS layout.setFieldGrowthPolicy(QFormLayout.FieldGrowthPolicy.ExpandingFieldsGrow) layout.addRow(self._lbl_x, self._txt_x) layout.addRow(self._lbl_y, self._txt_y) layout.addRow(self._lbl_z, self._txt_z) layout.addRow('Unit', self._cb_unit) self.setLayout(layout) # Signals self.valuesChanged.connect(self._onChanged) self.validationRequested.connect(self._onChanged) self._txt_x.textChanged.connect(self.valuesChanged) self._txt_y.textChanged.connect(self.valuesChanged) self._txt_z.textChanged.connect(self.valuesChanged) self._cb_unit.currentIndexChanged.connect(self.valuesChanged) self.validationRequested.emit()
def __init__(self, parameter, parent=None): _ParameterWidget.__init__(self, parameter, parent) # Widgets self._txt_values = MultiNumericalLineEdit() self._txt_values.setValidator(_ParameterValidator(parameter)) # Layouts layout = QHBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(self._txt_values) self.setLayout(layout) # Signals self.valuesChanged.connect(self._onChanged) self.validationRequested.connect(self._onChanged) self._txt_values.textChanged.connect(self.valuesChanged) self.validationRequested.emit()
class TimeParameterWidget(_ParameterWidget): def __init__(self, parameter, parent=None): _ParameterWidget.__init__(self, parameter, parent=parent) # Widgets self._cb_time = TimeComboBox() self._txt_values = MultiNumericalLineEdit() validator = _FactorParameterValidator(parameter, self._cb_time) self._txt_values.setValidator(validator) # Layouts layout = QHBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(self._txt_values, 1) layout.addWidget(self._cb_time) self.setLayout(layout) # Signals self.valuesChanged.connect(self._onChanged) self.validationRequested.connect(self._onChanged) self._txt_values.textChanged.connect(self.valuesChanged) self._cb_time.currentIndexChanged.connect(self.valuesChanged) self.validationRequested.emit() def _onChanged(self): if self.hasAcceptableInput(): self._txt_values.setStyleSheet("background: none") else: self._txt_values.setStyleSheet("background: pink") def values(self): return self._txt_values.values() * self._cb_time.factor() def setValues(self, values): self._txt_values.setValues(values) self._cb_time.setScale('s') def isReadOnly(self): return self._txt_values.isReadOnly() and not self._cb_time.isEnabled() def setReadOnly(self, state): self._txt_values.setReadOnly(state) self._cb_time.setEnabled(not state) def hasAcceptableInput(self): if not _ParameterWidget.hasAcceptableInput(self): return False return self._txt_values.hasAcceptableInput()
class NumericalParameterWidget(_ParameterWidget): def __init__(self, parameter, parent=None): _ParameterWidget.__init__(self, parameter, parent) # Widgets self._txt_values = MultiNumericalLineEdit() self._txt_values.setValidator(_ParameterValidator(parameter)) # Layouts layout = QHBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(self._txt_values) self.setLayout(layout) # Signals self.valuesChanged.connect(self._onChanged) self.validationRequested.connect(self._onChanged) self._txt_values.textChanged.connect(self.valuesChanged) self.validationRequested.emit() def _onChanged(self): if self.hasAcceptableInput(): self._txt_values.setStyleSheet("background: none") else: self._txt_values.setStyleSheet("background: pink") def values(self): return self._txt_values.values() def setValues(self, values): self._txt_values.setValues(values) def isReadOnly(self): self._txt_values.isReadOnly() def setReadOnly(self, state): self._txt_values.setReadOnly(state) def hasAcceptableInput(self): if not _ParameterWidget.hasAcceptableInput(self): return False return self._txt_values.hasAcceptableInput()
class _AngleRangeWidget(_ParameterWidget): def __init__(self, parameter, parent=None): _ParameterWidget.__init__(self, parameter, parent) # Widgets self._txt_lower = MultiNumericalLineEdit() self._txt_upper = MultiNumericalLineEdit() self._cb_unit = AngleComboBox() self._cb_unit.setUnit(u'\u00b0') # Layouts layout = QHBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(self._txt_lower, 1) layout.addWidget(QLabel("-")) layout.addWidget(self._txt_upper, 1) layout.addWidget(self._cb_unit) self.setLayout(layout) # Signals self.valuesChanged.connect(self._onChanged) self.validationRequested.connect(self._onChanged) self._txt_lower.textChanged.connect(self.valuesChanged) self._txt_upper.textChanged.connect(self.valuesChanged) self._cb_unit.currentIndexChanged.connect(self.valuesChanged) self.validationRequested.emit() def _onChanged(self): if self.hasAcceptableInput(): self._txt_lower.setStyleSheet("background: none") self._txt_upper.setStyleSheet("background: none") else: self._txt_lower.setStyleSheet("background: pink") self._txt_upper.setStyleSheet("background: pink") def values(self): lows = self._txt_lower.values() * self._cb_unit.factor() ups = self._txt_upper.values() * self._cb_unit.factor() return list(product(lows, ups)) def setValues(self, values): values = np.array(values, ndmin=1) self._txt_lower.setValues(list(map(np.degrees, map(itemgetter(0), values)))) self._txt_upper.setValues(list(map(np.degrees, map(itemgetter(1), values)))) self._cb_unit.setUnit(u'\u00b0') def isReadOnly(self): return self._txt_lower.isReadOnly() and \ self._txt_upper.isReadOnly() and \ not self._cb_unit.isEnabled() def setReadOnly(self, state): self._txt_lower.setReadOnly(state) self._txt_upper.setReadOnly(state) self._cb_unit.setEnabled(not state)
def _initUI(self): # Variables model_forcing = _InteractionForcingTableModel() # Actions act_add_forcing = QAction(getIcon("list-add"), "Add interaction forcing", self) act_remove_forcing = QAction(getIcon("list-remove"), "Remove interaction forcing", self) # Widgets self._lbl_elastic_scattering_c1 = QLabel('C1') self._lbl_elastic_scattering_c1.setStyleSheet("color: blue") self._txt_elastic_scattering_c1 = MultiNumericalLineEdit() self._txt_elastic_scattering_c1.setValidator(_ElasticScatteringValidator()) self._txt_elastic_scattering_c1.setValues([0.0]) self._lbl_elastic_scattering_c2 = QLabel('C2') self._lbl_elastic_scattering_c2.setStyleSheet("color: blue") self._txt_elastic_scattering_c2 = MultiNumericalLineEdit() self._txt_elastic_scattering_c2.setValidator(_ElasticScatteringValidator()) self._txt_elastic_scattering_c2.setValues([0.0]) self._lbl_cutoff_energy_inelastic = QLabel('Inelastic collisions') self._lbl_cutoff_energy_inelastic.setStyleSheet("color: blue") self._txt_cutoff_energy_inelastic = MultiNumericalLineEdit() self._txt_cutoff_energy_inelastic.setValidator(_CutoffEnergyValidator()) self._txt_cutoff_energy_inelastic.setValues([50.0]) self._cb_cutoff_energy_inelastic = UnitComboBox('eV') self._lbl_cutoff_energy_bremsstrahlung = QLabel('Bremsstrahlung emission') self._lbl_cutoff_energy_bremsstrahlung.setStyleSheet("color: blue") self._txt_cutoff_energy_bremsstrahlung = MultiNumericalLineEdit() self._txt_cutoff_energy_bremsstrahlung.setValidator(_CutoffEnergyValidator()) self._txt_cutoff_energy_bremsstrahlung.setValues([50.0]) self._cb_cutoff_energy_bremsstrahlung = UnitComboBox('eV') self._lbl_maximum_step_length = QLabel('Maximum step length') self._lbl_maximum_step_length.setStyleSheet("color: blue") self._txt_maximum_step_length = MultiNumericalLineEdit() self._txt_maximum_step_length.setValidator(_MaximumStepLengthValidator()) self._txt_maximum_step_length.setValues([1e15]) self._cb_maximum_step_length_unit = UnitComboBox('m') self._tbl_forcing = QTableView() self._tbl_forcing.setModel(model_forcing) self._tbl_forcing.setItemDelegate(_InteractionForcingDelegate()) header = self._tbl_forcing.horizontalHeader() header.setResizeMode(QHeaderView.Stretch) self._tlb_forcing = QToolBar() spacer = QWidget() spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self._tlb_forcing.addWidget(spacer) self._tlb_forcing.addAction(act_add_forcing) self._tlb_forcing.addAction(act_remove_forcing) # Layouts layout = QHBoxLayout() layout.addLayout(_MaterialDialog._initUI(self), 1) frame = QFrame() frame.setFrameShape(QFrame.VLine) frame.setFrameShadow(QFrame.Sunken) layout.addWidget(frame) sublayout = QVBoxLayout() box_elastic_scattering = QGroupBox("Elastic scattering") boxlayout = QFormLayout() boxlayout.addRow(self._lbl_elastic_scattering_c1, self._txt_elastic_scattering_c1) boxlayout.addRow(self._lbl_elastic_scattering_c2, self._txt_elastic_scattering_c2) box_elastic_scattering.setLayout(boxlayout) sublayout.addWidget(box_elastic_scattering) box_cutoff_energy = QGroupBox("Cutoff energy") boxlayout = QFormLayout() boxsublayout = QHBoxLayout() boxsublayout.addWidget(self._txt_cutoff_energy_inelastic, 1) boxsublayout.addWidget(self._cb_cutoff_energy_inelastic) boxlayout.addRow(self._lbl_cutoff_energy_inelastic, boxsublayout) boxsublayout = QHBoxLayout() boxsublayout.addWidget(self._txt_cutoff_energy_bremsstrahlung, 1) boxsublayout.addWidget(self._cb_cutoff_energy_bremsstrahlung) boxlayout.addRow(self._lbl_cutoff_energy_bremsstrahlung, boxsublayout) box_cutoff_energy.setLayout(boxlayout) sublayout.addWidget(box_cutoff_energy) subsublayout = QFormLayout() subsubsublayout = QHBoxLayout() subsubsublayout.addWidget(self._txt_maximum_step_length, 1) subsubsublayout.addWidget(self._cb_maximum_step_length_unit) subsublayout.addRow(self._lbl_maximum_step_length, subsubsublayout) sublayout.addLayout(subsublayout) box_forcing = QGroupBox('Interaction forcing') boxlayout = QVBoxLayout() boxlayout.addWidget(self._tbl_forcing) boxlayout.addWidget(self._tlb_forcing) box_forcing.setLayout(boxlayout) sublayout.addWidget(box_forcing) sublayout.addStretch() layout.addLayout(sublayout, 1) # Signals self._txt_elastic_scattering_c1.textChanged.connect(self._onElasticScatteringC1Changed) self._txt_elastic_scattering_c2.textChanged.connect(self._onElasticScatteringC2Changed) self._txt_cutoff_energy_inelastic.textChanged.connect(self._onCutoffEnergyInelasticChanged) self._txt_cutoff_energy_bremsstrahlung.textChanged.connect(self._onCutoffEnergyBremsstrahlungChanged) self._txt_maximum_step_length.textChanged.connect(self._onMaximumStepLengthChanged) act_add_forcing.triggered.connect(self._onForcingAdd) act_remove_forcing.triggered.connect(self._onForcingRemove) return layout
class PenelopeMaterialDialog(_MaterialDialog): def __init__(self, parent=None): _MaterialDialog.__init__(self, parent) self.setWindowTitle('Material') self.setMinimumWidth(1000) def _initUI(self): # Variables model_forcing = _InteractionForcingTableModel() # Actions act_add_forcing = QAction(getIcon("list-add"), "Add interaction forcing", self) act_remove_forcing = QAction(getIcon("list-remove"), "Remove interaction forcing", self) # Widgets self._lbl_elastic_scattering_c1 = QLabel('C1') self._lbl_elastic_scattering_c1.setStyleSheet("color: blue") self._txt_elastic_scattering_c1 = MultiNumericalLineEdit() self._txt_elastic_scattering_c1.setValidator(_ElasticScatteringValidator()) self._txt_elastic_scattering_c1.setValues([0.0]) self._lbl_elastic_scattering_c2 = QLabel('C2') self._lbl_elastic_scattering_c2.setStyleSheet("color: blue") self._txt_elastic_scattering_c2 = MultiNumericalLineEdit() self._txt_elastic_scattering_c2.setValidator(_ElasticScatteringValidator()) self._txt_elastic_scattering_c2.setValues([0.0]) self._lbl_cutoff_energy_inelastic = QLabel('Inelastic collisions') self._lbl_cutoff_energy_inelastic.setStyleSheet("color: blue") self._txt_cutoff_energy_inelastic = MultiNumericalLineEdit() self._txt_cutoff_energy_inelastic.setValidator(_CutoffEnergyValidator()) self._txt_cutoff_energy_inelastic.setValues([50.0]) self._cb_cutoff_energy_inelastic = UnitComboBox('eV') self._lbl_cutoff_energy_bremsstrahlung = QLabel('Bremsstrahlung emission') self._lbl_cutoff_energy_bremsstrahlung.setStyleSheet("color: blue") self._txt_cutoff_energy_bremsstrahlung = MultiNumericalLineEdit() self._txt_cutoff_energy_bremsstrahlung.setValidator(_CutoffEnergyValidator()) self._txt_cutoff_energy_bremsstrahlung.setValues([50.0]) self._cb_cutoff_energy_bremsstrahlung = UnitComboBox('eV') self._lbl_maximum_step_length = QLabel('Maximum step length') self._lbl_maximum_step_length.setStyleSheet("color: blue") self._txt_maximum_step_length = MultiNumericalLineEdit() self._txt_maximum_step_length.setValidator(_MaximumStepLengthValidator()) self._txt_maximum_step_length.setValues([1e15]) self._cb_maximum_step_length_unit = UnitComboBox('m') self._tbl_forcing = QTableView() self._tbl_forcing.setModel(model_forcing) self._tbl_forcing.setItemDelegate(_InteractionForcingDelegate()) header = self._tbl_forcing.horizontalHeader() header.setResizeMode(QHeaderView.Stretch) self._tlb_forcing = QToolBar() spacer = QWidget() spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self._tlb_forcing.addWidget(spacer) self._tlb_forcing.addAction(act_add_forcing) self._tlb_forcing.addAction(act_remove_forcing) # Layouts layout = QHBoxLayout() layout.addLayout(_MaterialDialog._initUI(self), 1) frame = QFrame() frame.setFrameShape(QFrame.VLine) frame.setFrameShadow(QFrame.Sunken) layout.addWidget(frame) sublayout = QVBoxLayout() box_elastic_scattering = QGroupBox("Elastic scattering") boxlayout = QFormLayout() boxlayout.addRow(self._lbl_elastic_scattering_c1, self._txt_elastic_scattering_c1) boxlayout.addRow(self._lbl_elastic_scattering_c2, self._txt_elastic_scattering_c2) box_elastic_scattering.setLayout(boxlayout) sublayout.addWidget(box_elastic_scattering) box_cutoff_energy = QGroupBox("Cutoff energy") boxlayout = QFormLayout() boxsublayout = QHBoxLayout() boxsublayout.addWidget(self._txt_cutoff_energy_inelastic, 1) boxsublayout.addWidget(self._cb_cutoff_energy_inelastic) boxlayout.addRow(self._lbl_cutoff_energy_inelastic, boxsublayout) boxsublayout = QHBoxLayout() boxsublayout.addWidget(self._txt_cutoff_energy_bremsstrahlung, 1) boxsublayout.addWidget(self._cb_cutoff_energy_bremsstrahlung) boxlayout.addRow(self._lbl_cutoff_energy_bremsstrahlung, boxsublayout) box_cutoff_energy.setLayout(boxlayout) sublayout.addWidget(box_cutoff_energy) subsublayout = QFormLayout() subsubsublayout = QHBoxLayout() subsubsublayout.addWidget(self._txt_maximum_step_length, 1) subsubsublayout.addWidget(self._cb_maximum_step_length_unit) subsublayout.addRow(self._lbl_maximum_step_length, subsubsublayout) sublayout.addLayout(subsublayout) box_forcing = QGroupBox('Interaction forcing') boxlayout = QVBoxLayout() boxlayout.addWidget(self._tbl_forcing) boxlayout.addWidget(self._tlb_forcing) box_forcing.setLayout(boxlayout) sublayout.addWidget(box_forcing) sublayout.addStretch() layout.addLayout(sublayout, 1) # Signals self._txt_elastic_scattering_c1.textChanged.connect(self._onElasticScatteringC1Changed) self._txt_elastic_scattering_c2.textChanged.connect(self._onElasticScatteringC2Changed) self._txt_cutoff_energy_inelastic.textChanged.connect(self._onCutoffEnergyInelasticChanged) self._txt_cutoff_energy_bremsstrahlung.textChanged.connect(self._onCutoffEnergyBremsstrahlungChanged) self._txt_maximum_step_length.textChanged.connect(self._onMaximumStepLengthChanged) act_add_forcing.triggered.connect(self._onForcingAdd) act_remove_forcing.triggered.connect(self._onForcingRemove) return layout def _onElasticScatteringC1Changed(self): if self._txt_elastic_scattering_c1.hasAcceptableInput(): self._txt_elastic_scattering_c1.setStyleSheet('background: none') else: self._txt_elastic_scattering_c1.setStyleSheet('background: pink') def _onElasticScatteringC2Changed(self): if self._txt_elastic_scattering_c2.hasAcceptableInput(): self._txt_elastic_scattering_c2.setStyleSheet('background: none') else: self._txt_elastic_scattering_c2.setStyleSheet('background: pink') def _onCutoffEnergyInelasticChanged(self): if self._txt_cutoff_energy_inelastic.hasAcceptableInput(): self._txt_cutoff_energy_inelastic.setStyleSheet('background: none') else: self._txt_cutoff_energy_inelastic.setStyleSheet('background: pink') def _onCutoffEnergyBremsstrahlungChanged(self): if self._txt_cutoff_energy_bremsstrahlung.hasAcceptableInput(): self._txt_cutoff_energy_bremsstrahlung.setStyleSheet('background: none') else: self._txt_cutoff_energy_bremsstrahlung.setStyleSheet('background: pink') def _onMaximumStepLengthChanged(self): if self._txt_maximum_step_length.hasAcceptableInput(): self._txt_maximum_step_length.setStyleSheet('background: none') else: self._txt_maximum_step_length.setStyleSheet('background: pink') def _onForcingAdd(self): index = self._tbl_forcing.selectionModel().currentIndex() model = self._tbl_forcing.model() model.insertRows(index.row() + 1) def _onForcingRemove(self): selection = self._tbl_forcing.selectionModel().selection().indexes() if len(selection) == 0: QMessageBox.warning(self, "Interaction forcing", "Select a row") return model = self._tbl_forcing.model() for row in sorted(map(methodcaller('row'), selection), reverse=True): model.removeRow(row) def _getParametersDict(self): params = _MaterialDialog._getParametersDict(self) params['c1'] = self._txt_elastic_scattering_c1.values().tolist() params['c2'] = self._txt_elastic_scattering_c2.values().tolist() wcc = self._txt_cutoff_energy_inelastic.values() * self._cb_cutoff_energy_inelastic.factor() params['wcc'] = wcc.tolist() wcr = self._txt_cutoff_energy_bremsstrahlung.values() * self._cb_cutoff_energy_bremsstrahlung.factor() params['wcr'] = wcr.tolist() dsmax = self._txt_maximum_step_length.values() * self._cb_maximum_step_length_unit.factor() params['dsmax'] = dsmax.tolist() params['forcings'] = \ self._tbl_forcing.model().interaction_forcings() return params def _generateName(self, parameters, varied): name = parameters.pop('name') if name is None: name = PenelopeMaterial.generate_name(parameters['composition']) parts = [name] for key in varied: if key == 'composition': continue elif key == 'forcings': forcing = parameters[key][0] forcer = forcing.forcer wlow = forcing.weight[0] whigh = forcing.weight[1] parts.append('forcings={0:n}_{1:n}_{2:n}'.format(forcer, wlow, whigh)) else: parts.append('{0:s}={1:n}'.format(key, parameters[key])) return '+'.join(parts) def _createMaterial(self, parameters, varied): mat = _MaterialDialog._createMaterial(self, parameters, varied) c1 = parameters['c1'] c2 = parameters['c2'] wcc = parameters['wcc'] wcr = parameters['wcr'] dsmax = parameters['dsmax'] forcings = parameters['forcings'] return PenelopeMaterial(mat.composition, mat.name, mat.density_kg_m3, mat.absorption_energy_eV, elastic_scattering=(c1, c2), cutoff_energy_inelastic_eV=wcc, cutoff_energy_bremsstrahlung_eV=wcr, interaction_forcings=forcings, maximum_step_length_m=dsmax) def setValue(self, material): _MaterialDialog.setValue(self, material) # Elastic scattering c1, c2 = material.elastic_scattering self._txt_elastic_scattering_c1.setValues(c1) self._txt_elastic_scattering_c2.setValues(c2) # Cutoff energy self._txt_cutoff_energy_inelastic.setValues(material.cutoff_energy_inelastic_eV) self._cb_cutoff_energy_inelastic.setUnit('eV') self._txt_cutoff_energy_bremsstrahlung.setValues(material.cutoff_energy_bremsstrahlung_eV) self._cb_cutoff_energy_bremsstrahlung.setUnit('eV') # Maximum step length self._txt_maximum_step_length.setValues(material.maximum_step_length_m) self._cb_maximum_step_length_unit.setUnit('m') # Interaction forcings forcings = material.interaction_forcings model = self._tbl_forcing.model() model.removeRows(0, model.rowCount()) model.insertRows(1, len(forcings)) for row, forcing in enumerate(forcings): model.setData(model.index(row, 0), forcing.particle) model.setData(model.index(row, 1), forcing.collision) model.setData(model.index(row, 2), forcing.forcer) model.setData(model.index(row, 3), forcing.weight[0]) model.setData(model.index(row, 4), forcing.weight[1]) def setReadOnly(self, state): _MaterialDialog.setReadOnly(self, state) style = 'color: none' if state else 'color: blue' self._lbl_elastic_scattering_c1.setStyleSheet(style) self._txt_elastic_scattering_c1.setReadOnly(state) self._lbl_elastic_scattering_c2.setStyleSheet(style) self._txt_elastic_scattering_c2.setReadOnly(state) self._lbl_cutoff_energy_inelastic.setStyleSheet(style) self._txt_cutoff_energy_inelastic.setReadOnly(state) self._cb_cutoff_energy_inelastic.setEnabled(not state) self._lbl_cutoff_energy_bremsstrahlung.setStyleSheet(style) self._txt_cutoff_energy_bremsstrahlung.setReadOnly(state) self._cb_cutoff_energy_bremsstrahlung.setEnabled(not state) self._lbl_maximum_step_length.setStyleSheet(style) self._txt_maximum_step_length.setReadOnly(state) self._cb_maximum_step_length_unit.setEnabled(not state) self._tbl_forcing.setEnabled(not state) self._tlb_forcing.setVisible(not state) def isReadOnly(self): return _MaterialDialog.isReadOnly(self) and \ self._txt_elastic_scattering_c1.isReadOnly() and \ self._txt_elastic_scattering_c2.isReadOnly() and \ self._txt_cutoff_energy_inelastic.isReadOnly() and \ self._txt_cutoff_energy_bremsstrahlung.isReadOnly() and \ self._txt_maximum_step_length.isReadOnly() and \ not self._tbl_forcing.isEnabled() and \ not self._tlb_forcing.isVisible()
class DirectionWidget(_ParameterWidget): def __init__(self, parameter, parent=None): _ParameterWidget.__init__(self, parameter, parent) # Widgets self._lbl_u = QLabel('u') self._lbl_u.setStyleSheet("color: blue") self._txt_u = MultiNumericalLineEdit() self._lbl_v = QLabel('v') self._lbl_v.setStyleSheet("color: blue") self._txt_v = MultiNumericalLineEdit() self._lbl_w = QLabel('w') self._lbl_w.setStyleSheet("color: blue") self._txt_w = MultiNumericalLineEdit() # Layouts layout = QFormLayout() layout.setContentsMargins(0, 0, 0, 0) if sys.platform == 'darwin': # Fix for Mac OS layout.setFieldGrowthPolicy(QFormLayout.FieldGrowthPolicy.ExpandingFieldsGrow) layout.addRow(self._lbl_u, self._txt_u) layout.addRow(self._lbl_v, self._txt_v) layout.addRow(self._lbl_w, self._txt_w) self.setLayout(layout) # Signals self.valuesChanged.connect(self._onChanged) self.validationRequested.connect(self._onChanged) self._txt_u.textChanged.connect(self.valuesChanged) self._txt_v.textChanged.connect(self.valuesChanged) self._txt_w.textChanged.connect(self.valuesChanged) self.validationRequested.emit() def _onChanged(self): if self.hasAcceptableInput(): self._txt_u.setStyleSheet("background: none") self._txt_v.setStyleSheet("background: none") self._txt_w.setStyleSheet("background: none") else: self._txt_u.setStyleSheet("background: pink") self._txt_v.setStyleSheet("background: pink") self._txt_w.setStyleSheet("background: pink") def values(self): us = self._txt_u.values() vs = self._txt_v.values() ws = self._txt_w.values() return list(product(us, vs, ws)) def setValues(self, values): values = np.array(values, ndmin=1) self._txt_u.setValues(list(map(itemgetter(0), values))) self._txt_v.setValues(list(map(itemgetter(1), values))) self._txt_w.setValues(list(map(itemgetter(2), values))) def isReadOnly(self): return self._txt_u.isReadOnly() and \ self._txt_v.isReadOnly() and \ self._txt_w.isReadOnly() def setReadOnly(self, state): style = 'color: none' if state else 'color: blue' self._lbl_u.setStyleSheet(style) self._txt_u.setReadOnly(state) self._lbl_v.setStyleSheet(style) self._txt_v.setReadOnly(state) self._lbl_w.setStyleSheet(style) self._txt_w.setReadOnly(state) def hasAcceptableInput(self): if not _ParameterWidget.hasAcceptableInput(self): return False if not self._txt_u.hasAcceptableInput(): return False if not self._txt_v.hasAcceptableInput(): return False if not self._txt_w.hasAcceptableInput(): return False return True
class OriginWidget(_ParameterWidget): def __init__(self, parameter, parent=None): _ParameterWidget.__init__(self, parameter, parent) # Widgets self._lbl_x = QLabel('x') self._lbl_x.setStyleSheet("color: blue") self._txt_x = MultiNumericalLineEdit() self._lbl_y = QLabel('y') self._lbl_y.setStyleSheet("color: blue") self._txt_y = MultiNumericalLineEdit() self._lbl_z = QLabel('z') self._lbl_z.setStyleSheet("color: blue") self._txt_z = MultiNumericalLineEdit() self._cb_unit = UnitComboBox(parameter.unit) # Layouts layout = QFormLayout() layout.setContentsMargins(0, 0, 0, 0) if sys.platform == 'darwin': # Fix for Mac OS layout.setFieldGrowthPolicy(QFormLayout.FieldGrowthPolicy.ExpandingFieldsGrow) layout.addRow(self._lbl_x, self._txt_x) layout.addRow(self._lbl_y, self._txt_y) layout.addRow(self._lbl_z, self._txt_z) layout.addRow('Unit', self._cb_unit) self.setLayout(layout) # Signals self.valuesChanged.connect(self._onChanged) self.validationRequested.connect(self._onChanged) self._txt_x.textChanged.connect(self.valuesChanged) self._txt_y.textChanged.connect(self.valuesChanged) self._txt_z.textChanged.connect(self.valuesChanged) self._cb_unit.currentIndexChanged.connect(self.valuesChanged) self.validationRequested.emit() def _onChanged(self): if self.hasAcceptableInput(): self._txt_x.setStyleSheet("background: none") self._txt_y.setStyleSheet("background: none") self._txt_z.setStyleSheet("background: none") else: self._txt_x.setStyleSheet("background: pink") self._txt_y.setStyleSheet("background: pink") self._txt_z.setStyleSheet("background: pink") def values(self): xs = self._txt_x.values() * self._cb_unit.factor() ys = self._txt_y.values() * self._cb_unit.factor() zs = self._txt_z.values() * self._cb_unit.factor() return list(product(xs, ys, zs)) def setValues(self, values): values = np.array(values, ndmin=1) self._txt_x.setValues(list(map(itemgetter(0), values))) self._txt_y.setValues(list(map(itemgetter(1), values))) self._txt_z.setValues(list(map(itemgetter(2), values))) self._cb_unit.setUnit('m') def isReadOnly(self): return self._txt_x.isReadOnly() and \ self._txt_y.isReadOnly() and \ self._txt_z.isReadOnly() and \ not self._cb_unit.isEnabled() def setReadOnly(self, state): style = 'color: none' if state else 'color: blue' self._lbl_x.setStyleSheet(style) self._txt_x.setReadOnly(state) self._lbl_y.setStyleSheet(style) self._txt_y.setReadOnly(state) self._lbl_z.setStyleSheet(style) self._txt_z.setReadOnly(state) self._cb_unit.setEnabled(not state) def hasAcceptableInput(self): if not _ParameterWidget.hasAcceptableInput(self): return False if not self._txt_x.hasAcceptableInput(): return False if not self._txt_y.hasAcceptableInput(): return False if not self._txt_z.hasAcceptableInput(): return False return True