diff options
Diffstat (limited to 'examples/graphs/3d/widgetgallery/topographicseries.py')
-rw-r--r-- | examples/graphs/3d/widgetgallery/topographicseries.py | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/examples/graphs/3d/widgetgallery/topographicseries.py b/examples/graphs/3d/widgetgallery/topographicseries.py new file mode 100644 index 000000000..4f286a222 --- /dev/null +++ b/examples/graphs/3d/widgetgallery/topographicseries.py @@ -0,0 +1,57 @@ +# Copyright (C) 2023 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +from PySide6.QtCore import Qt +from PySide6.QtGui import QImage, QVector3D +from PySide6.QtGraphs import (QSurface3DSeries, QSurfaceDataItem) + + +# Value used to encode height data as RGB value on PNG file +PACKING_FACTOR = 11983.0 + + +class TopographicSeries(QSurface3DSeries): + + def __init__(self): + super().__init__() + self._sampleCountX = 0.0 + self._sampleCountZ = 0.0 + self.setDrawMode(QSurface3DSeries.DrawSurface) + self.setFlatShadingEnabled(True) + self.setBaseColor(Qt.white) + + def sampleCountX(self): + return self._sampleCountX + + def sampleCountZ(self): + return self._sampleCountZ + + def setTopographyFile(self, file, width, height): + heightMapImage = QImage(file) + bits = heightMapImage.bits() + imageHeight = heightMapImage.height() + imageWidth = heightMapImage.width() + widthBits = imageWidth * 4 + stepX = width / float(imageWidth) + stepZ = height / float(imageHeight) + + dataArray = [] + for i in range(0, imageHeight): + p = i * widthBits + z = height - float(i) * stepZ + newRow = [] + for j in range(0, imageWidth): + aa = bits[p + 0] + rr = bits[p + 1] + gg = bits[p + 2] + color = (gg << 16) + (rr << 8) + aa + y = float(color) / PACKING_FACTOR + item = QSurfaceDataItem(QVector3D(float(j) * stepX, y, z)) + newRow.append(item) + p += 4 + dataArray.append(newRow) + + self.dataProxy().resetArray(dataArray) + + self._sampleCountX = float(imageWidth) + self._sampleCountZ = float(imageHeight) |