diff --git a/include/E57Format.h b/include/E57Format.h index 6096562..960f092 100644 --- a/include/E57Format.h +++ b/include/E57Format.h @@ -486,7 +486,8 @@ public: VectorNode codecs() const; // Iterators - CompressedVectorWriter writer( std::vector &sbufs ); + CompressedVectorWriter writer( std::vector &sbufs, + bool writeIndexPackets = true ); CompressedVectorReader reader( const std::vector &dbufs ); // Up/Down cast conversion diff --git a/include/E57SimpleWriter.h b/include/E57SimpleWriter.h index 06c67d7..bfcf67f 100644 --- a/include/E57SimpleWriter.h +++ b/include/E57SimpleWriter.h @@ -47,6 +47,9 @@ namespace e57 /// Information describing the Coordinate Reference System to be used for the file ustring coordinateMetadata; + + /// Write the index packets (setting this to false is not standards compliant) + bool writeIndexPackets = true; }; /// @brief Used for writing an E57 file using the E57 Simple API. diff --git a/src/CompressedVectorNode.cpp b/src/CompressedVectorNode.cpp index 666f3a7..422581c 100644 --- a/src/CompressedVectorNode.cpp +++ b/src/CompressedVectorNode.cpp @@ -438,9 +438,10 @@ CompressedVectorNode cannot be set twice). @see CompressedVectorWriter, SourceDestBuffer, CompressedVectorNode::CompressedVectorNode, CompressedVectorNode::prototype */ -CompressedVectorWriter CompressedVectorNode::writer( std::vector &sbufs ) +CompressedVectorWriter CompressedVectorNode::writer( std::vector &sbufs, + bool writeIndexPackets ) { - return CompressedVectorWriter( impl_->writer( sbufs ) ); + return CompressedVectorWriter( impl_->writer( sbufs, writeIndexPackets ) ); } /*! diff --git a/src/CompressedVectorNodeImpl.cpp b/src/CompressedVectorNodeImpl.cpp index 63ae31c..9243fe0 100644 --- a/src/CompressedVectorNodeImpl.cpp +++ b/src/CompressedVectorNodeImpl.cpp @@ -266,7 +266,7 @@ namespace e57 #endif std::shared_ptr CompressedVectorNodeImpl::writer( - std::vector sbufs ) + std::vector sbufs, bool writeIndexPackets ) { checkImageFileOpen( __FILE__, __LINE__, static_cast( __FUNCTION__ ) ); @@ -313,7 +313,7 @@ namespace e57 // Return a shared_ptr to new object std::shared_ptr cvwi( - new CompressedVectorWriterImpl( cai, sbufs ) ); + new CompressedVectorWriterImpl( cai, sbufs, writeIndexPackets ) ); return ( cvwi ); } diff --git a/src/CompressedVectorNodeImpl.h b/src/CompressedVectorNodeImpl.h index 82887bf..bd237d7 100644 --- a/src/CompressedVectorNodeImpl.h +++ b/src/CompressedVectorNodeImpl.h @@ -58,7 +58,8 @@ namespace e57 const char *forcedFieldName = nullptr ) override; /// Iterator constructors - std::shared_ptr writer( std::vector sbufs ); + std::shared_ptr writer( std::vector sbufs, + bool writeIndexPackets = true ); std::shared_ptr reader( std::vector dbufs ); int64_t getRecordCount() const diff --git a/src/CompressedVectorWriterImpl.cpp b/src/CompressedVectorWriterImpl.cpp index 52a938e..56a5c0c 100644 --- a/src/CompressedVectorWriterImpl.cpp +++ b/src/CompressedVectorWriterImpl.cpp @@ -48,8 +48,9 @@ namespace e57 }; CompressedVectorWriterImpl::CompressedVectorWriterImpl( - std::shared_ptr ni, std::vector &sbufs ) : - cVector_( ni ), isOpen_( false ) // set to true when succeed below + std::shared_ptr ni, std::vector &sbufs, + bool writeIndexPackets ) : + cVector_( ni ), writeIndexPackets_(writeIndexPackets), isOpen_( false ) // set to true when succeed below { //??? check if cvector already been written (can't write twice) @@ -183,8 +184,11 @@ namespace e57 flush(); } - // Write one index packet (required by standard). - packetWriteIndex(); + if (writeIndexPackets_) + { + // Write one index packet (required by standard). + packetWriteIndex(); + } // Compute length of whole section we just wrote (from section start to // current start of free space). diff --git a/src/CompressedVectorWriterImpl.h b/src/CompressedVectorWriterImpl.h index 5596267..c2ab933 100644 --- a/src/CompressedVectorWriterImpl.h +++ b/src/CompressedVectorWriterImpl.h @@ -35,7 +35,8 @@ namespace e57 { public: CompressedVectorWriterImpl( std::shared_ptr ni, - std::vector &sbufs ); + std::vector &sbufs, + bool writeIndexPackets = true ); ~CompressedVectorWriterImpl(); void write( size_t requestedRecordCount ); @@ -69,6 +70,7 @@ namespace e57 std::vector> bytestreams_; DataPacket dataPacket_; + bool writeIndexPackets_; /// set this to false for backwards compatibility bool isOpen_; uint64_t sectionHeaderLogicalStart_; /// start of CompressedVector binary section uint64_t sectionLogicalLength_; /// total length of CompressedVector binary section diff --git a/src/WriterImpl.cpp b/src/WriterImpl.cpp index 4987cba..be1ddee 100644 --- a/src/WriterImpl.cpp +++ b/src/WriterImpl.cpp @@ -126,7 +126,8 @@ namespace e57 } WriterImpl::WriterImpl( const ustring &filePath, const WriterOptions &options ) : - imf_( filePath, "w" ), root_( imf_.root() ), data3D_( imf_, true ), images2D_( imf_, true ) + imf_( filePath, "w" ), root_( imf_.root() ), data3D_( imf_, true ), images2D_( imf_, true ), + writeIndexPackets_(options.writeIndexPackets) { // We are using the E57 v1.0 data format standard field names. // The standard field names are used without an extension prefix (in the default namespace). @@ -1295,7 +1296,7 @@ namespace e57 } // create the writer, all buffers must be setup before this call - CompressedVectorWriter writer = points.writer( sourceBuffers ); + CompressedVectorWriter writer = points.writer( sourceBuffers, writeIndexPackets_ ); return writer; } @@ -1345,7 +1346,7 @@ namespace e57 groupSDBuffers.emplace_back( imf_, "startPointIndex", startPointIndex, groupCount, true ); groupSDBuffers.emplace_back( imf_, "pointCount", pointCount, groupCount, true ); - CompressedVectorWriter writer = groups.writer( groupSDBuffers ); + CompressedVectorWriter writer = groups.writer( groupSDBuffers, writeIndexPackets_ ); writer.write( groupCount ); writer.close(); diff --git a/src/WriterImpl.h b/src/WriterImpl.h index d353ddd..6bbbe2f 100644 --- a/src/WriterImpl.h +++ b/src/WriterImpl.h @@ -79,5 +79,7 @@ namespace e57 VectorNode data3D_; VectorNode images2D_; + + bool writeIndexPackets_; }; // end Writer class } // end namespace e57 diff --git a/test/src/test_SimpleWriter.cpp b/test/src/test_SimpleWriter.cpp index c1eee01..9f4fdf1 100644 --- a/test/src/test_SimpleWriter.cpp +++ b/test/src/test_SimpleWriter.cpp @@ -705,3 +705,51 @@ TEST( SimpleWriterData, VisualRefImage ) delete writer; } + +TEST( SimpleWriter, WritePacketIsTrueByDefault) +{ + e57::WriterOptions options; + + EXPECT_TRUE( options.writeIndexPackets ); +} + +TEST( SimpleWriter, PacketWriteIndexFlag ) +{ + e57::WriterOptions options; + options.guid = "Packet Write Index Test GUID"; + options.writeIndexPackets = false; + + e57::Writer *writer = nullptr; + + E57_ASSERT_NO_THROW( writer = new e57::Writer( "./PacketWriteIndexFalse.e57", options ) ); + + constexpr int64_t cNumPoints = 10; + + e57::Data3D header; + header.guid = "PacketWriteIndexFalse Header GUID"; + header.pointCount = cNumPoints; + header.pointFields.cartesianXField = true; + header.pointFields.cartesianYField = true; + header.pointFields.cartesianZField = true; + + e57::Data3DPointsFloat pointsData( header ); + + for ( int64_t i = 0; i < cNumPoints; ++i ) + { + auto floati = static_cast( i ); + pointsData.cartesianX[i] = floati; + pointsData.cartesianY[i] = floati; + pointsData.cartesianZ[i] = floati; + } + + try + { + writer->WriteData3DData( header, pointsData ); + } + catch ( e57::E57Exception &err ) + { + FAIL() << err.errorStr() << ": " << err.context(); + } + + delete writer; +} \ No newline at end of file