#include "onf_stepcomputerdm.h" #include "ct_log/ct_logmanager.h" ONF_StepComputreRDM::ONF_StepComputreRDM() : SuperClass() { _hmin = 1.0; _hmax = 6.0; } QString ONF_StepComputreRDM::description() const { return tr("Créer RDM (Relative Density Model)"); } QString ONF_StepComputreRDM::detailledDescription() const { return tr("Cette étape permet de cacluler le RDM. (D’Oliveira et al., 2012)"); } CT_VirtualAbstractStep* ONF_StepComputreRDM::createNewInstance() const { // cree une copie de cette etape return new ONF_StepComputreRDM(); } //////////////////// PROTECTED ////////////////// void ONF_StepComputreRDM::declareInputModels(CT_StepInModelStructureManager& manager) { manager.addResult(_inResult, tr("Scène(s)")); manager.setZeroOrMoreRootGroup(_inResult, _inZeroOrMoreRootGroup); manager.addGroup(_inZeroOrMoreRootGroup, _inGroup); manager.addItem(_inGroup, _inScene, tr("Scène(s)")); manager.addResult(_inResultDTM, tr("MNT"), tr("MNT"), true); manager.setZeroOrMoreRootGroup(_inResultDTM, _inZeroOrMoreRootGroupDTM); manager.addGroup(_inZeroOrMoreRootGroupDTM, _inGroupDTM); manager.addItem(_inGroupDTM, _inDTM, tr("MNT")); } void ONF_StepComputreRDM::fillPostInputConfigurationDialog(CT_StepConfigurableDialog* postInputConfigDialog) { postInputConfigDialog->addDouble(tr("H couche 1 :"), "m", -std::numeric_limits::max(), std::numeric_limits::max(), 2, _hmin); postInputConfigDialog->addDouble(tr("H couche 2 :"), "m", -std::numeric_limits::max(), std::numeric_limits::max(), 2, _hmax); } void ONF_StepComputreRDM::declareOutputModels(CT_StepOutModelStructureManager& manager) { manager.addResultCopy(_inResult); manager.addItem(_inGroup, _outRDM, tr("RDM")); } void ONF_StepComputreRDM::compute() { const CT_Image2D* mnt = nullptr; for (const CT_Image2D* imageIn : _inDTM.iterateInputs(_inResultDTM)) { mnt = imageIn; } if (mnt != nullptr) { float na = mnt->NA(); for (CT_StandardItemGroup* group : _inGroup.iterateOutputs(_inResult)) { for (const CT_AbstractItemDrawableWithPointCloud* inScene : group->singularItems(_inScene)) { if (isStopped()) {return;} const CT_AbstractPointCloudIndex *pointCloudIndex = inScene->pointCloudIndex(); size_t n_points = pointCloudIndex->size(); PS_LOG->addMessage(LogInterface::info, LogInterface::step, QString(tr("La scène d'entrée comporte %1 points.")).arg(n_points)); CT_Image2D* rdm = new CT_Image2D(mnt->minX(), mnt->minY(), mnt->xdim(), mnt->ydim(), mnt->resolution(), mnt->minZ(), -1, 0); CT_Image2D* rdm2 = new CT_Image2D(mnt->minX(), mnt->minY(), mnt->xdim(), mnt->ydim(), mnt->resolution(), mnt->minZ(), -1, 0); group->addSingularItem(_outRDM, rdm); // Extraction des points de la placette size_t i = 0; CT_PointIterator itP(pointCloudIndex); while(itP.hasNext() && !isStopped()) { const CT_Point &point = itP.next().currentPoint(); float zMNT = mnt->valueAtCoords(point(0), point(1)); if (!qFuzzyCompare(zMNT, na)) { float h = point(2) - zMNT; if (h > 0) { if (h < _hmax) { if (h >= _hmin) { rdm->addValueAtCoords(point(0), point(1), 1); } rdm2->addValueAtCoords(point(0), point(1), 1); } } } // progres de 0 à 100 setProgress(float(90.0*i/n_points)); ++i; } for (size_t c = 0 ; c < rdm->nCells() ; c++) { float val = rdm->valueAtIndex(c); float val2 = rdm2->valueAtIndex(c); if (val > 0 && val2 > 0) { rdm->setValueAtIndex(c, val / val2); } } delete rdm2; rdm->computeMinMax(); } } } }