Skip to content
Snippets Groups Projects
Commit f831e92d authored by Matthias Puchner's avatar Matthias Puchner
Browse files

free ParticleLayoutItem from SessionItem signaling

parent 271cc415
Branches
Tags
1 merge request!532Reduce SessionItem signaling
...@@ -68,7 +68,7 @@ MultiLayerItem* GUISampleBuilder::populateSampleModel(SampleModel* sampleModel, ...@@ -68,7 +68,7 @@ MultiLayerItem* GUISampleBuilder::populateSampleModel(SampleModel* sampleModel,
// iterate over particle layouts // iterate over particle layouts
for (const auto* layout : layer->layouts()) { for (const auto* layout : layer->layouts()) {
auto* layoutItem = layerItem->addLayout(); auto* layoutItem = layerItem->addLayout();
layoutItem->totalDensity().set(layout->totalParticleSurfaceDensity()); layoutItem->ownDensity().set(layout->totalParticleSurfaceDensity());
layoutItem->weight().set(layout->weight()); layoutItem->weight().set(layout->weight());
FromDomain::setInterference(layoutItem, layout->interferenceFunction()); FromDomain::setInterference(layoutItem, layout->interferenceFunction());
......
...@@ -48,11 +48,9 @@ ParticleLayoutItem::ParticleLayoutItem() : SessionItem(M_TYPE) ...@@ -48,11 +48,9 @@ ParticleLayoutItem::ParticleLayoutItem() : SessionItem(M_TYPE)
{Interference1DLatticeItem::M_TYPE, Interference2DLatticeItem::M_TYPE, {Interference1DLatticeItem::M_TYPE, Interference2DLatticeItem::M_TYPE,
Interference2DParaCrystalItem::M_TYPE, InterferenceFinite2DLatticeItem::M_TYPE, Interference2DParaCrystalItem::M_TYPE, InterferenceFinite2DLatticeItem::M_TYPE,
InterferenceHardDiskItem::M_TYPE, InterferenceRadialParaCrystalItem::M_TYPE}); InterferenceHardDiskItem::M_TYPE, InterferenceRadialParaCrystalItem::M_TYPE});
mapper()->setOnAnyChildChange([this](SessionItem*) { updateDensityValue(); });
} }
DoubleDescriptor ParticleLayoutItem::totalDensity() const DoubleDescriptor ParticleLayoutItem::ownDensity() const
{ {
DoubleDescriptor d(getItem(P_TOTAL_DENSITY), Unit::nanometerPowerMinus2); DoubleDescriptor d(getItem(P_TOTAL_DENSITY), Unit::nanometerPowerMinus2);
d.tooltip = "Number of particles per area (particle surface density).\n " d.tooltip = "Number of particles per area (particle surface density).\n "
...@@ -60,6 +58,34 @@ DoubleDescriptor ParticleLayoutItem::totalDensity() const ...@@ -60,6 +58,34 @@ DoubleDescriptor ParticleLayoutItem::totalDensity() const
return d; return d;
} }
double ParticleLayoutItem::totalDensity() const
{
if (!totalDensityIsDefinedByInterference())
return ownDensity();
const auto* interferenceItem = getItem(T_INTERFERENCE);
ASSERT(interferenceItem);
if (const auto* interLatticeItem =
dynamic_cast<const Interference2DAbstractLatticeItem*>(interferenceItem)) {
Lattice2DItem* latticeItem = interLatticeItem->latticeType().currentItem();
try {
const double area = latticeItem->unitCellArea();
return area == 0.0 ? 0.0 : 1.0 / area;
} catch (const std::exception&) {
// nothing to do here; new exception will be caught during job execution
return 0.0;
}
} else if (const auto* interHDItem =
dynamic_cast<const InterferenceHardDiskItem*>(interferenceItem))
return interHDItem->density();
else {
ASSERT(false);
return 0.0;
}
}
DoubleDescriptor ParticleLayoutItem::weight() const DoubleDescriptor ParticleLayoutItem::weight() const
{ {
return DoubleDescriptor(getItem(P_WEIGHT), Unit::unitless); return DoubleDescriptor(getItem(P_WEIGHT), Unit::unitless);
...@@ -134,28 +160,6 @@ void ParticleLayoutItem::removeInterference() ...@@ -134,28 +160,6 @@ void ParticleLayoutItem::removeInterference()
model()->removeItem(item); model()->removeItem(item);
} }
//! Updates the value of TotalSurfaceDensity on lattice type change.
void ParticleLayoutItem::updateDensityValue()
{
if (auto* interferenceItem = getItem(T_INTERFERENCE)) {
if (auto* interLatticeItem =
dynamic_cast<Interference2DAbstractLatticeItem*>(interferenceItem)) {
Lattice2DItem* latticeItem = interLatticeItem->latticeType().currentItem();
double area = 0.0;
try {
area = latticeItem->unitCellArea();
} catch (const std::exception&) {
// nothing to do here; new exception will be caught during job execution
}
setItemValue(P_TOTAL_DENSITY, area == 0.0 ? 0.0 : 1.0 / area);
} else if (auto* interHDItem = dynamic_cast<InterferenceHardDiskItem*>(interferenceItem)) {
double density = interHDItem->density();
setItemValue(P_TOTAL_DENSITY, density);
}
}
}
void ParticleLayoutItem::enableDensity(bool b) void ParticleLayoutItem::enableDensity(bool b)
{ {
getItem(P_TOTAL_DENSITY)->setEnabled(b); getItem(P_TOTAL_DENSITY)->setEnabled(b);
......
...@@ -34,7 +34,19 @@ public: ...@@ -34,7 +34,19 @@ public:
ParticleLayoutItem(); ParticleLayoutItem();
DoubleDescriptor totalDensity() const; //! The density value which belonging only to the layout.
//!
//! This is the editable value. If an interference is present, this value may not be the one to
//! be used for building the domain layout or to be presented. For the correct value-to-use,
//! whether an interference is present or not, use totalDensity().
DoubleDescriptor ownDensity() const;
//! The real density.
//!
//! Returns ownDensity() if the interference is not influencing the density. If the
//! interference is defining the density, this is the interference-calculated density.
double totalDensity() const;
DoubleDescriptor weight() const; DoubleDescriptor weight() const;
QVector<ItemWithParticles*> particles() const; QVector<ItemWithParticles*> particles() const;
...@@ -46,8 +58,6 @@ public: ...@@ -46,8 +58,6 @@ public:
void setInterference(InterferenceItem* interference); void setInterference(InterferenceItem* interference);
void removeInterference(); void removeInterference();
void updateDensityValue();
// #baMigration Use only while not migrated to SessionModel! // #baMigration Use only while not migrated to SessionModel!
void enableDensity(bool b); void enableDensity(bool b);
......
...@@ -34,7 +34,7 @@ ParticleLayoutForm::ParticleLayoutForm(LayerForm* parent, ParticleLayoutItem* la ...@@ -34,7 +34,7 @@ ParticleLayoutForm::ParticleLayoutForm(LayerForm* parent, ParticleLayoutItem* la
{ {
FormLayouter layouter(this, ec); FormLayouter layouter(this, ec);
layouter.setContentsMargins(30, 6, 0, 0); layouter.setContentsMargins(30, 6, 0, 0);
int rowOfTotalDensity = layouter.addValue(m_layoutItem->totalDensity()); int rowOfTotalDensity = layouter.addValue(m_layoutItem->ownDensity());
m_totalDensitySpinBox = m_totalDensitySpinBox =
layouter.widgetAt<DoubleSpinBox*>(rowOfTotalDensity, QFormLayout::FieldRole); layouter.widgetAt<DoubleSpinBox*>(rowOfTotalDensity, QFormLayout::FieldRole);
ASSERT(m_totalDensitySpinBox); ASSERT(m_totalDensitySpinBox);
...@@ -105,6 +105,10 @@ void ParticleLayoutForm::updateDensityEnabling() ...@@ -105,6 +105,10 @@ void ParticleLayoutForm::updateDensityEnabling()
void ParticleLayoutForm::updateDensityValue() void ParticleLayoutForm::updateDensityValue()
{ {
if (m_layoutItem->totalDensityIsDefinedByInterference()) {
QSignalBlocker b(m_totalDensitySpinBox);
m_totalDensitySpinBox->setBaseValue(m_layoutItem->totalDensity());
} else
m_totalDensitySpinBox->updateValue(); m_totalDensitySpinBox->updateValue();
} }
......
...@@ -348,7 +348,6 @@ void SampleEditorController::setDensityRelatedValue(InterferenceItem* interferen ...@@ -348,7 +348,6 @@ void SampleEditorController::setDensityRelatedValue(InterferenceItem* interferen
auto* particlelayoutItem = dynamic_cast<ParticleLayoutItem*>(interferenceItem->parent()); auto* particlelayoutItem = dynamic_cast<ParticleLayoutItem*>(interferenceItem->parent());
if (!particlelayoutItem) if (!particlelayoutItem)
return; return;
particlelayoutItem->updateDensityValue();
// -- notify the containing particle layout UI about changed value // -- notify the containing particle layout UI about changed value
ASSERT(m_multiLayerForm); ASSERT(m_multiLayerForm);
...@@ -423,7 +422,7 @@ void SampleEditorController::selectInterference(InterferenceForm* widget, int ne ...@@ -423,7 +422,7 @@ void SampleEditorController::selectInterference(InterferenceForm* widget, int ne
if (auto* particleLayoutForm = dynamic_cast<ParticleLayoutForm*>(parent)) { if (auto* particleLayoutForm = dynamic_cast<ParticleLayoutForm*>(parent)) {
particleLayoutForm->updateDensityEnabling(); particleLayoutForm->updateDensityEnabling();
particleLayoutForm->layoutItem()->updateDensityValue(); particleLayoutForm->updateDensityValue();
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment