Skip to content
Snippets Groups Projects
Commit dcf65157 authored by Mikhail Svechnikov's avatar Mikhail Svechnikov
Browse files

[m.i1016] Serialize RoughnessModel in GUI ()

Merging branch 'm.i1016'  into 'main'.

See merge request !2704
parents 9b1d2b36 fc65f4ff
No related branches found
No related tags found
1 merge request!2704Serialize RoughnessModel in GUI
Pipeline #154366 passed
......@@ -15,7 +15,7 @@
#include "GUI/Model/Sample/RoughnessCatalog.h"
#include "Base/Util/Assert.h"
#include "GUI/Model/Sample/RoughnessItems.h"
#include "Sample/Interface/RoughnessModels.h"
#include "GUI/Model/Sample/RoughnessModelItems.h"
RoughnessItem* RoughnessCatalog::create(Type type)
{
......@@ -57,13 +57,13 @@ RoughnessCatalog::Type RoughnessCatalog::type(const RoughnessItem* item)
//--------------------------------------------------------------------------
RoughnessModel* RoughnessModelCatalog::create(Type type)
RoughnessModelItem* RoughnessModelCatalog::create(Type type)
{
switch (type) {
case Type::Erf:
return new ErfRoughness();
return new ErfRoughnessItem();
case Type::Tanh:
return new TanhRoughness();
return new TanhRoughnessItem();
}
ASSERT_NEVER;
}
......@@ -84,12 +84,12 @@ UiInfo RoughnessModelCatalog::uiInfo(Type type)
ASSERT_NEVER;
}
RoughnessModelCatalog::Type RoughnessModelCatalog::type(const RoughnessModel* model)
RoughnessModelCatalog::Type RoughnessModelCatalog::type(const RoughnessModelItem* model)
{
if (dynamic_cast<const ErfRoughness*>(model))
if (dynamic_cast<const ErfRoughnessItem*>(model))
return Type::Erf;
if (dynamic_cast<const TanhRoughness*>(model))
if (dynamic_cast<const TanhRoughnessItem*>(model))
return Type::Tanh;
ASSERT_NEVER;
......
......@@ -19,7 +19,7 @@
#include <QVector>
class RoughnessItem;
class RoughnessModel;
class RoughnessModelItem;
class RoughnessCatalog {
public:
......@@ -47,7 +47,7 @@ public:
enum class Type : uint8_t { Erf = 0, Tanh = 1 };
//! Creates the item of the given type.
static RoughnessModel* create(Type type);
static RoughnessModelItem* create(Type type);
//! List of available types, sorted as expected in the UI.
static QVector<Type> types();
......@@ -56,7 +56,7 @@ public:
static UiInfo uiInfo(Type t);
//! Returns the enum type of the given item.
static Type type(const RoughnessModel* model);
static Type type(const RoughnessModelItem* model);
};
#endif // BORNAGAIN_GUI_MODEL_SAMPLE_ROUGHNESSCATALOG_H
......@@ -18,6 +18,8 @@
namespace {
namespace Tag {
const QString BaseData("BaseData");
const QString HeightDistributionModel("HeightDistributionModel");
const QString Sigma("Sigma");
const QString Hurst("Hurst");
const QString LateralCorrelationLength("LateralCorrelationLength");
......@@ -25,13 +27,29 @@ const QString LateralCorrelationLength("LateralCorrelationLength");
} // namespace Tag
} // namespace
void RoughnessItem::writeTo(QXmlStreamWriter* w) const
{
XML::writeTaggedElement(w, Tag::HeightDistributionModel, m_roughness_model);
}
void RoughnessItem::readFrom(QXmlStreamReader* r)
{
while (r->readNextStartElement()) {
QString tag = r->name().toString();
if (tag == Tag::HeightDistributionModel)
XML::readTaggedElement(r, tag, m_roughness_model);
else
r->skipCurrentElement();
}
}
RoughnessItem::RoughnessItem()
{
DefaultRoughness default_roughness_type;
m_roughness_model.simpleInit("Interlayer profile",
"Laterally averaged profile of the interlayer transition (or "
"roughness height distribution)",
RoughnessModelCatalog::type(&default_roughness_type));
RoughnessModelCatalog::Type::Tanh);
}
//------------------------------------------------------------------------------------------------
......@@ -50,6 +68,7 @@ BasicRoughnessItem::BasicRoughnessItem(double sigma, double hurst, double corr_l
void BasicRoughnessItem::writeTo(QXmlStreamWriter* w) const
{
XML::writeBaseElement<RoughnessItem>(w, Tag::BaseData, this);
m_sigma.writeTo2(w, Tag::Sigma);
m_hurst.writeTo2(w, Tag::Hurst);
m_lateral_correlation_length.writeTo2(w, Tag::LateralCorrelationLength);
......@@ -60,7 +79,9 @@ void BasicRoughnessItem::readFrom(QXmlStreamReader* r)
while (r->readNextStartElement()) {
QString tag = r->name().toString();
if (tag == Tag::Sigma)
if (tag == Tag::BaseData)
XML::readBaseElement<RoughnessItem>(r, tag, this);
else if (tag == Tag::Sigma)
m_sigma.readFrom2(r, tag);
else if (tag == Tag::Hurst)
m_hurst.readFrom2(r, tag);
......
......@@ -18,26 +18,26 @@
#include "GUI/Model/Descriptor/DoubleProperty.h"
#include "GUI/Model/Descriptor/PolyPtr.h"
#include "GUI/Model/Sample/RoughnessCatalog.h"
#include "Sample/Interface/RoughnessModels.h"
#include "GUI/Model/Sample/RoughnessModelItems.h"
class RoughnessItem {
public:
virtual ~RoughnessItem() = default;
virtual void writeTo(QXmlStreamWriter* w) const = 0;
virtual void readFrom(QXmlStreamReader* r) = 0;
virtual void writeTo(QXmlStreamWriter* w) const;
virtual void readFrom(QXmlStreamReader* r);
virtual DoubleProperties roughnessProperties() = 0;
PolyPtr<RoughnessModel, RoughnessModelCatalog>& roughnessModelSelection()
PolyPtr<RoughnessModelItem, RoughnessModelCatalog>& roughnessModelSelection()
{
return m_roughness_model;
}
RoughnessModel* certainRoughnessModel() const { return m_roughness_model.certainItem(); }
void setRoughnessModelType(RoughnessModel* p) { m_roughness_model.setCertainItem(p); }
RoughnessModelItem* certainRoughnessModel() const { return m_roughness_model.certainItem(); }
void setRoughnessModelType(RoughnessModelItem* p) { m_roughness_model.setCertainItem(p); }
protected:
RoughnessItem();
PolyPtr<RoughnessModel, RoughnessModelCatalog> m_roughness_model;
PolyPtr<RoughnessModelItem, RoughnessModelCatalog> m_roughness_model;
};
class BasicRoughnessItem : public RoughnessItem {
......
// ************************************************************************************************
//
// BornAgain: simulate and fit reflection and scattering
//
//! @file GUI/Model/Sample/RoughnessModelItems.h
//! @brief Defines classes RoughnessModelItems.
//!
//! @homepage http://www.bornagainproject.org
//! @license GNU General Public License v3 or higher (see COPYING)
//! @copyright Forschungszentrum Jülich GmbH 2024
//! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
//
// ************************************************************************************************
#ifndef BORNAGAIN_GUI_MODEL_SAMPLE_ROUGHNESSMODELITEMS_H
#define BORNAGAIN_GUI_MODEL_SAMPLE_ROUGHNESSMODELITEMS_H
#include "Sample/Interface/RoughnessModels.h"
#include <memory>
class RoughnessModelItem {
public:
virtual ~RoughnessModelItem() = default;
virtual void writeTo(QXmlStreamWriter*) const {}
virtual void readFrom(QXmlStreamReader*) {}
virtual std::unique_ptr<RoughnessModel> createModel() const = 0;
protected:
RoughnessModelItem() = default;
};
class ErfRoughnessItem : public RoughnessModelItem {
public:
ErfRoughnessItem() = default;
std::unique_ptr<RoughnessModel> createModel() const { return std::make_unique<ErfRoughness>(); }
};
class TanhRoughnessItem : public RoughnessModelItem {
public:
TanhRoughnessItem() = default;
std::unique_ptr<RoughnessModel> createModel() const
{
return std::make_unique<TanhRoughness>();
}
};
#endif // BORNAGAIN_GUI_MODEL_SAMPLE_ROUGHNESSMODELITEMS_H
......@@ -121,7 +121,7 @@ std::unique_ptr<MultiLayer> GUI::ToCore::itemToSample(const SampleItem& sampleIt
layerItem->roughnessSelection().certainItem())) {
LayerRoughness roughness(t->sigma().dVal(), t->hurst().dVal(),
t->lateralCorrelationLength().dVal(),
t->certainRoughnessModel());
t->certainRoughnessModel()->createModel().release());
sample->addLayerWithTopRoughness(*layer, roughness);
} else
sample->addLayer(*layer);
......
......@@ -96,9 +96,9 @@ std::unique_ptr<const double2d_t> layerRoughnessMap(const LayerItem& layerItem,
std::unique_ptr<const double2d_t> result;
if (const auto* br = dynamic_cast<const BasicRoughnessItem*>(layerItem.certainRoughness())) {
auto roughness =
LayerRoughness(br->sigma().dVal(), br->hurst().dVal(),
br->lateralCorrelationLength().dVal(), br->certainRoughnessModel());
auto roughness = LayerRoughness(br->sigma().dVal(), br->hurst().dVal(),
br->lateralCorrelationLength().dVal(),
br->certainRoughnessModel()->createModel().release());
int n = sceneGeometry.numRoughnessPointsAlongAxis;
double L = 2 * sceneGeometry.layerSize;
auto rmap = RoughnessMap(n, n, L, L, &roughness, seed); // seed < 0 ==> random every time
......
......@@ -53,7 +53,7 @@ DoubleProperties PolyForm::doublePropertiesOfItem(FormfactorItem* item)
return item->geometryProperties();
}
DoubleProperties PolyForm::doublePropertiesOfItem(RoughnessModel*)
DoubleProperties PolyForm::doublePropertiesOfItem(RoughnessModelItem*)
{
return {};
}
......@@ -52,7 +52,7 @@ public:
virtual void createContent();
private:
static DoubleProperties doublePropertiesOfItem(class RoughnessModel* item);
static DoubleProperties doublePropertiesOfItem(class RoughnessModelItem* item);
static DoubleProperties doublePropertiesOfItem(class FormfactorItem* item);
static DoubleProperties doublePropertiesOfItem(class Profile1DItem* item);
static DoubleProperties doublePropertiesOfItem(class Profile2DItem* item);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment