File size: 8,506 Bytes
985c397 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 | /*
* 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 E57 Simple API for writing E57.
/// @details This includes support for the
/// [E57_EXT_surface_normals](http://www.libe57.org/E57_EXT_surface_normals.txt) extension.
#include "E57SimpleData.h"
namespace e57
{
/// Options to the Writer constructor
struct E57_DLL WriterOptions
{
/// Optional file guid
ustring guid;
/// Information describing the Coordinate Reference System to be used for the file
ustring coordinateMetadata;
};
/// @brief Used for writing an E57 file using the E57 Simple API.
///
/// The Writer includes support for the
/// [E57_EXT_surface_normals](http://www.libe57.org/E57_EXT_surface_normals.txt) extension.
class E57_DLL Writer
{
public:
/// @brief Writer constructor
/// @param [in] filePath Path to E57 file
/// @param [in] options Options to be used for the file
Writer( const ustring &filePath, const WriterOptions &options );
/// @brief Writer constructor (deprecated)
/// @param [in] filePath Path to E57 file
/// @param [in] coordinateMetadata Information describing the Coordinate Reference System to
/// be used for the file
/// @deprecated Will be removed in 4.0. Use Writer( const ustring &filePath, const
/// WriterOptions &options ) instead.
[[deprecated(
"Will be removed in 4.0. Use Writer( ustring, WriterOptions )." )]] // TODO Remove in 4.0
explicit Writer( const ustring &filePath, const ustring &coordinateMetadata = {} );
/// @brief Returns true if the file is open
bool IsOpen() const;
/// @brief Closes the file
bool Close();
/// @name Image2D
///@{
/// @brief This function writes the Image2D data to the file
/// @note @p image2DHeader may be modified (adding a guid or adding missing, required fields).
/// @param [in,out] image2DHeader header metadata
/// @param [in] imageType identifies the image format
/// @param [in] imageProjection identifies the projection
/// @param [in] startPos position in the block to start writing
/// @param [in] buffer pointer the data buffer
/// @param [in] byteCount buffer size
/// @return Returns the number of bytes written
int64_t WriteImage2DData( Image2D &image2DHeader, Image2DType imageType,
Image2DProjection imageProjection, int64_t startPos, void *buffer,
int64_t byteCount );
/// @brief Writes a new Image2D header
/// @details The user needs to config a Image2D structure with all the camera information
/// before making this call.
/// @param [in,out] image2DHeader header metadata
/// @return Returns the image2D index
int64_t NewImage2D( Image2D &image2DHeader );
/// @brief Writes the actual image data
/// @param [in] imageIndex picture block index given by the NewImage2D
/// @param [in] imageType identifies the image format desired.
/// @param [in] imageProjection identifies the projection desired.
/// @param [in] buffer pointer the buffer
/// @param [in] start position in the block to start writing
/// @param [in] count size of desired chunk or buffer size
/// @return Returns the number of bytes written
int64_t WriteImage2DData( int64_t imageIndex, Image2DType imageType,
Image2DProjection imageProjection, void *buffer, int64_t start,
int64_t count );
///@}
/// @name Data3D
///@{
/// @brief This function writes the Data3D data to the file
/// @details The user needs to config a Data3D structure with all the scanning information
/// before making this call.
/// @note @p data3DHeader may be modified (adding a guid or adding missing, required fields).
/// @param [in,out] data3DHeader metadata about what is included in the buffers
/// @param [in] buffers pointers to user-provided buffers containing the actual data
/// @return Returns the index of the new scan's data3D block.
int64_t WriteData3DData( Data3D &data3DHeader, const Data3DPointsFloat &buffers );
/// @overload
int64_t WriteData3DData( Data3D &data3DHeader, const Data3DPointsDouble &buffers );
/// @brief Writes a new Data3D header
/// @details The user needs to config a Data3D structure with all the scanning information
/// before making this call.
/// @param [in,out] data3DHeader scan metadata
/// @return Returns the index of the new scan's data3D block.
int64_t NewData3D( Data3D &data3DHeader );
/// @brief Sets up a writer to write the actual scan data
/// @param [in] dataIndex index returned by NewData3D
/// @param [in] pointCount Number of points to write (number of elements in each of the
/// buffers)
/// @param [in] buffers pointers to user-provided buffers
/// @return returns a vector writer setup to write the selected scan data
CompressedVectorWriter SetUpData3DPointsData( int64_t dataIndex, size_t pointCount,
const Data3DPointsFloat &buffers );
/// @overload
CompressedVectorWriter SetUpData3DPointsData( int64_t dataIndex, size_t pointCount,
const Data3DPointsDouble &buffers );
/// @brief Writes out the group data
/// @param [in] dataIndex data block index given by the NewData3D
/// @param [in] groupCount size of each of the buffers given
/// @param [in] idElementValue buffer with idElementValue indices for this group
/// @param [in] startPointIndex buffer with starting indices in to the "points" data vector
/// for the groups
/// @param [in] pointCount buffer with sizes of the groups given
/// @return Return true if successful, false otherwise
bool WriteData3DGroupsData( int64_t dataIndex, size_t groupCount, int64_t *idElementValue,
int64_t *startPointIndex, int64_t *pointCount );
///@}
/// @name File information
///@{
/// @brief Returns the file raw E57Root Structure Node
StructureNode GetRawE57Root();
/// @brief Returns the raw Data3D Vector Node
VectorNode GetRawData3D();
/// @brief Returns the raw Image2D Vector Node
VectorNode GetRawImages2D();
/// @brief Returns the ram ImageFile Node which is need to add enhancements
ImageFile GetRawIMF();
///@}
/// @cond documentNonPublic The following isn't part of the API, and isn't documented.
protected:
friend class WriterImpl;
E57_INTERNAL_ACCESS( Writer )
protected:
std::shared_ptr<WriterImpl> impl_;
/// @endcond
}; // end Writer class
} // end namespace e57
|