Skip to content

Commit 88087d6

Browse files
committed
Add PDALDimType retrieval functions for PointLayout
1 parent eea6c05 commit 88087d6

File tree

4 files changed

+156
-1
lines changed

4 files changed

+156
-1
lines changed

source/pdal/capi/Forward.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,16 @@ namespace pdal
4242
#include <stdint.h> // for uint64_t
4343
#endif /* __cplusplus */
4444

45+
typedef struct PDALDimType PDALDimType;
46+
47+
struct PDALDimType
48+
{
49+
uint32_t id;
50+
uint32_t type;
51+
double scale;
52+
double offset;
53+
};
54+
4555
/// A pointer to a dimension type list
4656
typedef void* PDALDimTypeListPtr;
4757

source/pdal/capi/PointLayout.cpp

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,71 @@ namespace pdal
3434
return size;
3535
}
3636

37+
38+
size_t PDALGetDimTypeIdName(PDALDimType dim, char *name, size_t size)
39+
{
40+
size_t result = 0;
41+
42+
if (name && size > 0)
43+
{
44+
std::string s = pdal::Dimension::name(
45+
static_cast<pdal::Dimension::Id>(dim.id));
46+
std::strncpy(name, s.c_str(), size);
47+
result = std::min(std::strlen(name), size);
48+
}
49+
50+
return result;
51+
}
52+
53+
size_t PDALGetDimTypeInterpretationName(PDALDimType dim, char *name, size_t size)
54+
{
55+
size_t result = 0;
56+
57+
if (name && size > 0)
58+
{
59+
std::string s = pdal::Dimension::interpretationName(
60+
static_cast<pdal::Dimension::Type>(dim.type));
61+
std::strncpy(name, s.c_str(), size);
62+
result = std::min(std::strlen(name), size);
63+
}
64+
65+
return result;
66+
}
67+
68+
69+
PDALDimType PDALGetDimType(PDALDimTypeListPtr types, size_t index)
70+
{
71+
pdal::capi::DimTypeList *wrapper = reinterpret_cast<pdal::capi::DimTypeList *>(types);
72+
73+
PDALDimType dim = {
74+
static_cast<uint32_t>(pdal::Dimension::id("")), static_cast<uint32_t>(pdal::Dimension::type("")),
75+
1.0, 0.0
76+
};
77+
78+
if (wrapper && wrapper->get())
79+
{
80+
try
81+
{
82+
pdal::DimTypeList *list = wrapper->get();
83+
84+
if (index < list->size())
85+
{
86+
pdal::DimType nativeDim = list->at(index);
87+
dim.id = static_cast<uint32_t>(nativeDim.m_id);
88+
dim.type = static_cast<uint32_t>(nativeDim.m_type);
89+
dim.scale = nativeDim.m_xform.m_scale.m_val;
90+
dim.offset = nativeDim.m_xform.m_offset.m_val;
91+
}
92+
}
93+
catch (const std::exception &e)
94+
{
95+
printf("%s\n", e.what());
96+
}
97+
}
98+
99+
return dim;
100+
}
101+
37102
PDALDimTypeListPtr PDALGetPointLayoutDimTypes(PDALPointLayoutPtr layout)
38103
{
39104
PDALDimTypeListPtr types = NULL;
@@ -58,6 +123,28 @@ namespace pdal
58123
}
59124
}
60125

