| 274 | } |
| 275 | |
| 276 | void FbiWriter::write(const PointViewPtr view) |
| 277 | { |
| 278 | buildHdrFromPoints(*hdr, view); |
| 279 | |
| 280 | PointRef point(*view, 0); |
| 281 | |
| 282 | std::ostream* ofFBI = Utils::createFile(filename(), true); |
| 283 | |
| 284 | writeFbiHeader(*hdr.get(), ofFBI); |
| 285 | |
| 286 | assert(hdr->UnitsXyz > 0); |
| 287 | double Mul = 1.0 / hdr->UnitsXyz; |
| 288 | |
| 289 | for (PointId i = 0; i < view->size(); ++i) |
| 290 | { |
| 291 | point.setPointId(i); |
| 292 | double X = point.getFieldAs<double>(Dimension::Id::X); |
| 293 | double Y = point.getFieldAs<double>(Dimension::Id::Y); |
| 294 | double Z = point.getFieldAs<double>(Dimension::Id::Z); |
| 295 | |
| 296 | fbi::UINT xr = (fbi::UINT) ((X - hdr->OrgX)*Mul); |
| 297 | fbi::UINT yr = (fbi::UINT) ((Y - hdr->OrgY)*Mul); |
| 298 | fbi::UINT zr = (fbi::UINT) ((Z - hdr->OrgZ)*Mul); |
| 299 | |
| 300 | ofFBI->write(reinterpret_cast<const char *>(&xr), hdr->BitsX/8); |
| 301 | ofFBI->write(reinterpret_cast<const char *>(&yr), hdr->BitsY/8); |
| 302 | ofFBI->write(reinterpret_cast<const char *>(&zr), hdr->BitsZ/8); |
| 303 | } |
| 304 | |
| 305 | if (hdr->BitsTime > 0) |
| 306 | { |
| 307 | for (PointId i = 0; i < view->size(); ++i) |
| 308 | { |
| 309 | point.setPointId(i); |
| 310 | uint64_t time = point.getFieldAs<uint64_t>(Dimension::Id::OffsetTime); |
| 311 | ofFBI->write(reinterpret_cast<const char *>(&time), hdr->BitsTime/8); |
| 312 | } |
| 313 | } |
| 314 | |
| 315 | if (hdr->BitsDistance > 0) |
| 316 | { |
| 317 | for (PointId i = 0; i < view->size(); ++i) |
| 318 | { |
| 319 | point.setPointId(i); |
| 320 | uint32_t distance = point.getFieldAs<uint32_t>(Dimension::Id::NNDistance); |
| 321 | ofFBI->write(reinterpret_cast<const char *>(&distance), hdr->BitsDistance/8); |
| 322 | } |
| 323 | } |
| 324 | |
| 325 | if (hdr->BitsGroup > 0) |
| 326 | { |
| 327 | for (PointId i = 0; i < view->size(); ++i) |
| 328 | { |
| 329 | point.setPointId(i); |
| 330 | uint64_t cluster = point.getFieldAs<uint64_t>(Dimension::Id::ClusterID); |
| 331 | ofFBI->write(reinterpret_cast<const char *>(&cluster), hdr->BitsGroup/8); |
| 332 | } |
| 333 | } |
no test coverage detected