From a71cff888bb1fcc2bd0ff0dbf267227c1ddcf43a Mon Sep 17 00:00:00 2001 From: Matthias Puchner <github@mpuchner.de> Date: Sun, 5 Dec 2021 09:45:09 +0100 Subject: [PATCH] simplify sample validator; reduce SessionItem usage --- GUI/Model/Sample/SampleValidator.cpp | 119 +++++++-------------------- GUI/Model/Sample/SampleValidator.h | 15 +--- 2 files changed, 36 insertions(+), 98 deletions(-) diff --git a/GUI/Model/Sample/SampleValidator.cpp b/GUI/Model/Sample/SampleValidator.cpp index d62ddf10c03..ceeaf7cfa0a 100644 --- a/GUI/Model/Sample/SampleValidator.cpp +++ b/GUI/Model/Sample/SampleValidator.cpp @@ -19,19 +19,6 @@ #include "GUI/Model/Sample/ParticleCoreShellItem.h" #include "GUI/Model/Sample/ParticleLayoutItem.h" -#include <boost/polymorphic_cast.hpp> - -using boost::polymorphic_cast; -using boost::polymorphic_downcast; - -SampleValidator::SampleValidator() : m_valid_sample(true) {} - -void SampleValidator::initValidator() -{ - m_validation_message.clear(); - m_valid_sample = true; -} - void SampleValidator::iterateItems(const SessionItem* parentItem) { for (const SessionItem* child : parentItem->children()) { @@ -42,87 +29,45 @@ void SampleValidator::iterateItems(const SessionItem* parentItem) void SampleValidator::validateItem(const SessionItem* item) { - if (!item) - return; - - QString diagnosis; - - if (item->hasModelType<MultiLayerItem>()) - diagnosis = validateMultiLayerItem(polymorphic_downcast<const MultiLayerItem*>(item)); - else if (item->hasModelType<ParticleLayoutItem>()) { - diagnosis = - validateParticleLayoutItem(polymorphic_downcast<const ParticleLayoutItem*>(item)); - } else if (item->hasModelType<ParticleCoreShellItem>()) { - diagnosis = - validateParticleCoreShellItem(polymorphic_cast<const ParticleCoreShellItem*>(item)); - } else if (item->hasModelType<ParticleCompositionItem>()) { - diagnosis = - validateParticleCompositionItem(polymorphic_cast<const ParticleCompositionItem*>(item)); - } - if (!diagnosis.isEmpty()) { - m_valid_sample = false; - m_validation_message += QString("* ") + diagnosis + "\n"; - } + if (auto* p = dynamic_cast<const ParticleCoreShellItem*>(item)) { + if (!p->core()) + addMessage("Core/shell particle doesn't have core defined."); + if (!p->shell()) + addMessage("Core/shell particle doesn't have shell defined."); + } else if (auto* p = dynamic_cast<const ParticleCompositionItem*>(item)) + if (p->particles().isEmpty()) + addMessage("Particle composition doesn't have any particles."); } -QString SampleValidator::validateMultiLayerItem(const MultiLayerItem* item) +void SampleValidator::addMessage(const QString& m) { - QString result; - - QVector<LayerItem*> layers = item->layers(); - - if (layers.isEmpty()) - result = "MultiLayer should contain at least one layer."; - else if (layers.size() == 1) { - if (layers.front()->layouts().isEmpty()) - result = "The single layer in your MultiLayer should contain ParticleLayout."; - } - return result; -} - -QString SampleValidator::validateParticleLayoutItem(const ParticleLayoutItem* item) -{ - QString result; - - QVector<ItemWithParticles*> particles = item->particles(); - if (particles.isEmpty()) - result = "ParticleLayout doesn't contain any particles."; - - return result; -} - -QString SampleValidator::validateParticleCoreShellItem(const ParticleCoreShellItem* item) -{ - QString result; - - const ParticleItem* core = item->core(); - const ParticleItem* shell = item->shell(); - - if (core == nullptr || shell == nullptr) - result = "ParticleCoreShell doesn't have either core or shell defined."; - - return result; -} - -QString SampleValidator::validateParticleCompositionItem(const ParticleCompositionItem* item) -{ - QString result; - if (item->particles().isEmpty()) - result = "ParticleComposition doesn't have any particles."; - - return result; + m_messages += QString("* ") + m + "\n"; } bool SampleValidator::isValidMultiLayer(const MultiLayerItem* multilayer) { - initValidator(); + m_messages.clear(); - validateItem(multilayer); - iterateItems(multilayer); + QVector<LayerItem*> layers = multilayer->layers(); - if (!m_valid_sample) { - m_validation_message = - "Can't setup DWBA simulation for given MultiLayer.\n" + m_validation_message; - } - return m_valid_sample; + if (layers.isEmpty()) + addMessage("MultiLayer should contain at least one layer."); + if (layers.size() == 1) + if (layers.front()->layouts().isEmpty()) + addMessage("The single layer in your MultiLayer should contain a particle layout."); + + for (auto* layer : layers) + for (auto* layout : layer->layouts()) { + if (layout->particles().isEmpty()) + addMessage("Particle layout doesn't contain any particles."); + for (auto* particle : layout->particles()) { + validateItem(particle); + iterateItems(particle); + } + } + + if (!m_messages.isEmpty()) + m_messages = "Can't setup DWBA simulation for given MultiLayer.\n" + m_messages; + + return m_messages.isEmpty(); } diff --git a/GUI/Model/Sample/SampleValidator.h b/GUI/Model/Sample/SampleValidator.h index 22e6491ddd9..00ef0ff63c7 100644 --- a/GUI/Model/Sample/SampleValidator.h +++ b/GUI/Model/Sample/SampleValidator.h @@ -26,25 +26,18 @@ class ParticleLayoutItem; //! Validates SampleModel for MultiLayerItem suitable for simulation class SampleValidator { public: - SampleValidator(); - bool isValidMultiLayer(const MultiLayerItem* multilayer); - QString getValidationMessage() const { return m_validation_message; } + QString getValidationMessage() const { return m_messages; } private: - void initValidator(); - void iterateItems(const SessionItem* parentItem); void validateItem(const SessionItem* item); - QString validateMultiLayerItem(const MultiLayerItem* item); - QString validateParticleLayoutItem(const ParticleLayoutItem* item); - QString validateParticleCoreShellItem(const ParticleCoreShellItem* item); - QString validateParticleCompositionItem(const ParticleCompositionItem* item); + //! Adds this message to the report. + void addMessage(const QString& m); - bool m_valid_sample; - QString m_validation_message; + QString m_messages; }; #endif // BORNAGAIN_GUI_MODEL_SAMPLE_SAMPLEVALIDATOR_H -- GitLab