diff --git a/GUI/Model/To/DomainObjectBuilder.cpp b/GUI/Model/To/DomainObjectBuilder.cpp deleted file mode 100644 index bc69ebd0f74685abd26b4de6e7a7fce535961a83..0000000000000000000000000000000000000000 --- a/GUI/Model/To/DomainObjectBuilder.cpp +++ /dev/null @@ -1,78 +0,0 @@ -// ************************************************************************************************ -// -// BornAgain: simulate and fit reflection and scattering -// -//! @file GUI/Model/To/DomainObjectBuilder.cpp -//! @brief Implements DomainObjectBuilder namespace -//! -//! @homepage http://www.bornagainproject.org -//! @license GNU General Public License v3 or higher (see COPYING) -//! @copyright Forschungszentrum Jülich GmbH 2018 -//! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS) -// -// ************************************************************************************************ - -#include "GUI/Model/To/DomainObjectBuilder.h" -#include "GUI/Model/Instrument/InstrumentItems.h" -#include "GUI/Model/Sample/InterferenceItems.h" -#include "GUI/Model/Sample/LayerItem.h" -#include "GUI/Model/Sample/MultiLayerItem.h" -#include "GUI/Model/Sample/ParticleLayoutItem.h" -#include "GUI/Model/To/ToDomain.h" -#include "GUI/Util/Error.h" - -std::unique_ptr<MultiLayer> -GUI::Model::DomainObjectBuilder::buildMultiLayer(const MultiLayerItem& multiLayerItem) -{ - auto P_multilayer = GUI::Transform::ToDomain::createMultiLayer(multiLayerItem); - for (auto* layerItem : multiLayerItem.layers()) { - const bool isFirstLayer = layerItem == multiLayerItem.layers().first(); - const bool isLastLayer = layerItem == multiLayerItem.layers().last(); - auto P_layer = buildLayer(*layerItem, isFirstLayer || isLastLayer); - if (P_layer) { - const auto roughness = layerItem->roughness().currentItem(); - auto P_roughness = GUI::Transform::ToDomain::createLayerRoughness(roughness); - if (P_roughness && !isLastLayer) - P_multilayer->addLayerWithTopRoughness(*P_layer, *P_roughness); - else - P_multilayer->addLayer(*P_layer); - } - } - return P_multilayer; -} - -std::unique_ptr<Layer> GUI::Model::DomainObjectBuilder::buildLayer(const LayerItem& item, - bool isFirstOrLastLayer) -{ - auto P_layer = GUI::Transform::ToDomain::createLayer(item, isFirstOrLastLayer); - for (ParticleLayoutItem* layout : item.layouts()) { - auto P_layout = buildParticleLayout(*layout); - if (P_layout) - P_layer->addLayout(*P_layout); - } - return P_layer; -} - -std::unique_ptr<ParticleLayout> -GUI::Model::DomainObjectBuilder::buildParticleLayout(const ParticleLayoutItem& item) -{ - auto P_layout = GUI::Transform::ToDomain::createParticleLayout(item); - QVector<SessionItem*> children = item.getItems(); - for (int i = 0; i < children.size(); ++i) { - auto P_particle = GUI::Transform::ToDomain::createIParticle(*children[i]); - if (P_particle) { - P_layout->addParticle(*P_particle); - continue; - } - - throw Error("GUI::Model::DomainObjectBuilder::buildParticleLayout()" - " -> Error! Not implemented"); - } - InterferenceItem* interference = item.interference().currentItem(); - if (interference) { - auto P_interference = interference->createInterference(); - if (P_interference) - P_layout->setInterference(*P_interference); - } - return P_layout; -} diff --git a/GUI/Model/To/DomainObjectBuilder.h b/GUI/Model/To/DomainObjectBuilder.h deleted file mode 100644 index 132010d55d51bdbd99aa257f5fcb82c4093d96ca..0000000000000000000000000000000000000000 --- a/GUI/Model/To/DomainObjectBuilder.h +++ /dev/null @@ -1,40 +0,0 @@ -// ************************************************************************************************ -// -// BornAgain: simulate and fit reflection and scattering -// -//! @file GUI/Model/To/DomainObjectBuilder.h -//! @brief Defines namespace GUI::Model::DomainObjectBuilder -//! -//! @homepage http://www.bornagainproject.org -//! @license GNU General Public License v3 or higher (see COPYING) -//! @copyright Forschungszentrum Jülich GmbH 2018 -//! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS) -// -// ************************************************************************************************ - -#ifndef BORNAGAIN_GUI_MODEL_TO_DOMAINOBJECTBUILDER_H -#define BORNAGAIN_GUI_MODEL_TO_DOMAINOBJECTBUILDER_H - -#include <memory> - -class MultiLayer; -class Layer; -class LayerItem; -class Instrument; -class MultiLayerItem; -class ParticleLayout; -class ParticleLayoutItem; -class IInterference; -class SessionItem; -class InstrumentItem; -class ICoordSystem; - -namespace GUI::Model::DomainObjectBuilder { - -std::unique_ptr<MultiLayer> buildMultiLayer(const MultiLayerItem& item); -std::unique_ptr<Layer> buildLayer(const LayerItem& item, bool isFirstOrLastLayer); -std::unique_ptr<ParticleLayout> buildParticleLayout(const ParticleLayoutItem& item); - -} // namespace GUI::Model::DomainObjectBuilder - -#endif // BORNAGAIN_GUI_MODEL_TO_DOMAINOBJECTBUILDER_H diff --git a/GUI/Model/To/DomainSimulationBuilder.cpp b/GUI/Model/To/DomainSimulationBuilder.cpp index 5ee90855d10b51ce6174211dc7b2f7bfa3b7259d..8d79baa67c6bf16e4a70a8c0c88cfc42e1681478 100644 --- a/GUI/Model/To/DomainSimulationBuilder.cpp +++ b/GUI/Model/To/DomainSimulationBuilder.cpp @@ -30,7 +30,7 @@ #include "GUI/Model/Instrument/InstrumentItems.h" #include "GUI/Model/Sample/MultiLayerItem.h" #include "GUI/Model/Session/SimulationOptionsItem.h" -#include "GUI/Model/To/DomainObjectBuilder.h" +#include "GUI/Model/To/ToDomain.h" #include "GUI/Util/Error.h" #include "Param/Distrib/RangedDistributions.h" #include "Resample/Options/SimulationOptions.h" @@ -220,7 +220,7 @@ GUI::Model::DomainSimulationBuilder::createSimulation(const MultiLayerItem* samp throw Error(message); } - auto P_multilayer = GUI::Model::DomainObjectBuilder::buildMultiLayer(*sampleItem); + auto P_multilayer = GUI::Transform::ToDomain::buildMultiLayer(*sampleItem); if (const auto* gisasInstrument = dynamic_cast<const GISASInstrumentItem*>(instrumentItem)) return createGISASSimulation(std::move(P_multilayer), gisasInstrument, optionsItem); diff --git a/GUI/Model/To/ToDomain.cpp b/GUI/Model/To/ToDomain.cpp index 9cc724da0eefd9a927c177e36d724d0bc3e613dc..3e2ff9eed3ea91416453921bde5bfc8ec142b393 100644 --- a/GUI/Model/To/ToDomain.cpp +++ b/GUI/Model/To/ToDomain.cpp @@ -14,6 +14,7 @@ #include "GUI/Model/To/ToDomain.h" #include "GUI/Model/Material/MaterialItem.h" +#include "GUI/Model/Sample/InterferenceItems.h" #include "GUI/Model/Sample/LayerItem.h" #include "GUI/Model/Sample/LayerRoughnessItems.h" #include "GUI/Model/Sample/MesoCrystalItem.h" @@ -24,11 +25,20 @@ #include "GUI/Model/Sample/ParticleLayoutItem.h" #include "GUI/Model/Types/DoubleDescriptor.h" #include "GUI/Model/Types/UIntDescriptor.h" +#include "GUI/Util/Error.h" +#include "Sample/Aggregate/IInterference.h" +#include "Sample/Aggregate/ParticleLayout.h" +#include "Sample/Interface/LayerRoughness.h" +#include "Sample/Multilayer/Layer.h" +#include "Sample/Multilayer/MultiLayer.h" +#include "Sample/Particle/IParticle.h" #include "Sample/Particle/MesoCrystal.h" #include "Sample/Particle/Particle.h" #include "Sample/Particle/ParticleCoreShell.h" -std::unique_ptr<MultiLayer> GUI::Transform::ToDomain::createMultiLayer(const MultiLayerItem& item) +namespace { + +std::unique_ptr<MultiLayer> createMultiLayer(const MultiLayerItem& item) { auto P_multilayer = std::make_unique<MultiLayer>(); double cross_corr_length = item.crossCorrLength(); @@ -39,8 +49,7 @@ std::unique_ptr<MultiLayer> GUI::Transform::ToDomain::createMultiLayer(const Mul return P_multilayer; } -std::unique_ptr<Layer> GUI::Transform::ToDomain::createLayer(const LayerItem& item, - bool isFirstOrLastLayer) +std::unique_ptr<Layer> createLayer(const LayerItem& item, bool isFirstOrLastLayer) { auto P_layer = std::make_unique<Layer>(*item.materialItem()->createMaterial(), isFirstOrLastLayer ? 0.0 : item.thickness()); @@ -48,22 +57,7 @@ std::unique_ptr<Layer> GUI::Transform::ToDomain::createLayer(const LayerItem& it return P_layer; } -std::unique_ptr<LayerRoughness> GUI::Transform::ToDomain::createLayerRoughness( - const std::variant<LayerZeroRoughnessItem*, LayerBasicRoughnessItem*>& roughness) -{ - if (std::holds_alternative<LayerZeroRoughnessItem*>(roughness)) - return nullptr; - if (std::holds_alternative<LayerBasicRoughnessItem*>(roughness)) { - const auto& basicRoughnessItem = *std::get<LayerBasicRoughnessItem*>(roughness); - return std::make_unique<LayerRoughness>(basicRoughnessItem.sigma(), - basicRoughnessItem.hurst(), - basicRoughnessItem.lateralCorrelationLength()); - } - ASSERT(0); -} - -std::unique_ptr<ParticleLayout> -GUI::Transform::ToDomain::createParticleLayout(const ParticleLayoutItem& item) +std::unique_ptr<ParticleLayout> createParticleLayout(const ParticleLayoutItem& item) { auto P_layout = std::make_unique<ParticleLayout>(); double total_density = item.totalDensity(); @@ -73,7 +67,7 @@ GUI::Transform::ToDomain::createParticleLayout(const ParticleLayoutItem& item) return P_layout; } -std::unique_ptr<IParticle> GUI::Transform::ToDomain::createIParticle(const SessionItem& item) +std::unique_ptr<IParticle> createIParticle(const SessionItem& item) { std::unique_ptr<IParticle> P_particle; if (item.hasModelType<ParticleItem>()) { @@ -91,3 +85,73 @@ std::unique_ptr<IParticle> GUI::Transform::ToDomain::createIParticle(const Sessi } return P_particle; } + +std::unique_ptr<ParticleLayout> buildParticleLayout(const ParticleLayoutItem& item) +{ + auto P_layout = createParticleLayout(item); + QVector<SessionItem*> children = item.getItems(); + for (int i = 0; i < children.size(); ++i) { + auto P_particle = createIParticle(*children[i]); + if (P_particle) { + P_layout->addParticle(*P_particle); + continue; + } + + throw Error("GUI::Model::DomainObjectBuilder::buildParticleLayout()" + " -> Error! Not implemented"); + } + InterferenceItem* interference = item.interference().currentItem(); + if (interference) { + auto P_interference = interference->createInterference(); + if (P_interference) + P_layout->setInterference(*P_interference); + } + return P_layout; +} + +std::unique_ptr<Layer> buildLayer(const LayerItem& item, bool isFirstOrLastLayer) +{ + auto P_layer = createLayer(item, isFirstOrLastLayer); + for (ParticleLayoutItem* layout : item.layouts()) { + auto P_layout = buildParticleLayout(*layout); + if (P_layout) + P_layer->addLayout(*P_layout); + } + return P_layer; +} + +} // namespace + +std::unique_ptr<LayerRoughness> GUI::Transform::ToDomain::createLayerRoughness( + const std::variant<LayerZeroRoughnessItem*, LayerBasicRoughnessItem*>& roughness) +{ + if (std::holds_alternative<LayerZeroRoughnessItem*>(roughness)) + return nullptr; + if (std::holds_alternative<LayerBasicRoughnessItem*>(roughness)) { + const auto& basicRoughnessItem = *std::get<LayerBasicRoughnessItem*>(roughness); + return std::make_unique<LayerRoughness>(basicRoughnessItem.sigma(), + basicRoughnessItem.hurst(), + basicRoughnessItem.lateralCorrelationLength()); + } + ASSERT(0); +} + +std::unique_ptr<MultiLayer> +GUI::Transform::ToDomain::buildMultiLayer(const MultiLayerItem& multiLayerItem) +{ + auto P_multilayer = createMultiLayer(multiLayerItem); + for (auto* layerItem : multiLayerItem.layers()) { + const bool isFirstLayer = layerItem == multiLayerItem.layers().first(); + const bool isLastLayer = layerItem == multiLayerItem.layers().last(); + auto P_layer = buildLayer(*layerItem, isFirstLayer || isLastLayer); + if (P_layer) { + const auto roughness = layerItem->roughness().currentItem(); + auto P_roughness = createLayerRoughness(roughness); + if (P_roughness && !isLastLayer) + P_multilayer->addLayerWithTopRoughness(*P_layer, *P_roughness); + else + P_multilayer->addLayer(*P_layer); + } + } + return P_multilayer; +} diff --git a/GUI/Model/To/ToDomain.h b/GUI/Model/To/ToDomain.h index 3094cc184c45c0ad2a2023782f4db6e4682d542d..7fb9eb4225d447560ae3194fd03f368d31846a88 100644 --- a/GUI/Model/To/ToDomain.h +++ b/GUI/Model/To/ToDomain.h @@ -15,33 +15,23 @@ #ifndef BORNAGAIN_GUI_MODEL_TO_TODOMAIN_H #define BORNAGAIN_GUI_MODEL_TO_TODOMAIN_H -#include "Device/Instrument/Instrument.h" -#include "Param/Distrib/Distributions.h" // for IDistribution1D -#include "Param/Distrib/ParameterDistribution.h" -#include "Sample/Aggregate/IInterference.h" -#include "Sample/Aggregate/ParticleLayout.h" -#include "Sample/Interface/LayerRoughness.h" -#include "Sample/Multilayer/Layer.h" -#include "Sample/Multilayer/MultiLayer.h" -#include "Sample/Particle/IParticle.h" #include <memory> #include <variant> class LayerItem; class MultiLayerItem; -class ParticleLayoutItem; -class SessionItem; +class MultiLayer; class LayerZeroRoughnessItem; class LayerBasicRoughnessItem; +class LayerRoughness; namespace GUI::Transform::ToDomain { -std::unique_ptr<IParticle> createIParticle(const SessionItem& item); -std::unique_ptr<Layer> createLayer(const LayerItem& item, bool isFirstOrLastLayer); std::unique_ptr<LayerRoughness> createLayerRoughness( const std::variant<LayerZeroRoughnessItem*, LayerBasicRoughnessItem*>& roughness); -std::unique_ptr<MultiLayer> createMultiLayer(const MultiLayerItem& item); -std::unique_ptr<ParticleLayout> createParticleLayout(const ParticleLayoutItem& item); + +std::unique_ptr<MultiLayer> buildMultiLayer(const MultiLayerItem& item); + } // namespace GUI::Transform::ToDomain diff --git a/GUI/View/SampleDesigner/ScriptPanel.cpp b/GUI/View/SampleDesigner/ScriptPanel.cpp index 8e3af3eb6b24a8724317f8566db280710dbb315b..6c74ff967d3f14897164d4c87a2e5b0836bf12ff 100644 --- a/GUI/View/SampleDesigner/ScriptPanel.cpp +++ b/GUI/View/SampleDesigner/ScriptPanel.cpp @@ -16,7 +16,7 @@ #include "Core/Export/ExportToPython.h" #include "GUI/Model/Sample/MultiLayerItem.h" #include "GUI/Model/Sample/SampleModel.h" -#include "GUI/Model/To/DomainObjectBuilder.h" +#include "GUI/Model/To/ToDomain.h" #include "GUI/View/Info/CautionSign.h" #include "GUI/View/Info/PythonSyntaxHighlighter.h" #include "GUI/View/Tool/DesignerHelper.h" @@ -122,8 +122,7 @@ QString ScriptPanel::generateCodeSnippet() QString result; try { - auto multilayer = - GUI::Model::DomainObjectBuilder::buildMultiLayer(*m_currentMultiLayerItem); + auto multilayer = GUI::Transform::ToDomain::buildMultiLayer(*m_currentMultiLayerItem); result.append(QString::fromStdString(Py::Export::sampleCode(*multilayer))); } catch (const std::exception& ex) { QString message = diff --git a/Tests/Unit/GUI/TestLayerRoughnessItems.cpp b/Tests/Unit/GUI/TestLayerRoughnessItems.cpp index 43b7bf204b4a120d38aee7adeacd720c365da975..ae1684fa16cef2bc51995e2e83c1828066dab353 100644 --- a/Tests/Unit/GUI/TestLayerRoughnessItems.cpp +++ b/Tests/Unit/GUI/TestLayerRoughnessItems.cpp @@ -2,6 +2,7 @@ #include "GUI/Model/Sample/LayerRoughnessItems.h" #include "GUI/Model/To/ToDomain.h" #include "GUI/Model/Types/DoubleDescriptor.h" +#include "Sample/Interface/LayerRoughness.h" #include "Tests/GTestWrapper/google_test.h" class TestLayerRoughnessItems : public ::testing::Test {