43
43
#include < pdal/util/Algorithm.hpp>
44
44
#include < pdal/util/Extractor.hpp>
45
45
46
- # include " ../plang/Environment.hpp "
46
+
47
47
48
48
#if NPY_ABI_VERSION < 0x02000000
49
49
#define PyDataType_FIELDS (descr ) ((descr)->fields)
@@ -138,10 +138,13 @@ void NumpyReader::setArray(PyObject* array)
138
138
Py_XINCREF (m_array);
139
139
}
140
140
141
+
141
142
PyArrayObject* load_npy_file (std::string const & filename)
142
143
{
143
144
144
145
PyObject *py_filename = PyUnicode_FromString (filename.c_str ());
146
+ if (!py_filename)
147
+ throw pdal::pdal_error (plang::getTraceback ());
145
148
PyObject *numpy_module = PyImport_ImportModule (" numpy" );
146
149
if (!numpy_module)
147
150
throw pdal::pdal_error (plang::getTraceback ());
@@ -165,7 +168,11 @@ PyArrayObject* load_npy_file(std::string const& filename)
165
168
if (!array)
166
169
throw pdal::pdal_error (plang::getTraceback ());
167
170
168
- return reinterpret_cast <PyArrayObject*>(array);
171
+
172
+ PyArrayObject* nparray = reinterpret_cast <PyArrayObject*>(array);
173
+ if (!PyArray_Check (array))
174
+ throw pdal_error (" Numpy file did not return an array!" );
175
+ return nparray;
169
176
}
170
177
171
178
PyArrayObject* load_npy_script (std::string const & source,
@@ -196,6 +203,9 @@ PyArrayObject* load_npy_script(std::string const& source,
196
203
197
204
Py_XDECREF (scriptArgs);
198
205
206
+ if (!PyArray_Check (array))
207
+ throw pdal_error (" Numpy script did not return an array!" );
208
+
199
209
return reinterpret_cast <PyArrayObject*>(array);
200
210
}
201
211
@@ -350,32 +360,24 @@ Dimension::Id NumpyReader::registerDim(PointLayoutPtr layout,
350
360
return id;
351
361
}
352
362
353
- namespace
354
- {
355
363
356
-
357
- Dimension::Type getType (PyArray_Descr *dtype, const std::string& name)
364
+ void NumpyReader::createFields (PointLayoutPtr layout)
358
365
{
359
- if (!dtype)
360
- throw pdal_error (" Can't fetch data type for numpy field." );
361
366
362
- Dimension::Type pdalType =
363
- plang::Environment::getPDALDataType (dtype->type_num );
364
- if (pdalType == Dimension::Type::None)
367
+ auto getPDALType = [](int type_num, const std::string& name)
365
368
{
366
- std::ostringstream oss;
367
- oss << " Unable to map dimension '" << name << " ' because its "
368
- " type '" << dtype->type_num <<" ' is not mappable to PDAL" ;
369
- throw pdal_error (oss.str ());
370
- }
371
- return pdalType;
372
- }
373
-
374
- } // unnamed namespace
375
-
369
+ Dimension::Type pdalType =
370
+ plang::Environment::getPDALDataType (type_num);
371
+ if (pdalType == Dimension::Type::None)
372
+ {
373
+ std::ostringstream oss;
374
+ oss << " Unable to map dimension '" << name << " ' because its "
375
+ " type '" << type_num <<" ' is not mappable to PDAL" ;
376
+ throw pdal_error (oss.str ());
377
+ }
378
+ return pdalType;
379
+ };
376
380
377
- void NumpyReader::createFields (PointLayoutPtr layout)
378
- {
379
381
Dimension::Id id;
380
382
Dimension::Type type;
381
383
int offset;
@@ -388,7 +390,7 @@ void NumpyReader::createFields(PointLayoutPtr layout)
388
390
// Array isn't structured - just a bunch of data.
389
391
if (m_numFields <= 0 )
390
392
{
391
- type = getType (m_dtype, m_defaultDimension);
393
+ type = getPDALType (m_dtype-> type_num , m_defaultDimension);
392
394
id = registerDim (layout, m_defaultDimension, type);
393
395
m_fields.push_back ({id, type, 0 });
394
396
}
@@ -415,7 +417,7 @@ void NumpyReader::createFields(PointLayoutPtr layout)
415
417
416
418
// Get type.
417
419
PyArray_Descr* dt = (PyArray_Descr *)PySequence_Fast_GET_ITEM (tup, 0 );
418
- type = getType (dt, name);
420
+ type = getPDALType (dt-> type_num , name);
419
421
420
422
char byteorder = dt->byteorder ;
421
423
int elsize = (int ) PyDataType_ELSIZE (dt);
0 commit comments