Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • c.trageser/bornagain
  • mlz/bornagain
2 results
Show changes
Commits on Source (24)
Showing
with 139 additions and 259 deletions
......@@ -16,7 +16,6 @@
#include "Base/Const/Units.h"
#include "GUI/Model/From/FromDomain.h"
#include "GUI/Model/Material/MaterialItem.h"
#include "GUI/Model/Material/MaterialItemUtils.h"
#include "GUI/Model/Material/MaterialModel.h"
#include "GUI/Model/Sample/FormFactorItems.h"
#include "GUI/Model/Sample/InterferenceItems.h"
......@@ -89,6 +88,11 @@ SessionItem* GUIDomainSampleVisitor::populateSampleModel(SampleModel* sampleMode
}
SessionItem* result = m_levelToParentItem[1];
// initialize all items with materials to find the materials
for (auto multiLayerItem : sampleModel->multiLayerItems())
for (auto itemWithMaterial : multiLayerItem->itemsWithMaterial())
itemWithMaterial->setMaterialModel(materialModel);
result->setItemName(m_topSampleName);
return result;
}
......
......@@ -24,6 +24,7 @@
#include "GUI/Model/Instrument/InstrumentItems.h"
#include "GUI/Model/Job/JobItemUtils.h"
#include "GUI/Model/Material/MaterialItemContainer.h"
#include "GUI/Model/Sample/ItemWithMaterial.h"
#include "GUI/Model/Sample/MultiLayerItem.h"
#include "GUI/Model/Session/SimulationOptionsItem.h"
#include "GUI/Util/Error.h"
......@@ -242,7 +243,15 @@ MultiLayerItem* JobItem::sampleItem()
MultiLayerItem* JobItem::copySampleIntoJob(const MultiLayerItem* sample)
{
return model()->copyItem(sample, this, T_SAMPLE);
model()->copyItem(sample, this, T_SAMPLE);
// initialize finder-function of items with material
for (auto* itemWithMaterial : sampleItem()->itemsWithMaterial()) {
itemWithMaterial->setMaterialFinder(
[=](const QString& id) { return materialContainerItem()->findMaterialById(id); });
}
return sampleItem();
}
InstrumentItem* JobItem::instrumentItem() const
......
......@@ -23,6 +23,8 @@
#include "GUI/Model/Job/JobModelFunctions.h"
#include "GUI/Model/Job/JobQueueData.h"
#include "GUI/Model/Job/ParameterTreeUtils.h"
#include "GUI/Model/Material/MaterialItemContainer.h"
#include "GUI/Model/Sample/ItemWithMaterial.h"
#include "GUI/Model/Sample/MultiLayerItem.h"
#include "GUI/Util/Path.h"
......@@ -159,11 +161,18 @@ void JobModel::readFrom(QXmlStreamReader* reader, MessageService* messageService
// Set & check instrument links. JobItem and realDataItem have to reference the same instrument
// (which is the one contained in this job item, not contained in the instrument model)
for (auto* jobItem : jobItems())
for (auto* jobItem : jobItems()) {
if (RealDataItem* refItem = jobItem->realDataItem()) {
refItem->setInstrumentId(jobItem->instrumentItem()->id());
ASSERT(refItem->linkedInstrument() == jobItem->instrumentItem());
}
// initialize the material finder functions
for (auto* itemWithMaterial : jobItem->sampleItem()->itemsWithMaterial())
itemWithMaterial->setMaterialFinder([=](const QString& id) {
return jobItem->materialContainerItem()->findMaterialById(id);
});
}
}
void JobModel::onCancelAllJobs()
......
......@@ -30,7 +30,6 @@
#include "GUI/Model/Job/JobItemUtils.h"
#include "GUI/Model/Material/MaterialItem.h"
#include "GUI/Model/Material/MaterialItemContainer.h"
#include "GUI/Model/Material/MaterialItemUtils.h"
#include "GUI/Model/Sample/ItemWithMaterial.h"
#include "GUI/Model/Sample/MultiLayerItem.h"
#include "GUI/Util/Error.h"
......@@ -130,21 +129,15 @@ void GUI::Model::JobFunctions::setupJobItemSampleData(JobItem* jobItem,
MultiLayerItem* multilayer = jobItem->copySampleIntoJob(sampleItem);
multilayer->setItemName(MultiLayerItem::M_TYPE);
// copying materials
// copy used materials into material container
MaterialItemContainer* container = jobItem->createMaterialContainer();
std::map<MaterialItem*, MaterialItem*> materials;
for (auto* itemWithMaterial : multilayer->itemsWithMaterial()) {
auto materialIdentifier = itemWithMaterial->materialIdentifier();
auto* material = GUI::MaterialUtil::findMaterial(materialIdentifier);
auto iter = materials.find(material);
if (iter == materials.end()) {
for (auto* itemWithMaterial : sampleItem->itemsWithMaterial()) {
auto* material = itemWithMaterial->materialItem();
if (!container->findMaterialById(material->identifier())) {
auto* materialCopy = container->insertCopy(material);
materials[material] = materialCopy;
itemWithMaterial->setMaterial(materialCopy);
} else
itemWithMaterial->setMaterial(iter->second);
materialCopy->setIdentifier(material->identifier()); // insertCopy() doesn't do this
}
}
}
......
......@@ -125,6 +125,16 @@ complex_t MaterialItem::scatteringLengthDensity() const
return complex_t(real, imag);
}
QString MaterialItem::materialName() const
{
return itemName();
}
void MaterialItem::setMaterialName(const QString& name)
{
setItemName(name);
}
QString MaterialItem::identifier() const
{
return getItemValue(P_IDENTIFIER).toString();
......
......@@ -55,6 +55,9 @@ public:
/// \pre ! hasRefractiveIndex
complex_t scatteringLengthDensity() const;
QString materialName() const;
void setMaterialName(const QString& name);
QString identifier() const;
void setIdentifier(const QString& id);
......
......@@ -32,7 +32,10 @@ public:
//! and returns a pointer to the copy.
MaterialItem* insertCopy(MaterialItem* material_item);
//! Can be nullptr if not found
const MaterialItem* findMaterialById(QString id) const;
//! Can be nullptr if not found
MaterialItem* findMaterialById(QString id);
QVector<MaterialItem*> getMaterials();
......
// ************************************************************************************************
//
// BornAgain: simulate and fit reflection and scattering
//
//! @file GUI/Model/Material/MaterialItemUtils.cpp
//! @brief Implements class MaterialItemUtils
//!
//! @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/Material/MaterialItemUtils.h"
#include "GUI/Model/Material/MaterialItem.h"
#include "GUI/Model/Material/MaterialItemContainer.h"
#include "GUI/Model/Material/MaterialModel.h"
#include "GUI/Model/Material/MaterialModelStore.h"
#include "GUI/Util/Error.h"
#include "Sample/Material/Material.h"
#include <deque>
#include <random>
QColor GUI::MaterialUtil::randomMaterialColor()
{
static std::random_device r;
std::default_random_engine re(r());
std::uniform_int_distribution<int> ru(0, 255);
return QColor(ru(re), ru(re), ru(re));
}
QString GUI::MaterialUtil::defaultMaterialIdentifier()
{
if (!GUI::Model::MaterialModelStore::materialModel())
return QString();
const auto materials = GUI::Model::MaterialModelStore::materialModel()->materialItems();
return materials.isEmpty() ? QString() : materials.front()->identifier();
}
std::unique_ptr<Material> GUI::MaterialUtil::createDomainMaterial(const QString& materialIdentifier)
{
MaterialItem* materialItem = findMaterial(materialIdentifier);
return materialItem->createMaterial();
}
std::unique_ptr<Material>
GUI::MaterialUtil::createDomainMaterial(const QString& materialIdentifier,
const MaterialItemContainer& container)
{
const MaterialItem* material_item = container.findMaterialById(materialIdentifier);
if (!material_item)
throw Error("MaterialUtils::createDomainMaterial() -> Error. Can't find "
"material with identifier '"
+ materialIdentifier + "'.");
return material_item->createMaterial();
}
MaterialItem* GUI::MaterialUtil::findMaterial(const QString& materialIdentifier)
{
if (!GUI::Model::MaterialModelStore::materialModel())
throw Error("GUI::MaterialUtil::findMaterial() -> Error. "
"Attempt to access non-existing material model");
auto* material =
GUI::Model::MaterialModelStore::materialModel()->materialFromIdentifier(materialIdentifier);
if (!material)
throw Error("MaterialUtils::findMaterial() -> Error. Can't find "
"material with identifier '"
+ materialIdentifier + "'.");
return material;
}
// ************************************************************************************************
//
// BornAgain: simulate and fit reflection and scattering
//
//! @file GUI/Model/Material/MaterialItemUtils.h
//! @brief Defines namespace GUI::MaterialUtil
//!
//! @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_MATERIAL_MATERIALITEMUTILS_H
#define BORNAGAIN_GUI_MODEL_MATERIAL_MATERIALITEMUTILS_H
#include <QColor>
#include <QString>
#include <memory>
class Material;
class MaterialItem;
class MaterialItemContainer;
class ItemWithMaterial;
class ParticleLayoutItem;
namespace GUI::MaterialUtil {
QColor randomMaterialColor();
QString defaultMaterialIdentifier();
std::unique_ptr<Material> createDomainMaterial(const QString& materialIdentifier);
std::unique_ptr<Material> createDomainMaterial(const QString& materialIdentifier,
const MaterialItemContainer& container);
MaterialItem* findMaterial(const QString& materialIdentifier);
} // namespace GUI::MaterialUtil
#endif // BORNAGAIN_GUI_MODEL_MATERIAL_MATERIALITEMUTILS_H
......@@ -14,9 +14,9 @@
#include "GUI/Model/Material/MaterialModel.h"
#include "GUI/Model/Material/MaterialItem.h"
#include "GUI/Model/Material/MaterialItemUtils.h"
#include "GUI/Model/Material/MaterialModelStore.h"
#include <QColor>
#include <QUuid>
#include <random>
namespace {
......@@ -30,7 +30,13 @@ QColor suggestMaterialColor(const QString& name)
return QColor(Qt::green);
if (name.contains("Particle"))
return QColor(146, 198, 255);
return GUI::MaterialUtil::randomMaterialColor();
// return a random color
static std::random_device r;
std::default_random_engine re(r());
std::uniform_int_distribution<int> ru(0, 255);
return QColor(ru(re), ru(re), ru(re));
}
} // namespace
......@@ -40,14 +46,11 @@ MaterialModel::MaterialModel(QObject* parent)
: SessionModel(GUI::Session::XML::MaterialModelTag, parent)
{
setObjectName(GUI::Session::XML::MaterialModelTag);
if (GUI::Model::MaterialModelStore::materialModel() == nullptr)
GUI::Model::MaterialModelStore::subscribe(this);
}
MaterialModel::~MaterialModel()
void MaterialModel::clear()
{
if (GUI::Model::MaterialModelStore::materialModel() == this)
GUI::Model::MaterialModelStore::unsubscribe(this);
SessionModel::clear();
}
MaterialModel* MaterialModel::createCopy(SessionItem* parent)
......@@ -60,7 +63,7 @@ MaterialModel* MaterialModel::createCopy(SessionItem* parent)
MaterialItem* MaterialModel::addRefractiveMaterial(const QString& name, double delta, double beta)
{
auto* materialItem = insertItem<MaterialItem>();
materialItem->setItemName(name);
materialItem->setMaterialName(name);
materialItem->setColor(suggestMaterialColor(name));
materialItem->setRefractiveIndex(delta, beta);
return materialItem;
......@@ -69,22 +72,22 @@ MaterialItem* MaterialModel::addRefractiveMaterial(const QString& name, double d
MaterialItem* MaterialModel::addSLDMaterial(const QString& name, double sld, double abs_term)
{
auto* materialItem = insertItem<MaterialItem>();
materialItem->setItemName(name);
materialItem->setMaterialName(name);
materialItem->setColor(suggestMaterialColor(name));
materialItem->setScatteringLengthDensity(complex_t(sld, abs_term));
return materialItem;
}
MaterialItem* MaterialModel::materialFromName(const QString& name)
MaterialItem* MaterialModel::materialFromName(const QString& name) const
{
for (auto* materialItem : topItems<MaterialItem>())
if (materialItem->itemName() == name)
if (materialItem->materialName() == name)
return materialItem;
return nullptr;
}
MaterialItem* MaterialModel::materialFromIdentifier(const QString& identifier)
MaterialItem* MaterialModel::materialFromIdentifier(const QString& identifier) const
{
for (auto* materialItem : topItems<MaterialItem>())
if (materialItem->identifier() == identifier)
......@@ -100,7 +103,7 @@ MaterialItem* MaterialModel::cloneMaterial(MaterialItem* material)
auto* clonedMaterial = copyItem(material, nullptr);
clonedMaterial->setIdentifier(QUuid::createUuid().toString());
clonedMaterial->setItemName(material->itemName() + " (copy)");
clonedMaterial->setMaterialName(material->materialName() + " (copy)");
return clonedMaterial;
}
......@@ -119,6 +122,12 @@ MaterialItem* MaterialModel::findMaterialItem(const QString& identifier) const
return nullptr;
}
MaterialItem* MaterialModel::defaultMaterial() const
{
ASSERT(!materialItems().isEmpty());
return materialItems().front();
}
void MaterialModel::removeMaterial(const QString& identifier)
{
removeMaterial(materialFromIdentifier(identifier));
......
......@@ -24,15 +24,16 @@ class MaterialModel : public SessionModel {
public:
explicit MaterialModel(QObject* parent = nullptr);
~MaterialModel() override;
void clear() override;
MaterialModel* createCopy(SessionItem* parent = nullptr) override;
MaterialItem* addRefractiveMaterial(const QString& name, double delta, double beta);
MaterialItem* addSLDMaterial(const QString& name, double sld, double abs_term);
MaterialItem* materialFromName(const QString& name);
MaterialItem* materialFromIdentifier(const QString& identifier);
MaterialItem* materialFromName(const QString& name) const;
MaterialItem* materialFromIdentifier(const QString& identifier) const;
//! Returns clone of given material. Clone will get the same material identifier!
MaterialItem* cloneMaterial(MaterialItem* material);
......@@ -40,6 +41,8 @@ public:
QVector<MaterialItem*> materialItems() const;
MaterialItem* findMaterialItem(const QString& identifier) const;
MaterialItem* defaultMaterial() const;
void removeMaterial(const QString& identifier);
void removeMaterial(MaterialItem* materialItem);
......
// ************************************************************************************************
//
// BornAgain: simulate and fit reflection and scattering
//
//! @file GUI/Model/Material/MaterialModelStore.cpp
//! @brief Implements namespace MaterialModelStore
//!
//! @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/Material/MaterialModelStore.h"
#include "GUI/Util/Error.h"
namespace {
MaterialModel* theMaterialModel = nullptr;
}
namespace GUI::Model::MaterialModelStore {
MaterialModel* materialModel()
{
return theMaterialModel;
}
void subscribe(MaterialModel* materialModel)
{
if (theMaterialModel != nullptr)
throw Error("GUI::Model::MaterialModelStore::subscribe() -> Error. Attempt to subscribe "
"MaterialModel twice.");
theMaterialModel = materialModel;
}
void unsubscribe(MaterialModel* materialModel)
{
if (theMaterialModel != materialModel)
throw Error("GUI::Model::MaterialModelStore::unsubscribe -> Error. Attempt to unsubscribe "
"MaterialModel before it was subscribed.");
theMaterialModel = nullptr;
}
} // namespace GUI::Model::MaterialModelStore
// ************************************************************************************************
//
// BornAgain: simulate and fit reflection and scattering
//
//! @file GUI/Model/Material/MaterialModelStore.h
//! @brief Defines namespace GUI::Model::MaterialModelStore
//!
//! @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_MATERIAL_MATERIALMODELSTORE_H
#define BORNAGAIN_GUI_MODEL_MATERIAL_MATERIALMODELSTORE_H
class MaterialModel;
//! The MaterialModelStore holds an instance of the MaterialModel class
namespace GUI::Model::MaterialModelStore {
MaterialModel* materialModel();
void subscribe(MaterialModel* materialModel);
void unsubscribe(MaterialModel* materialModel);
} // namespace GUI::Model::MaterialModelStore
#endif // BORNAGAIN_GUI_MODEL_MATERIAL_MATERIALMODELSTORE_H
......@@ -16,7 +16,11 @@
#include "GUI/Model/IO/ProjectUtils.h"
#include "GUI/Model/Instrument/LinkInstrumentManager.h"
#include "GUI/Model/Job/JobModel.h"
#include "GUI/Model/Material/MaterialModel.h"
#include "GUI/Model/Project/OutputDataIOService.h"
#include "GUI/Model/Sample/ItemWithMaterial.h"
#include "GUI/Model/Sample/MultiLayerItem.h"
#include "GUI/Model/Sample/SampleModel.h"
#include "GUI/Model/Session/SimulationOptionsItem.h"
#include "GUI/Util/Error.h"
#include "GUI/Util/MessageService.h"
......@@ -328,6 +332,11 @@ ProjectDocument::ReadResult ProjectDocument::readProject(QIODevice* device,
}
}
// initialize all items with materials to find the materials
for (auto multiLayerItem : m_applicationModels.sampleModel()->multiLayerItems())
for (auto itemWithMaterial : multiLayerItem->itemsWithMaterial())
itemWithMaterial->setMaterialModel(m_applicationModels.materialModel());
if (reader.hasError()) {
QString message = QString("Format error '%1'").arg(reader.errorString());
messageService.addError(this, message);
......
......@@ -17,8 +17,8 @@
#include "GUI/Model/Job/JobModelFunctions.h"
#include "GUI/Model/Material/MaterialItem.h"
#include "GUI/Model/Material/MaterialItemContainer.h"
#include "GUI/Model/Material/MaterialItemUtils.h"
#include "Sample/Material/Material.h"
#include "GUI/Model/Material/MaterialModel.h"
#include <QColor>
void ItemWithMaterial::setMaterial(const MaterialItem* materialItem)
{
......@@ -35,6 +35,18 @@ bool ItemWithMaterial::isMaterialPropertyName(const QString& name)
return name == P_MATERIAL;
}
void ItemWithMaterial::setMaterialFinder(std::function<MaterialItem*(const QString&)> fn)
{
m_fnFindMaterialById = fn;
}
void ItemWithMaterial::setMaterialModel(const MaterialModel* materialModel)
{
m_fnFindMaterialById = [=](const QString& id) {
return materialModel->materialFromIdentifier(id);
};
}
void ItemWithMaterial::setMaterialUndefined()
{
setItemValue(P_MATERIAL, QString());
......@@ -42,22 +54,14 @@ void ItemWithMaterial::setMaterialUndefined()
QColor ItemWithMaterial::materialColor() const
{
const auto* const parentJob = GUI::Model::JobFunctions::findJobItem(this);
if (parentJob)
return parentJob->materialContainerItem()->findMaterialById(materialIdentifier())->color();
return GUI::MaterialUtil::findMaterial(materialIdentifier())->color();
ASSERT(materialItem());
return materialItem()->color();
}
QString ItemWithMaterial::materialName() const
{
const auto* const parentJob = GUI::Model::JobFunctions::findJobItem(this);
if (parentJob)
return parentJob->materialContainerItem()
->findMaterialById(materialIdentifier())
->itemName();
return GUI::MaterialUtil::findMaterial(materialIdentifier())->itemName();
ASSERT(materialItem());
return materialItem()->materialName();
}
QString ItemWithMaterial::materialIdentifier() const
......@@ -65,18 +69,18 @@ QString ItemWithMaterial::materialIdentifier() const
return getItemValue(P_MATERIAL).toString();
}
ItemWithMaterial::ItemWithMaterial(const QString& model_type) : SessionItem(model_type)
MaterialItem* ItemWithMaterial::materialItem() const
{
addProperty(P_MATERIAL, GUI::MaterialUtil::defaultMaterialIdentifier())
->setToolTip("Material this item is made of")
.setEditorType(SessionItem::EDITOR_TYPE_MATERIAL);
if (materialIdentifier().isEmpty())
return nullptr;
ASSERT(m_fnFindMaterialById);
return m_fnFindMaterialById(materialIdentifier());
}
std::unique_ptr<Material> ItemWithMaterial::domainMaterial() const
ItemWithMaterial::ItemWithMaterial(const QString& model_type) : SessionItem(model_type)
{
const auto* parent_job = GUI::Model::JobFunctions::findJobItem(this);
const MaterialItemContainer* container =
parent_job ? parent_job->materialContainerItem() : nullptr;
return container ? GUI::MaterialUtil::createDomainMaterial(materialIdentifier(), *container)
: GUI::MaterialUtil::createDomainMaterial(materialIdentifier());
addProperty(P_MATERIAL, QString())
->setToolTip("Material this item is made of")
.setEditorType(SessionItem::EDITOR_TYPE_MATERIAL);
}
......@@ -16,10 +16,12 @@
#define BORNAGAIN_GUI_MODEL_SAMPLE_ITEMWITHMATERIAL_H
#include "GUI/Model/Session/SessionItem.h"
#include <functional>
#include <memory>
class Material;
class MaterialItem;
class MaterialModel;
class ItemWithMaterial : public virtual SessionItem {
private:
......@@ -28,6 +30,18 @@ private:
public:
static bool isMaterialPropertyName(const QString& name);
//! Define a function to find the linked material.
//!
//! Other option to use: setMaterialModel()
//! TODO: This should be part of the constructor once the generic item creation is refactored
void setMaterialFinder(std::function<MaterialItem*(const QString&)> fn);
//! Define a function to find the linked material.
//!
//! Other option to use: setMaterialFinder()
//! TODO: This should be part of the constructor once the generic item creation is refactored
void setMaterialModel(const MaterialModel* materialModel);
//! Set the material this item shall use.
//! Stores the identifier, not the pointer!
void setMaterial(const MaterialItem* materialItem);
......@@ -43,10 +57,14 @@ public:
QString materialName() const;
QString materialIdentifier() const;
std::unique_ptr<Material> domainMaterial() const;
//! Returns the material item this item links to.
MaterialItem* materialItem() const;
protected:
ItemWithMaterial(const QString& model_type);
private:
std::function<MaterialItem*(const QString&)> m_fnFindMaterialById;
};
#endif // BORNAGAIN_GUI_MODEL_SAMPLE_ITEMWITHMATERIAL_H
......@@ -14,7 +14,6 @@
#include "GUI/Model/Sample/LayerItem.h"
#include "GUI/Model/Group/GroupInfo.h"
#include "GUI/Model/Material/MaterialItemUtils.h"
#include "GUI/Model/Sample/LayerRoughnessItems.h"
#include "GUI/Model/Sample/MesoCrystalItem.h"
#include "GUI/Model/Sample/MultiLayerItem.h"
......@@ -25,8 +24,9 @@
#include "GUI/Model/Types/DoubleDescriptor.h"
#include "GUI/Model/Types/UIntDescriptor.h"
#include "GUI/Util/Error.h"
#include <QColor>
#include <boost/polymorphic_cast.hpp>
using boost::polymorphic_cast;
namespace {
......
......@@ -39,7 +39,7 @@ MultiLayerItem::MultiLayerItem() : SessionItem(M_TYPE)
mapper()->setOnChildrenChange([this](SessionItem*) { updateLayers(); });
}
QVector<ItemWithMaterial*> MultiLayerItem::itemsWithMaterial()
QVector<ItemWithMaterial*> MultiLayerItem::itemsWithMaterial() const
{
QVector<ItemWithMaterial*> result;
for (auto* layer_item : getItems(T_LAYERS))
......
......@@ -35,7 +35,7 @@ public:
MultiLayerItem();
QVector<ItemWithMaterial*> itemsWithMaterial();
QVector<ItemWithMaterial*> itemsWithMaterial() const;
QString description() const;
void setDescription(const QString& description);
......
......@@ -16,7 +16,7 @@
#include "GUI/Model/Group/GroupItem.h"
#include "GUI/Model/Job/JobItem.h"
#include "GUI/Model/Job/JobModelFunctions.h"
#include "GUI/Model/Material/MaterialItemUtils.h"
#include "GUI/Model/Material/MaterialItem.h"
#include "GUI/Model/Sample/FormFactorItems.h"
#include "GUI/Model/Sample/ParticleCoreShellItem.h"
#include "GUI/Model/Sample/ParticleLayoutItem.h"
......@@ -48,9 +48,9 @@ ParticleItem::ParticleItem()
std::unique_ptr<Particle> ParticleItem::createParticle() const
{
auto& ffItem = groupItem<FormFactorItem>(P_FORM_FACTOR);
auto material = domainMaterial();
auto domainMaterial = materialItem()->createMaterial();
auto particle = std::make_unique<Particle>(*material, *ffItem.createFormFactor());
auto particle = std::make_unique<Particle>(*domainMaterial, *ffItem.createFormFactor());
particle->setAbundance(abundance());
setTransformationInfo(particle.get());
......