| /* | |
| * 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. | |
| */ | |
| /// @file | |
| /// @brief Data structures for E57 Simple API | |
| 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 | |
| @throw ::ErrorInvalidNodeType | |
| */ | |
| 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 | |