15 #include <mrpt/containers/yaml.h>
31 auto cfgIn = c[
"selected_ring_ids"];
41 "YAML configuration must have an entry `selected_ring_ids` "
42 "with a scalar or sequence.");
44 for (
const auto& n : cfgIn.asSequenceRange())
54 MRPT_LOG_DEBUG_STREAM(
"Loading these params:\n" << c);
66 "Input point cloud layer '%s' was not found.",
69 const auto& pc = *pcPtr;
76 pcPtr->GetRuntimeClass()->className);
78 if (outSelected) outSelected->reserve(outSelected->size() + pc.size() / 10);
85 pcPtr->GetRuntimeClass()->className);
87 if (outNonSel) outNonSel->reserve(outNonSel->size() + pc.size() / 10);
90 outSelected || outNonSel,
91 "At least one of 'output_layer_selected' or "
92 "'output_layer_non_selected' must be provided.");
94 const auto& xs = pc.getPointsBufferRef_x();
97 const auto* ptrR = pc.getPointsBufferRef_ring();
98 if (!ptrR || ptrR->empty())
101 "Error: this filter needs the input layer '%s' to has an "
102 "'ring' point channel.",
106 const auto& Rs = *ptrR;
107 ASSERT_EQUAL_(Rs.size(), xs.size());
108 const size_t N = xs.size();
110 size_t countSel = 0, countNon = 0;
112 for (
size_t i = 0; i < N; i++)
114 const auto R = Rs[i];
116 mrpt::maps::CPointsMap* trg =
nullptr;
120 trg = outSelected.get();
125 trg = outNonSel.get();
129 if (trg) trg->insertPointFrom(pc, i);
132 MRPT_LOG_DEBUG_STREAM(
133 "[FilterByRing] Input points=" << N <<
" selected=" << countSel
134 <<
" non-selected=" << countNon);