diff options
Diffstat (limited to 'sources/pyside6/PySide6/QtGraphs/qtgraphs_helper.cpp')
-rw-r--r-- | sources/pyside6/PySide6/QtGraphs/qtgraphs_helper.cpp | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/sources/pyside6/PySide6/QtGraphs/qtgraphs_helper.cpp b/sources/pyside6/PySide6/QtGraphs/qtgraphs_helper.cpp new file mode 100644 index 000000000..19fe4f818 --- /dev/null +++ b/sources/pyside6/PySide6/QtGraphs/qtgraphs_helper.cpp @@ -0,0 +1,97 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qtgraphs_helper.h" + +#include <sbknumpyview.h> + +#include <QtCore/QDebug> + +namespace QtGraphsHelper { + +template <class T> +static void populateArray(double xStart, double deltaX, double zStart, double deltaZ, + qsizetype xSize, qsizetype zSize, qsizetype zStrideBytes, + const T *data, QSurfaceDataArray *result) +{ + result->reserve(zSize); + const qsizetype zStride = zStrideBytes / sizeof(T); + double z = zStart; + for (qsizetype zi = 0; zi < zSize; ++zi) { + QSurfaceDataRow row; + row.reserve(xSize); + + double x = xStart; + auto *rowDataEnd = data + xSize; + for (auto *d = data; d < rowDataEnd; ++d) { + row.append(QSurfaceDataItem(QVector3D(x, *d, z))); + x += deltaX; + } + result->append(row); + + data += zStride; + z += deltaZ; + } +} + +QSurfaceDataArray surfaceDataFromNp(double xStart, double deltaX, double zStart, double deltaZ, + PyObject *pyData) +{ + static const char funcName[] = "QSurfaceDataProxy.resetArrayNp"; + + QSurfaceDataArray result; + + auto view = Shiboken::Numpy::View::fromPyObject(pyData); + if (!view) { + PyErr_Format(PyExc_TypeError, "Invalid array passed to %s", funcName); + return result; + } + if (view.ndim != 2) { + PyErr_Format(PyExc_TypeError, "%s expects a 2 dimensional array (%d)", view.ndim); + return result; + } + + const qsizetype zSize = view.dimensions[0]; + const qsizetype xSize = view.dimensions[1]; + if (zSize == 0 || xSize == 0) + return result; + + switch (view.type) { + case Shiboken::Numpy::View::Int16: + populateArray(xStart, deltaX, zStart, deltaZ, xSize, zSize, view.stride[0], + reinterpret_cast<const int16_t *>(view.data), &result); + break; + case Shiboken::Numpy::View::Unsigned16: + populateArray(xStart, deltaX, zStart, deltaZ, xSize, zSize, view.stride[0], + reinterpret_cast<const uint16_t *>(view.data), &result); + break; + case Shiboken::Numpy::View::Int: + populateArray(xStart, deltaX, zStart, deltaZ, xSize, zSize, view.stride[0], + reinterpret_cast<const int *>(view.data), &result); + break; + case Shiboken::Numpy::View::Unsigned: + populateArray(xStart, deltaX, zStart, deltaZ, xSize, zSize, view.stride[0], + reinterpret_cast<const unsigned *>(view.data), &result); + break; + case Shiboken::Numpy::View::Int64: + populateArray(xStart, deltaX, zStart, deltaZ, xSize, zSize, view.stride[0], + reinterpret_cast<const int64_t *>(view.data), &result); + break; + case Shiboken::Numpy::View::Unsigned64: + populateArray(xStart, deltaX, zStart, deltaZ, xSize, zSize, view.stride[0], + reinterpret_cast<const uint64_t *>(view.data), &result); + break; + case Shiboken::Numpy::View::Float: + populateArray(xStart, deltaX, zStart, deltaZ, xSize, zSize, view.stride[0], + reinterpret_cast<const float *>(view.data), &result); + break; + case Shiboken::Numpy::View::Double: + populateArray(xStart, deltaX, zStart, deltaZ, xSize, zSize, view.stride[0], + reinterpret_cast<const double *>(view.data), &result); + + break; + } + return result; +} + +} // namespace QtGraphsHelper |