Skip to content
Snippets Groups Projects
Commit 4261a464 authored by m.puchner's avatar m.puchner
Browse files

Merge branch 'SimplifyRealSpaceBuilder' into 'develop'

simplify RealSpace generation

See merge request !477
parents 78221631 62f7a706
No related branches found
No related tags found
1 merge request!477simplify RealSpace generation
Pipeline #50291 passed
...@@ -22,10 +22,10 @@ ...@@ -22,10 +22,10 @@
#include "GUI/Model/Sample/ParticleItem.h" #include "GUI/Model/Sample/ParticleItem.h"
#include "GUI/Model/Sample/ParticleLayoutItem.h" #include "GUI/Model/Sample/ParticleLayoutItem.h"
#include "GUI/Model/Types/DoubleDescriptor.h" #include "GUI/Model/Types/DoubleDescriptor.h"
#include "GUI/View/Realspace/IPositionBuilder.h"
#include "GUI/View/Realspace/Particle3DContainer.h" #include "GUI/View/Realspace/Particle3DContainer.h"
#include "GUI/View/Realspace/RealSpaceBuilderUtils.h" #include "GUI/View/Realspace/RealSpaceBuilderUtils.h"
#include "GUI/View/Realspace/RealSpaceCanvas.h" #include "GUI/View/Realspace/RealSpaceCanvas.h"
#include "GUI/View/Realspace/RealSpacePositionBuilder.h"
#include "GUI/View/Realspace/TransformTo3D.h" #include "GUI/View/Realspace/TransformTo3D.h"
#include "GUI/ba3d/model/model.h" #include "GUI/ba3d/model/model.h"
#include "Sample/Aggregate/Interferences.h" #include "Sample/Aggregate/Interferences.h"
...@@ -34,15 +34,30 @@ ...@@ -34,15 +34,30 @@
namespace { namespace {
std::unique_ptr<IInterference> GetInterference(const ParticleLayoutItem& layoutItem) std::vector<std::vector<double>> generatePositions(const ParticleLayoutItem& layoutItem,
double layerSize, double density)
{ {
auto* interferenceItem = layoutItem.interference().currentItem(); auto* interferenceItem = layoutItem.interference().currentItem();
if (interferenceItem) { if (interferenceItem) {
auto P_interference = interferenceItem->createInterference(); auto interference = interferenceItem->createInterference();
if (P_interference)
return std::unique_ptr<IInterference>(P_interference.release()); if (auto* p = dynamic_cast<Interference1DLattice*>(interference.get()))
return Lattice1DPositionBuilder(p).generatePositions(layerSize, density);
if (auto* p = dynamic_cast<Interference2DLattice*>(interference.get()))
return Lattice2DPositionBuilder(p).generatePositions(layerSize, density);
if (auto* p = dynamic_cast<Interference2DParaCrystal*>(interference.get()))
return ParaCrystal2DPositionBuilder(p).generatePositions(layerSize, density);
if (auto* p = dynamic_cast<InterferenceFinite2DLattice*>(interference.get()))
return Finite2DLatticePositionBuilder(p).generatePositions(layerSize, density);
if (auto* p = dynamic_cast<InterferenceRadialParaCrystal*>(interference.get()))
return RadialParacrystalPositionBuilder(p).generatePositions(layerSize, density);
} }
return std::make_unique<InterferenceNone>();
return RandomPositionBuilder().generatePositions(layerSize, density);
} }
} // namespace } // namespace
...@@ -121,14 +136,9 @@ void RealSpaceBuilder::populateLayout(GUI::RealSpace::Model* model, ...@@ -121,14 +136,9 @@ void RealSpaceBuilder::populateLayout(GUI::RealSpace::Model* model,
auto particle3DContainer_vector = auto particle3DContainer_vector =
GUI::RealSpace::BuilderUtils::particle3DContainerVector(layoutItem, origin); GUI::RealSpace::BuilderUtils::particle3DContainerVector(layoutItem, origin);
auto interference = GetInterference(layoutItem); const auto latticePositions = generatePositions(layoutItem, layer_size, total_density);
RealSpacePositionBuilder pos_builder;
interference->accept(&pos_builder);
std::vector<std::vector<double>> lattice_positions =
pos_builder.generatePositions(layer_size, total_density);
GUI::RealSpace::BuilderUtils::populateParticlesAtLatticePositions( GUI::RealSpace::BuilderUtils::populateParticlesAtLatticePositions(
lattice_positions, particle3DContainer_vector, model, sceneGeometry, this); latticePositions, particle3DContainer_vector, model, sceneGeometry, this);
} }
void RealSpaceBuilder::populateParticleFromParticleItem(GUI::RealSpace::Model* model, void RealSpaceBuilder::populateParticleFromParticleItem(GUI::RealSpace::Model* model,
......
// ************************************************************************************************
//
// BornAgain: simulate and fit reflection and scattering
//
//! @file GUI/View/Realspace/RealSpacePositionBuilder.cpp
//! @brief Implements class RealSpacePositionBuilder
//!
//! @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/View/Realspace/RealSpacePositionBuilder.h"
#include "GUI/View/Realspace/IPositionBuilder.h"
#include <memory>
RealSpacePositionBuilder::RealSpacePositionBuilder() : m_pos_builder{new DefaultPositionBuilder()}
{
}
RealSpacePositionBuilder::~RealSpacePositionBuilder() = default;
void RealSpacePositionBuilder::visit(const Interference1DLattice* p_iff)
{
m_pos_builder = std::make_unique<Lattice1DPositionBuilder>(p_iff);
}
void RealSpacePositionBuilder::visit(const Interference2DLattice* p_iff)
{
m_pos_builder = std::make_unique<Lattice2DPositionBuilder>(p_iff);
}
void RealSpacePositionBuilder::visit(const Interference2DParaCrystal* p_iff)
{
m_pos_builder = std::make_unique<ParaCrystal2DPositionBuilder>(p_iff);
}
void RealSpacePositionBuilder::visit(const InterferenceFinite2DLattice* p_iff)
{
m_pos_builder = std::make_unique<Finite2DLatticePositionBuilder>(p_iff);
}
void RealSpacePositionBuilder::visit(const InterferenceRadialParaCrystal* p_iff)
{
m_pos_builder = std::make_unique<RadialParacrystalPositionBuilder>(p_iff);
}
void RealSpacePositionBuilder::visit(const InterferenceNone*)
{
m_pos_builder = std::make_unique<RandomPositionBuilder>();
}
std::vector<std::vector<double>> RealSpacePositionBuilder::generatePositions(double layer_size,
double density) const
{
return m_pos_builder->generatePositions(layer_size, density);
}
// ************************************************************************************************
//
// BornAgain: simulate and fit reflection and scattering
//
//! @file GUI/View/Realspace/RealSpacePositionBuilder.h
//! @brief Defines class RealSpacePositionBuilder
//!
//! @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_VIEW_REALSPACE_REALSPACEPOSITIONBUILDER_H
#define BORNAGAIN_GUI_VIEW_REALSPACE_REALSPACEPOSITIONBUILDER_H
#include "Param/Node/INodeVisitor.h"
#include <memory>
#include <vector>
class IPositionBuilder;
class RealSpacePositionBuilder : public INodeVisitor {
public:
RealSpacePositionBuilder();
~RealSpacePositionBuilder() override;
using INodeVisitor::visit;
void visit(const Interference1DLattice* p_iff) override;
void visit(const Interference2DLattice* p_iff) override;
void visit(const Interference2DParaCrystal* p_iff) override;
void visit(const InterferenceFinite2DLattice* p_iff) override;
void visit(const InterferenceRadialParaCrystal* p_iff) override;
void visit(const InterferenceNone* p_iff) override;
std::vector<std::vector<double>> generatePositions(double layer_size,
double density = 0.0) const;
private:
std::unique_ptr<IPositionBuilder> m_pos_builder;
};
#endif // BORNAGAIN_GUI_VIEW_REALSPACE_REALSPACEPOSITIONBUILDER_H
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment