| 175 | } |
| 176 | |
| 177 | PointViewSet CSFilter::run(PointViewPtr view) |
| 178 | { |
| 179 | PointViewSet viewSet{view}; |
| 180 | if (!view->size()) |
| 181 | return viewSet; |
| 182 | |
| 183 | // Segment input view into ignored/kept views. |
| 184 | PointViewPtr ignoredView = view->makeNew(); |
| 185 | PointViewPtr keptView = view->makeNew(); |
| 186 | if (m_args->m_ignored.empty()) |
| 187 | keptView->append(*view); |
| 188 | else |
| 189 | Segmentation::ignoreDimRanges(m_args->m_ignored, view, keptView, |
| 190 | ignoredView); |
| 191 | |
| 192 | // Check for 0's in ReturnNumber and NumberOfReturns |
| 193 | bool nrOneZero(false); |
| 194 | bool rnOneZero(false); |
| 195 | bool nrAllZero(true); |
| 196 | bool rnAllZero(true); |
| 197 | for (PointRef p : *keptView) |
| 198 | { |
| 199 | uint8_t nr = p.getFieldAs<uint8_t>(Id::NumberOfReturns); |
| 200 | uint8_t rn = p.getFieldAs<uint8_t>(Id::ReturnNumber); |
| 201 | if ((nr == 0) && !nrOneZero) |
| 202 | nrOneZero = true; |
| 203 | if ((rn == 0) && !rnOneZero) |
| 204 | rnOneZero = true; |
| 205 | if (nr != 0) |
| 206 | nrAllZero = false; |
| 207 | if (rn != 0) |
| 208 | rnAllZero = false; |
| 209 | } |
| 210 | |
| 211 | if ((nrOneZero || rnOneZero) && !(nrAllZero && rnAllZero)) |
| 212 | throwError("Some NumberOfReturns or ReturnNumber values were 0, but " |
| 213 | "not all. Check that all values in the input file are >= " |
| 214 | "1."); |
| 215 | |
| 216 | // Segment kept view into two views |
| 217 | PointViewPtr firstView = keptView->makeNew(); |
| 218 | PointViewPtr secondView = keptView->makeNew(); |
| 219 | |
| 220 | if (nrAllZero && rnAllZero) |
| 221 | { |
| 222 | log()->get(LogLevel::Warning) |
| 223 | << "Both NumberOfReturns and ReturnNumber are filled with 0's. " |
| 224 | "Proceeding without any further return filtering.\n"; |
| 225 | firstView->append(*keptView); |
| 226 | } |
| 227 | else |
| 228 | { |
| 229 | Segmentation::segmentReturns(keptView, firstView, secondView, |
| 230 | m_args->m_returns); |
| 231 | } |
| 232 | |
| 233 | if (!firstView->size()) |
| 234 | throwError("No returns to process."); |
nothing calls this directly
no test coverage detected