From 1c5326f2d110f7d50c8f921c87c085733fdc537d Mon Sep 17 00:00:00 2001 From: Tobias Knopff <t.knopff@fz-juelich.de> Date: Fri, 9 Jul 2021 12:11:47 +0200 Subject: [PATCH] Make TransformationItem::P_ROT private --- GUI/Models/GUIDomainSampleVisitor.cpp | 12 ++++-------- GUI/Models/ItemWithParticles.cpp | 5 +++++ GUI/Models/ItemWithParticles.h | 1 + GUI/Models/TransformToDomain.cpp | 17 +++++++---------- GUI/Models/TransformToDomain.h | 2 +- GUI/Models/TransformationItem.cpp | 6 ++++++ GUI/Models/TransformationItem.h | 17 ++++++++++++++++- 7 files changed, 40 insertions(+), 20 deletions(-) diff --git a/GUI/Models/GUIDomainSampleVisitor.cpp b/GUI/Models/GUIDomainSampleVisitor.cpp index c440f23bd07..8f2acf45ef6 100644 --- a/GUI/Models/GUIDomainSampleVisitor.cpp +++ b/GUI/Models/GUIDomainSampleVisitor.cpp @@ -503,8 +503,7 @@ void GUIDomainSampleVisitor::visit(const RotationX* sample) ASSERT(parent); TransformationItem* transformation_item = parent->createTransformationItem(); - XRotationItem* rotationItem = - transformation_item->setGroupPropertyType<XRotationItem>(TransformationItem::P_ROT); + XRotationItem* rotationItem = transformation_item->setRotationType<XRotationItem>(); rotationItem->setAngleValue(Units::rad2deg(sample->getAngle())); m_levelToParentItem[depth()] = transformation_item; } @@ -515,8 +514,7 @@ void GUIDomainSampleVisitor::visit(const RotationY* sample) ASSERT(parent); TransformationItem* transformation_item = parent->createTransformationItem(); - YRotationItem* rotationItem = - transformation_item->setGroupPropertyType<YRotationItem>(TransformationItem::P_ROT); + YRotationItem* rotationItem = transformation_item->setRotationType<YRotationItem>(); rotationItem->setAngleValue(Units::rad2deg(sample->getAngle())); m_levelToParentItem[depth()] = transformation_item; } @@ -527,8 +525,7 @@ void GUIDomainSampleVisitor::visit(const RotationZ* sample) ASSERT(parent); TransformationItem* transformation_item = parent->createTransformationItem(); - ZRotationItem* rotationItem = - transformation_item->setGroupPropertyType<ZRotationItem>(TransformationItem::P_ROT); + ZRotationItem* rotationItem = transformation_item->setRotationType<ZRotationItem>(); rotationItem->setAngleValue(Units::rad2deg(sample->getAngle())); m_levelToParentItem[depth()] = transformation_item; } @@ -539,8 +536,7 @@ void GUIDomainSampleVisitor::visit(const RotationEuler* sample) ASSERT(parent); TransformationItem* transformation_item = parent->createTransformationItem(); - EulerRotationItem* rotationItem = - transformation_item->setGroupPropertyType<EulerRotationItem>(TransformationItem::P_ROT); + EulerRotationItem* rotationItem = transformation_item->setRotationType<EulerRotationItem>(); rotationItem->setAlphaValue(Units::rad2deg(sample->getAlpha())); rotationItem->setBetaValue(Units::rad2deg(sample->getBeta())); rotationItem->setGammaValue(Units::rad2deg(sample->getGamma())); diff --git a/GUI/Models/ItemWithParticles.cpp b/GUI/Models/ItemWithParticles.cpp index 340a6736bd2..f737b1f68d8 100644 --- a/GUI/Models/ItemWithParticles.cpp +++ b/GUI/Models/ItemWithParticles.cpp @@ -53,6 +53,11 @@ VectorItem* ItemWithParticles::positionItem() const return item<VectorItem>(P_POSITION); } +TransformationItem* ItemWithParticles::transformation() const +{ + return dynamic_cast<TransformationItem*>(getItem(T_TRANSFORMATION)); +} + TransformationItem* ItemWithParticles::createTransformationItem() { return model()->insertItem<TransformationItem>(this, -1, T_TRANSFORMATION); diff --git a/GUI/Models/ItemWithParticles.h b/GUI/Models/ItemWithParticles.h index 1c7f4c9f969..d5fc73947c7 100644 --- a/GUI/Models/ItemWithParticles.h +++ b/GUI/Models/ItemWithParticles.h @@ -38,6 +38,7 @@ public: void setPosition(const kvector_t& position); VectorItem* positionItem() const; + TransformationItem* transformation() const; TransformationItem* createTransformationItem(); void setTransformation(RotationItem* transformation); static bool isTransformationTagName(const QString& name); diff --git a/GUI/Models/TransformToDomain.cpp b/GUI/Models/TransformToDomain.cpp index db7c33ed741..3bb11977690 100644 --- a/GUI/Models/TransformToDomain.cpp +++ b/GUI/Models/TransformToDomain.cpp @@ -196,17 +196,14 @@ void GUI::Transform::ToDomain::setPositionInfo(IParticle* result, const ItemWith result->setPosition(pos.x(), pos.y(), pos.z()); } -void GUI::Transform::ToDomain::setRotationInfo(IParticle* result, const SessionItem& item) +void GUI::Transform::ToDomain::setRotationInfo(IParticle* result, const ItemWithParticles& item) { - QVector<SessionItem*> children = item.children(); - for (int i = 0; i < children.size(); ++i) { - if (children[i]->hasModelType<TransformationItem>()) { - auto& rot_item = children[i]->groupItem<RotationItem>(TransformationItem::P_ROT); - auto rotation = rot_item.createRotation(); - if (rotation) - result->setRotation(*rotation); - break; - } + TransformationItem* trans_item = item.transformation(); + if (trans_item) { + RotationItem* rot_item = trans_item->rotation(); + auto rotation = rot_item->createRotation(); + if (rotation) + result->setRotation(*rotation); } } diff --git a/GUI/Models/TransformToDomain.h b/GUI/Models/TransformToDomain.h index 915bbc73dc1..04257ffa0d8 100644 --- a/GUI/Models/TransformToDomain.h +++ b/GUI/Models/TransformToDomain.h @@ -58,7 +58,7 @@ void setBeamDistribution(ParameterDistribution::WhichParameter which, void setSimulationOptions(ISimulation* simulation, const SessionItem& item); void setTransformationInfo(IParticle* result, const ItemWithParticles& item); void setPositionInfo(IParticle* result, const ItemWithParticles& item); -void setRotationInfo(IParticle* result, const SessionItem& item); +void setRotationInfo(IParticle* result, const ItemWithParticles& item); } // namespace GUI::Transform::ToDomain diff --git a/GUI/Models/TransformationItem.cpp b/GUI/Models/TransformationItem.cpp index f48bdecc8cb..17f828d8f13 100644 --- a/GUI/Models/TransformationItem.cpp +++ b/GUI/Models/TransformationItem.cpp @@ -13,6 +13,7 @@ // ************************************************************************************************ #include "GUI/Models/TransformationItem.h" +#include "GUI/Models/RotationItems.h" const QString TransformationItem::P_ROT = "Rotation type"; @@ -23,3 +24,8 @@ TransformationItem::TransformationItem() : SessionGraphicsItem(M_TYPE) setToolTip("Rotation applied to particles"); addGroupProperty(P_ROT, "Rotation group"); } + +RotationItem* TransformationItem::rotation() const +{ + return dynamic_cast<RotationItem*>(getGroupItem(P_ROT)); +} diff --git a/GUI/Models/TransformationItem.h b/GUI/Models/TransformationItem.h index 68d2f877c2b..0893a2d23c1 100644 --- a/GUI/Models/TransformationItem.h +++ b/GUI/Models/TransformationItem.h @@ -17,13 +17,28 @@ #include "GUI/Models/SessionGraphicsItem.h" +class RotationItem; + class BA_CORE_API_ TransformationItem : public SessionGraphicsItem { -public: +private: static const QString P_ROT; +public: static const QString M_TYPE; TransformationItem(); + + RotationItem* rotation() const; + template <typename T> T* setRotationType(); }; + +template <typename T> T* TransformationItem::setRotationType() +{ + static_assert(std::is_base_of<RotationItem, T>::value, + "Class must be derived from RotationItem"); + + return setGroupPropertyType<T>(P_ROT); +} + #endif // BORNAGAIN_GUI_MODELS_TRANSFORMATIONITEM_H -- GitLab