#include "pb_stepapplyfloatrasterfilters.h"
#include "pb_steppluginmanager.h"
#include "ct_abstractstepplugin.h"
#include "ct_filter/abstract/ct_abstractfilter_rasterfloat.h"
#include "tools/ct_configurableelementtools.h"
PB_StepApplyFloatRasterFilters::PB_StepApplyFloatRasterFilters() : SuperClass()
{
}
PB_StepApplyFloatRasterFilters::~PB_StepApplyFloatRasterFilters()
{
qDeleteAll(mOutHandles.begin(), mOutHandles.end());
mOutHandles.clear();
qDeleteAll(m_selectedFloatRasterFilters);
m_selectedFloatRasterFilters.clear();
}
// Step description (tooltip of contextual menu)
QString PB_StepApplyFloatRasterFilters::description() const
{
return tr("Indicateurs topographiques *");
}
// Step detailled description
QString PB_StepApplyFloatRasterFilters::detailledDescription() const
{
if (this->isAPrototype())
{
return tr("Cette étape regroupe un ensemble d'indicateurs topographiques disponibles dans les différents plugins actifs.
"
"A partir d'une raster d'entrée (en général un MNT), un ensemble de rasters correspondants à différents produits dérivés peuvent être calculés en bloc.
"
"Une partie de ces indicateurs sont aussi disponibles sous forme d'étapes autonomes (facilitant les tests de paramétrage).
Les étapes concernées sont suivies d'une *."
"
"
"La liste des indicateurs disponibles est fournie en dernière partie de cette page."
"
");
}
return tr("Cette étape regroupe un ensemble d'indicateurs topographiques disponibles dans les différents plugins actifs.
"
"A partir d'une raster d'entrée (en général un MNT), un ensemble de rasters correspondants à différents produits dérivés peuvent être calculés en bloc.
"
"Une partie de ces indicateurs sont aussi disponibles sous forme d'étapes autonomes (facilitant les tests de paramétrage).
Les étapes concernées sont suivies d'une *."
"
"
"La liste des indicateurs calculés est fournie en dernière partie de cette page."
"
");
}
QString PB_StepApplyFloatRasterFilters::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
()->floatRasterFiltersAvailable()));
}
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_selectedFloatRasterFilters));
}
void PB_StepApplyFloatRasterFilters::savePostSettings(SettingsWriterInterface &writer) const
{
SuperClass::savePostSettings(writer);
CT_ConfigurableElementTools::saveSettingsOfACollectionOfConfigurableElement(m_selectedFloatRasterFilters,
this,
"Filter",
writer);
}
bool PB_StepApplyFloatRasterFilters::restorePostSettings(SettingsReaderInterface &reader)
{
if (!CT_ConfigurableElementTools::restoreSettingsOfConfigurableElementAndSaveItInACollection(m_selectedFloatRasterFilters,
pluginStaticCastT
()->floatRasterFiltersAvailable(),
this,
"Filter",
reader))
{
return false;
}
return SuperClass::restorePostSettings(reader);
}
CT_VirtualAbstractStep* PB_StepApplyFloatRasterFilters::createNewInstance() const
{
return new PB_StepApplyFloatRasterFilters();
}
void PB_StepApplyFloatRasterFilters::declareInputModels(CT_StepInModelStructureManager& manager)
{
manager.addResult(mInResult, tr("Points"));
manager.setZeroOrMoreRootGroup(mInResult, mInRootGroup);
manager.addGroup(mInRootGroup, mInGroup, tr("Groupe"));
manager.addItem(mInGroup, mInItem, tr("Raster (float)"));
}
bool PB_StepApplyFloatRasterFilters::postInputConfigure()
{
CTG_ConfigurableElementsSelector cd(nullptr, hasChildrens());
cd.setWindowTitle("Filtres séléctionnés");
cd.setElementsAvailable(pluginStaticCastT()->floatRasterFiltersAvailable());
cd.setElementsSelected(&m_selectedFloatRasterFilters);
if(cd.exec() == QDialog::Accepted)
{
setSettingsModified(true);
return true;
}
return false;
}
void PB_StepApplyFloatRasterFilters::finalizePostSettings()
{
for(CT_AbstractConfigurableElement* f : m_selectedFloatRasterFilters)
{
static_cast(f)->finalizeConfiguration();
}
}
void PB_StepApplyFloatRasterFilters::declareOutputModels(CT_StepOutModelStructureManager& manager)
{
qDeleteAll(mOutHandles.begin(), mOutHandles.end());
mOutHandles.clear();
manager.addResultCopy(mInResult);
for(CT_AbstractConfigurableElement* f : m_selectedFloatRasterFilters)
{
CT_HandleOutSingularItem >* outHandle = new CT_HandleOutSingularItem >();
manager.addItem(mInGroup, *outHandle, f->getDetailledDisplayableName());
mOutHandles.append(outHandle);
}
}
void PB_StepApplyFloatRasterFilters::compute()
{
for(CT_StandardItemGroup* group : mInGroup.iterateOutputs(mInResult))
{
const CT_Image2D* inRaster = group->singularItem(mInItem);
if(inRaster != nullptr)
{
int i = 0;
for(CT_AbstractConfigurableElement* element : m_selectedFloatRasterFilters)
{
CT_AbstractFilter_RasterFloat* filter = static_cast(element->copy());
filter->setInputRaster(inRaster);
if (filter->filterRaster())
{
CT_Image2D* outRaster = filter->takeOutputRaster();
auto outHandle = mOutHandles.at(i);
group->addSingularItem(*outHandle, outRaster);
}
delete filter;
++i;
}
}
}
}