BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
MaterialItemUtils.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file GUI/coregui/Views/MaterialEditor/MaterialItemUtils.cpp
6 //! @brief Implements class MaterialItemUtils
7 //!
8 //! @homepage http://www.bornagainproject.org
9 //! @license GNU General Public License v3 or higher (see COPYING)
10 //! @copyright Forschungszentrum Jülich GmbH 2018
11 //! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
12 //
13 // ************************************************************************************************
14 
33 #include <QColorDialog>
34 
35 namespace {
36 
37 std::map<QString, QString> get_tag_map()
38 {
39  std::map<QString, QString> result = {
40  {"ParticleComposition", ParticleCompositionItem::T_PARTICLES},
41  {"ParticleDistribution", ParticleDistributionItem::T_PARTICLES},
42  {"ParticleLayout", ParticleLayoutItem::T_PARTICLES},
43  {"MesoCrystal", MesoCrystalItem::T_BASIS_PARTICLE}};
44  return result;
45 }
46 } // namespace
47 
49 {
50  if (name.contains("Vacuum")) {
51  return QColor(179, 242, 255);
52  } else if (name.contains("Substrate")) {
53  return QColor(205, 102, 0);
54  } else if (name.contains("Default")) {
55  return QColor(Qt::green);
56  } else if (name.contains("Particle")) {
57  return QColor(146, 198, 255);
58  } else {
60  }
61 }
62 
64 {
65  if (!AppSvc::materialModel())
66  return ExternalProperty();
67 
68  auto materials = AppSvc::materialModel()->topItems();
69  return materials.isEmpty() ? ExternalProperty()
70  : MaterialItemUtils::materialProperty(*materials.front());
71 }
72 
73 std::unique_ptr<Material>
75 {
76  MaterialItem* materialItem = findMaterial(material_property);
77  return materialItem->createMaterial();
78 }
79 
80 std::unique_ptr<Material>
82  const MaterialItemContainer& container)
83 {
84  const MaterialItem* material_item = container.findMaterialById(material_property.identifier());
85  if (!material_item)
86  throw GUIHelpers::Error("MaterialUtils::createDomainMaterial() -> Error. Can't find "
87  "material with name '"
88  + material_property.text() + "'.");
89  return material_item->createMaterial();
90 }
91 
93 {
94  if (!AppSvc::materialModel())
95  throw GUIHelpers::Error("MaterialItemUtils::findMaterial() -> Error. "
96  "Attempt to access non-existing material model");
97 
98  auto material = AppSvc::materialModel()->materialFromIdentifier(material_property.identifier());
99 
100  if (!material)
101  throw GUIHelpers::Error("MaterialUtils::findMaterial() -> Error. Can't find "
102  "material with name '"
103  + material_property.text() + "'.");
104  return material;
105 }
106 
107 //! Returns material tag for given item. Returns empty string, if item doesn't have materials.
108 
110 {
111  QString result;
112  if (item.modelType() == "Particle") {
113  result = ParticleItem::P_MATERIAL;
114  } else if (item.modelType() == "Layer") {
115  result = LayerItem::P_MATERIAL;
116  }
117  return result;
118 }
119 
120 //! Returns list of model types which contains registered MaterialProperty.
121 
123 {
124  return {"Particle", "Layer"};
125 }
126 
127 //! Constructs material property for given material.
128 
130 {
131  ExternalProperty result;
132 
134  materialItem.getItemValue(MaterialItem::P_COLOR).value<ExternalProperty>();
135  result.setIdentifier(materialItem.getItemValue(MaterialItem::P_IDENTIFIER).toString());
136  result.setColor(colorProperty.color());
137  result.setText(materialItem.itemName());
138 
139  return result;
140 }
141 
143 {
144  ExternalProperty result;
145  result.setColor(color);
146  result.setText(QString("[%1, %2, %3] (%4)")
147  .arg(color.red())
148  .arg(color.green())
149  .arg(color.blue())
150  .arg(color.alpha()));
151  return result;
152 }
153 
155 {
157  dialog.setMaterialProperty(previous);
158  if (dialog.exec() == QDialog::Accepted) {
159  return dialog.selectedMaterialProperty();
160  }
161 
162  return ExternalProperty();
163 }
164 
166 {
167  ExternalProperty result;
168 
169 #if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0)
170  auto oldColor = previous.color();
171  auto newColor = QColorDialog::getColor(oldColor);
172  if (oldColor != newColor)
173  result = MaterialItemUtils::colorProperty(newColor);
174 #else
175  bool ok = false;
176  QRgb oldRgba = previous.color().rgba();
177  QRgb newRgba = QColorDialog::getRgba(oldRgba, &ok, nullptr);
178  if (ok && newRgba != oldRgba)
179  result = MaterialItemUtils::colorProperty(QColor::fromRgba(newRgba));
180 #endif
181 
182  return result;
183 }
184 
186 {
187  static const std::map<QString, QString> tag_map = get_tag_map();
188  QVector<SessionItem*> materials;
189  QList<SessionItem*> particle_holders{item};
190  while (!particle_holders.isEmpty()) {
191  auto item = particle_holders.takeFirst();
192  if (!item)
193  continue;
194 
195  const QString model_type = item->modelType();
196  auto iter = tag_map.find(model_type);
197  if (iter != tag_map.end()) {
198  particle_holders.append(QList<SessionItem*>::fromVector(item->getItems(iter->second)));
199  continue;
200  }
201 
202  if (model_type == "Particle")
203  materials.append(static_cast<ParticleItem*>(item)->materialPropertyItems());
204  else if (model_type == "ParticleCoreShell")
205  materials.append(static_cast<ParticleCoreShellItem*>(item)->materialPropertyItems());
206  else
207  throw GUIHelpers::Error(
208  "Error in MaterialItemUtils::materialProperties: cannot handle passed model type '"
209  + model_type + "'");
210  }
211  return materials;
212 }
Defines class AppSvc.
Defines class ComboProperty.
Defines class DesignerHelper.
Defines class GUIHelpers functions.
Defines class MainWindow.
Defines class LayerItem.
Defines MaterialDataItems classes.
Defines class MaterialEditorDialog.
Defines class MaterialItemContainer.
Defines class MaterialItemUtils.
Defines class MaterialModel.
Defines and implements class Material.
Defines class MesoCrystalItem.
Defines class ParticleCompositionItem.
Defines class ParticleCoreShellItem.
Defines class ParticleDistributionItem.
Defines class ParticleItem.
Defines class ParticleLayoutItem.
static MaterialModel * materialModel()
Definition: AppSvc.cpp:33
static QColor getRandomColor()
The ExternalProperty class defines custom QVariant property to carry the text, color and an identifie...
QString identifier() const
void setColor(const QColor &color)
QString text() const
void setText(const QString &name)
void setIdentifier(const QString &identifier)
QColor color() const
static const QString P_MATERIAL
Definition: LayerItem.h:24
static MainWindow * instance()
Returns the one and only instance of this class.
Definition: mainwindow.cpp:129
Dialog to hold MaterialEditor.
void setMaterialProperty(const ExternalProperty &matProperty)
ExternalProperty selectedMaterialProperty()
const MaterialItem * findMaterialById(QString id) const
static const QString P_IDENTIFIER
Definition: MaterialItem.h:27
static const QString P_COLOR
Definition: MaterialItem.h:24
std::unique_ptr< Material > createMaterial() const
MaterialItem * materialFromIdentifier(const QString &identifier)
static const QString T_BASIS_PARTICLE
static const QString T_PARTICLES
static const QString T_PARTICLES
static const QString P_MATERIAL
Definition: ParticleItem.h:27
static const QString T_PARTICLES
QString itemName() const
Get item name, return display name if no name is set.
QVector< SessionItem * > getItems(const QString &tag="") const
Returns vector of all items of given tag.
QVariant getItemValue(const QString &tag) const
Directly access value of item under given tag.
QString modelType() const
Get model type.
QVector< T * > topItems() const
Definition: SessionModel.h:147
ExternalProperty selectMaterialProperty(const ExternalProperty &previous=ExternalProperty())
Calls material selector dialog.
QString materialTag(const SessionItem &item)
Returns material tag for given item. Returns empty string, if item doesn't have materials.
MaterialItem * findMaterial(const ExternalProperty &material_property)
QColor suggestMaterialColor(const QString &name)
std::unique_ptr< Material > createDomainMaterial(const ExternalProperty &material_property)
QVector< SessionItem * > materialPropertyItems(SessionItem *item)
Gather material property items from a given item.
QStringList materialRelatedModelTypes()
Returns list of model types which contains registered MaterialProperty.
ExternalProperty colorProperty(const QColor &color)
Constructs color property from given color.
ExternalProperty materialProperty(const SessionItem &materialItem)
Constructs material property corresponding to given material.
ExternalProperty defaultMaterialProperty()
ExternalProperty selectColorProperty(const ExternalProperty &previous=ExternalProperty())
Calls color selector dialog.
std::string model_type
Definition: types.h:23
QString const & name(EShape k)
Definition: particles.cpp:21