diff --git a/GUI/coregui/Models/BeamItems.cpp b/GUI/coregui/Models/BeamItems.cpp index 8990ee82384ff93276dc0a09cac3ba30d3411536..70590c911609d19749b1833fecb6919f11ccb952 100644 --- a/GUI/coregui/Models/BeamItems.cpp +++ b/GUI/coregui/Models/BeamItems.cpp @@ -88,6 +88,11 @@ void BeamItem::setInclinationAngle(double value) item<BeamDistributionItem>(P_INCLINATION_ANGLE)->resetToValue(value); } +BeamDistributionItem* BeamItem::inclinationAngleItem() const +{ + return item<BeamDistributionItem>(P_INCLINATION_ANGLE); +} + double BeamItem::getAzimuthalAngle() const { return item<BeamAzimuthalAngleItem>(P_AZIMUTHAL_ANGLE)->azimuthalAngle(); @@ -120,6 +125,14 @@ template<typename T> void BeamItem::initWavelength() addProperty<T>(P_WAVELENGTH); } +template<typename T> void BeamItem::initInclinationAngle() +{ + static_assert(std::is_base_of<BeamDistributionItem,T>::value, + "Class must be derived from BeamDistributionItem"); + + addProperty<T>(P_INCLINATION_ANGLE); +} + // Specular beam item /* ------------------------------------------------------------------------- */ @@ -129,7 +142,7 @@ const QString footprint_group_label("Type"); SpecularBeamItem::SpecularBeamItem() : BeamItem("SpecularBeam") { - addProperty<SpecularBeamInclinationItem>(P_INCLINATION_ANGLE); + initInclinationAngle<SpecularBeamInclinationItem>(); initWavelength<SpecularBeamWavelengthItem>(); getItem(P_AZIMUTHAL_ANGLE)->setVisible(false); @@ -170,7 +183,7 @@ void SpecularBeamItem::setInclinationAngle(double value) GroupItem* SpecularBeamItem::inclinationAxisGroup() { return dynamic_cast<GroupItem*>( - getItem(P_INCLINATION_ANGLE)->getItem(SpecularBeamInclinationItem::P_ALPHA_AXIS)); + inclinationAngleItem()->getItem(SpecularBeamInclinationItem::P_ALPHA_AXIS)); } BasicAxisItem* SpecularBeamItem::currentInclinationAxisItem() @@ -203,7 +216,8 @@ SessionItem* SpecularBeamItem::footprintGroupItem() const void SpecularBeamItem::updateFileName(const QString& filename) { - item<SpecularBeamInclinationItem>(BeamItem::P_INCLINATION_ANGLE)->updateFileName(filename); + dynamic_cast<SpecularBeamInclinationItem*>(inclinationAngleItem()) + ->updateFileName(filename); } void SpecularBeamItem::updateToData(const IAxis& axis, QString units) @@ -239,7 +253,7 @@ void SpecularBeamItem::updateWavelength() GISASBeamItem::GISASBeamItem() : BeamItem("GISASBeam") { - addProperty<BeamInclinationAngleItem>(P_INCLINATION_ANGLE); + initInclinationAngle<BeamInclinationAngleItem>(); initWavelength<BeamWavelengthItem>(); } @@ -247,7 +261,8 @@ GISASBeamItem::~GISASBeamItem() = default; double GISASBeamItem::getInclinationAngle() const { - return item<BeamInclinationAngleItem>(P_INCLINATION_ANGLE)->inclinationAngle(); + return dynamic_cast<BeamInclinationAngleItem*>(inclinationAngleItem()) + ->inclinationAngle(); } namespace { diff --git a/GUI/coregui/Models/BeamItems.h b/GUI/coregui/Models/BeamItems.h index 16ea73157966ae512c4ef767764a8372de001525..c7df4a7c640d7cc690ca4aef88b41d0dfdeb2105 100644 --- a/GUI/coregui/Models/BeamItems.h +++ b/GUI/coregui/Models/BeamItems.h @@ -19,6 +19,7 @@ class BasicAxisItem; class Beam; +class BeamDistributionItem; class BeamWavelengthItem; class FootprintItem; class GroupItem; @@ -28,8 +29,8 @@ class BA_CORE_API_ BeamItem : public SessionItem { private: static const QString P_INTENSITY; static const QString P_WAVELENGTH; -public: static const QString P_INCLINATION_ANGLE; +public: static const QString P_AZIMUTHAL_ANGLE; static const QString P_POLARIZATION; @@ -45,7 +46,8 @@ public: virtual double getInclinationAngle() const = 0; virtual void setInclinationAngle(double value); - + BeamDistributionItem* inclinationAngleItem() const; + double getAzimuthalAngle() const; void setAzimuthalAngle(double value); @@ -55,6 +57,7 @@ protected: explicit BeamItem(const QString& beam_model); template<typename T> void initWavelength(); + template<typename T> void initInclinationAngle(); }; class BA_CORE_API_ SpecularBeamItem : public BeamItem { diff --git a/GUI/coregui/Models/InstrumentItems.cpp b/GUI/coregui/Models/InstrumentItems.cpp index a6a274a5d350f6af127dfc55dc73cb8d4053ab30..42ebba51ee84c1d6d97f811f816c2cc48916ce01 100644 --- a/GUI/coregui/Models/InstrumentItems.cpp +++ b/GUI/coregui/Models/InstrumentItems.cpp @@ -309,7 +309,7 @@ OffSpecularInstrumentItem::OffSpecularInstrumentItem() : Instrument2DItem("OffSp auto inclination_item = getItem(P_ALPHA_AXIS)->getItem(BasicAxisItem::P_MIN_DEG); auto beam_item = beamItem(); beam_item->setInclinationAngle(inclination_item->value().toDouble()); - beam_item->getItem(BeamItem::P_INCLINATION_ANGLE)->setEnabled(false); + beam_item->inclinationAngleItem()->setEnabled(false); inclination_item->mapper()->setOnValueChange([beam_item, inclination_item]() { beam_item->setInclinationAngle(inclination_item->value().toDouble()); }); @@ -427,7 +427,7 @@ std::unique_ptr<DepthProbeSimulation> DepthProbeInstrumentItem::createSimulation TransformToDomain::setBeamDistribution( ParameterDistribution::BeamInclinationAngle, - *beamItem()->item<SpecularBeamInclinationItem>(SpecularBeamItem::P_INCLINATION_ANGLE), + *beamItem()->inclinationAngleItem(), *simulation.get()); return simulation; diff --git a/GUI/coregui/Models/InstrumentModel.cpp b/GUI/coregui/Models/InstrumentModel.cpp index 34368ff1f2dd7bee95d42a8fb7bfd78c6603421c..1dee3986b18ff3b15bc082b63009bceef2e41364 100644 --- a/GUI/coregui/Models/InstrumentModel.cpp +++ b/GUI/coregui/Models/InstrumentModel.cpp @@ -40,7 +40,7 @@ QVector<SessionItem*> InstrumentModel::nonXMLItems() const for (auto instrument_item : topItems<SpecularInstrumentItem>()) { auto axis_group = instrument_item->beamItem() - ->getItem(BeamItem::P_INCLINATION_ANGLE) + ->inclinationAngleItem() ->getItem(SpecularBeamInclinationItem::P_ALPHA_AXIS); if (auto pointwise_axis = axis_group->getChildOfType("PointwiseAxis")) diff --git a/GUI/coregui/Models/TransformFromDomain.cpp b/GUI/coregui/Models/TransformFromDomain.cpp index d1228420e067c8112ab7811169f21ca9e9b51693..ed2c2edf30b8f0e0aeafbdc9c88ed5b48aa87202 100644 --- a/GUI/coregui/Models/TransformFromDomain.cpp +++ b/GUI/coregui/Models/TransformFromDomain.cpp @@ -230,7 +230,8 @@ void TransformFromDomain::setGISASBeamItem(BeamItem* beam_item, const GISASSimul addDistributionToBeamItem(ParameterDistribution::BeamWavelength, beam_item->wavelengthItem(), distributions[i]); addDistributionToBeamItem(ParameterDistribution::BeamInclinationAngle, - BeamItem::P_INCLINATION_ANGLE, distributions[i], beam_item); + beam_item->inclinationAngleItem(), + distributions[i]); addDistributionToBeamItem(ParameterDistribution::BeamAzimuthalAngle, BeamItem::P_AZIMUTHAL_ANGLE, distributions[i], beam_item); } @@ -281,7 +282,7 @@ void TransformFromDomain::setSpecularBeamItem(SpecularBeamItem* beam_item, resolution = scan->angleResolution(); if (resolution && !resolution->empty()) { double std_dev = resolution->stdDevs(0.0, 1).front(); - addRangedDistributionToItem(beam_item->getItem(SpecularBeamItem::P_INCLINATION_ANGLE), + addRangedDistributionToItem(beam_item->inclinationAngleItem(), *resolution->distribution(), 0.0, std_dev); } } diff --git a/GUI/coregui/Models/TransformToDomain.cpp b/GUI/coregui/Models/TransformToDomain.cpp index 4632cc5d01fb4a845f76767266f19dedef6f3ae7..8eed27c9c761b38256a30e86c2d260f4ffeec0f6 100644 --- a/GUI/coregui/Models/TransformToDomain.cpp +++ b/GUI/coregui/Models/TransformToDomain.cpp @@ -147,7 +147,7 @@ void TransformToDomain::addDistributionParametersToSimulation(const BeamItem& be simulation); setParameterDistributionToSimulation<BeamInclinationAngleItem>( ParameterDistribution::BeamInclinationAngle, - beam_item.getItem(BeamItem::P_INCLINATION_ANGLE), simulation); + beam_item.inclinationAngleItem(), simulation); setParameterDistributionToSimulation<BeamAzimuthalAngleItem>( ParameterDistribution::BeamAzimuthalAngle, beam_item.getItem(BeamItem::P_AZIMUTHAL_ANGLE), simulation); @@ -164,7 +164,7 @@ void TransformToDomain::addBeamDivergencesToScan(const BeamItem& beam_item, auto resolution = createScanResolution(beam_item.wavelengthItem()); if (resolution) scan.setWavelengthResolution(*resolution); - resolution = createScanResolution(beam_item.getItem(SpecularBeamItem::P_INCLINATION_ANGLE)); + resolution = createScanResolution(beam_item.inclinationAngleItem()); if (resolution) scan.setAngleResolution(*resolution); } diff --git a/GUI/coregui/Views/InstrumentWidgets/DepthProbeInstrumentEditor.cpp b/GUI/coregui/Views/InstrumentWidgets/DepthProbeInstrumentEditor.cpp index a0667148ebf409d8699d16f8e688a00e6bbff907..30fccb4ee8ebfa7c1aaf2602e791146c6695334a 100644 --- a/GUI/coregui/Views/InstrumentWidgets/DepthProbeInstrumentEditor.cpp +++ b/GUI/coregui/Views/InstrumentWidgets/DepthProbeInstrumentEditor.cpp @@ -58,7 +58,7 @@ void DepthProbeInstrumentEditor::subscribeToItem() BeamWavelengthItem* wavelengthItem = beam_item->wavelengthItem(); m_wavelengthEditor->setItem(wavelengthItem->getItem(BeamDistributionItem::P_DISTRIBUTION)); - auto inclinationItem = beam_item->getItem(SpecularBeamItem::P_INCLINATION_ANGLE); + auto inclinationItem = beam_item->inclinationAngleItem(); m_inclinationEditor->setItem( inclinationItem->getItem(SpecularBeamInclinationItem::P_DISTRIBUTION)); m_inclinationEditor->addItem( diff --git a/GUI/coregui/Views/InstrumentWidgets/GISASBeamEditor.cpp b/GUI/coregui/Views/InstrumentWidgets/GISASBeamEditor.cpp index cd6a28d6c3b7ee827cb6cb4344b35208727d7a5f..19dd1252fa175fad072ee97571326b46734c5f76 100644 --- a/GUI/coregui/Views/InstrumentWidgets/GISASBeamEditor.cpp +++ b/GUI/coregui/Views/InstrumentWidgets/GISASBeamEditor.cpp @@ -67,7 +67,7 @@ void GISASBeamEditor::subscribeToItem() auto wavelengthItem = beamItem()->wavelengthItem(); m_wavelengthEditor->setItem(wavelengthItem->getItem(BeamDistributionItem::P_DISTRIBUTION)); - auto inclinationItem = beamItem()->getItem(BeamItem::P_INCLINATION_ANGLE); + auto inclinationItem = beamItem()->inclinationAngleItem(); m_inclinationEditor->setItem(inclinationItem->getItem(BeamDistributionItem::P_DISTRIBUTION)); auto azimuthalItem = beamItem()->getItem(BeamItem::P_AZIMUTHAL_ANGLE); diff --git a/GUI/coregui/Views/InstrumentWidgets/SpecularBeamEditor.cpp b/GUI/coregui/Views/InstrumentWidgets/SpecularBeamEditor.cpp index b261a4c96ea145c2febac976c9ccd7ac73a7e02c..6f92700505a0a276c11831bda10ea02d4ea94d59 100644 --- a/GUI/coregui/Views/InstrumentWidgets/SpecularBeamEditor.cpp +++ b/GUI/coregui/Views/InstrumentWidgets/SpecularBeamEditor.cpp @@ -70,7 +70,7 @@ void SpecularBeamEditor::subscribeToItem() auto wavelengthItem = beam_item->wavelengthItem(); m_wavelengthEditor->setItem(wavelengthItem->getItem(BeamDistributionItem::P_DISTRIBUTION)); - auto inclinationItem = beam_item->getItem(SpecularBeamItem::P_INCLINATION_ANGLE); + auto inclinationItem = beam_item->inclinationAngleItem(); m_inclinationEditor->setItem( inclinationItem->getItem(SpecularBeamInclinationItem::P_DISTRIBUTION)); m_inclinationEditor->addItem( diff --git a/Tests/UnitTests/GUI/TestSavingSpecularData.cpp b/Tests/UnitTests/GUI/TestSavingSpecularData.cpp index 8fd851afd25c1c0fd4225a6a9418d170d6eb32d9..2149002e811eb38acd05ded7cf9a28da340e8bae 100644 --- a/Tests/UnitTests/GUI/TestSavingSpecularData.cpp +++ b/Tests/UnitTests/GUI/TestSavingSpecularData.cpp @@ -51,8 +51,8 @@ PointwiseAxisItem* TestSavingSpecularData::createPointwiseAxisItem(SessionModel& GroupItem* TestSavingSpecularData::getAxisGroup(SpecularInstrumentItem* instrument) { - auto axis_item = instrument->getItem(SpecularInstrumentItem::P_BEAM) - ->getItem(BeamItem::P_INCLINATION_ANGLE) + auto axis_item = instrument->beamItem() + ->inclinationAngleItem() ->getItem(SpecularBeamInclinationItem::P_ALPHA_AXIS); return dynamic_cast<GroupItem*>(axis_item); }