10 #include <QElapsedTimer>
16 laszip_header* laszipHeader{
nullptr};
17 laszip_CHAR* errorMsg{
nullptr};
19 if (laszip_get_header_pointer(laszipReader, &laszipHeader))
21 laszip_get_error(laszipHeader, &errorMsg);
23 laszip_close_reader(laszipReader);
24 laszip_clean(laszipReader);
25 laszip_destroy(laszipReader);
29 laszip_U64 pointCount;
30 if (laszipHeader->version_minor == 4)
32 pointCount = laszipHeader->extended_number_of_point_records;
36 pointCount = laszipHeader->number_of_point_records;
39 laszip_point* laszipPoint{
nullptr};
40 if (laszip_get_point_pointer(laszipReader, &laszipPoint))
42 laszip_get_error(laszipHeader, &errorMsg);
44 laszip_close_reader(laszipReader);
45 laszip_clean(laszipReader);
46 laszip_destroy(laszipReader);
50 std::vector<laszip_POINTER> writers;
55 const size_t index0 = options.
index0();
56 const size_t index1 = options.
index1();
58 double cloudMins[3] = {
64 double cloudBBox[3] = {
65 laszipHeader->max_x - laszipHeader->min_x,
66 laszipHeader->max_y - laszipHeader->min_y,
67 laszipHeader->max_z - laszipHeader->min_z,
70 double tileSize[2] = {
75 laszip_F64 laszipCoordinates[3] = {0};
80 QFileInfo originInfo(originName);
84 progressDialog.
setInfo(
"Tiling...");
86 progressDialog.
start();
88 for (
unsigned i = 0; i < pointCount; ++i)
90 if (laszip_read_point(laszipReader))
92 laszip_get_error(laszipReader, &errorMsg);
98 if (laszip_get_coordinates(laszipReader, laszipCoordinates))
100 laszip_get_error(laszipReader, &errorMsg);
106 auto tileI =
static_cast<size_t>((laszipCoordinates[index0] - cloudMins[index0]) / tileSize[0]);
108 auto tileJ =
static_cast<size_t>((laszipCoordinates[index1] - cloudMins[index1]) / tileSize[1]);
111 const size_t tileIndex = (tileI * options.
numTiles1) + tileJ;
113 laszip_POINTER& writer = writers[tileIndex];
115 if (writer ==
nullptr)
125 const QString fileName = QString(
"%1_%2_%3.%4").arg(originInfo.baseName(), QString::number(tileI), QString::number(tileJ), originInfo.suffix());
126 outputName += fileName;
127 const std::string outputNameStd = outputName.toStdString();
129 if (laszip_create(&writer))
136 if (laszip_set_header(writer, laszipHeader))
138 laszip_get_error(writer, &errorMsg);
144 if (laszip_open_writer(writer, outputNameStd.c_str(),
false))
146 laszip_get_error(writer, &errorMsg);
153 if (laszip_set_point(writer, laszipPoint))
155 laszip_get_error(writer, &errorMsg);
161 if (laszip_write_point(writer))
163 laszip_get_error(writer, &errorMsg);
169 if (laszip_update_inventory(writer))
171 laszip_get_error(writer, &errorMsg);
180 for (laszip_POINTER writer : writers)
182 if (writer ==
nullptr)
187 laszip_close_writer(writer);
188 laszip_clean(writer);
189 laszip_destroy(writer);
192 laszip_close_reader(laszipReader);
193 laszip_clean(laszipReader);
194 laszip_destroy(laszipReader);
199 qint64 elapsed_ms =
timer.elapsed();
200 qint64 minutes = elapsed_ms / (1000 * 60);
201 elapsed_ms -= minutes * (1000 * 60);
202 qint64
seconds = elapsed_ms / 1000;
204 CVLog::Print(QString(
"[LAS] File tiled in %1m%2s%3ms").arg(minutes).arg(
seconds).arg(elapsed_ms));
CC_FILE_ERROR
Typical I/O filter errors.
@ CC_FERR_THIRD_PARTY_LIB_FAILURE
CC_FILE_ERROR TileLasReader(laszip_POINTER laszipReader, const QString &originName, const LasTilingOptions &options)
static bool Warning(const char *format,...)
Prints out a formatted warning message in console.
static bool Print(const char *format,...)
Prints out a formatted message in console.
bool oneStep()
Increments total progress value of a single unit.
Graphical progress indicator (thread-safe)
virtual void start() override
virtual void setInfo(const char *infoStr) override
Notifies some information about the ongoing process.
virtual void setMethodTitle(const char *methodTitle) override
Notifies the algorithm title.
static void error(char *msg)