BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
RealSpaceBuilder Class Reference
Inheritance diagram for RealSpaceBuilder:
[legend]
Collaboration diagram for RealSpaceBuilder:
[legend]

Public Member Functions

 RealSpaceBuilder (QWidget *parent=nullptr)
 
 ~RealSpaceBuilder ()
 
void populate (RealSpaceModel *model, const SessionItem &item, const SceneGeometry &sceneGeometry, const RealSpace::Camera::Position &cameraPosition=RealSpace::Camera::Position(RealSpace::Vector3D(0, -200, 120), RealSpace::Vector3D(0, 0, 0), RealSpace::Vector3D::_z))
 
void populateLayer (RealSpaceModel *model, const SessionItem &layerItem, const SceneGeometry &sceneGeometry, const QVector3D &origin={}, const bool isTopLayer=false)
 
void populateLayout (RealSpaceModel *model, const SessionItem &layoutItem, const SceneGeometry &sceneGeometry, const QVector3D &origin={})
 
void populateMultiLayer (RealSpaceModel *model, const SessionItem &item, const SceneGeometry &sceneGeometry, const QVector3D &origin={})
 
void populateParticleFromParticle3DContainer (RealSpaceModel *model, const Particle3DContainer &particle3DContainer, const QVector3D &lattice_position={}) const
 
void populateParticleFromParticleItem (RealSpaceModel *model, const SessionItem &particleItem) const
 

Detailed Description

Definition at line 28 of file RealSpaceBuilder.h.

Constructor & Destructor Documentation

◆ RealSpaceBuilder()

RealSpaceBuilder::RealSpaceBuilder ( QWidget *  parent = nullptr)

Definition at line 44 of file RealSpaceBuilder.cpp.

44 : QWidget(parent) {}

◆ ~RealSpaceBuilder()

RealSpaceBuilder::~RealSpaceBuilder ( )
default

Member Function Documentation

◆ populate()

void RealSpaceBuilder::populate ( RealSpaceModel model,
const SessionItem item,
const SceneGeometry sceneGeometry,
const RealSpace::Camera::Position cameraPosition = RealSpace::Camera::Position(RealSpace::Vector3D(0, -200, 120),                                                   RealSpace::Vector3D(0, 0, 0),                                                        RealSpace::Vector3D::_z) 
)

Definition at line 48 of file RealSpaceBuilder.cpp.

51 {
52  // default value of cameraPosition is in RealSpaceBuilder.h
53 
54  model->defCamPos = cameraPosition;
55 
56  if (item.modelType() == "MultiLayer")
57  populateMultiLayer(model, item, sceneGeometry);
58 
59  else if (item.modelType() == "Layer")
60  populateLayer(model, item, sceneGeometry);
61 
62  else if (item.modelType() == "ParticleLayout")
63  populateLayout(model, item, sceneGeometry);
64 
65  else if (item.modelType() == "Particle")
67 
68  else if (item.modelType() == "ParticleComposition")
70 
71  else if (item.modelType() == "ParticleCoreShell")
73 
74  else if (item.modelType() == "ParticleDistribution")
76 
77  else if (item.modelType() == "MesoCrystal")
79 }
void populateParticleFromParticleItem(RealSpaceModel *model, const SessionItem &particleItem) const
void populateLayer(RealSpaceModel *model, const SessionItem &layerItem, const SceneGeometry &sceneGeometry, const QVector3D &origin={}, const bool isTopLayer=false)
void populateLayout(RealSpaceModel *model, const SessionItem &layoutItem, const SceneGeometry &sceneGeometry, const QVector3D &origin={})
void populateMultiLayer(RealSpaceModel *model, const SessionItem &item, const SceneGeometry &sceneGeometry, const QVector3D &origin={})
Camera::Position defCamPos
Definition: model.h:53
QString modelType() const
Get model type.

References RealSpace::Model::defCamPos, SessionItem::modelType(), populateLayer(), populateLayout(), populateMultiLayer(), and populateParticleFromParticleItem().

Referenced by RealSpaceCanvas::updateScene().

Here is the call graph for this function:

◆ populateLayer()

void RealSpaceBuilder::populateLayer ( RealSpaceModel model,
const SessionItem layerItem,
const SceneGeometry sceneGeometry,
const QVector3D &  origin = {},
const bool  isTopLayer = false 
)

Definition at line 99 of file RealSpaceBuilder.cpp.

102 {
103  auto layer = TransformTo3D::createLayer(layerItem, sceneGeometry, origin);
104  if (layer && !isTopLayer)
105  model->addBlend(layer.release());
106 
107  for (auto layout : layerItem.getItems(LayerItem::T_LAYOUTS))
108  populateLayout(model, *layout, sceneGeometry, origin);
109 }
static const QString T_LAYOUTS
Definition: LayerItem.h:26
void addBlend(Object *)
Definition: model.cpp:127
QVector< SessionItem * > getItems(const QString &tag="") const
Returns vector of all items of given tag.
std::unique_ptr< RealSpace::Layer > createLayer(const SessionItem &layerItem, const SceneGeometry &sceneGeometry, const QVector3D &origin={})

