12 #include <QDataStream>
16 if (vlr.record_length_after_header < 26)
21 auto data = QByteArray::fromRawData(
reinterpret_cast<const char*
>(vlr.data), vlr.record_length_after_header);
22 QDataStream stream(data);
23 stream.setByteOrder(QDataStream::ByteOrder::LittleEndian);
25 uint8_t compressionType;
42 for (laszip_U32 i = 0; i < numVlrs; ++i)
45 if (strcmp(vlr.user_id,
"LASF_Spec") == 0 && 99 < vlr.record_id && vlr.record_id < 355)
62 const QString& lasFilename,
64 : isPointFormatExtended(laszipHeader.point_data_format >= 6)
70 if (laszipHeader.start_of_waveform_data_packet_record != 0)
72 CVLog::Print(
"[LAS] Waveform data is located within the las file");
73 fwfDataSource.setFileName(lasFilename);
74 if (!fwfDataSource.open(QFile::ReadOnly))
76 CVLog::Warning(QString(
"[LAS] Failed to re open the las file: %1").arg(fwfDataSource.errorString()));
80 if (!fwfDataSource.seek(laszipHeader.start_of_waveform_data_packet_record))
82 CVLog::Warning(QString(
"[LAS] Failed to find the associated waveform data packets header"));
86 QDataStream stream(&fwfDataSource);
89 if (stream.status() == QDataStream::Status::ReadPastEnd)
91 CVLog::Warning(QString(
"[LAS] Failed to read the associated waveform data packets"));
104 CVLog::Warning(QString(
"[LAS] Invalid waveform data packet size (0). We'll load all the "
105 "remaining part of the file!"));
106 fwfDataCount = fwfDataSource.size() - fwfDataSource.pos();
109 else if (laszipHeader.global_encoding & 4)
111 QFileInfo info(lasFilename);
112 QString wdpFilename = info.path() +
"/" + info.completeBaseName() +
".wdp";
113 fwfDataSource.setFileName(wdpFilename);
114 if (!fwfDataSource.open(QFile::ReadOnly))
116 CVLog::Warning(QString(
"[LAS] Failed to read the associated waveform data packets file "
117 "(looking for '%1'): %2")
119 .arg(fwfDataSource.errorString()));
126 QDataStream stream(&fwfDataSource);
128 stream >> evlrHeader;
133 auto p = fwfDataSource.pos();
140 fwfDataSource.seek(0);
143 CVLog::Print(QString(
"[LAS] Waveform Data Packets are in an external file located at %1").arg(wdpFilename));
155 catch (
const std::bad_alloc&)
157 CVLog::Warning(QString(
"[LAS] Not enough memory to import the waveform data"));
162 fwfDataSource.read((
char*)container->data(),
fwfDataCount);
163 fwfDataSource.close();
171 assert(pointCloud.
size() > 0);
177 auto data = QByteArray::fromRawData(
reinterpret_cast<const char*
>(currentPoint.wave_packet), 29);
178 QDataStream stream(data);
179 stream.setByteOrder(QDataStream::ByteOrder::LittleEndian);
181 uint8_t descriptorIndex = 0;
182 quint64 byteOffset = 0;
183 uint32_t byteCount = 0;
184 float returnPointLocation = 0;
185 float x_t = 0, y_t = 0, z_t = 0;
186 stream >> descriptorIndex >> byteOffset >> byteCount >> returnPointLocation >> x_t >> y_t >> z_t;
189 if (
descriptors.contains(descriptorIndex) && !cloudDescriptors.contains(descriptorIndex))
191 cloudDescriptors.insert(descriptorIndex,
descriptors.value(descriptorIndex));
195 CVLog::Warning(
"[LAS] No valid descriptor vlr for index %d", descriptorIndex);
201 CVLog::Warning(
"[LAS] Waveform byte offset is smaller that fwfDataOffset");
209 CVLog::Warning(
"[LAS] Waveform byte count for point %u is bigger than actual fwf data",
210 pointCloud.
size() - 1);
Vector3Tpl< float > CCVector3f
Float 3D Vector.
laszip_vlr laszip_vlr_struct
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.
A 3D cloud and its associated features (color, normals, scalar fields, etc.)
QMap< uint8_t, WaveformDescriptor > FWFDescriptorSet
Waveform descriptors set.
FWFDescriptorSet & fwfDescriptors()
Gives access to the FWF descriptors.
std::vector< ccWaveform > & waveforms()
Gives access to the associated FWF data.
QSharedPointer< const FWFDataContainer > SharedFWFDataContainer
std::vector< uint8_t > FWFDataContainer
Waveform data container.
SharedFWFDataContainer & fwfData()
Gives access to the associated FWF data container.
unsigned size() const override
unsigned capacity() const
Returns cloud capacity (i.e. reserved size)