From 169871abf3743309ebf2635f8d6003f0921d7236 Mon Sep 17 00:00:00 2001
From: Gennady Pospelov <g.pospelov@fz-juelich.de>
Date: Wed, 21 Feb 2018 09:58:17 +0100
Subject: [PATCH] GUIObjectBuilder now is able to create OffSpecInstrumentItem

---
 GUI/coregui/Models/GUIObjectBuilder.cpp    | 25 ++++++++++++++++++++++
 GUI/coregui/Models/TransformFromDomain.cpp | 14 +++++++++++-
 GUI/coregui/Models/TransformFromDomain.h   |  5 ++++-
 3 files changed, 42 insertions(+), 2 deletions(-)

diff --git a/GUI/coregui/Models/GUIObjectBuilder.cpp b/GUI/coregui/Models/GUIObjectBuilder.cpp
index 59f25dffe86..a9009c62846 100644
--- a/GUI/coregui/Models/GUIObjectBuilder.cpp
+++ b/GUI/coregui/Models/GUIObjectBuilder.cpp
@@ -25,12 +25,18 @@
 #include "Simulation.h"
 #include "SimulationOptionsItem.h"
 #include "TransformFromDomain.h"
+#include "OffSpecSimulation.h"
 
 namespace
 {
 GISASInstrumentItem* createGISASInstrumentItem(InstrumentModel* model,
                                                const GISASSimulation& simulation,
                                                const QString& name);
+
+OffSpecInstrumentItem* createOffSpecInstrumentItem(InstrumentModel* model,
+                                               const OffSpecSimulation& simulation,
+                                               const QString& name);
+
 }
 
 SessionItem* GUIObjectBuilder::populateSampleModelFromSim(SampleModel* sampleModel,
@@ -66,6 +72,10 @@ SessionItem* GUIObjectBuilder::populateInstrumentModel(InstrumentModel* p_instru
         return createGISASInstrumentItem(p_instrument_model, *gisasSimulation, name);
     }
 
+    else if(auto offSpecSimulation = dynamic_cast<const OffSpecSimulation*>(&simulation)) {
+        return createOffSpecInstrumentItem(p_instrument_model, *offSpecSimulation, name);
+    }
+
     throw GUIHelpers::Error("GUIObjectBuilder::populateInstrumentModel() -> Error. Simulation is "
                             "not yet supported");
 }
@@ -106,4 +116,19 @@ GISASInstrumentItem* createGISASInstrumentItem(InstrumentModel* model,
 
     return result;
 }
+
+OffSpecInstrumentItem* createOffSpecInstrumentItem(InstrumentModel* model,
+                                               const OffSpecSimulation& simulation,
+                                               const QString& name)
+{
+    auto result = dynamic_cast<OffSpecInstrumentItem*>(model->insertNewItem(Constants::OffSpecInstrumentType));
+
+    result->setItemName(name);
+    TransformFromDomain::setOffSpecBeamItem(result->beamItem(), simulation);
+    TransformFromDomain::setDetector(result, simulation);
+    TransformFromDomain::setBackground(result, simulation);
+
+    return result;
+}
+
 }
diff --git a/GUI/coregui/Models/TransformFromDomain.cpp b/GUI/coregui/Models/TransformFromDomain.cpp
index ae66c0e0fc3..e9401017ec3 100644
--- a/GUI/coregui/Models/TransformFromDomain.cpp
+++ b/GUI/coregui/Models/TransformFromDomain.cpp
@@ -59,6 +59,7 @@
 #include "SphericalDetector.h"
 #include "SphericalDetectorItem.h"
 #include "Units.h"
+#include "OffSpecSimulation.h"
 
 using namespace INodeUtils;
 using SessionItemUtils::SetVectorItem;
@@ -238,6 +239,17 @@ void TransformFromDomain::setGISASBeamItem(BeamItem* beam_item, const GISASSimul
     SetVectorItem(*beam_item, BeamItem::P_POLARIZATION, beam.getBlochVector());
 }
 
+void TransformFromDomain::setOffSpecBeamItem(BeamItem* beam_item, const OffSpecSimulation& simulation)
+{
+    Beam beam = simulation.getInstrument().getBeam();
+
+    beam_item->setIntensity(beam.getIntensity());
+    beam_item->setWavelength(beam.getWavelength());
+    beam_item->setInclinationAngle(Units::rad2deg(beam.getAlpha()));
+    beam_item->setAzimuthalAngle(Units::rad2deg(beam.getPhi()));
+    // TODO implement beam divergence
+}
+
 void TransformFromDomain::setDetector(Instrument2DItem* instrument_item,
                                       const Simulation2D& simulation)
 {
@@ -522,7 +534,7 @@ void TransformFromDomain::setItemFromSample(BeamDistributionItem* beam_distribut
     setDistribution(beam_distribution_item, parameter_distribution, group_name, unit_factor);
 }
 
-void TransformFromDomain::setBackground(GISASInstrumentItem* instrument_item,
+void TransformFromDomain::setBackground(Instrument2DItem* instrument_item,
                                         const Simulation& simulation)
 {
     auto p_bg = simulation.background();
diff --git a/GUI/coregui/Models/TransformFromDomain.h b/GUI/coregui/Models/TransformFromDomain.h
index ca85e78890d..ef1326c1d5b 100644
--- a/GUI/coregui/Models/TransformFromDomain.h
+++ b/GUI/coregui/Models/TransformFromDomain.h
@@ -42,6 +42,7 @@ class IDetector;
 class GISASInstrumentItem;
 class Instrument2DItem;
 class Simulation2D;
+class OffSpecSimulation;
 
 namespace TransformFromDomain
 {
@@ -67,6 +68,8 @@ BA_CORE_API_ bool isValidRoughness(const LayerRoughness* roughness);
 
 BA_CORE_API_ void setGISASBeamItem(BeamItem* beam_item, const GISASSimulation& simulation);
 
+BA_CORE_API_ void setOffSpecBeamItem(BeamItem* beam_item, const OffSpecSimulation& simulation);
+
 BA_CORE_API_ void setDetector(Instrument2DItem* instrument_item, const Simulation2D& simulation);
 
 BA_CORE_API_ void setDetectorGeometry(Instrument2DItem* instrument_item, const IDetector& detector);
@@ -89,7 +92,7 @@ BA_CORE_API_ void setMaskContainer(MaskContainerItem* container_item, const IDet
 BA_CORE_API_ void setItemFromSample(BeamDistributionItem* beam_distribution_item,
                                     const ParameterDistribution& parameter_distribution);
 
-BA_CORE_API_ void setBackground(GISASInstrumentItem* instrument_item, const Simulation& simulation);
+BA_CORE_API_ void setBackground(Instrument2DItem* instrument_item, const Simulation& simulation);
 }
 
 #endif // TRANSFORMFROMDOMAIN_H
-- 
GitLab