diff --git a/GUI/Models/GUIObjectBuilder.cpp b/GUI/Models/GUIObjectBuilder.cpp index 643d2da92d0d5d76ed81f3f5cded053e528a5652..1a4dbbaa84569d4b5ec7daed1f589e122e9f1c16 100644 --- a/GUI/Models/GUIObjectBuilder.cpp +++ b/GUI/Models/GUIObjectBuilder.cpp @@ -71,19 +71,17 @@ SessionItem* GUI::Model::ObjectBuilder::populateInstrumentModel(InstrumentModel* SessionItem* GUI::Model::ObjectBuilder::populateDocumentModel(DocumentModel* p_document_model, const ISimulation& simulation) { - auto p_options_item = p_document_model->insertItem<SimulationOptionsItem>(); - if (simulation.options().isIntegrate()) { - p_options_item->setComputationMethod("Monte-Carlo Integration"); - p_options_item->setNumberOfMonteCarloPoints( - static_cast<int>(simulation.options().getMcPoints())); - } - if (simulation.options().useAvgMaterials()) { - p_options_item->setFresnelMaterialMethod("Average Layer Material"); - } - if (simulation.options().includeSpecular()) { - p_options_item->setIncludeSpecularPeak("Yes"); - } - return p_options_item; + auto* item = p_document_model->insertItem<SimulationOptionsItem>(); + + if (simulation.options().isIntegrate()) + item->setUseMonteCarloIntegration(static_cast<int>(simulation.options().getMcPoints())); + else + item->setUseAnalytical(); + + item->setUseAverageMaterials(simulation.options().useAvgMaterials()); + item->setIncludeSpecularPeak(simulation.options().includeSpecular()); + + return item; } namespace { diff --git a/GUI/Models/SimulationOptionsItem.cpp b/GUI/Models/SimulationOptionsItem.cpp index 81d9056f023f3e6ca92750854506699a374102c7..40b3f9960f733f8efa9310b63376b30740a8ae55 100644 --- a/GUI/Models/SimulationOptionsItem.cpp +++ b/GUI/Models/SimulationOptionsItem.cpp @@ -36,6 +36,14 @@ const QString tooltip_ambientmaterial = const QString tooltip_specularpeak = "Defines if the specular peak should be included in the simulation result"; +const QString Immediately = "Immediately"; +const QString InBackground = "In background"; +const QString Analytical = "Analytical"; +const QString MonteCarlo = "Monte-Carlo Integration"; +const QString AmbientLayerMaterial = "Ambient Layer Material"; +const QString AverageLayerMaterial = "Average Layer Material"; +const QString Yes = "Yes"; +const QString No = "No"; } // namespace const QString SimulationOptionsItem::P_RUN_POLICY = "Run Policy"; @@ -61,21 +69,18 @@ SimulationOptionsItem::SimulationOptionsItem() : SessionItem(M_TYPE) addProperty(P_NTHREADS, nthreads.variant())->setToolTip(tooltip_nthreads); ComboProperty computationMethod; - computationMethod << "Analytical" - << "Monte-Carlo Integration"; + computationMethod << Analytical << MonteCarlo; addProperty(P_COMPUTATION_METHOD, computationMethod.variant())->setToolTip(tooltip_computation); addProperty(P_MC_POINTS, 100)->setEnabled(false); ComboProperty averageLayerMaterials; - averageLayerMaterials << "Ambient Layer Material" - << "Average Layer Material"; + averageLayerMaterials << AmbientLayerMaterial << AverageLayerMaterial; addProperty(P_FRESNEL_MATERIAL_METHOD, averageLayerMaterials.variant()) ->setToolTip(tooltip_ambientmaterial); ComboProperty includeSpecularPeak; - includeSpecularPeak << "No" - << "Yes"; + includeSpecularPeak << No << Yes; addProperty(P_INCLUDE_SPECULAR_PEAK, includeSpecularPeak.variant()) ->setToolTip(tooltip_specularpeak); @@ -83,34 +88,48 @@ SimulationOptionsItem::SimulationOptionsItem() : SessionItem(M_TYPE) if (name == P_COMPUTATION_METHOD && isTag(P_MC_POINTS)) { ComboProperty combo = getItemValue(P_COMPUTATION_METHOD).value<ComboProperty>(); - if (combo.getValue() == "Analytical") { + if (combo.getValue() == Analytical) getItem(P_MC_POINTS)->setEnabled(false); - - } else { + else getItem(P_MC_POINTS)->setEnabled(true); - } - } else if (name == P_NTHREADS) { + } else if (name == P_NTHREADS) updateComboItem(P_NTHREADS, getCPUUsageOptions()); - } else if (name == P_RUN_POLICY) { + else if (name == P_RUN_POLICY) updateComboItem(P_RUN_POLICY, getRunPolicyNames()); - } }); } -int SimulationOptionsItem::getNumberOfThreads() const +int SimulationOptionsItem::numberOfThreads() const { ComboProperty combo = getItemValue(P_NTHREADS).value<ComboProperty>(); return m_text_to_nthreads[combo.getValue()]; } +void SimulationOptionsItem::setNumberOfThreads(int number) +{ + const QString numberAsText = m_text_to_nthreads.key(number); + ASSERT(!numberAsText.isEmpty()); + + ComboProperty combo = getItemValue(P_NTHREADS).value<ComboProperty>(); + combo.setValue(numberAsText); + setItemValue(P_NTHREADS, combo.variant()); + + ASSERT(numberOfThreads() == number); +} + bool SimulationOptionsItem::runImmediately() const { - return runPolicy() == "Immediately"; + return runPolicy() == Immediately; } bool SimulationOptionsItem::runInBackground() const { - return runPolicy() == "In background"; + return !runImmediately(); +} + +void SimulationOptionsItem::setRunImmediately(bool runImmediately) +{ + setRunPolicy(runImmediately ? Immediately : InBackground); } void SimulationOptionsItem::setRunPolicy(const QString& policy) @@ -120,6 +139,22 @@ void SimulationOptionsItem::setRunPolicy(const QString& policy) setItemValue(P_RUN_POLICY, combo.variant()); } +void SimulationOptionsItem::setUseMonteCarloIntegration(int numberOfPoints) +{ + setComputationMethod(MonteCarlo); + setNumberOfMonteCarloPoints(numberOfPoints); +} + +void SimulationOptionsItem::setUseAnalytical() +{ + setComputationMethod(Analytical); +} + +bool SimulationOptionsItem::useMonteCarloIntegration() const +{ + return getComputationMethod() == MonteCarlo; +} + void SimulationOptionsItem::setComputationMethod(const QString& name) { ComboProperty combo = getItemValue(P_COMPUTATION_METHOD).value<ComboProperty>(); @@ -133,7 +168,7 @@ QString SimulationOptionsItem::getComputationMethod() const return combo.getValue(); } -int SimulationOptionsItem::getNumberOfMonteCarloPoints() const +int SimulationOptionsItem::numberOfMonteCarloPoints() const { return getItemValue(P_MC_POINTS).toInt(); } @@ -143,6 +178,16 @@ void SimulationOptionsItem::setNumberOfMonteCarloPoints(int npoints) setItemValue(P_MC_POINTS, npoints); } +void SimulationOptionsItem::setUseAverageMaterials(bool useAverageMaterials) +{ + setFresnelMaterialMethod(useAverageMaterials ? AverageLayerMaterial : AmbientLayerMaterial); +} + +bool SimulationOptionsItem::useAverageMaterials() const +{ + return getFresnelMaterialMethod() == AverageLayerMaterial; +} + void SimulationOptionsItem::setFresnelMaterialMethod(const QString& name) { ComboProperty combo = getItemValue(P_FRESNEL_MATERIAL_METHOD).value<ComboProperty>(); @@ -156,17 +201,17 @@ QString SimulationOptionsItem::getFresnelMaterialMethod() const return combo.getValue(); } -void SimulationOptionsItem::setIncludeSpecularPeak(const QString& name) +void SimulationOptionsItem::setIncludeSpecularPeak(bool includeSpecularPeak) { ComboProperty combo = getItemValue(P_INCLUDE_SPECULAR_PEAK).value<ComboProperty>(); - combo.setValue(name); + combo.setValue(includeSpecularPeak ? Yes : No); setItemValue(P_INCLUDE_SPECULAR_PEAK, combo.variant()); } -QString SimulationOptionsItem::getIncludeSpecularPeak() const +bool SimulationOptionsItem::includeSpecularPeak() const { ComboProperty combo = getItemValue(P_INCLUDE_SPECULAR_PEAK).value<ComboProperty>(); - return combo.getValue(); + return combo.getValue() == Yes; } SessionItem* SimulationOptionsItem::monteCarloPointsItem() const @@ -204,8 +249,7 @@ QStringList SimulationOptionsItem::getCPUUsageOptions() QStringList SimulationOptionsItem::getRunPolicyNames() { QStringList result; - result << "Immediately" - << "In background"; + result << Immediately << InBackground; return result; } diff --git a/GUI/Models/SimulationOptionsItem.h b/GUI/Models/SimulationOptionsItem.h index 21a010b25f8dae5dba87fed1d2c32d452b54321b..642c28863cc341392152b7a790c8877a5e3f25fd 100644 --- a/GUI/Models/SimulationOptionsItem.h +++ b/GUI/Models/SimulationOptionsItem.h @@ -36,27 +36,37 @@ public: explicit SimulationOptionsItem(); - int getNumberOfThreads() const; + void setNumberOfThreads(int n); + int numberOfThreads() const; + + void setRunImmediately(bool runImmediately); bool runImmediately() const; bool runInBackground() const; - void setRunPolicy(const QString& policy); - - void setComputationMethod(const QString& name); - QString getComputationMethod() const; + void setUseMonteCarloIntegration(int numberOfPoints); + void setUseAnalytical(); + bool useMonteCarloIntegration() const; - int getNumberOfMonteCarloPoints() const; void setNumberOfMonteCarloPoints(int npoints); + int numberOfMonteCarloPoints() const; - void setFresnelMaterialMethod(const QString& name); - QString getFresnelMaterialMethod() const; + void setUseAverageMaterials(bool useAverageMaterials); + bool useAverageMaterials() const; - void setIncludeSpecularPeak(const QString& name); - QString getIncludeSpecularPeak() const; + void setIncludeSpecularPeak(bool includeSpecularPeak); + bool includeSpecularPeak() const; SessionItem* monteCarloPointsItem() const; private: + void setRunPolicy(const QString& policy); + + void setComputationMethod(const QString& name); + QString getComputationMethod() const; + + void setFresnelMaterialMethod(const QString& name); + QString getFresnelMaterialMethod() const; + QString runPolicy() const; QStringList getCPUUsageOptions(); QStringList getRunPolicyNames(); diff --git a/GUI/Models/TransformToDomain.cpp b/GUI/Models/TransformToDomain.cpp index 7838b6dac7337ca4d95bd0410b863ae517504f23..aab96e0fd2edcf869a2051da6881cb399ce208c0 100644 --- a/GUI/Models/TransformToDomain.cpp +++ b/GUI/Models/TransformToDomain.cpp @@ -171,15 +171,13 @@ void GUI::Transform::ToDomain::setSimulationOptions(ISimulation* simulation, ASSERT(item.modelType() == SimulationOptionsItem::M_TYPE); if (auto optionItem = dynamic_cast<const SimulationOptionsItem*>(&item)) { - simulation->options().setNumberOfThreads(optionItem->getNumberOfThreads()); - if (optionItem->getComputationMethod() == "Monte-Carlo Integration") { - simulation->options().setMonteCarloIntegration( - true, optionItem->getNumberOfMonteCarloPoints()); + simulation->options().setNumberOfThreads(optionItem->numberOfThreads()); + if (optionItem->useMonteCarloIntegration()) { + simulation->options().setMonteCarloIntegration(true, + optionItem->numberOfMonteCarloPoints()); } - if (optionItem->getFresnelMaterialMethod() == "Average Layer Material") - simulation->options().setUseAvgMaterials(true); - if (optionItem->getIncludeSpecularPeak() == "Yes") - simulation->options().setIncludeSpecular(true); + simulation->options().setUseAvgMaterials(optionItem->useAverageMaterials()); + simulation->options().setIncludeSpecular(optionItem->includeSpecularPeak()); } } diff --git a/Tests/UnitTests/GUI/TestMapperCases.cpp b/Tests/UnitTests/GUI/TestMapperCases.cpp index 8f5f1e53df2216b6045a816a4365af4eb9608eca..d0d1757c1ef3d0d13a424b7ede4f509049433e69 100644 --- a/Tests/UnitTests/GUI/TestMapperCases.cpp +++ b/Tests/UnitTests/GUI/TestMapperCases.cpp @@ -35,9 +35,9 @@ TEST_F(TestMapperCases, test_SimulationOptionsComputationToggle) SimulationOptionsItem* item = model.simulationOptionsItem(); - EXPECT_EQ(item->getComputationMethod(), "Analytical"); + EXPECT_EQ(item->useMonteCarloIntegration(), false); EXPECT_FALSE(item->monteCarloPointsItem()->isEnabled()); - item->setComputationMethod("Monte-Carlo Integration"); + item->setUseMonteCarloIntegration(100); EXPECT_TRUE(item->monteCarloPointsItem()->isEnabled()); }