#include "pb_stepcomputerastermetrics.h" #include "pb_steppluginmanager.h" #include "ct_abstractstepplugin.h" #include "ct_metric/abstract/ct_abstractmetric_raster.h" #include "ct_view/elements/ctg_configurableelementsselector.h" #include "tools/ct_configurableelementtools.h" PB_StepComputeRasterMetrics::PB_StepComputeRasterMetrics() : SuperClass() { } PB_StepComputeRasterMetrics::~PB_StepComputeRasterMetrics() { qDeleteAll(m_selectedRasterMetrics); m_selectedRasterMetrics.clear(); } QString PB_StepComputeRasterMetrics::description() const { return tr("Métriques de rasters"); } QString PB_StepComputeRasterMetrics::detailledDescription() const { if (this->isAPrototype()) { return tr("Cette étape regroupe toutes les métriques de raster disponibles dans les différents plugins actifs.

" "Dans Computree une \"métrique\" est un indicateur calculé sur un type de données précis. " "Les métriques de raster sont calculées à partir d'un raster (image 2D, où chaque pixel contient une valeur). " "Une emprise peut optionnellement être fournie pour sélectionner la partie du raster à prendre en compte." "

" "La liste des métriques de raster disponibles est fournie en dernière partie de cette page." "

"); } return tr("Cette étape calcule les métriques de raster séléctionnées.

" "Dans Computree une \"métrique\" est un indicateur calculé sur un type de données précis. " "Les métriques de raster sont calculées à partir d'un raster (image 2D, où chaque pixel contient une valeur). " "Une emprise peut optionnellement être fournie pour sélectionner la partie du raster à prendre en compte." "

" "La description des métriques de raster calculées est fournie en dernière partie de cette page." "

"); } QString PB_StepComputeRasterMetrics::inputDescription() const { return SuperClass::inputDescription() + tr("

Toutes les métriques de raster prennent les mêmes données en entrée :
" ""); } QString PB_StepComputeRasterMetrics::outputDescription() const { if (this->isAPrototype()) { return tr("Cette étape ajoute au résultat d'entrée un conteneur \"métriques\", contenant toutes les métriques calculées. "); } return SuperClass::outputDescription(); } QString PB_StepComputeRasterMetrics::detailsDescription() const { if (this->isAPrototype()) { return tr("Attention : le comportement des métriques peut être influencé par la résolution des rasters fournis.
" "

Liste des métriques de raster disponibles :

%1") .arg(CT_ConfigurableElementTools::formatHtmlStepDetailledDescription(pluginStaticCastT()->rasterMetricsAvailable())); } return tr("Attention : le comportement des métriques peut être influencé par la résolution des rasters fournis.
" "

Description des métriques de raster calculées :

%1") .arg(CT_ConfigurableElementTools::formatHtmlStepDetailledDescription(m_selectedRasterMetrics)); } void PB_StepComputeRasterMetrics::savePostSettings(SettingsWriterInterface &writer) const { CT_ConfigurableElementTools::saveSettingsOfACollectionOfConfigurableElement(m_selectedRasterMetrics, this, "Metric", writer); SuperClass::savePostSettings(writer); } bool PB_StepComputeRasterMetrics::restorePostSettings(SettingsReaderInterface &reader) { if(!CT_ConfigurableElementTools::restoreSettingsOfConfigurableElementAndSaveItInACollection(m_selectedRasterMetrics, pluginStaticCastT()->rasterMetricsAvailable(), this, "Metric", reader)) return false; return SuperClass::restorePostSettings(reader); } CT_VirtualAbstractStep* PB_StepComputeRasterMetrics::createNewInstance() const { return new PB_StepComputeRasterMetrics(); } void PB_StepComputeRasterMetrics::declareInputModels(CT_StepInModelStructureManager& manager) { manager.addResult(mInResult, tr("Rasters"), "", true); manager.setZeroOrMoreRootGroup(mInResult, mInRootGroup); manager.addGroup(mInRootGroup, mInGroup, tr("Groupe")); manager.addItem(mInGroup, mInRaster, tr("Raster")); manager.addItem(mInGroup, mInArea, tr("Emprise de la placette")); } bool PB_StepComputeRasterMetrics::postInputConfigure() { CTG_ConfigurableElementsSelector cd(nullptr, hasChildrens()); cd.setWindowTitle("Métriques séléctionnées"); cd.setElementsAvailable(pluginStaticCastT()->rasterMetricsAvailable()); cd.setElementsSelected(&m_selectedRasterMetrics); if(cd.exec() == QDialog::Accepted) { setSettingsModified(true); return true; } return false; } void PB_StepComputeRasterMetrics::finalizePostSettings() { for(CT_AbstractConfigurableElement* f : m_selectedRasterMetrics) { static_cast(f)->finalizeConfiguration(); } } void PB_StepComputeRasterMetrics::declareOutputModels(CT_StepOutModelStructureManager& manager) { const CT_OutAbstractModel* outItemModel = mInRaster.outModelSelected(mInResult); manager.addResultCopy(mInResult); manager.addItem(mInGroup, mOutAttributeList, tr("Métriques") + (outItemModel == nullptr ? QString() : tr(" (%1)").arg(outItemModel->displayableName()))); for(CT_AbstractConfigurableElement* f : m_selectedRasterMetrics) { CT_AbstractMetric_Raster* metric = static_cast(f); metric->declareOutputItemAttributeModelsInItem(manager, mOutAttributeList); } } void PB_StepComputeRasterMetrics::compute() { for(CT_StandardItemGroup* group : mInGroup.iterateOutputs(mInResult)) { const CT_AbstractImage2D* raster = group->singularItem(mInRaster); if(raster != nullptr) { const CT_AbstractAreaShape2D* plotArea = group->singularItem(mInArea); const CT_AreaShape2DData* area = nullptr; if(plotArea != nullptr) area = &plotArea->getAreaData(); CT_ItemAttributeList* outAttributes = new CT_ItemAttributeList(); group->addSingularItem(mOutAttributeList, outAttributes); for(CT_AbstractConfigurableElement* f : m_selectedRasterMetrics) { CT_AbstractMetric_Raster* metric = static_cast(f); if (metric->initDatas(raster, area)) metric->computeMetric(outAttributes); } } } }