diff --git a/GUI/Model/Data/Data2DItem.cpp b/GUI/Model/Data/Data2DItem.cpp index 6d1599473ca6b296d9d494adba3db4a3492150d4..d68f949ddf0dc8616215d6b3507870e42298b310 100644 --- a/GUI/Model/Data/Data2DItem.cpp +++ b/GUI/Model/Data/Data2DItem.cpp @@ -17,9 +17,12 @@ #include "Base/Axis/Scale.h" #include "Base/Util/Assert.h" #include "Device/Data/Datafield.h" +#include "Device/Mask/IShape2D.h" +#include "Device/Mask/MaskStack.h" #include "GUI/Model/Axis/AmplitudeAxisItem.h" #include "GUI/Model/Axis/BasicAxisItem.h" #include "GUI/Model/Mask/MaskeditorListmodel.h" +#include "GUI/Model/Mask/MaskItems.h" #include "GUI/Model/Mask/ProjectionList.h" #include "GUI/Support/Style/QCP_Util.h" #include "GUI/Support/XML/UtilXML.h" @@ -365,6 +368,37 @@ MaskeditorListmodel* Data2DItem::getOrCreateMaskModel() return m_mask_model.get(); } +Datafield* Data2DItem::createMaskedField() const +{ + // Requesting mask information + std::unique_ptr<IShape2D> roi; + Datafield* result = c_field()->clone(); + MaskStack detectorMask; + const QVector<const MaskItem*> maskItems = maskContainerItem()->maskItems(); + for (auto maskIter = maskItems.rbegin(); maskIter != maskItems.rend(); maskIter++) + if ((*maskIter)->isVisible()) { + if (auto* roiItem = dynamic_cast<const RegionOfInterestItem*>((*maskIter))) + roi = roiItem->createShape(); + else { + std::unique_ptr<IShape2D> shape((*maskIter)->createShape()); + detectorMask.pushMask(*shape, (*maskIter)->maskValue(), false); + } + } + + // ROI mask has to be the last one, it can not be "unmasked" by other shapes + if (roi) + detectorMask.pushMask(*roi, true, false); + + if (!detectorMask.hasMasks()) + return nullptr; + + for (size_t i = 0; i < result->size(); ++i) + if (detectorMask.isMasked(i, result->frame())) + (*result)[i] = 0; + + return result; +} + ProjectionList* Data2DItem::projectionContainerItem() { return m_proj_model ? m_proj_model->projnItem() : nullptr; diff --git a/GUI/Model/Data/Data2DItem.h b/GUI/Model/Data/Data2DItem.h index aef93ea2b8b05e8f1401ce53225a10db2d5e6232..d7b2f7263d9fa6ab0d648b20fcca1957da9c49fa 100644 --- a/GUI/Model/Data/Data2DItem.h +++ b/GUI/Model/Data/Data2DItem.h @@ -78,6 +78,7 @@ public: MaskList* maskContainerItem(); const MaskList* maskContainerItem() const; MaskeditorListmodel* getOrCreateMaskModel(); + Datafield* createMaskedField() const; ProjectionList* projectionContainerItem(); const ProjectionList* projectionContainerItem() const; diff --git a/GUI/View/Canvas/MaskEditorCanvas.cpp b/GUI/View/Canvas/MaskEditorCanvas.cpp index c75abd1c4440014e04c9d54eca186ef747e47ad1..a0ee95f8451c5cdef5b58cff79be31f53bc54b28 100644 --- a/GUI/View/Canvas/MaskEditorCanvas.cpp +++ b/GUI/View/Canvas/MaskEditorCanvas.cpp @@ -14,8 +14,6 @@ #include "GUI/View/Canvas/MaskEditorCanvas.h" #include "Device/Data/Datafield.h" -#include "Device/Mask/IShape2D.h" -#include "Device/Mask/MaskStack.h" #include "GUI/Model/Data/Data2DItem.h" #include "GUI/Model/Mask/MaskItems.h" #include "GUI/Model/Mask/MaskList.h" @@ -27,45 +25,6 @@ #include "GUI/View/Scene/MaskGraphicsView.h" #include <QVBoxLayout> -namespace { - -//! Constructs Datafield which contains original intensity data except masked areas, -//! and areas outside of ROI, where bin content is set to zero. - -Datafield* createMaskPresentation(Data2DItem* data2DItem) -{ - // Requesting mask information - std::unique_ptr<IShape2D> roi; - Datafield* result = data2DItem->c_field()->clone(); - MaskStack detectorMask; - const QVector<const MaskItem*> maskItems = data2DItem->maskContainerItem()->maskItems(); - for (auto maskIter = maskItems.rbegin(); maskIter != maskItems.rend(); maskIter++) - if ((*maskIter)->isVisible()) { - if (auto* roiItem = dynamic_cast<const RegionOfInterestItem*>((*maskIter))) - roi = roiItem->createShape(); - else { - std::unique_ptr<IShape2D> shape((*maskIter)->createShape()); - detectorMask.pushMask(*shape, (*maskIter)->maskValue(), false); - } - } - - // ROI mask has to be the last one, it can not be "unmasked" by other shapes - if (roi) - detectorMask.pushMask(*roi, true, false); - - if (!detectorMask.hasMasks()) - return nullptr; - - for (size_t i = 0; i < result->size(); ++i) - if (detectorMask.isMasked(i, result->frame())) - (*result)[i] = 0; - - return result; -} - -} // namespace - - MaskEditorCanvas::MaskEditorCanvas(QWidget* parent) : QWidget(parent) , m_scene(new MaskGraphicsScene) @@ -114,7 +73,7 @@ void MaskEditorCanvas::onPresentationChange(bool pixelized) ASSERT(m_data2DItem); if (pixelized) { - if (Datafield* maskedData = ::createMaskPresentation(m_data2DItem)) { + if (Datafield* maskedData = m_data2DItem->createMaskedField()) { // store data backup m_backup_data.reset(m_data2DItem->c_field()->clone()); m_backup_interpolated = m_data2DItem->isInterpolated();