QGIS API Documentation  3.24.2-Tisler (13c1a02865)
qgspointcloudrenderer.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgspointcloudrenderer.h
3  --------------------
4  begin : October 2020
5  copyright : (C) 2020 by Peter Petrik
6  email : zilolv at gmail dot com
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 #ifndef QGSPOINTCLOUDRENDERER_H
19 #define QGSPOINTCLOUDRENDERER_H
20 
21 #include "qgsrendercontext.h"
22 
23 #include "qgis_core.h"
24 #include "qgis_sip.h"
25 #include "qgsvector3d.h"
26 #include "qgspointcloudattribute.h"
27 
28 class QgsPointCloudBlock;
29 class QgsLayerTreeLayer;
31 class QgsPointCloudLayer;
32 
41 class CORE_EXPORT QgsPointCloudRenderContext
42 {
43  public:
44 
57  QgsPointCloudRenderContext( QgsRenderContext &context, const QgsVector3D &scale, const QgsVector3D &offset,
58  double zValueScale, double zValueFixedOffset, QgsFeedback *feedback = nullptr );
59 
62 
65 
69  QgsRenderContext &renderContext() { return mRenderContext; }
70 
75  const QgsRenderContext &renderContext() const { return mRenderContext; } SIP_SKIP
76 
80  QgsVector3D scale() const { return mScale; }
81 
86  void setScale( const QgsVector3D &scale ) { mScale = scale; }
87 
91  QgsVector3D offset() const { return mOffset; }
92 
97  void setOffset( const QgsVector3D &offset ) { mOffset = offset; }
98 
102  long pointsRendered() const;
103 
110  void incrementPointsRendered( long count );
111 
117  QgsPointCloudAttributeCollection attributes() const { return mAttributes; }
118 
124  void setAttributes( const QgsPointCloudAttributeCollection &attributes );
125 
129  int pointRecordSize() const { return mPointRecordSize; }
130 
137  int xOffset() const { return mXOffset; }
138 
145  int yOffset() const { return mYOffset; }
146 
153  int zOffset() const { return mZOffset; }
154 
160  double zValueScale() const { return mZValueScale; }
161 
167  double zValueFixedOffset() const { return mZValueFixedOffset; }
168 
174  QgsFeedback *feedback() const { return mFeedback; }
175 
176 #ifndef SIP_RUN
177 
182  template <typename T>
183  void getAttribute( const char *data, std::size_t offset, QgsPointCloudAttribute::DataType type, T &value ) const
184  {
185  switch ( type )
186  {
189  value = *( data + offset );
190  return;
191 
193  value = *reinterpret_cast< const quint32 * >( data + offset );
194  return;
196  value = *reinterpret_cast< const qint32 * >( data + offset );
197  return;
198 
200  value = *reinterpret_cast< const quint64 * >( data + offset );
201  return;
203  value = *reinterpret_cast< const qint64 * >( data + offset );
204  return;
205 
207  value = *reinterpret_cast< const short * >( data + offset );
208  return;
209 
211  value = *reinterpret_cast< const unsigned short * >( data + offset );
212  return;
213 
215  value = *reinterpret_cast< const float * >( data + offset );
216  return;
217 
219  value = *reinterpret_cast< const double * >( data + offset );
220  return;
221  }
222  }
223 #endif
224 
225  private:
226 #ifdef SIP_RUN
228 #endif
229 
230  QgsRenderContext &mRenderContext;
231  QgsVector3D mScale;
232  QgsVector3D mOffset;
233  long mPointsRendered = 0;
235  int mPointRecordSize = 0;
236  int mXOffset = 0;
237  int mYOffset = 0;
238  int mZOffset = 0;
239  double mZValueScale = 1.0;
240  double mZValueFixedOffset = 0;
241 
242  QgsFeedback *mFeedback = nullptr;
243 };
244 
245 
254 class CORE_EXPORT QgsPointCloudRenderer
255 {
256 
257 #ifdef SIP_RUN
259 
260  const QString type = sipCpp->type();
261 
262  if ( type == QLatin1String( "rgb" ) )
263  sipType = sipType_QgsPointCloudRgbRenderer;
264  else if ( type == QLatin1String( "ramp" ) )
265  sipType = sipType_QgsPointCloudAttributeByRampRenderer;
266  else if ( type == QLatin1String( "classified" ) )
267  sipType = sipType_QgsPointCloudClassifiedRenderer;
268  else if ( type == QLatin1String( "extent" ) )
269  sipType = sipType_QgsPointCloudExtentRenderer;
270  else
271  sipType = 0;
272  SIP_END
273 #endif
274 
275  public:
276 
281  {
284  };
285 
290  enum class DrawOrder : int
291  {
292  Default,
293  BottomToTop,
294  TopToBottom,
295  };
296 
301 
302  virtual ~QgsPointCloudRenderer() = default;
303 
307  virtual QString type() const = 0;
308 
314 
317 
320 
324  virtual void renderBlock( const QgsPointCloudBlock *block, QgsPointCloudRenderContext &context ) = 0;
325 
335  QVector<QVariantMap> identify( QgsPointCloudLayer *layer, const QgsRenderContext &context, const QgsGeometry &geometry, double toleranceForPointIdentification = 0 ) SIP_SKIP;
336 
342  virtual bool willRenderPoint( const QMap<QString, QVariant> &pointAttributes )
343  {
344  Q_UNUSED( pointAttributes );
345  return true;
346  }
347 
355  static QgsPointCloudRenderer *load( QDomElement &element, const QgsReadWriteContext &context ) SIP_FACTORY;
356 
361  virtual QDomElement save( QDomDocument &doc, const QgsReadWriteContext &context ) const = 0;
362 
370  virtual QSet< QString > usedAttributes( const QgsPointCloudRenderContext &context ) const;
371 
381  virtual void startRender( QgsPointCloudRenderContext &context );
382 
393  virtual void stopRender( QgsPointCloudRenderContext &context );
394 
400  virtual bool legendItemChecked( const QString &key );
401 
407  virtual void checkLegendItem( const QString &key, bool state = true );
408 
415  void setPointSize( double size ) { mPointSize = size; }
416 
426  double pointSize() const { return mPointSize; }
427 
435  void setPointSizeUnit( const QgsUnitTypes::RenderUnit units ) { mPointSizeUnit = units; }
436 
443  QgsUnitTypes::RenderUnit pointSizeUnit() const { return mPointSizeUnit; }
444 
451  void setPointSizeMapUnitScale( const QgsMapUnitScale &scale ) { mPointSizeMapUnitScale = scale; }
452 
459  const QgsMapUnitScale &pointSizeMapUnitScale() const { return mPointSizeMapUnitScale; }
460 
467  DrawOrder drawOrder2d() const;
468 
475  void setDrawOrder2d( DrawOrder order );
476 
482  PointSymbol pointSymbol() const;
483 
489  void setPointSymbol( PointSymbol symbol );
490 
501  double maximumScreenError() const;
502 
513  void setMaximumScreenError( double error );
514 
521  QgsUnitTypes::RenderUnit maximumScreenErrorUnit() const;
522 
529  void setMaximumScreenErrorUnit( QgsUnitTypes::RenderUnit unit );
530 
534  virtual QList<QgsLayerTreeModelLegendNode *> createLegendNodes( QgsLayerTreeLayer *nodeLayer ) SIP_FACTORY;
535 
539  virtual QStringList legendRuleKeys() const;
540 
541  protected:
542 
546  static void pointXY( QgsPointCloudRenderContext &context, const char *ptr, int i, double &x, double &y )
547  {
548  // be wary when copying this code!! In the renderer we explicitly request x/y/z as qint32 values, but in other
549  // situations these may be floats or doubles!
550  const qint32 ix = *reinterpret_cast< const qint32 * >( ptr + i * context.pointRecordSize() + context.xOffset() );
551  const qint32 iy = *reinterpret_cast< const qint32 * >( ptr + i * context.pointRecordSize() + context.yOffset() );
552  x = context.offset().x() + context.scale().x() * ix;
553  y = context.offset().y() + context.scale().y() * iy;
554  }
555 
559  static double pointZ( QgsPointCloudRenderContext &context, const char *ptr, int i )
560  {
561  // be wary when copying this code!! In the renderer we explicitly request x/y/z as qint32 values, but in other
562  // situations these may be floats or doubles!
563  const qint32 iz = *reinterpret_cast<const qint32 * >( ptr + i * context.pointRecordSize() + context.zOffset() );
564  return ( context.offset().z() + context.scale().z() * iz ) * context.zValueScale() + context.zValueFixedOffset();
565  }
566 
570  void drawPoint( double x, double y, const QColor &color, QgsPointCloudRenderContext &context ) const
571  {
572  const QPointF originalXY( x, y );
573  context.renderContext().mapToPixel().transformInPlace( x, y );
574  QPainter *painter = context.renderContext().painter();
575  switch ( mPointSymbol )
576  {
577  case Square:
578  painter->fillRect( QRectF( x - mPainterPenWidth * 0.5,
579  y - mPainterPenWidth * 0.5,
580  mPainterPenWidth, mPainterPenWidth ), color );
581  break;
582 
583  case Circle:
584  painter->setBrush( QBrush( color ) );
585  painter->setPen( Qt::NoPen );
586  painter->drawEllipse( QRectF( x - mPainterPenWidth * 0.5,
587  y - mPainterPenWidth * 0.5,
588  mPainterPenWidth, mPainterPenWidth ) );
589  break;
590  };
591  }
592 
596  void copyCommonProperties( QgsPointCloudRenderer *destination ) const;
597 
604  void restoreCommonProperties( const QDomElement &element, const QgsReadWriteContext &context );
605 
612  void saveCommonProperties( QDomElement &element, const QgsReadWriteContext &context ) const;
613 
614  private:
615 #ifdef SIP_RUN
617 #endif
618 
619 #ifdef QGISDEBUG
621  QThread *mThread = nullptr;
622 #endif
623 
624  double mMaximumScreenError = 0.3;
626 
627  double mPointSize = 1;
629  QgsMapUnitScale mPointSizeMapUnitScale;
630 
631  PointSymbol mPointSymbol = Square;
632  int mPainterPenWidth = 1;
633  DrawOrder mDrawOrder2d = DrawOrder::Default;
634 };
635 
636 #endif // QGSPOINTCLOUDRENDERER_H
Base class for feedback objects to be used for cancellation of something running in a worker thread.
Definition: qgsfeedback.h:45
A geometry is the spatial representation of a feature.
Definition: qgsgeometry.h:125
Layer tree node points to a map layer.
The QgsLegendRendererItem class is abstract interface for legend items returned from QgsMapLayerLegen...
void transformInPlace(double &x, double &y) const
Transforms device coordinates to map coordinates.
Struct for storing maximum and minimum scales for measurements in map units.
Collection of point cloud attributes.
DataType
Systems of unit measurement.
@ UShort
Unsigned short int 2 bytes.
@ UChar
Unsigned char 1 byte.
@ UInt32
Unsigned int32 4 bytes.
@ UInt64
Unsigned int64 8 bytes.
Base class for storing raw data from point cloud nodes.
Represents a map layer supporting display of point clouds.
Encapsulates the render context for a 2D point cloud rendering operation.
void getAttribute(const char *data, std::size_t offset, QgsPointCloudAttribute::DataType type, T &value) const
Retrieves the attribute value from data at the specified offset, where type indicates the original da...
const QgsRenderContext & renderContext() const
Returns a reference to the context's render context.
int yOffset() const
Returns the offset for the y value in a point record.
double zValueFixedOffset() const
Returns any constant offset which must be applied to z values taken from the point cloud index.
QgsVector3D offset() const
Returns the offset of the layer's int32 coordinates compared to CRS coords.
void setOffset(const QgsVector3D &offset)
Sets the offset of the layer's int32 coordinates compared to CRS coords.
void setScale(const QgsVector3D &scale)
Sets the scale of the layer's int32 coordinates compared to CRS coords.
int pointRecordSize() const
Returns the size of a single point record.
int xOffset() const
Returns the offset for the x value in a point record.
QgsPointCloudRenderContext(const QgsPointCloudRenderContext &rh)=delete
QgsPointCloudRenderContext cannot be copied.
QgsFeedback * feedback() const
Returns the feedback object used to cancel rendering.
double zValueScale() const
Returns any constant scaling factor which must be applied to z values taken from the point cloud inde...
QgsVector3D scale() const
Returns the scale of the layer's int32 coordinates compared to CRS coords.
QgsPointCloudAttributeCollection attributes() const
Returns the attributes associated with the rendered block.
int zOffset() const
Returns the offset for the y value in a point record.
QgsPointCloudRenderContext & operator=(const QgsPointCloudRenderContext &)=delete
QgsPointCloudRenderContext cannot be copied.
QgsRenderContext & renderContext()
Returns a reference to the context's render context.
Abstract base class for 2d point cloud renderers.
virtual QDomElement save(QDomDocument &doc, const QgsReadWriteContext &context) const =0
Saves the renderer configuration to an XML element.
const QgsMapUnitScale & pointSizeMapUnitScale() const
Returns the map unit scale used for the point size.
virtual void renderBlock(const QgsPointCloudBlock *block, QgsPointCloudRenderContext &context)=0
Renders a block of point cloud data using the specified render context.
QgsPointCloudRenderer & operator=(const QgsPointCloudRenderer &other)=delete
QgsPointCloudRenderer cannot be copied – use clone() instead.
void setPointSizeUnit(const QgsUnitTypes::RenderUnit units)
Sets the units used for the point size.
DrawOrder
Pointcloud rendering order for 2d views /since QGIS 3.24.
void setPointSizeMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale used for the point size.
QgsPointCloudRenderer()=default
Constructor for QgsPointCloudRenderer.
virtual QgsPointCloudRenderer * clone() const =0
Create a deep copy of this renderer.
void setPointSize(double size)
Sets the point size.
PointSymbol
Rendering symbols for points.
@ Square
Renders points as squares.
@ Circle
Renders points as circles.
virtual QString type() const =0
Returns the identifier of the renderer type.
QgsPointCloudRenderer(const QgsPointCloudRenderer &other)=delete
QgsPointCloudRenderer cannot be copied – use clone() instead.
QgsUnitTypes::RenderUnit pointSizeUnit() const
Returns the units used for the point size.
virtual ~QgsPointCloudRenderer()=default
void drawPoint(double x, double y, const QColor &color, QgsPointCloudRenderContext &context) const
Draws a point using a color at the specified x and y (in map coordinates).
double pointSize() const
Returns the point size.
static double pointZ(QgsPointCloudRenderContext &context, const char *ptr, int i)
Retrieves the z value for the point at index i.
static void pointXY(QgsPointCloudRenderContext &context, const char *ptr, int i, double &x, double &y)
Retrieves the x and y coordinate for the point at index i.
The class is used as a container of context for various read/write operations on other objects.
Contains information about the context of a rendering operation.
QPainter * painter()
Returns the destination QPainter for the render operation.
const QgsMapToPixel & mapToPixel() const
Returns the context's map to pixel transform, which transforms between map coordinates and device coo...
RenderUnit
Rendering size units.
Definition: qgsunittypes.h:168
@ RenderMillimeters
Millimeters.
Definition: qgsunittypes.h:169
double y() const
Returns Y coordinate.
Definition: qgsvector3d.h:51
double z() const
Returns Z coordinate.
Definition: qgsvector3d.h:53
double x() const
Returns X coordinate.
Definition: qgsvector3d.h:49
#define SIP_CONVERT_TO_SUBCLASS_CODE(code)
Definition: qgis_sip.h:177
#define SIP_SKIP
Definition: qgis_sip.h:126
#define SIP_FACTORY
Definition: qgis_sip.h:76
#define SIP_END
Definition: qgis_sip.h:194