126+
PDALDimType PDALFindDimType(PDALPointLayoutPtr layout, const char *name)
127+
{
128+
PDALDimType dim = {
129+
static_cast<uint32_t>(pdal::Dimension::id("")), static_cast<uint32_t>(pdal::Dimension::type("")),
130+
1.0, 0.0
131+
};
132+
133+
pdal::PointLayoutPtr nativeLayout = reinterpret_cast<pdal::PointLayoutPtr>(layout);
134+
135+
if (name && nativeLayout)
136+
{
137+
pdal::DimType nativeDim = nativeLayout->findDimType(name);
138+
139+
dim.id = static_cast<uint32_t>(nativeDim.m_id);
140+
dim.type = static_cast<uint32_t>(nativeDim.m_type);
141+
dim.scale = nativeDim.m_xform.m_scale.m_val;
142+
dim.offset = nativeDim.m_xform.m_offset.m_val;
143+
}
144+
145+
return dim;
146+
}
147+
61148
size_t PDALGetDimSize(PDALPointLayoutPtr layout, const char *name)
62149
{
63150
pdal::PointLayoutPtr nativeLayout = reinterpret_cast<pdal::PointLayoutPtr>(layout);

source/pdal/capi/PointLayout.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,17 @@ namespace pdal
1818
#endif
1919
PDAL_C_API size_t PDALGetDimTypeListSize(PDALDimTypeListPtr types);
2020

21+
PDAL_C_API PDALDimType PDALGetDimType(PDALDimTypeListPtr types, size_t index);
22+
23+
PDAL_C_API size_t PDALGetDimTypeIdName(PDALDimType dim, char *name, size_t size);
24+
25+
PDAL_C_API size_t PDALGetDimTypeInterpretationName(PDALDimType dim, char *name, size_t size);
26+
2127
PDAL_C_API PDALDimTypeListPtr PDALGetPointLayoutDimTypes(PDALPointLayoutPtr layout);
2228

2329
PDAL_C_API void PDALDisposeDimTypeList(PDALDimTypeListPtr types);
2430

25-
//! PDAL_C_API PDALDimType PDALFindDimType(PDALPointLayoutPtr layout, const char *name);
31+
PDAL_C_API PDALDimType PDALFindDimType(PDALPointLayoutPtr layout, const char *name);
2632

2733
PDAL_C_API size_t PDALGetDimSize(PDALPointLayoutPtr layout, const char *name);
2834

tests/pdal/capi/PointLayoutTest.c.in

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,57 @@ TEST testPDALGetPointLayoutDimTypes(void)
8181
PASS();
8282
}
8383

84+
TEST testPDALFindDimType(void)
85+
{
86+
uint32_t idUnknown = 0;
87+
uint32_t typeNone = 0;
88+
double tolerance = 1.0e-4;
89+
90+
ASSERT(gLayout);
91+
92+
PDALDimType actual = PDALFindDimType(NULL, NULL);
93+
ASSERT_EQ(idUnknown, actual.id);
94+
ASSERT_EQ(typeNone, actual.type);
95+
ASSERT_IN_RANGE(1.0, actual.scale, tolerance);
96+
ASSERT_IN_RANGE(0.0, actual.offset, tolerance);
97+
98+
actual = PDALFindDimType(gLayout, NULL);
99+
ASSERT_EQ(idUnknown, actual.id);
100+
ASSERT_EQ(typeNone, actual.type);
101+
ASSERT_IN_RANGE(1.0, actual.scale, tolerance);
102+
ASSERT_IN_RANGE(0.0, actual.offset, tolerance);
103+
104+
PDALDimTypeListPtr types = PDALGetPointLayoutDimTypes(gLayout);
105+
size_t size = PDALGetDimTypeListSize(types);
106+
107+
for (size_t i = 0; i < size; ++i)
108+
{
109+
PDALDimType expected = PDALGetDimType(types, i);
110+
ASSERT(idUnknown != expected.id);
111+
ASSERT(typeNone != expected.type);
112+
113+
char name[64];
114+
ASSERT(PDALGetDimTypeIdName(expected, name, 64) > 0);
115+
116+
actual = PDALFindDimType(NULL, name);
117+
ASSERT_EQ(idUnknown, actual.id);
118+
ASSERT_EQ(typeNone, actual.type);
119+
ASSERT_IN_RANGE(1.0, actual.scale, tolerance);
120+
ASSERT_IN_RANGE(0.0, actual.offset, tolerance);
121+
122+
actual = PDALFindDimType(gLayout, name);
123+
ASSERT_EQ(expected.id, actual.id);
124+
ASSERT_EQ(expected.type, actual.type);
125+
ASSERT_IN_RANGE(expected.scale, actual.scale, tolerance);
126+
ASSERT_IN_RANGE(expected.offset, actual.offset, tolerance);
127+
}
128+
129+
PDALDisposeDimTypeList(types);
130+
131+
PASS();
132+
}
133+
134+
84135
TEST testPDALGetDimSize(void)
85136
{
86137
ASSERT(gLayout);
@@ -148,6 +199,7 @@ GREATEST_SUITE(PointLayoutTest)
148199
SET_TEARDOWN(teardownPointLayoutTest, NULL);
149200

150201
RUN_TEST(testPDALGetPointLayoutDimTypes);
202+
RUN_TEST(testPDALFindDimType);
151203
RUN_TEST(testPDALGetDimSize);
152204
RUN_TEST(testPDALGetDimPackedOffset);
153205
RUN_TEST(testPDALGetPointSize);

0 commit comments

Comments
 (0)