References RealSpace::Model::addBlend(), TransformTo3D::createLayer(), SessionItem::getItems(), populateLayout(), and LayerItem::T_LAYOUTS.

Referenced by populate(), and populateMultiLayer().

Here is the call graph for this function:

◆ populateLayout()

void RealSpaceBuilder::populateLayout ( RealSpaceModel model,
const SessionItem layoutItem,
const SceneGeometry sceneGeometry,
const QVector3D &  origin = {} 
)

Definition at line 111 of file RealSpaceBuilder.cpp.

113 {
114  ASSERT(layoutItem.modelType() == "ParticleLayout");
115 
116  // If there is no particle to populate
117  if (!layoutItem.getItem(ParticleLayoutItem::T_PARTICLES))
118  return;
119 
120  double layer_size = sceneGeometry.layer_size();
121  double total_density = layoutItem.getItemValue(ParticleLayoutItem::P_TOTAL_DENSITY).toDouble();
122 
123  auto particle3DContainer_vector =
125 
126  auto interference = GetInterferenceFunction(layoutItem);
127 
128  RealSpacePositionBuilder pos_builder;
129  interference->accept(&pos_builder);
130  std::vector<std::vector<double>> lattice_positions =
131  pos_builder.generatePositions(layer_size, total_density);
133  lattice_positions, particle3DContainer_vector, model, sceneGeometry, this);
134 }
#define ASSERT(condition)
Definition: Assert.h:31
static const QString T_PARTICLES
static const QString P_TOTAL_DENSITY
std::vector< std::vector< double > > generatePositions(double layer_size, double density=0.0) const
double layer_size() const
QVariant getItemValue(const QString &tag) const
Directly access value of item under given tag.
SessionItem * getItem(const QString &tag="", int row=0) const
Returns item in given row of given tag.
void populateParticlesAtLatticePositions(const std::vector< std::vector< double >> &lattice_positions, const std::vector< Particle3DContainer > &particle3DContainer_vector, RealSpaceModel *model, const SceneGeometry &sceneGeometry, const RealSpaceBuilder *builder3D)
std::vector< Particle3DContainer > particle3DContainerVector(const SessionItem &layoutItem, const QVector3D &origin={})

References ASSERT, RealSpacePositionBuilder::generatePositions(), SessionItem::getItem(), SessionItem::getItemValue(), SceneGeometry::layer_size(), SessionItem::modelType(), ParticleLayoutItem::P_TOTAL_DENSITY, RealSpaceBuilderUtils::particle3DContainerVector(), RealSpaceBuilderUtils::populateParticlesAtLatticePositions(), and ParticleLayoutItem::T_PARTICLES.

Referenced by populate(), and populateLayer().

Here is the call graph for this function:

◆ populateMultiLayer()

void RealSpaceBuilder::populateMultiLayer ( RealSpaceModel model,
const SessionItem item,
const SceneGeometry sceneGeometry,
const QVector3D &  origin = {} 
)

Definition at line 81 of file RealSpaceBuilder.cpp.

83 {
84  double total_height(0.0);
85  int index(0);
86  for (auto layer : item.getItems(MultiLayerItem::T_LAYERS)) {
87 
88  bool isTopLayer = index == 0;
89  populateLayer(model, *layer, sceneGeometry,
90  QVector3D(0, 0, static_cast<float>(-total_height)), isTopLayer);
91 
92  if (index != 0)
93  total_height += TransformTo3D::visualLayerThickness(*layer, sceneGeometry);
94 
95  ++index;
96  }
97 }
static const QString T_LAYERS
double visualLayerThickness(const SessionItem &layerItem, const SceneGeometry &sceneGeometry)

References SessionItem::getItems(), populateLayer(), MultiLayerItem::T_LAYERS, and TransformTo3D::visualLayerThickness().

Referenced by populate().

Here is the call graph for this function:

◆ populateParticleFromParticle3DContainer()

void RealSpaceBuilder::populateParticleFromParticle3DContainer ( RealSpaceModel model,
const Particle3DContainer particle3DContainer,
const QVector3D &  lattice_position = {} 
) const

Definition at line 179 of file RealSpaceBuilder.cpp.

182 {
183  if (particle3DContainer.containerSize()) {
184  for (size_t i = 0; i < particle3DContainer.containerSize(); ++i) {
185  auto particle3D = particle3DContainer.createParticle(i);
186  particle3D->addTranslation(lattice_position);
187  if (particle3D) {
188  if (!particle3DContainer.particle3DBlend(i))
189  model->add(particle3D.release());
190  else
191  model->addBlend(particle3D.release()); // use addBlend() for transparent object
192  }
193  }
194  }
195 }
std::unique_ptr< RealSpace::Particles::Particle > createParticle(const size_t &index) const
size_t containerSize() const
bool particle3DBlend(const size_t &index) const
void add(Object *)
Definition: model.cpp:119

