QGIS API Documentation  3.21.0-Master (402cf1129e)
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  {
188  value = *( data + offset );
189  return;
190 
192  value = *reinterpret_cast< const qint32 * >( data + offset );
193  return;
194 
196  value = *reinterpret_cast< const short * >( data + offset );
197  return;
198 
200  value = *reinterpret_cast< const unsigned short * >( data + offset );
201  return;
202 
204  value = *reinterpret_cast< const float * >( data + offset );
205  return;
206 
208  value = *reinterpret_cast< const double * >( data + offset );
209  return;
210  }
211  }
212 #endif
213 
214  private:
215 #ifdef SIP_RUN
217 #endif
218 
219  QgsRenderContext &mRenderContext;
220  QgsVector3D mScale;
221  QgsVector3D mOffset;
222  long mPointsRendered = 0;
224  int mPointRecordSize = 0;
225  int mXOffset = 0;
226  int mYOffset = 0;
227  int mZOffset = 0;
228  double mZValueScale = 1.0;
229  double mZValueFixedOffset = 0;
230 
231  QgsFeedback *mFeedback = nullptr;
232 };
233 
234 
243 class CORE_EXPORT QgsPointCloudRenderer
244 {
245 
246 #ifdef SIP_RUN
248 
249  const QString type = sipCpp->type();
250 
251  if ( type == QLatin1String( "rgb" ) )
252  sipType = sipType_QgsPointCloudRgbRenderer;
253  else if ( type == QLatin1String( "ramp" ) )
254  sipType = sipType_QgsPointCloudAttributeByRampRenderer;
255  else if ( type == QLatin1String( "classified" ) )
256  sipType = sipType_QgsPointCloudClassifiedRenderer;
257  else if ( type == QLatin1String( "extent" ) )
258  sipType = sipType_QgsPointCloudExtentRenderer;
259  else
260  sipType = 0;
261  SIP_END
262 #endif
263 
264  public:
265 
270  {
273  };
274 
279 
280  virtual ~QgsPointCloudRenderer() = default;
281 
285  virtual QString type() const = 0;
286 
292 
295 
298 
302  virtual void renderBlock( const QgsPointCloudBlock *block, QgsPointCloudRenderContext &context ) = 0;
303 
313  QVector<QVariantMap> identify( QgsPointCloudLayer *layer, const QgsRenderContext &context, const QgsGeometry &geometry, double toleranceForPointIdentification = 0 ) SIP_SKIP;
314 
320  virtual bool willRenderPoint( const QMap<QString, QVariant> &pointAttributes )
321  {
322  Q_UNUSED( pointAttributes );
323  return true;
324  }
325 
333  static QgsPointCloudRenderer *load( QDomElement &element, const QgsReadWriteContext &context ) SIP_FACTORY;
334 
339  virtual QDomElement save( QDomDocument &doc, const QgsReadWriteContext &context ) const = 0;
340 
348  virtual QSet< QString > usedAttributes( const QgsPointCloudRenderContext &context ) const;
349 
359  virtual void startRender( QgsPointCloudRenderContext &context );
360 
371  virtual void stopRender( QgsPointCloudRenderContext &context );
372 
378  virtual bool legendItemChecked( const QString &key );
379 
385  virtual void checkLegendItem( const QString &key, bool state = true );
386 
393  void setPointSize( double size ) { mPointSize = size; }
394 
404  double pointSize() const { return mPointSize; }
405 
413  void setPointSizeUnit( const QgsUnitTypes::RenderUnit units ) { mPointSizeUnit = units; }
414 
421  QgsUnitTypes::RenderUnit pointSizeUnit() const { return mPointSizeUnit; }
422 
429  void setPointSizeMapUnitScale( const QgsMapUnitScale &scale ) { mPointSizeMapUnitScale = scale; }
430 
437  const QgsMapUnitScale &pointSizeMapUnitScale() const { return mPointSizeMapUnitScale; }
438 
444  PointSymbol pointSymbol() const;
445 
451  void setPointSymbol( PointSymbol symbol );
452 
463  double maximumScreenError() const;
464 
475  void setMaximumScreenError( double error );
476 
483  QgsUnitTypes::RenderUnit maximumScreenErrorUnit() const;
484 
491  void setMaximumScreenErrorUnit( QgsUnitTypes::RenderUnit unit );
492 
496  virtual QList<QgsLayerTreeModelLegendNode *> createLegendNodes( QgsLayerTreeLayer *nodeLayer ) SIP_FACTORY;
497 
501  virtual QStringList legendRuleKeys() const;
502 
503  protected:
504 
508  static void pointXY( QgsPointCloudRenderContext &context, const char *ptr, int i, double &x, double &y )
509  {
510  // be wary when copying this code!! In the renderer we explicitly request x/y/z as qint32 values, but in other
511  // situations these may be floats or doubles!
512  const qint32 ix = *reinterpret_cast< const qint32 * >( ptr + i * context.pointRecordSize() + context.xOffset() );
513  const qint32 iy = *reinterpret_cast< const qint32 * >( ptr + i * context.pointRecordSize() + context.yOffset() );
514  x = context.offset().x() + context.scale().x() * ix;
515  y = context.offset().y() + context.scale().y() * iy;
516  }
517 
521  static double pointZ( QgsPointCloudRenderContext &context, const char *ptr, int i )
522  {
523  // be wary when copying this code!! In the renderer we explicitly request x/y/z as qint32 values, but in other
524  // situations these may be floats or doubles!
525  const qint32 iz = *reinterpret_cast<const qint32 * >( ptr + i * context.pointRecordSize() + context.zOffset() );
526  return ( context.offset().z() + context.scale().z() * iz ) * context.zValueScale() + context.zValueFixedOffset();
527  }
528 
532  void drawPoint( double x, double y, const QColor &color, QgsPointCloudRenderContext &context ) const
533  {
534  QPointF originalXY( x, y );
535  context.renderContext().mapToPixel().transformInPlace( x, y );
536  QPainter *painter = context.renderContext().painter();
537  switch ( mPointSymbol )
538  {
539  case Square:
540  painter->fillRect( QRectF( x - mPainterPenWidth * 0.5,
541  y - mPainterPenWidth * 0.5,
542  mPainterPenWidth, mPainterPenWidth ), color );
543  break;
544 
545  case Circle:
546  painter->setBrush( QBrush( color ) );
547  painter->setPen( Qt::NoPen );
548  painter->drawEllipse( QRectF( x - mPainterPenWidth * 0.5,
549  y - mPainterPenWidth * 0.5,
550  mPainterPenWidth, mPainterPenWidth ) );
551  break;
552  };
553  }
554 
558  void copyCommonProperties( QgsPointCloudRenderer *destination ) const;
559 
566  void restoreCommonProperties( const QDomElement &element, const QgsReadWriteContext &context );
567 
574  void saveCommonProperties( QDomElement &element, const QgsReadWriteContext &context ) const;
575 
576  private:
577 #ifdef SIP_RUN
579 #endif
580 
581 #ifdef QGISDEBUG
583  QThread *mThread = nullptr;
584 #endif
585 
586  double mMaximumScreenError = 0.3;
588 
589  double mPointSize = 1;
591  QgsMapUnitScale mPointSizeMapUnitScale;
592 
593  PointSymbol mPointSymbol = Square;
594  int mPainterPenWidth = 1;
595 };
596 
597 #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:124
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.
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.
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