Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgspointcloudlayer.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 QGSPOINTCLOUDLAYER_H 19 : : #define QGSPOINTCLOUDLAYER_H 20 : : 21 : : class QgsPointCloudLayerRenderer; 22 : : 23 : : #include "qgspointclouddataprovider.h" 24 : : #include "qgsmaplayer.h" 25 : : #include "qgis_core.h" 26 : : 27 : : #include <QString> 28 : : #include <memory> 29 : : 30 : : class QgsPointCloudRenderer; 31 : : class QgsPointCloudLayerElevationProperties; 32 : : 33 : : /** 34 : : * \ingroup core 35 : : * 36 : : * \brief Represents a map layer supporting display of point clouds 37 : : * 38 : : * \note The API is considered EXPERIMENTAL and can be changed without a notice 39 : : * 40 : : * \since QGIS 3.18 41 : : */ 42 : : class CORE_EXPORT QgsPointCloudLayer : public QgsMapLayer 43 : : { 44 : 0 : Q_OBJECT 45 : : public: 46 : : 47 : : /** 48 : : * Setting options for loading point cloud layers. 49 : : */ 50 : 0 : struct LayerOptions 51 : : { 52 : : 53 : : /** 54 : : * Constructor for LayerOptions with optional \a transformContext. 55 : : */ 56 : 0 : explicit LayerOptions( const QgsCoordinateTransformContext &transformContext = QgsCoordinateTransformContext( ) ) 57 : 0 : : transformContext( transformContext ) 58 : 0 : {} 59 : : 60 : : /** 61 : : * Coordinate transform context 62 : : */ 63 : : QgsCoordinateTransformContext transformContext; 64 : : 65 : : //! Set to TRUE if the default layer style should be loaded 66 : 0 : bool loadDefaultStyle = true; 67 : : 68 : : /** 69 : : * Controls whether the layer is allowed to have an invalid/unknown CRS. 70 : : * 71 : : * If TRUE, then no validation will be performed on the layer's CRS and the layer 72 : : * layer's crs() may be invalid() (i.e. the layer will have no georeferencing available 73 : : * and will be treated as having purely numerical coordinates). 74 : : * 75 : : * If FALSE (the default), the layer's CRS will be validated using QgsCoordinateReferenceSystem::validate(), 76 : : * which may cause a blocking, user-facing dialog asking users to manually select the correct CRS for the 77 : : * layer. 78 : : */ 79 : 0 : bool skipCrsValidation = false; 80 : : 81 : : /** 82 : : * Set to TRUE if point cloud index generation should be skipped. 83 : : */ 84 : 0 : bool skipIndexGeneration = false; 85 : : }; 86 : : 87 : : 88 : : /** 89 : : * Constructor - creates a point cloud layer 90 : : */ 91 : : explicit QgsPointCloudLayer( const QString &path = QString(), 92 : : const QString &baseName = QString(), 93 : 0 : const QString &providerLib = QStringLiteral( "pointcloud" ), 94 : : const QgsPointCloudLayer::LayerOptions &options = QgsPointCloudLayer::LayerOptions() ); 95 : : 96 : : ~QgsPointCloudLayer() override; 97 : : 98 : : //! QgsPointCloudLayer cannot be copied. 99 : : QgsPointCloudLayer( const QgsPointCloudLayer &rhs ) = delete; 100 : : //! QgsPointCloudLayer cannot be copied. 101 : : QgsPointCloudLayer &operator=( QgsPointCloudLayer const &rhs ) = delete; 102 : : 103 : : #ifdef SIP_RUN 104 : : SIP_PYOBJECT __repr__(); 105 : : % MethodCode 106 : : QString str = QStringLiteral( "<QgsPointCloudLayer: '%1' (%2)>" ).arg( sipCpp->name(), sipCpp->dataProvider() ? sipCpp->dataProvider()->name() : QStringLiteral( "Invalid" ) ); 107 : : sipRes = PyUnicode_FromString( str.toUtf8().constData() ); 108 : : % End 109 : : #endif 110 : : 111 : : QgsPointCloudLayer *clone() const override SIP_FACTORY; 112 : : QgsRectangle extent() const override; 113 : : QgsMapLayerRenderer *createMapRenderer( QgsRenderContext &rendererContext ) override SIP_FACTORY; 114 : : 115 : : QgsPointCloudDataProvider *dataProvider() override; 116 : : const QgsPointCloudDataProvider *dataProvider() const override SIP_SKIP; 117 : : 118 : : bool readXml( const QDomNode &layerNode, QgsReadWriteContext &context ) override; 119 : : 120 : : bool writeXml( QDomNode &layerNode, QDomDocument &doc, const QgsReadWriteContext &context ) const override; 121 : : 122 : : bool readSymbology( const QDomNode &node, QString &errorMessage, 123 : : QgsReadWriteContext &context, StyleCategories categories = AllStyleCategories ) override; 124 : : bool readStyle( const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context, StyleCategories categories = AllStyleCategories ) FINAL; 125 : : 126 : : bool writeSymbology( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context, 127 : : StyleCategories categories = AllStyleCategories ) const override; 128 : : bool writeStyle( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context, StyleCategories categories = AllStyleCategories ) const FINAL; 129 : : 130 : : void setTransformContext( const QgsCoordinateTransformContext &transformContext ) override; 131 : : void setDataSource( const QString &dataSource, const QString &baseName, const QString &provider, const QgsDataProvider::ProviderOptions &options, bool loadDefaultStyleFlag = false ) override; 132 : : QString encodedSource( const QString &source, const QgsReadWriteContext &context ) const override; 133 : : QString decodedSource( const QString &source, const QString &dataProvider, const QgsReadWriteContext &context ) const override; 134 : : QString loadDefaultStyle( bool &resultFlag SIP_OUT ) FINAL; 135 : : QString htmlMetadata() const override; 136 : : QgsMapLayerElevationProperties *elevationProperties() override; 137 : : 138 : : /** 139 : : * Returns the attributes available from the layer. 140 : : */ 141 : : QgsPointCloudAttributeCollection attributes() const; 142 : : 143 : : /** 144 : : * Returns the total number of points available in the layer. 145 : : */ 146 : : int pointCount() const; 147 : : 148 : : /** 149 : : * Returns the 2D renderer for the point cloud. 150 : : * 151 : : * \see setRenderer() 152 : : */ 153 : : QgsPointCloudRenderer *renderer(); 154 : : 155 : : /** 156 : : * Returns the 2D renderer for the point cloud. 157 : : * \note not available in Python bindings 158 : : * 159 : : * \see setRenderer() 160 : : */ 161 : : const QgsPointCloudRenderer *renderer() const SIP_SKIP; 162 : : 163 : : /** 164 : : * Sets the 2D \a renderer for the point cloud. 165 : : * 166 : : * Ownership of \a renderer is transferred to the layer. 167 : : * 168 : : * \see renderer() 169 : : */ 170 : : void setRenderer( QgsPointCloudRenderer *renderer SIP_TRANSFER ); 171 : : 172 : : private slots: 173 : : void onPointCloudIndexGenerationStateChanged( QgsPointCloudDataProvider::PointCloudIndexGenerationState state ); 174 : : 175 : : private: 176 : : 177 : : bool isReadOnly() const override {return true;} 178 : : 179 : : #ifdef SIP_RUN 180 : : QgsPointCloudLayer( const QgsPointCloudLayer &rhs ); 181 : : #endif 182 : : 183 : : std::unique_ptr<QgsPointCloudDataProvider> mDataProvider; 184 : : 185 : : std::unique_ptr<QgsPointCloudRenderer> mRenderer; 186 : : 187 : : QgsPointCloudLayerElevationProperties *mElevationProperties = nullptr; 188 : : }; 189 : : 190 : : 191 : : #endif // QGSPOINTCLOUDPLAYER_H