References RealSpace::Model::add(), RealSpace::Model::addBlend(), Particle3DContainer::containerSize(), Particle3DContainer::createParticle(), and Particle3DContainer::particle3DBlend().

Referenced by populateParticleFromParticleItem(), and RealSpaceBuilderUtils::populateParticlesAtLatticePositions().

Here is the call graph for this function:

◆ populateParticleFromParticleItem()

void RealSpaceBuilder::populateParticleFromParticleItem ( RealSpaceModel model,
const SessionItem particleItem 
) const

Definition at line 136 of file RealSpaceBuilder.cpp.

138 {
139  Particle3DContainer particle3DContainer;
140  if (particleItem.modelType() == "Particle") {
141  auto pItem = dynamic_cast<const ParticleItem*>(&particleItem);
142  auto particle = pItem->createParticle();
143  particle3DContainer = RealSpaceBuilderUtils::singleParticle3DContainer(*particle);
144  } else if (particleItem.modelType() == "ParticleCoreShell") {
145  auto particleCoreShellItem = dynamic_cast<const ParticleCoreShellItem*>(&particleItem);
146  // If there is no CORE or SHELL to populate inside ParticleCoreShellItem
147  if (!particleCoreShellItem->getItem(ParticleCoreShellItem::T_CORE)
148  || !particleCoreShellItem->getItem(ParticleCoreShellItem::T_SHELL))
149  return;
150  auto particleCoreShell = particleCoreShellItem->createParticleCoreShell();
151  particle3DContainer =
153  } else if (particleItem.modelType() == "ParticleComposition") {
154  auto particleCompositionItem = dynamic_cast<const ParticleCompositionItem*>(&particleItem);
155  // If there is no particle to populate inside ParticleCompositionItem
156  if (!particleCompositionItem->getItem(ParticleCompositionItem::T_PARTICLES))
157  return;
158  auto particleComposition = particleCompositionItem->createParticleComposition();
159  particle3DContainer =
161  } else if (particleItem.modelType() == "ParticleDistribution") {
162  auto particleDistributionItem =
163  dynamic_cast<const ParticleDistributionItem*>(&particleItem);
164  // If there is no particle to populate inside ParticleDistributionItem
165  if (!particleDistributionItem->getItem(ParticleDistributionItem::T_PARTICLES))
166  return;
167  // show nothing when ParticleDistributionItem is selected
168  } else if (particleItem.modelType() == "MesoCrystal") {
169  auto mesoCrystalItem = dynamic_cast<const MesoCrystalItem*>(&particleItem);
170  // If there is no particle to populate inside MesoCrystalItem
171  if (!mesoCrystalItem->getItem(MesoCrystalItem::T_BASIS_PARTICLE))
172  return;
173  particle3DContainer = RealSpaceBuilderUtils::mesoCrystal3DContainer(*mesoCrystalItem);
174  }
175 
176  populateParticleFromParticle3DContainer(model, particle3DContainer);
177 }
static const QString T_BASIS_PARTICLE
static const QString T_PARTICLES
std::unique_ptr< ParticleComposition > createParticleComposition() const
static const QString T_CORE
static const QString T_SHELL
std::unique_ptr< ParticleCoreShell > createParticleCoreShell() const
static const QString T_PARTICLES
std::unique_ptr< Particle > createParticle() const
void populateParticleFromParticle3DContainer(RealSpaceModel *model, const Particle3DContainer &particle3DContainer, const QVector3D &lattice_position={}) const
Particle3DContainer particleCoreShell3DContainer(const ParticleCoreShell &particleCoreShell, double total_abundance=1.0, const QVector3D &origin={})
Particle3DContainer particleComposition3DContainer(const ParticleComposition &particleComposition3DContainer, double total_abundance=1.0, const QVector3D &origin={})
Particle3DContainer mesoCrystal3DContainer(const MesoCrystalItem &mesoCrystalItem, double total_abundance=1.0, const QVector3D &origin={})
Particle3DContainer singleParticle3DContainer(const Particle &particle, double total_abundance=1.0, const QVector3D &origin={})

References ParticleItem::createParticle(), ParticleCompositionItem::createParticleComposition(), ParticleCoreShellItem::createParticleCoreShell(), RealSpaceBuilderUtils::mesoCrystal3DContainer(), SessionItem::modelType(), RealSpaceBuilderUtils::particleComposition3DContainer(), RealSpaceBuilderUtils::particleCoreShell3DContainer(), populateParticleFromParticle3DContainer(), RealSpaceBuilderUtils::singleParticle3DContainer(), MesoCrystalItem::T_BASIS_PARTICLE, ParticleCoreShellItem::T_CORE, ParticleCompositionItem::T_PARTICLES, ParticleDistributionItem::T_PARTICLES, and ParticleCoreShellItem::T_SHELL.

Referenced by populate().

Here is the call graph for this function:

The documentation for this class was generated from the following files: