Skip to content

Commit

Permalink
Add condition option to assign filter (#2154)
Browse files Browse the repository at this point in the history
* Add condition option to assign filter

Values will only be assigned when the condition (specified as a DimRange) is
met.

Closes #1956

* handle 'condition' in filters.assign when there is no condition set

* test condition setting in filters.assign
  • Loading branch information
hobu committed Aug 28, 2018
1 parent 9ec20ea commit 13718db
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 3 deletions.
25 changes: 22 additions & 3 deletions filters/AssignFilter.cpp
Expand Up @@ -123,13 +123,21 @@ void AssignFilter::addArgs(ProgramArgs& args)
{
args.add("assignment", "Values to assign to dimensions based on range.",
m_assignments);
args.add("condition", "Condition for assignment based on range.",
m_condition);
}


void AssignFilter::prepared(PointTableRef table)
{
PointLayoutPtr layout(table.layout());

m_condition.m_id = layout->findDim(m_condition.m_name);
if (m_condition.m_id == Dimension::Id::Unknown)
m_doCondition = false;
else
m_doCondition = true;

for (auto& r : m_assignments)
{
r.m_id = layout->findDim(r.m_name);
Expand All @@ -142,9 +150,20 @@ void AssignFilter::prepared(PointTableRef table)

bool AssignFilter::processOne(PointRef& point)
{
for (AssignRange& r : m_assignments)
if (r.valuePasses(point.getFieldAs<double>(r.m_id)))
point.setField(r.m_id, r.m_value);
if (m_doCondition)
{
bool condition = m_condition.valuePasses(point.getFieldAs<double>(m_condition.m_id));
for (AssignRange& r : m_assignments)
if (r.valuePasses(point.getFieldAs<double>(r.m_id)) &&
condition)
point.setField(r.m_id, r.m_value);
} else
{

for (AssignRange& r : m_assignments)
if (r.valuePasses(point.getFieldAs<double>(r.m_id)) )
point.setField(r.m_id, r.m_value);
}
return true;
}

Expand Down
4 changes: 4 additions & 0 deletions filters/AssignFilter.hpp
Expand Up @@ -37,6 +37,8 @@
#include <pdal/Filter.hpp>
#include <pdal/Streamable.hpp>

#include "private/DimRange.hpp"

namespace pdal
{

Expand All @@ -60,6 +62,8 @@ class PDAL_DLL AssignFilter : public Filter, public Streamable
AssignFilter(const AssignFilter&) = delete;

std::vector<AssignRange> m_assignments;
DimRange m_condition;
bool m_doCondition;
};

} // namespace pdal
39 changes: 39 additions & 0 deletions test/unit/filters/AssignFilterTest.cpp
Expand Up @@ -138,3 +138,42 @@ TEST(AssignFilterTest, t2)
EXPECT_EQ(i6, 3);
EXPECT_EQ(i8, 5);
}

TEST(AssignFilterTest, test_condition)
{
StageFactory factory;

Stage& r = *factory.createStage("readers.las");
Stage& f = *factory.createStage("filters.assign");

// utm17.las contains 5 points with intensity of 280, 3 of 260 and 2 of 240
Options ro;
ro.add("filename", Support::datapath("las/utm17.las"));
r.setOptions(ro);

Options fo;
fo.add("condition", "Intensity[260:260]");
fo.add("assignment", "PointSourceId[:]=6");

f.setInput(r);
f.setOptions(fo);

PointTable t;
f.prepare(t);
PointViewSet s = f.execute(t);
PointViewPtr v = *s.begin();

int ielse = 0;
int i6 = 0;
for (PointId i = 0; i < v->size(); ++i)
{
int ii = v->getFieldAs<int>(Dimension::Id::PointSourceId, i);
if (ii == 6)
i6++;
else
ielse++;
}
EXPECT_EQ(i6, 3);
EXPECT_EQ(v->size(), 10u);
EXPECT_EQ(ielse, 7);
}

0 comments on commit 13718db

Please sign in to comment.