#include "pb_stepapplypointfilters.h" #include "pb_steppluginmanager.h" #include "ct_pointcloudindex/ct_pointcloudindexvector.h" #include "ct_abstractstepplugin.h" #include "ct_filter/abstract/ct_abstractfilter_xyz.h" #include "ctliblas/filters/abstract/ct_abstractfilter_las.h" #include "tools/ct_configurableelementtools.h" PB_StepApplyPointFilters::PB_StepApplyPointFilters() : SuperClass() { } PB_StepApplyPointFilters::~PB_StepApplyPointFilters() { qDeleteAll(mOutHandles.begin(), mOutHandles.end()); mOutHandles.clear(); qDeleteAll(m_selectedXYZFilters); m_selectedXYZFilters.clear(); } // Step description (tooltip of contextual menu) QString PB_StepApplyPointFilters::description() const { return tr("Filtres de points"); } // Step detailled description QString PB_StepApplyPointFilters::detailledDescription() const { if (this->isAPrototype()) { return tr("Cette étape regroupe un ensemble de filtres de points disponibles dans les différents plugins actifs.

" "A partir d'un nuage de points d'entrée, chaque filtre génère un nuage de points filtré en sortie." "

" "La liste des filtres disponibles est fournie en dernière partie de cette page." "

"); } return tr("Cette étape regroupe un ensemble de filtres de points disponibles dans les différents plugins actifs.

" "A partir d'un nuage de points d'entrée, chaque filtre génère un nuage de points filtré en sortie" "

" "La liste des filtres calculés est fournie en dernière partie de cette page." "

"); } QString PB_StepApplyPointFilters::detailsDescription() const { if (this->isAPrototype()) { return tr("Chaque filtre séléctionné génèrera un nuage de points filtré en sortie.

" "

Liste des filtres disponibles :

%1") .arg(CT_ConfigurableElementTools::formatHtmlStepDetailledDescription(pluginStaticCastT()->xyzFiltersAvailable())); } return tr("Chaque filtre séléctionné génèrera un nuage de points filtré en sortie.

" "

Liste des filtres calculés :

%1") .arg(CT_ConfigurableElementTools::formatHtmlStepDetailledDescription(m_selectedXYZFilters)); } void PB_StepApplyPointFilters::savePostSettings(SettingsWriterInterface &writer) const { SuperClass::savePostSettings(writer); CT_ConfigurableElementTools::saveSettingsOfACollectionOfConfigurableElement(m_selectedXYZFilters, this, "Filter", writer); } bool PB_StepApplyPointFilters::restorePostSettings(SettingsReaderInterface &reader) { if (!CT_ConfigurableElementTools::restoreSettingsOfConfigurableElementAndSaveItInACollection(m_selectedXYZFilters, pluginStaticCastT()->xyzFiltersAvailable(), this, "Filter", reader)) { return false; } return SuperClass::restorePostSettings(reader); } CT_VirtualAbstractStep* PB_StepApplyPointFilters::createNewInstance() const { return new PB_StepApplyPointFilters(); } void PB_StepApplyPointFilters::declareInputModels(CT_StepInModelStructureManager& manager) { manager.addResult(mInResult, tr("Points")); manager.setZeroOrMoreRootGroup(mInResult, mInRootGroup); manager.addGroup(mInRootGroup, mInGroup, tr("Groupe")); manager.addItem(mInGroup, mInItem, tr("Item contenant des points")); manager.addItem(mInGroup, mInLasPointsAttributesContainer, tr("Attributs LAS")); } bool PB_StepApplyPointFilters::postInputConfigure() { CTG_ConfigurableElementsSelector cd(nullptr, hasChildrens()); cd.setWindowTitle("Filtres séléctionnés"); cd.setElementsAvailable(pluginStaticCastT()->xyzFiltersAvailable()); cd.setElementsSelected(&m_selectedXYZFilters); if(cd.exec() == QDialog::Accepted) { setSettingsModified(true); return true; } return false; } void PB_StepApplyPointFilters::finalizePostSettings() { for(CT_AbstractConfigurableElement* f : m_selectedXYZFilters) { static_cast(f)->finalizeConfiguration(); } } void PB_StepApplyPointFilters::declareOutputModels(CT_StepOutModelStructureManager& manager) { qDeleteAll(mOutHandles.begin(), mOutHandles.end()); mOutHandles.clear(); manager.addResultCopy(mInResult); for(CT_AbstractConfigurableElement* f : m_selectedXYZFilters) { CT_HandleOutSingularItem* outHandle = new CT_HandleOutSingularItem(); manager.addItem(mInGroup, *outHandle, f->getDetailledDisplayableName()); mOutHandles.append(outHandle); } } void PB_StepApplyPointFilters::compute() { for(CT_StandardItemGroup* group : mInGroup.iterateOutputs(mInResult)) { const CT_AbstractItemDrawableWithPointCloud* points = group->singularItem(mInItem); const CT_StdLASPointsAttributesContainer* lasAtt = group->singularItem(mInLasPointsAttributesContainer); if((points != nullptr) && (points->pointCloudIndex() != nullptr)) { int i = 0; for(CT_AbstractConfigurableElement* element : m_selectedXYZFilters) { CT_AbstractFilter_XYZ* filter = static_cast(element->copy()); CT_AbstractFilter_LAS* filterLAS = dynamic_cast(filter); filter->setPointCloud(points); if(filterLAS != nullptr) filterLAS->setLASAttributesContainer(lasAtt); if(filter->filterPointCloudIndex()) { if(filter->outputPointCloudIndex()->size() > 0) { CT_Scene* outScene = new CT_Scene(PS_REPOSITORY->registerPointCloudIndex(filter->takeOutputCloudIndex())); auto outHandle = mOutHandles.at(i); group->addSingularItem(*outHandle, outScene); } } delete filter; ++i; } } } }