#include "pb_stepapplyrgbirasterfilters.h"
#include "pb_steppluginmanager.h"
#include "ct_abstractstepplugin.h"
#include "ct_filter/abstract/ct_abstractfilter_rasterrgbi.h"
#include "tools/ct_configurableelementtools.h"
PB_StepApplyRGBIRasterFilters::PB_StepApplyRGBIRasterFilters() : SuperClass()
{
}
PB_StepApplyRGBIRasterFilters::~PB_StepApplyRGBIRasterFilters()
{
qDeleteAll(mOutHandles.begin(), mOutHandles.end());
mOutHandles.clear();
qDeleteAll(m_selectedRGBIRasterFilters);
m_selectedRGBIRasterFilters.clear();
}
// Step description (tooltip of contextual menu)
QString PB_StepApplyRGBIRasterFilters::description() const
{
return tr("Indicateurs radiométriques (rasters)");
}
// Step detailled description
QString PB_StepApplyRGBIRasterFilters::detailledDescription() const
{
if (this->isAPrototype())
{
return tr("Cette étape regroupe un ensemble d'indicateurs radiométriques disponibles dans les différents plugins actifs.
"
"A partir d'un ensemble de canaux rasters d'entrée, un ensemble de rasters correspondants à différents produits dérivés peuvent être calculés en bloc.
"
"Les canaux Rouge (R), Vert (G), Bleu (B) et Proche Infra-Rouge (NIR) sont obligatoire. "
"Les canaux Red Edge (RE) et Infra-Rouge Moyen (MIR) sont optionnels, car utilisés dans une petite partie des indicateurs seulement."
"
"
"La liste des indicateurs disponibles est fournie en dernière partie de cette page."
"
");
}
return tr("Cette étape regroupe un ensemble d'indicateurs radiométriques disponibles dans les différents plugins actifs.
"
"A partir d'un ensemble de canaux rasters d'entrée, un ensemble de rasters correspondants à différents produits dérivés peuvent être calculés en bloc.
"
"Les canaux Rouge (R), Vert (G), Bleu (B) et Proche Infra-Rouge (NIR) sont obligatoire. "
"Les canaux Red Edge (RE) et Infra-Rouge Moyen (MIR) sont optionnels, car utilisés dans une petite partie des indicateurs seulement."
"
"
"La liste des indicateurs calculés est fournie en dernière partie de cette page."
"
");
}
QString PB_StepApplyRGBIRasterFilters::detailsDescription() const
{
if (this->isAPrototype())
{
return tr("Chaque indicateur séléctionné génèrera un raster en sortie.
"
"
Liste des indicateurs disponibles :
%1")
.arg(CT_ConfigurableElementTools::formatHtmlStepDetailledDescription(pluginStaticCastT
()->rgbiRasterFiltersAvailable()));
}
return tr("Chaque indicateur séléctionné génèrera un raster en sortie.
"
"Liste des indicateurs calculés :
%1")
.arg(CT_ConfigurableElementTools::formatHtmlStepDetailledDescription(m_selectedRGBIRasterFilters));
}
void PB_StepApplyRGBIRasterFilters::savePostSettings(SettingsWriterInterface &writer) const
{
SuperClass::savePostSettings(writer);
CT_ConfigurableElementTools::saveSettingsOfACollectionOfConfigurableElement(m_selectedRGBIRasterFilters,
this,
"Filter",
writer);
}
bool PB_StepApplyRGBIRasterFilters::restorePostSettings(SettingsReaderInterface &reader)
{
if (!CT_ConfigurableElementTools::restoreSettingsOfConfigurableElementAndSaveItInACollection(m_selectedRGBIRasterFilters,
pluginStaticCastT
()->rgbiRasterFiltersAvailable(),
this,
"Filter",
reader))
{
return false;
}
return SuperClass::restorePostSettings(reader);
}
CT_VirtualAbstractStep* PB_StepApplyRGBIRasterFilters::createNewInstance() const
{
return new PB_StepApplyRGBIRasterFilters();
}
void PB_StepApplyRGBIRasterFilters::declareInputModels(CT_StepInModelStructureManager& manager)
{
manager.addResult(mInResult, tr("Points"));
manager.setZeroOrMoreRootGroup(mInResult, mInRootGroup);
manager.addGroup(mInRootGroup, mInGroup, tr("Groupe"));
manager.addItem(mInGroup, mInR, tr("Raster Rouge"));
manager.addItem(mInGroup, mInG, tr("Raster Vert"));
manager.addItem(mInGroup, mInB, tr("Raster Bleu"));
manager.addItem(mInGroup, mInNIR, tr("Raster PIR"));
manager.addItem(mInGroup, mInRE, tr("Raster Red Edge (optionnel)"));
manager.addItem(mInGroup, mInMIR, tr("Raster MIR (optionnel)"));
}
bool PB_StepApplyRGBIRasterFilters::postInputConfigure()
{
CTG_ConfigurableElementsSelector cd(nullptr, hasChildrens());
cd.setWindowTitle("Filtres séléctionnés");
cd.setElementsAvailable(pluginStaticCastT()->rgbiRasterFiltersAvailable());
cd.setElementsSelected(&m_selectedRGBIRasterFilters);
if(cd.exec() == QDialog::Accepted)
{
setSettingsModified(true);
return true;
}
return false;
}
void PB_StepApplyRGBIRasterFilters::finalizePostSettings()
{
for(CT_AbstractConfigurableElement* f : m_selectedRGBIRasterFilters)
{
static_cast(f)->finalizeConfiguration();
}
}
void PB_StepApplyRGBIRasterFilters::declareOutputModels(CT_StepOutModelStructureManager& manager)
{
qDeleteAll(mOutHandles.begin(), mOutHandles.end());
mOutHandles.clear();
manager.addResultCopy(mInResult);
for(CT_AbstractConfigurableElement* f : m_selectedRGBIRasterFilters)
{
CT_HandleOutSingularItem >* outHandle = new CT_HandleOutSingularItem >();
manager.addItem(mInGroup, *outHandle, f->getDetailledDisplayableName());
mOutHandles.append(outHandle);
}
}
void PB_StepApplyRGBIRasterFilters::compute()
{
for(CT_StandardItemGroup* group : mInGroup.iterateOutputs(mInResult))
{
const CT_Image2D* inRasterR = group->singularItem(mInR);
const CT_Image2D* inRasterG = group->singularItem(mInG);
const CT_Image2D* inRasterB = group->singularItem(mInB);
const CT_Image2D* inRasterRE = group->singularItem(mInRE);
const CT_Image2D* inRasterNIR = group->singularItem(mInNIR);
const CT_Image2D* inRasterMIR = group->singularItem(mInMIR);
if(inRasterR != nullptr && inRasterG != nullptr && inRasterB != nullptr && inRasterNIR != nullptr)
{
int i = 0;
for(CT_AbstractConfigurableElement* element : m_selectedRGBIRasterFilters)
{
CT_AbstractFilter_RasterRGBI* filter = static_cast(element->copy());
filter->setInputRaster(inRasterR, inRasterG, inRasterB, inRasterRE, inRasterNIR, inRasterMIR);
if (filter->filterRaster())
{
CT_Image2D* outRaster = filter->takeOutputRaster();
auto outHandle = mOutHandles.at(i);
group->addSingularItem(*outHandle, outRaster);
}
delete filter;
++i;
}
}
}
}