d885ae35147 {doc} Update CHANGELOG for 3.3.0
9e7c0a25e4c {cmake} Update version to 3.3.0
8b668f19380 {doc} Update CHANGELOG
dcdda358b0f {doc} Add MicMac to README
5fb956155c7 Replace codecvt_utf8_utf16(deprecatred in C++17) with WIN32 API if C++>=17
a99cbb9ac82 {ci} Update actions/checkout to v5
23a37530095 {ci} Fix CI warnings
04a913cc35e {ci, doc} Fix clang -documentation warnings (#327)
7e3079b9a35 {ci} Make Windows CI working again (#325)
bab1d8b2350 {doc} Update CHANGELOG
git-subtree-dir: src/3rdParty/libE57Format
git-subtree-split: d885ae35147dabd0ad9f6a85e46538b27b1b701c
1000 lines
40 KiB
C++
1000 lines
40 KiB
C++
/*
|
|
* E57Simple - public header of E57 Simple API for reading/writing .e57 files.
|
|
*
|
|
* Copyright (c) 2010 Stan Coleby (scoleby@intelisum.com)
|
|
* Copyright (c) 2020 PTC Inc.
|
|
* Copyright (c) 2022 Andy Maloney <asmaloney@gmail.com>
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person or organization
|
|
* obtaining a copy of the software and accompanying documentation covered by
|
|
* this license (the "Software") to use, reproduce, display, distribute,
|
|
* execute, and transmit the Software, and to prepare derivative works of the
|
|
* Software, and to permit third-parties to whom the Software is furnished to
|
|
* do so, all subject to the following:
|
|
*
|
|
* The copyright notices in the Software and this entire statement, including
|
|
* the above license grant, this restriction and the following disclaimer,
|
|
* must be included in all copies of the Software, in whole or in part, and
|
|
* all derivative works of the Software, unless such copies or derivative
|
|
* works are solely in the form of machine-executable object code generated by
|
|
* a source language processor.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
|
* SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
|
* FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
|
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
* DEALINGS IN THE SOFTWARE.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
/// @file
|
|
/// @brief Data structures for E57 Simple API
|
|
|
|
#include "E57Format.h"
|
|
|
|
namespace e57
|
|
{
|
|
/// @cond documentNonPublic The following isn't part of the API, and isn't documented.
|
|
class ReaderImpl;
|
|
class WriterImpl;
|
|
/// @endcond
|
|
|
|
/// @brief Defines a rigid body translation in Cartesian coordinates.
|
|
struct E57_DLL Translation
|
|
{
|
|
/// The X coordinate of the translation (in meters)
|
|
double x = 0.0;
|
|
|
|
/// The Y coordinate of the translation (in meters)
|
|
double y = 0.0;
|
|
|
|
/// The Z coordinate of the translation (in meters)
|
|
double z = 0.0;
|
|
|
|
bool operator==( const Translation &rhs ) const
|
|
{
|
|
return ( x == rhs.x ) && ( y == rhs.y ) && ( z == rhs.z );
|
|
}
|
|
|
|
bool operator!=( const Translation &rhs ) const
|
|
{
|
|
return !operator==( rhs );
|
|
}
|
|
|
|
/// @brief Return "no translation".
|
|
/// @returns A translation of (0.0, 0.0, 0.0).
|
|
static Translation identity()
|
|
{
|
|
return {};
|
|
}
|
|
};
|
|
|
|
/// @brief Represents a rigid body rotation.
|
|
struct E57_DLL Quaternion
|
|
{
|
|
/// The real part of the quaternion (shall be nonnegative)
|
|
double w = 1.0;
|
|
|
|
/// The i coefficient of the quaternion
|
|
double x = 0.0;
|
|
|
|
/// The j coefficient of the quaternion
|
|
double y = 0.0;
|
|
|
|
/// The k coefficient of the quaternion
|
|
double z = 0.0;
|
|
|
|
bool operator==( const Quaternion &rhs ) const
|
|
{
|
|
return ( w == rhs.w ) && ( x == rhs.x ) && ( y == rhs.y ) && ( z == rhs.z );
|
|
}
|
|
|
|
bool operator!=( const Quaternion &rhs ) const
|
|
{
|
|
return !operator==( rhs );
|
|
}
|
|
|
|
/// @brief Return the identity quaternion.
|
|
/// @returns A quaternion of (1.0, 0.0, 0.0, 0.0).
|
|
static Quaternion identity()
|
|
{
|
|
return {};
|
|
}
|
|
};
|
|
|
|
/// @brief Defines a rigid body transform in cartesian coordinates.
|
|
struct E57_DLL RigidBodyTransform
|
|
{
|
|
/// A unit quaternion representing the rotation, R, of the transform
|
|
Quaternion rotation;
|
|
|
|
/// The translation point vector, t, of the transform
|
|
Translation translation;
|
|
|
|
bool operator==( const RigidBodyTransform &rhs ) const
|
|
{
|
|
return ( rotation == rhs.rotation ) && ( translation == rhs.translation );
|
|
}
|
|
|
|
bool operator!=( const RigidBodyTransform &rhs ) const
|
|
{
|
|
return !operator==( rhs );
|
|
}
|
|
|
|
/// @brief Returns a RigidBodyTransform without rotation or translation.
|
|
static RigidBodyTransform identity()
|
|
{
|
|
return { Quaternion::identity(), Translation::identity() };
|
|
}
|
|
};
|
|
|
|
/// @brief Specifies an axis-aligned box in local cartesian coordinates.
|
|
struct E57_DLL CartesianBounds
|
|
{
|
|
/// The minimum extent of the bounding box in the X direction
|
|
double xMinimum = -DOUBLE_MAX;
|
|
/// The maximum extent of the bounding box in the X direction
|
|
double xMaximum = DOUBLE_MAX;
|
|
|
|
/// The minimum extent of the bounding box in the Y direction
|
|
double yMinimum = -DOUBLE_MAX;
|
|
/// The maximum extent of the bounding box in the Y direction
|
|
double yMaximum = DOUBLE_MAX;
|
|
|
|
/// The minimum extent of the bounding box in the Z direction
|
|
double zMinimum = -DOUBLE_MAX;
|
|
/// The maximum extent of the bounding box in the Z direction
|
|
double zMaximum = DOUBLE_MAX;
|
|
|
|
bool operator==( const CartesianBounds &rhs ) const
|
|
{
|
|
return ( xMinimum == rhs.xMinimum ) && ( xMaximum == rhs.xMaximum ) &&
|
|
( yMinimum == rhs.yMinimum ) && ( yMaximum == rhs.yMaximum ) &&
|
|
( zMinimum == rhs.zMinimum ) && ( zMaximum == rhs.zMaximum );
|
|
}
|
|
|
|
bool operator!=( const CartesianBounds &rhs ) const
|
|
{
|
|
return !operator==( rhs );
|
|
}
|
|
};
|
|
|
|
/// @brief Stores the bounds of some data in spherical coordinates.
|
|
struct E57_DLL SphericalBounds
|
|
{
|
|
SphericalBounds(); // constructor in the cpp to avoid exposing M_PI
|
|
|
|
/// The minimum extent of the bounding region in the r direction
|
|
double rangeMinimum;
|
|
/// The maximum extent of the bounding region in the r direction
|
|
double rangeMaximum;
|
|
|
|
/// The minimum extent of the bounding region from the horizontal plane
|
|
double elevationMinimum;
|
|
/// The maximum extent of the bounding region from the horizontal plane
|
|
double elevationMaximum;
|
|
|
|
/// The starting azimuth angle defining the extent of the bounding region around the z axis
|
|
double azimuthStart;
|
|
/// The ending azimuth angle defining the extent of the bounding region around the z axis
|
|
double azimuthEnd;
|
|
|
|
bool operator==( const SphericalBounds &rhs ) const
|
|
{
|
|
return ( rangeMinimum == rhs.rangeMinimum ) && ( rangeMaximum == rhs.rangeMaximum ) &&
|
|
( elevationMinimum == rhs.elevationMinimum ) &&
|
|
( elevationMaximum == rhs.elevationMaximum ) &&
|
|
( azimuthStart == rhs.azimuthStart ) && ( azimuthEnd == rhs.azimuthEnd );
|
|
}
|
|
|
|
bool operator!=( const SphericalBounds &rhs ) const
|
|
{
|
|
return !operator==( rhs );
|
|
}
|
|
};
|
|
|
|
/// @brief Stores the minimum and maximum of rowIndex, columnIndex, and returnIndex fields for a
|
|
/// set of points.
|
|
struct E57_DLL IndexBounds
|
|
{
|
|
/// The minimum rowIndex value of any point represented by this IndexBounds object
|
|
int64_t rowMinimum = 0;
|
|
/// The maximum rowIndex value of any point represented by this IndexBounds object
|
|
int64_t rowMaximum = 0;
|
|
|
|
/// The minimum columnIndex value of any point represented by this IndexBounds object
|
|
int64_t columnMinimum = 0;
|
|
/// The maximum columnIndex value of any point represented by this IndexBounds object
|
|
int64_t columnMaximum = 0;
|
|
|
|
/// The minimum returnIndex value of any point represented by this IndexBounds object
|
|
int64_t returnMinimum = 0;
|
|
/// The maximum returnIndex value of any point represented by this IndexBounds object
|
|
int64_t returnMaximum = 0;
|
|
|
|
bool operator==( const IndexBounds &rhs ) const
|
|
{
|
|
return ( rowMinimum == rhs.rowMinimum ) && ( rowMaximum == rhs.rowMaximum ) &&
|
|
( columnMinimum == rhs.columnMinimum ) && ( columnMaximum == rhs.columnMaximum ) &&
|
|
( returnMinimum == rhs.returnMinimum ) && ( returnMaximum == rhs.returnMaximum );
|
|
}
|
|
|
|
bool operator!=( const IndexBounds &rhs ) const
|
|
{
|
|
return !operator==( rhs );
|
|
}
|
|
};
|
|
|
|
/// @brief Specifies the limits for the value of signal intensity that a sensor is capable of
|
|
/// producing
|
|
struct E57_DLL IntensityLimits
|
|
{
|
|
/// The minimum producible intensity value. Unit is unspecified.
|
|
double intensityMinimum = 0.0;
|
|
/// The maximum producible intensity value. Unit is unspecified.
|
|
double intensityMaximum = 0.0;
|
|
|
|
bool operator==( const IntensityLimits &rhs ) const
|
|
{
|
|
return ( intensityMinimum == rhs.intensityMinimum ) &&
|
|
( intensityMaximum == rhs.intensityMaximum );
|
|
}
|
|
|
|
bool operator!=( const IntensityLimits &rhs ) const
|
|
{
|
|
return !operator==( rhs );
|
|
}
|
|
};
|
|
|
|
/// @brief Specifies the limits for the value of red, green, and blue color that a sensor is
|
|
/// capable of producing.
|
|
struct E57_DLL ColorLimits
|
|
{
|
|
/// The minimum producible red color value. Unit is unspecified.
|
|
double colorRedMinimum = 0.0;
|
|
/// The maximum producible red color value. Unit is unspecified.
|
|
double colorRedMaximum = 0.0;
|
|
|
|
/// The minimum producible green color value. Unit is unspecified.
|
|
double colorGreenMinimum = 0.0;
|
|
/// The maximum producible green color value. Unit is unspecified.
|
|
double colorGreenMaximum = 0.0;
|
|
|
|
/// The minimum producible blue color value. Unit is unspecified.
|
|
double colorBlueMinimum = 0.0;
|
|
/// The maximum producible blue color value. Unit is unspecified.
|
|
double colorBlueMaximum = 0.0;
|
|
|
|
bool operator==( const ColorLimits &rhs ) const
|
|
{
|
|
return ( colorRedMinimum == rhs.colorRedMinimum ) &&
|
|
( colorRedMaximum == rhs.colorRedMaximum ) &&
|
|
( colorGreenMinimum == rhs.colorGreenMinimum ) &&
|
|
( colorGreenMaximum == rhs.colorGreenMaximum ) &&
|
|
( colorBlueMinimum == rhs.colorBlueMinimum ) &&
|
|
( colorBlueMaximum == rhs.colorBlueMaximum );
|
|
}
|
|
|
|
bool operator!=( const ColorLimits &rhs ) const
|
|
{
|
|
return !operator==( rhs );
|
|
}
|
|
};
|
|
|
|
/// @brief Encodes date and time.
|
|
/// @details The date and time is encoded using a single floating point number, stored as an E57
|
|
/// Float element which is based on the Global Positioning System (GPS) time scale.
|
|
struct E57_DLL DateTime
|
|
{
|
|
/// @brief The time, in seconds, since GPS time was zero.
|
|
/// @details This time specification may include fractions of a second.
|
|
double dateTimeValue = 0.0;
|
|
|
|
/// @brief This element should be present, and its value set to 1 if, and only if, the time
|
|
/// stored in the dateTimeValue element is obtained from an atomic clock time source.
|
|
/// @details Shall be either 0 or 1.
|
|
int32_t isAtomicClockReferenced = 0;
|
|
|
|
bool operator==( const DateTime &rhs ) const
|
|
{
|
|
return ( dateTimeValue == rhs.dateTimeValue ) &&
|
|
( isAtomicClockReferenced == rhs.isAtomicClockReferenced );
|
|
}
|
|
|
|
bool operator!=( const DateTime &rhs ) const
|
|
{
|
|
return !operator==( rhs );
|
|
}
|
|
};
|
|
|
|
/// @brief Stores the top-level information for the XML section of the file.
|
|
struct E57_DLL E57Root
|
|
{
|
|
/// Must contain the string "ASTM E57 3D Imaging Data File"
|
|
ustring formatName;
|
|
|
|
/// A globally unique identification string for the current version of the file
|
|
ustring guid;
|
|
|
|
/// Major version number (should be 1)
|
|
uint32_t versionMajor = 1;
|
|
/// Minor version number (should be 0)
|
|
uint32_t versionMinor = 0;
|
|
|
|
/// The version identifier for the E57 file format library which wrote the file.
|
|
ustring e57LibraryVersion;
|
|
|
|
/// Date/time that the file was created
|
|
DateTime creationDateTime;
|
|
|
|
/// Size of the Data3D vector for storing 3D imaging data
|
|
int64_t data3DSize = 0;
|
|
|
|
/// Size of the Images2D vector for storing 2D images from a camera or similar device.
|
|
int64_t images2DSize = 0;
|
|
|
|
/// Information describing the Coordinate Reference System to be used for the file
|
|
ustring coordinateMetadata;
|
|
};
|
|
|
|
/// @brief Stores information about a single group of points in a row or column
|
|
struct E57_DLL LineGroupRecord
|
|
{
|
|
/// @brief The value of the identifying element of all members in this group.
|
|
/// @details Shall be in the interval [0, 2^63).
|
|
int64_t idElementValue = 0;
|
|
|
|
/// @brief The record number of the first point in the continuous interval.
|
|
/// @details Shall be in the interval [0, 2^63).
|
|
int64_t startPointIndex = 0;
|
|
|
|
/// @brief The number of PointRecords in the group.
|
|
/// @details Shall be in the interval [1, 2^63). May be zero.
|
|
int64_t pointCount = 0;
|
|
|
|
/// @brief The bounding box (in Cartesian coordinates) of all points in the group.
|
|
/// @details These are in the local coordinate system of the points.
|
|
CartesianBounds cartesianBounds;
|
|
|
|
/// @brief The bounding region (in spherical coordinates) of all the points in the group.
|
|
/// @details These are in the local coordinate system of the points.
|
|
SphericalBounds sphericalBounds;
|
|
};
|
|
|
|
/// @brief Stores a set of point groups organized by the rowIndex or columnIndex attribute of the
|
|
/// PointRecord
|
|
struct E57_DLL GroupingByLine
|
|
{
|
|
/// @brief The name of the PointRecord element that identifies which group the point is in.
|
|
/// @details The value of this string must be "rowIndex" or "columnIndex".
|
|
ustring idElementName;
|
|
|
|
/// @brief Size of the groups compressedVector of LineGroupRecord structures.
|
|
int64_t groupsSize = 0;
|
|
|
|
/// @brief The size value for the LineGroupRecord::pointCount.
|
|
int64_t pointCountSize = 0;
|
|
};
|
|
|
|
/// @brief Supports the division of points within an Data3D into logical groupings
|
|
struct E57_DLL PointGroupingSchemes
|
|
{
|
|
/// @brief Grouping information by row or column index
|
|
GroupingByLine groupingByLine;
|
|
};
|
|
|
|
/// @brief Used to set the type of node in some PointStandardizedFieldsAvailable fields.
|
|
enum class NumericalNodeType
|
|
{
|
|
Integer = 0, ///< Use IntegerNode
|
|
ScaledInteger, ///< Use ScaledIntegerNode
|
|
Float, ///< Use FloatNode with floats
|
|
Double, ///< Use FloatNode with doubles
|
|
};
|
|
|
|
/// @brief Used to interrogate if standardized fields are available
|
|
struct E57_DLL PointStandardizedFieldsAvailable
|
|
{
|
|
/// Indicates that the PointRecord cartesianX field is active
|
|
bool cartesianXField = false;
|
|
/// Indicates that the PointRecord cartesianY field is active
|
|
bool cartesianYField = false;
|
|
/// Indicates that the PointRecord cartesianZ field is active
|
|
bool cartesianZField = false;
|
|
/// Indicates that the PointRecord cartesianInvalidState field is active
|
|
bool cartesianInvalidStateField = false;
|
|
|
|
/// Indicates that the PointRecord sphericalRange field is active
|
|
bool sphericalRangeField = false;
|
|
/// Indicates that the PointRecord sphericalAzimuth field is active
|
|
bool sphericalAzimuthField = false;
|
|
/// Indicates that the PointRecord sphericalElevation field is active
|
|
bool sphericalElevationField = false;
|
|
/// Indicates that the PointRecord sphericalInvalidState field is active
|
|
bool sphericalInvalidStateField = false;
|
|
|
|
/// @brief Indicates that the PointRecord cartesian and range fields should be configured with
|
|
/// this minimum value e.g. E57_FLOAT_MIN or E57_DOUBLE_MIN.
|
|
/// @details If using a ScaledIntegerNode then this needs to be a minimum range value.
|
|
double pointRangeMinimum = DOUBLE_MIN;
|
|
|
|
/// @brief Indicates that the PointRecord cartesian and range fields should be configured with
|
|
/// this maximum value e.g. E57_FLOAT_MAX or E57_DOUBLE_MAX.
|
|
/// @details If using a ScaledIntegerNode then this needs to be a maximum range value.
|
|
double pointRangeMaximum = DOUBLE_MAX;
|
|
|
|
/// @brief Controls the type of Node used for the PointRecord cartesian and range fields
|
|
/// @details Accepts NumericalNodeType::ScaledInteger, NumericalNodeType::Float, and
|
|
/// NumericalNodeType::Double.
|
|
NumericalNodeType pointRangeNodeType = NumericalNodeType::Float;
|
|
|
|
/// @brief Sets the scale if using scaled integers for point fields
|
|
/// @details If pointRangeNodeType == NumericalNodeType::ScaledInteger, it will use this value
|
|
/// to scale the numbers and it must be > 0.0.
|
|
double pointRangeScale = 0.0;
|
|
|
|
/// @brief Indicates that the PointRecord angle fields should be configured with this minimum
|
|
/// value E57_FLOAT_MIN or E57_DOUBLE_MIN.
|
|
/// @details If using a ScaledIntegerNode then this needs to be a minimum angle value.
|
|
double angleMinimum = DOUBLE_MIN;
|
|
|
|
/// @brief Indicates that the PointRecord angle fields should be configured with this maximum
|
|
/// value e.g. E57_FLOAT_MAX or E57_DOUBLE_MAX.
|
|
/// @details If using a ScaledIntegerNode then this needs to be a maximum angle value.
|
|
double angleMaximum = DOUBLE_MAX;
|
|
|
|
/// @brief Controls the type of Node used for the PointRecord angle fields
|
|
/// @details Accepts NumericalNodeType::ScaledInteger, NumericalNodeType::Float, and
|
|
/// NumericalNodeType::Double.
|
|
NumericalNodeType angleNodeType = NumericalNodeType::Float;
|
|
|
|
/// @brief Sets the scale if using scaled integers for angle fields
|
|
/// @details If angleNodeType == NumericalNodeType::ScaledInteger, it will use this value
|
|
/// to scale the numbers and it must be > 0.0.
|
|
double angleScale = 0.0;
|
|
|
|
/// Indicates that the PointRecord @a rowIndex field is active
|
|
bool rowIndexField = false;
|
|
|
|
/// Indicates that the PointRecord @a rowIndex fields should be configured with this maximum
|
|
/// value where the minimum will be set to 0.
|
|
uint32_t rowIndexMaximum = UINT32_MAX;
|
|
|
|
/// Indicates that the PointRecord @a columnIndex field is active
|
|
bool columnIndexField = false;
|
|
|
|
/// Indicates that the PointRecord @a columnIndex fields should be configured with this
|
|
/// maximum value where the minimum will be set to 0.
|
|
uint32_t columnIndexMaximum = UINT32_MAX;
|
|
|
|
/// Indicates that the PointRecord @a returnIndex field is active
|
|
bool returnIndexField = false;
|
|
/// Indicates that the PointRecord @a returnCount field is active
|
|
bool returnCountField = false;
|
|
/// Indicates that the PointRecord return fields should be configured with this maximum value
|
|
/// where the minimum will be set to 0.
|
|
uint8_t returnMaximum = UINT8_MAX;
|
|
|
|
/// Indicates that the PointRecord @a timeStamp field is active
|
|
bool timeStampField = false;
|
|
/// Indicates that the PointRecord @a isTimeStampInvalid field is active
|
|
bool isTimeStampInvalidField = false;
|
|
|
|
/// @brief Indicates that the PointRecord @a timeStamp fields should be configured with this
|
|
/// minimum value e.g. E57_UINT32_MIN, E57_DOUBLE_MIN or E57_DOUBLE_MIN.
|
|
/// @details If using a ScaledIntegerNode then this needs to be a minimum time value.
|
|
double timeMinimum = DOUBLE_MIN;
|
|
|
|
/// Indicates that the PointRecord @a timeStamp fields should be configured with this maximum
|
|
/// value. e.g. E57_UINT32_MAX, E57_DOUBLE_MAX or E57_DOUBLE_MAX.
|
|
double timeMaximum = DOUBLE_MAX;
|
|
|
|
/// @brief Controls the type of Node used for the PointRecord time fields
|
|
/// @details Accepts NumericalNodeType::Integer, NumericalNodeType::ScaledInteger,
|
|
/// NumericalNodeType::Float, and NumericalNodeType::Double.
|
|
NumericalNodeType timeNodeType = NumericalNodeType::Float;
|
|
|
|
/// @brief Sets the scale if using scaled integers for time fields
|
|
/// @details If timeNodeType == NumericalNodeType::ScaledInteger, it will use this value
|
|
/// to scale the numbers and it must be > 0.0.
|
|
double timeScale = 0.0;
|
|
|
|
/// Indicates that the PointRecord @a intensity field is active
|
|
bool intensityField = false;
|
|
/// Indicates that the PointRecord @a isIntensityInvalid field is active
|
|
bool isIntensityInvalidField = false;
|
|
|
|
/// @brief Controls the type of Node used for the PointRecord intensity fields
|
|
/// @details Accepts NumericalNodeType::Integer, NumericalNodeType::ScaledInteger,
|
|
/// NumericalNodeType::Float, and NumericalNodeType::Double.
|
|
NumericalNodeType intensityNodeType = NumericalNodeType::Float;
|
|
|
|
/// @brief Sets the scale if using scaled integers for intensity fields
|
|
/// @details If intensityNodeType == NumericalNodeType::ScaledInteger, it will use this value
|
|
/// to scale the numbers and it must be > 0.0.
|
|
double intensityScale = 0.0;
|
|
|
|
/// Indicates that the PointRecord @a colorRed field is active
|
|
bool colorRedField = false;
|
|
/// Indicates that the PointRecord @a colorGreen field is active
|
|
bool colorGreenField = false;
|
|
/// Indicates that the PointRecord @a colorBlue field is active
|
|
bool colorBlueField = false;
|
|
/// Indicates that the PointRecord @a isColorInvalid field is active
|
|
bool isColorInvalidField = false;
|
|
|
|
/// Indicates that the PointRecord @a nor:normalX field is active
|
|
bool normalXField = false;
|
|
/// Indicates that the PointRecord @a nor:normalY field is active
|
|
bool normalYField = false;
|
|
/// Indicates that the PointRecord @a nor:normalZ field is active
|
|
bool normalZField = false;
|
|
};
|
|
|
|
/// @brief Stores the top-level information for a single lidar scan
|
|
struct E57_DLL Data3D
|
|
{
|
|
/// A user-defined name for the Data3D.
|
|
ustring name;
|
|
|
|
/// A globally unique identification string for the current version of the Data3D object
|
|
ustring guid;
|
|
|
|
/// @brief A vector of globally unique identification Strings from which the points in this
|
|
/// Data3D originated.
|
|
std::vector<ustring> originalGuids;
|
|
|
|
/// A user-defined description of the Image
|
|
ustring description;
|
|
|
|
/// The name of the manufacturer for the sensor used to collect the points in this Data3D.
|
|
ustring sensorVendor;
|
|
/// The model name or number for the sensor.
|
|
ustring sensorModel;
|
|
/// The serial number for the sensor.
|
|
ustring sensorSerialNumber;
|
|
/// The version number for the sensor hardware at the time of data collection.
|
|
ustring sensorHardwareVersion;
|
|
/// The version number for the software used for the data collection.
|
|
ustring sensorSoftwareVersion;
|
|
/// @brief The version number for the firmware installed in the sensor at the time of data
|
|
/// collection.
|
|
ustring sensorFirmwareVersion;
|
|
|
|
/// @brief The ambient temperature, measured at the sensor, at the time of data collection.
|
|
/// @details This units are degrees Celsius.
|
|
float temperature = FLOAT_MAX;
|
|
|
|
/// @brief The percentage relative humidity, measured at the sensor, at the time of data
|
|
/// collection.
|
|
/// @details Shall be in the interval [0, 100].
|
|
float relativeHumidity = FLOAT_MAX;
|
|
|
|
/// @brief The atmospheric pressure, measured at the sensor, at the time of data collection
|
|
/// @details The units are Pascals. Shall be positive.
|
|
float atmosphericPressure = FLOAT_MAX;
|
|
|
|
/// The start date and time that the data was acquired.
|
|
DateTime acquisitionStart;
|
|
/// The end date and time that the data was acquired.
|
|
DateTime acquisitionEnd;
|
|
|
|
/// @brief A rigid body transform that describes the coordinate frame of the 3D imaging system
|
|
/// origin.
|
|
/// @details These are in the file-level coordinate system.
|
|
RigidBodyTransform pose;
|
|
|
|
/// The bounds of the row, column, and return number of all the points in this Data3D.
|
|
IndexBounds indexBounds;
|
|
|
|
/// @brief The bounding region (in cartesian coordinates) of all the points in this Data3D.
|
|
/// @details These are in the local coordinate system of the points.
|
|
CartesianBounds cartesianBounds;
|
|
|
|
/// @brief The bounding region (in spherical coordinates) of all the points in this Data3D.
|
|
/// @details These are in the local coordinate system of the points.
|
|
SphericalBounds sphericalBounds;
|
|
|
|
/// The limits for the value of signal intensity that the sensor is capable of producing.
|
|
IntensityLimits intensityLimits;
|
|
|
|
/// @brief The limits for the value of red, green, and blue color that the sensor is capable
|
|
/// of producing.
|
|
ColorLimits colorLimits;
|
|
|
|
/// The defined schemes that group points in different ways
|
|
PointGroupingSchemes pointGroupingSchemes;
|
|
/// The active fields used in the WritePoints function.
|
|
PointStandardizedFieldsAvailable pointFields;
|
|
|
|
/// The number of points in the Data3D.
|
|
/// On 32-bit systems size_t will allow for 4,294,967,295 points per scan which seems
|
|
/// reasonable...
|
|
size_t pointCount = 0;
|
|
};
|
|
|
|
/// @brief Stores pointers to user-provided buffers
|
|
template <typename COORDTYPE> struct Data3DPointsData_t
|
|
{
|
|
static_assert( std::is_floating_point<COORDTYPE>::value, "Floating point type required." );
|
|
|
|
/// @brief Default constructor does not manage any memory, adjust min/max for floats, or
|
|
/// validate data.
|
|
Data3DPointsData_t() = default;
|
|
|
|
/*!
|
|
@brief Constructor which allocates buffers for all valid fields in the given Data3D header.
|
|
|
|
@details
|
|
This constructor will also adjust the min/max fields in the data3D pointFields if
|
|
we are using floats, and run some validation on the Data3D.
|
|
|
|
@param [in] data3D Completed header which indicates the fields we are using
|
|
|
|
@throw ::ErrorValueOutOfBounds (n/c)
|
|
@throw ::ErrorInvalidNodeType (n/c)
|
|
*/
|
|
explicit Data3DPointsData_t( e57::Data3D &data3D );
|
|
|
|
/// @brief Destructor will delete any memory allocated using the Data3DPointsData_t( const
|
|
/// e57::Data3D & ) constructor
|
|
~Data3DPointsData_t();
|
|
|
|
/// @brief Pointer to a buffer with the X coordinate (in meters) of the point in Cartesian
|
|
/// coordinates
|
|
COORDTYPE *cartesianX = nullptr;
|
|
|
|
/// @brief Pointer to a buffer with the Y coordinate (in meters) of the point in Cartesian
|
|
/// coordinates
|
|
COORDTYPE *cartesianY = nullptr;
|
|
|
|
/// @brief Pointer to a buffer with the Z coordinate (in meters) of the point in Cartesian
|
|
/// coordinates
|
|
COORDTYPE *cartesianZ = nullptr;
|
|
|
|
/// @brief Value = 0 if the point is considered valid, 1 otherwise
|
|
int8_t *cartesianInvalidState = nullptr;
|
|
|
|
/// @brief Pointer to a buffer with the Point response intensity. Unit is unspecified.
|
|
double *intensity = nullptr;
|
|
|
|
/// @brief Value = 0 if the intensity is considered valid, 1 otherwise
|
|
int8_t *isIntensityInvalid = nullptr;
|
|
|
|
/// @brief Pointer to a buffer with the Red color coefficient. Unit is unspecified
|
|
uint16_t *colorRed = nullptr;
|
|
/// @brief Pointer to a buffer with the Green color coefficient. Unit is unspecified
|
|
uint16_t *colorGreen = nullptr;
|
|
/// @brief Pointer to a buffer with the Blue color coefficient. Unit is unspecified
|
|
uint16_t *colorBlue = nullptr;
|
|
/// @brief Value = 0 if the color is considered valid, 1 otherwise
|
|
int8_t *isColorInvalid = nullptr;
|
|
|
|
/// @brief Pointer to a buffer with the range (in meters) of points in spherical coordinates.
|
|
COORDTYPE *sphericalRange = nullptr;
|
|
|
|
/// @brief Pointer to a buffer with the Azimuth angle (in radians) of point in spherical
|
|
/// coordinates
|
|
COORDTYPE *sphericalAzimuth = nullptr;
|
|
|
|
/// @brief Pointer to a buffer with the Elevation angle (in radians) of point in spherical
|
|
/// coordinates
|
|
COORDTYPE *sphericalElevation = nullptr;
|
|
|
|
/// @brief Value = 0 if the range is considered valid, 1 otherwise
|
|
int8_t *sphericalInvalidState = nullptr;
|
|
|
|
/// @brief Pointer to a buffer with the row number of point (zero based).
|
|
/// @details This is useful for data that is stored in a regular grid. Shall be in the
|
|
/// interval (0, 2^31).
|
|
int32_t *rowIndex = nullptr;
|
|
|
|
/// @brief Pointer to a buffer with the column number of point (zero based).
|
|
/// @details This is useful for data that is stored in a regular grid. Shall be in the
|
|
/// interval (0, 2^31).
|
|
int32_t *columnIndex = nullptr;
|
|
|
|
/// @brief Pointer to a buffer with the number of this return (zero based).
|
|
/// @details That is, 0 is the first return, 1 is the second, and so on. Shall be in the
|
|
/// interval (0, returnCount). Only for multi-return sensors.
|
|
int8_t *returnIndex = nullptr;
|
|
|
|
/// @brief Pointer to a buffer with the total number of returns for the pulse that this
|
|
/// corresponds to.
|
|
/// @details Shall be in the interval (0, 2^7). Only for multi-return sensors.
|
|
int8_t *returnCount = nullptr;
|
|
|
|
/// @brief Pointer to a buffer with the time (in seconds) since the start time for the data.
|
|
/// @details This is given by acquisitionStart in the parent Data3D Structure.
|
|
double *timeStamp = nullptr;
|
|
|
|
/// @brief Value = 0 if the timeStamp is considered valid, 1 otherwise
|
|
int8_t *isTimeStampInvalid = nullptr;
|
|
|
|
/// @name Extension: E57_EXT_surface_normals
|
|
/// The following fields are part of the
|
|
/// [E57_EXT_surface_normals](http://www.libe57.org/E57_EXT_surface_normals.txt) extension.
|
|
///@{
|
|
|
|
/// @brief The X component of a surface normal vector.
|
|
float *normalX = nullptr;
|
|
/// @brief The Y component of a surface normal vector.
|
|
float *normalY = nullptr;
|
|
/// @brief The Z component of a surface normal vector.
|
|
float *normalZ = nullptr;
|
|
|
|
///@}
|
|
|
|
private:
|
|
/// @brief Keeps track of whether we used the Data3D constructor or not so we can free our
|
|
/// memory.
|
|
bool _selfAllocated = false;
|
|
};
|
|
|
|
using Data3DPointsFloat = Data3DPointsData_t<float>;
|
|
using Data3DPointsDouble = Data3DPointsData_t<double>;
|
|
|
|
/// @deprecated Will be removed in 4.0. Use e57::Data3DPointsFloat.
|
|
using Data3DPointsData [[deprecated( "Will be removed in 4.0. Use Data3DPointsFloat." )]] =
|
|
Data3DPointsData_t<float>;
|
|
/// @deprecated Will be removed in 4.0. Use e57::Data3DPointsDouble.
|
|
using Data3DPointsData_d [[deprecated( "Will be removed in 4.0. Use Data3DPointsDouble." )]] =
|
|
Data3DPointsData_t<double>;
|
|
|
|
extern template struct Data3DPointsData_t<float>;
|
|
extern template struct Data3DPointsData_t<double>;
|
|
|
|
/// @brief Stores an image that is to be used only as a visual reference.
|
|
struct E57_DLL VisualReferenceRepresentation
|
|
{
|
|
/// Size of JPEG format image data in BlobNode.
|
|
int64_t jpegImageSize = 0;
|
|
|
|
/// Size of PNG format image data in BlobNode.
|
|
int64_t pngImageSize = 0;
|
|
|
|
/// Size of PNG format image mask in BlobNode.
|
|
int64_t imageMaskSize = 0;
|
|
|
|
/// The image width (in pixels). Shall be positive.
|
|
int32_t imageWidth = 0;
|
|
|
|
/// The image height (in pixels). Shall be positive.
|
|
int32_t imageHeight = 0;
|
|
|
|
bool operator==( const VisualReferenceRepresentation &rhs ) const
|
|
{
|
|
return ( jpegImageSize == rhs.jpegImageSize ) && ( pngImageSize == rhs.pngImageSize ) &&
|
|
( imageMaskSize == rhs.imageMaskSize ) && ( imageWidth == rhs.imageWidth ) &&
|
|
( imageHeight == rhs.imageHeight );
|
|
}
|
|
|
|
bool operator!=( const VisualReferenceRepresentation &rhs ) const
|
|
{
|
|
return !operator==( rhs );
|
|
}
|
|
};
|
|
|
|
/// @brief Stores an image that is mapped from 3D using the pinhole camera projection model.
|
|
struct E57_DLL PinholeRepresentation
|
|
{
|
|
/// Size of JPEG format image data in BlobNode.
|
|
int64_t jpegImageSize = 0;
|
|
|
|
/// Size of PNG format image data in BlobNode.
|
|
int64_t pngImageSize = 0;
|
|
|
|
/// Size of PNG format image mask in BlobNode.
|
|
int64_t imageMaskSize = 0;
|
|
|
|
/// The image width (in pixels). Shall be positive.
|
|
int32_t imageWidth = 0;
|
|
/// The image height (in pixels). Shall be positive.
|
|
int32_t imageHeight = 0;
|
|
|
|
/// The camera's focal length (in meters). Shall be positive.
|
|
double focalLength = 0.0;
|
|
|
|
/// The width of the pixels in the camera (in meters). Shall be positive.
|
|
double pixelWidth = 0.0;
|
|
/// The height of the pixels in the camera (in meters). Shall be positive.
|
|
double pixelHeight = 0.0;
|
|
|
|
/// @brief The X coordinate in the image of the principal point, (in pixels).
|
|
/// @details The principal point is the intersection of the z axis of the camera coordinate
|
|
/// frame with the image plane.
|
|
double principalPointX = 0.0;
|
|
/// The Y coordinate in the image of the principal point (in pixels).
|
|
double principalPointY = 0.0;
|
|
|
|
bool operator==( const PinholeRepresentation &rhs ) const
|
|
{
|
|
return ( jpegImageSize == rhs.jpegImageSize ) && ( pngImageSize == rhs.pngImageSize ) &&
|
|
( imageMaskSize == rhs.imageMaskSize ) && ( imageWidth == rhs.imageWidth ) &&
|
|
( imageHeight == rhs.imageHeight ) && ( focalLength == rhs.focalLength ) &&
|
|
( pixelWidth == rhs.pixelWidth ) && ( pixelHeight == rhs.pixelHeight ) &&
|
|
( principalPointX == rhs.principalPointX ) &&
|
|
( principalPointY == rhs.principalPointY );
|
|
}
|
|
|
|
bool operator!=( const PinholeRepresentation &rhs ) const
|
|
{
|
|
return !operator==( rhs );
|
|
}
|
|
};
|
|
|
|
/// @brief Stores an image that is mapped from 3D using a spherical projection model
|
|
struct E57_DLL SphericalRepresentation
|
|
{
|
|
/// Size of JPEG format image data in BlobNode.
|
|
int64_t jpegImageSize = 0;
|
|
|
|
/// Size of PNG format image data in BlobNode.
|
|
int64_t pngImageSize = 0;
|
|
|
|
/// Size of PNG format image mask in BlobNode.
|
|
int64_t imageMaskSize = 0;
|
|
|
|
/// The image width (in pixels). Shall be positive
|
|
int32_t imageWidth = 0;
|
|
/// The image height (in pixels). Shall be positive
|
|
int32_t imageHeight = 0;
|
|
|
|
/// The width of a pixel in the image (in radians). Shall be positive
|
|
double pixelWidth = 0.0;
|
|
/// The height of a pixel in the image (in radians). Shall be positive.
|
|
double pixelHeight = 0.0;
|
|
|
|
bool operator==( const SphericalRepresentation &rhs ) const
|
|
{
|
|
return ( jpegImageSize == rhs.jpegImageSize ) && ( pngImageSize == rhs.pngImageSize ) &&
|
|
( imageMaskSize == rhs.imageMaskSize ) && ( imageWidth == rhs.imageWidth ) &&
|
|
( imageHeight == rhs.imageHeight ) && ( pixelWidth == rhs.pixelWidth ) &&
|
|
( pixelHeight == rhs.pixelHeight );
|
|
}
|
|
|
|
bool operator!=( const SphericalRepresentation &rhs ) const
|
|
{
|
|
return !operator==( rhs );
|
|
}
|
|
};
|
|
|
|
/// @brief Stores an image that is mapped from 3D using a cylindrical projection model.
|
|
struct E57_DLL CylindricalRepresentation
|
|
{
|
|
/// Size of JPEG format image data in Blob.
|
|
int64_t jpegImageSize = 0;
|
|
|
|
/// Size of PNG format image data in Blob.
|
|
int64_t pngImageSize = 0;
|
|
|
|
/// Size of PNG format image mask in Blob.
|
|
int64_t imageMaskSize = 0;
|
|
|
|
/// The image width (in pixels). Shall be positive
|
|
int32_t imageWidth = 0;
|
|
/// The image height (in pixels). Shall be positive
|
|
int32_t imageHeight = 0;
|
|
|
|
/// The width of a pixel in the image (in radians). Shall be positive.
|
|
double pixelWidth = 0.0;
|
|
/// The height of a pixel in the image (in meters). Shall be positive.
|
|
double pixelHeight = 0.0;
|
|
|
|
/// @brief The closest distance from the cylindrical image surface to the center of projection
|
|
/// (that is, the radius of the cylinder) (in meters).
|
|
/// @details Shall be non-negative.
|
|
double radius = 0.0;
|
|
|
|
/// @brief The Y coordinate in the image of the principal point (in pixels).
|
|
/// @details This is the intersection of the z = 0 plane with the image.
|
|
double principalPointY = 0.0;
|
|
|
|
bool operator==( const CylindricalRepresentation &rhs ) const
|
|
{
|
|
return ( jpegImageSize == rhs.jpegImageSize ) && ( pngImageSize == rhs.pngImageSize ) &&
|
|
( imageMaskSize == rhs.imageMaskSize ) && ( imageWidth == rhs.imageWidth ) &&
|
|
( imageHeight == rhs.imageHeight ) && ( pixelWidth == rhs.pixelWidth ) &&
|
|
( pixelHeight == rhs.pixelHeight ) && ( radius == rhs.radius ) &&
|
|
( principalPointY == rhs.principalPointY );
|
|
}
|
|
|
|
bool operator!=( const CylindricalRepresentation &rhs ) const
|
|
{
|
|
return !operator==( rhs );
|
|
}
|
|
};
|
|
|
|
/// @brief Stores an image from a camera
|
|
struct E57_DLL Image2D
|
|
{
|
|
/// A user-defined name for the Image2D.
|
|
ustring name;
|
|
|
|
/// A globally unique identification string for the current version of the Image2D object
|
|
ustring guid;
|
|
|
|
/// A user-defined description of the Image2D
|
|
ustring description;
|
|
|
|
/// The date and time that the image was taken
|
|
DateTime acquisitionDateTime;
|
|
|
|
/// The globally unique identification string (guid element) for the Data3D that was being
|
|
/// acquired when the picture was taken
|
|
ustring associatedData3DGuid;
|
|
|
|
/// The name of the manufacturer for the sensor used to collect the points in this Data3D.
|
|
ustring sensorVendor;
|
|
/// The model name or number for the sensor.
|
|
ustring sensorModel;
|
|
/// The serial number for the sensor.
|
|
ustring sensorSerialNumber;
|
|
|
|
/// A rigid body transform that describes the coordinate frame of the camera in the file-level
|
|
/// coordinate system
|
|
RigidBodyTransform pose;
|
|
|
|
/// Representation for an image that does not define any camera projection model.
|
|
/// The image is to be used for visual reference only
|
|
VisualReferenceRepresentation visualReferenceRepresentation;
|
|
|
|
/// Representation for an image using the pinhole camera projection model.
|
|
PinholeRepresentation pinholeRepresentation;
|
|
|
|
/// Representation for an image using the spherical camera projection model.
|
|
SphericalRepresentation sphericalRepresentation;
|
|
|
|
/// Representation for an image using the cylindrical camera projection model.
|
|
CylindricalRepresentation cylindricalRepresentation;
|
|
};
|
|
|
|
/// @brief Identifies the format representation for the image data
|
|
enum Image2DType
|
|
{
|
|
ImageNone = 0, ///< No image data
|
|
ImageJPEG = 1, ///< JPEG format image data.
|
|
ImagePNG = 2, ///< PNG format image data.
|
|
ImageMaskPNG = 3, ///< PNG format image mask.
|
|
|
|
/// @deprecated Will be removed in 4.0. Use e57::ImageNone.
|
|
E57_NO_IMAGE E57_DEPRECATED_ENUM( "Will be removed in 4.0. Use ImageNone." ) = ImageNone,
|
|
/// @deprecated Will be removed in 4.0. Use e57::ImageJPEG.
|
|
E57_JPEG_IMAGE E57_DEPRECATED_ENUM( "Will be removed in 4.0. Use ImageJPEG." ) = ImageJPEG,
|
|
/// @deprecated Will be removed in 4.0. Use e57::ImagePNG.
|
|
E57_PNG_IMAGE E57_DEPRECATED_ENUM( "Will be removed in 4.0. Use ImagePNG." ) = ImagePNG,
|
|
/// @deprecated Will be removed in 4.0. Use e57::ImageMaskPNG.
|
|
E57_PNG_IMAGE_MASK E57_DEPRECATED_ENUM( "Will be removed in 4.0. Use ImageMaskPNG." ) =
|
|
ImageMaskPNG,
|
|
};
|
|
|
|
/// @brief Identifies the representation for the image data
|
|
enum Image2DProjection
|
|
{
|
|
ProjectionNone = 0, ///< No representation for the image data is present
|
|
ProjectionVisual = 1, ///< VisualReferenceRepresentation for the image data
|
|
ProjectionPinhole = 2, ///< PinholeRepresentation for the image data
|
|
ProjectionSpherical = 3, ///< SphericalRepresentation for the image data
|
|
ProjectionCylindrical = 4, ///< CylindricalRepresentation for the image data
|
|
|
|
/// @deprecated Will be removed in 4.0. Use e57::ProjectionNone.
|
|
E57_NO_PROJECTION E57_DEPRECATED_ENUM( "Will be removed in 4.0. Use ProjectionNone." ) =
|
|
ProjectionNone,
|
|
/// @deprecated Will be removed in 4.0. Use e57::ProjectionVisual.
|
|
E57_VISUAL E57_DEPRECATED_ENUM( "Will be removed in 4.0. Use ProjectionVisual." ) =
|
|
ProjectionVisual,
|
|
/// @deprecated Will be removed in 4.0. Use e57::ProjectionPinhole.
|
|
E57_PINHOLE E57_DEPRECATED_ENUM( "Will be removed in 4.0. Use ProjectionPinhole." ) =
|
|
ProjectionPinhole,
|
|
/// @deprecated Will be removed in 4.0. Use e57::ProjectionSpherical.
|
|
E57_SPHERICAL E57_DEPRECATED_ENUM( "Will be removed in 4.0. Use ProjectionSpherical." ) =
|
|
ProjectionSpherical,
|
|
/// @deprecated Will be removed in 4.0. Use e57::ProjectionCylindrical.
|
|
E57_CYLINDRICAL E57_DEPRECATED_ENUM( "Will be removed in 4.0. Use ProjectionCylindrical." ) =
|
|
ProjectionCylindrical,
|
|
};
|
|
} // end namespace e57
|