From de965651c7ae97057cd870f9a848498481b3b00a Mon Sep 17 00:00:00 2001 From: Andrew Bell Date: Mon, 23 Feb 2015 16:57:33 -0600 Subject: [PATCH] Add read test for extra bytes. --- include/pdal/PointContext.hpp | 7 +- io/las/LasReader.cpp | 2 + test/data/las/extrabytes.las | Bin 0 -> 66354 bytes test/unit/io/las/LasReaderTest.cpp | 111 ++++++++++++++++++++++++----- 4 files changed, 101 insertions(+), 19 deletions(-) create mode 100644 test/data/las/extrabytes.las diff --git a/include/pdal/PointContext.hpp b/include/pdal/PointContext.hpp index 6d85210470..47db229bef 100644 --- a/include/pdal/PointContext.hpp +++ b/include/pdal/PointContext.hpp @@ -182,8 +182,13 @@ class PointContext Dimension::Id::Enum findDim(const std::string& name) const { Dimension::Id::Enum id = Dimension::id(name); - if (id != Dimension::Id::Unknown) + if (dimType(id) != Dimension::Type::None) return id; + return findProprietaryDim(name); + } + + Dimension::Id::Enum findProprietaryDim(const std::string& name) const + { auto di = m_dims->m_propIds.find(name); return (di != m_dims->m_propIds.end() ? di->second : Dimension::Id::Unknown); diff --git a/io/las/LasReader.cpp b/io/las/LasReader.cpp index 15d0590172..23d1848793 100644 --- a/io/las/LasReader.cpp +++ b/io/las/LasReader.cpp @@ -529,6 +529,8 @@ void LasReader::addDimensions(PointContextRef ctx) for (auto& dim : m_extraDims) { Dimension::Type::Enum type = dim.m_dimType.m_type; + if (type == Dimension::Type::None) + continue; if (dim.m_dimType.m_xform.nonstandard()) type = Dimension::Type::Double; dim.m_dimType.m_id = ctx.assignDim(dim.m_name, type); diff --git a/test/data/las/extrabytes.las b/test/data/las/extrabytes.las new file mode 100644 index 0000000000000000000000000000000000000000..a90481a3eab365fa5f4b0f853e5398b52bd074a9 GIT binary patch literal 66354 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 bEHxNC`st-TfhW_F -::testing::AssertionResult CheckEqualCollections(LeftIter left_begin, LeftIter left_end, RightIter right_begin) +::testing::AssertionResult CheckEqualCollections(LeftIter left_begin, + LeftIter left_end, RightIter right_begin) { - bool equal(true); - std::string message; - size_t index(0); - while (left_begin != left_end) - { - if (*left_begin++ != *right_begin++) + bool equal(true); + + std::string message; + size_t index(0); + while (left_begin != left_end) { - equal = false; - message += "\n\tMismatch at index " + std::to_string(index); + if (*left_begin++ != *right_begin++) + { + equal = false; + message += "\n\tMismatch at index " + std::to_string(index); + } + ++index; } - ++index; - } - if (message.size()) - message += "\n\t"; - return equal ? ::testing::AssertionSuccess() : ::testing::AssertionFailure() << message; -} + if (message.size()) + message += "\n\t"; + return equal ? ::testing::AssertionSuccess() : + ::testing::AssertionFailure() << message; } +} // unnamed namespace + TEST(LasReaderTest, test_base_options) { const std::string file(Support::datapath("las/1.2-with-color.las")); @@ -250,9 +254,9 @@ TEST(LasReaderTest, inspect) }; std::sort(qi.m_dimNames.begin(), qi.m_dimNames.end()); - EXPECT_TRUE(CheckEqualCollections(qi.m_dimNames.begin(), qi.m_dimNames.end(), std::begin(dims))); -} - + EXPECT_TRUE(CheckEqualCollections(qi.m_dimNames.begin(), + qi.m_dimNames.end(), std::begin(dims))); +} //ABELL - Find another way to do this. /** @@ -283,3 +287,74 @@ TEST(LasReaderTest, testInvalidFileSignature) EXPECT_TRUE(reader.header().valid()); } + +TEST(LasReaderTest, extraBytes) +{ + PointContext ctx; + + Options readOps; + readOps.add("filename", Support::datapath("las/extrabytes.las")); + LasReader reader; + reader.setOptions(readOps); + + reader.prepare(ctx); + + DimTypeList dimTypes = ctx.dimTypes(); + EXPECT_EQ(dimTypes.size(), (size_t)24); + + Dimension::Id::Enum color0 = ctx.findProprietaryDim("Colors0"); + EXPECT_EQ(ctx.dimType(color0), Dimension::Type::Unsigned16); + Dimension::Id::Enum color1 = ctx.findProprietaryDim("Colors1"); + EXPECT_EQ(ctx.dimType(color1), Dimension::Type::Unsigned16); + Dimension::Id::Enum color2 = ctx.findProprietaryDim("Colors2"); + EXPECT_EQ(ctx.dimType(color2), Dimension::Type::Unsigned16); + + Dimension::Id::Enum flag0 = ctx.findProprietaryDim("Flags0"); + EXPECT_EQ(ctx.dimType(flag0), Dimension::Type::Signed8); + Dimension::Id::Enum flag1 = ctx.findProprietaryDim("Flags1"); + EXPECT_EQ(ctx.dimType(flag1), Dimension::Type::Signed8); + + Dimension::Id::Enum intense2 = ctx.findProprietaryDim("Intensity"); + EXPECT_EQ(ctx.dimType(intense2), Dimension::Type::Unsigned32); + + Dimension::Id::Enum time2 = ctx.findProprietaryDim("Time"); + EXPECT_EQ(ctx.dimType(time2), Dimension::Type::Unsigned64); + + PointBufferSet pbSet = reader.execute(ctx); + EXPECT_EQ(pbSet.size(), (size_t)1); + PointBufferPtr pb = *pbSet.begin(); + + Dimension::Id::Enum red = ctx.findDim("Red"); + Dimension::Id::Enum green = ctx.findDim("Green"); + Dimension::Id::Enum blue = ctx.findDim("Blue"); + + Dimension::Id::Enum returnNum = ctx.findDim("ReturnNumber"); + Dimension::Id::Enum numReturns = ctx.findDim("NumberOfReturns"); + + Dimension::Id::Enum intensity = ctx.findDim("Intensity"); + Dimension::Id::Enum time = ctx.findDim("GpsTime"); + + for (PointId idx = 0; idx < pb->size(); ++idx) + { + EXPECT_EQ(pb->getFieldAs(red, idx), + pb->getFieldAs(color0, idx)); + EXPECT_EQ(pb->getFieldAs(green, idx), + pb->getFieldAs(color1, idx)); + EXPECT_EQ(pb->getFieldAs(blue, idx), + pb->getFieldAs(color2, idx)); + + EXPECT_EQ(pb->getFieldAs(flag0, idx), + pb->getFieldAs(returnNum, idx)); + EXPECT_EQ(pb->getFieldAs(flag1, idx), + pb->getFieldAs(numReturns, idx)); + + EXPECT_EQ(pb->getFieldAs(intensity, idx), + pb->getFieldAs(intense2, idx)); + + // Time was written truncated rather than rounded. + EXPECT_NEAR(pb->getFieldAs(time, idx), + pb->getFieldAs(time2, idx), 1.0); + + } +} +