Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsmeshtriangulation.h 3 : : ----------------- 4 : : begin : August 9th, 2020 5 : : copyright : (C) 2020 by Vincent Cloarec 6 : : email : vcloarec 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 : : #ifndef QGSMESHTRIANGULATION_H 18 : : #define QGSMESHTRIANGULATION_H 19 : : 20 : : #include "qgscoordinatereferencesystem.h" 21 : : #include "qgsmeshdataprovider.h" 22 : : 23 : : #include "qgis_analysis.h" 24 : : 25 : : 26 : : class QgsVectorLayer; 27 : : class QgsCoordinateTransformContext; 28 : : class QgsFeature; 29 : : class QgsFeatureIterator; 30 : : class QgsTriangulation; 31 : : class QgsFeedback; 32 : : 33 : : /** 34 : : * \ingroup analysis 35 : : * \class QgsMeshTriangulation 36 : : * 37 : : * \brief Class that handles mesh creation with Delaunay constrained triangulation 38 : : * 39 : : * \since QGIS 3.16 40 : : */ 41 : : class ANALYSIS_EXPORT QgsMeshTriangulation : public QObject 42 : : { 43 : : Q_OBJECT 44 : : public: 45 : : 46 : : //! Constructor 47 : : QgsMeshTriangulation(); 48 : : 49 : : //! Destructor 50 : : ~QgsMeshTriangulation(); 51 : : 52 : : /** 53 : : * Adds vertices to the triangulation from a feature iterator, return TRUE if successful. 54 : : * 55 : : * \param vertexFeatureIterator the feature iterator of vertices to insert 56 : : * \param valueAttribute the index of the attribute that represents the value of vertices, if -1 uses Z coordinate of vertices 57 : : * \param transform the coordinates transform used to transform coordinates 58 : : * \param feedback feedback argument may be specified to allow cancellation and progress reports 59 : : * \param featureCount the count of feature to allow progress report of the feedback 60 : : */ 61 : : bool addVertices( QgsFeatureIterator &vertexFeatureIterator, int valueAttribute, const QgsCoordinateTransform &transform, QgsFeedback *feedback = nullptr, long featureCount = 1 ); 62 : : 63 : : /** 64 : : * Adds break lines from a vector layer, return TRUE if successful. 65 : : * \param lineFeatureIterator the feature iterator of break lines to insert 66 : : * \param valueAttribute the index of the attribute that represents the value of vertices, if -1 uses Z coordinate of vertices 67 : : * \param transformContext the coordinates transform context used to transform coordinates 68 : : * \param feedback feedback argument may be specified to allow cancellation and progress reports 69 : : * \param featureCount the count of feature to allow progress report of the feedback 70 : : * 71 : : * \warning if the feature iterator contains only point geometries, the vertices will be added only without treating them as breaklines 72 : : */ 73 : : bool addBreakLines( QgsFeatureIterator &lineFeatureIterator, int valueAttribute, const QgsCoordinateTransform &transformContext, QgsFeedback *feedback = nullptr, long featureCount = 1 ); 74 : : 75 : : //! Returns the triangulated mesh 76 : : QgsMesh triangulatedMesh( QgsFeedback *feedback = nullptr ) const; 77 : : 78 : : //! Sets the coordinate reference system used for the triangulation 79 : : void setCrs( const QgsCoordinateReferenceSystem &crs ); 80 : : 81 : : private: 82 : : #ifdef SIP_RUN 83 : : QgsMeshTriangulation( const QgsMeshTriangulation &rhs ); 84 : : #endif 85 : : 86 : : QgsCoordinateReferenceSystem mCrs; 87 : : std::unique_ptr<QgsTriangulation> mTriangulation; 88 : : 89 : : void addVerticesFromFeature( const QgsFeature &feature, int valueAttribute, const QgsCoordinateTransform &transform, QgsFeedback *feedback = nullptr ); 90 : : void addBreakLinesFromFeature( const QgsFeature &feature, int valueAttribute, const QgsCoordinateTransform &transform, QgsFeedback *feedback = nullptr ); 91 : : }; 92 : : 93 : : #ifndef SIP_RUN 94 : : 95 : : /** 96 : : * \ingroup analysis 97 : : * \class QgsMeshZValueDataset 98 : : * 99 : : * \brief Convenient class that can be used to obtain a dataset that represents the Z values of mesh vertices 100 : : * 101 : : * \since QGIS 3.16 102 : : */ 103 : 0 : class QgsMeshZValueDataset: public QgsMeshDataset 104 : : { 105 : : public: 106 : : 107 : : //! Constructor with the mesh 108 : : QgsMeshZValueDataset( const QgsMesh &mesh ); 109 : : 110 : : QgsMeshDatasetValue datasetValue( int valueIndex ) const override; 111 : : QgsMeshDataBlock datasetValues( bool isScalar, int valueIndex, int count ) const override; 112 : : QgsMeshDataBlock areFacesActive( int faceIndex, int count ) const override; 113 : : bool isActive( int faceIndex ) const override; 114 : : QgsMeshDatasetMetadata metadata() const override; 115 : : int valuesCount() const override; 116 : : 117 : : private: 118 : : QgsMesh mMesh; 119 : : double mZMinimum = std::numeric_limits<double>::max(); 120 : : double mZMaximum = -std::numeric_limits<double>::max(); 121 : : }; 122 : : 123 : : #endif //SIP_RUN 124 : : 125 : : /** 126 : : * \ingroup analysis 127 : : * \class QgsMeshZValueDatasetGroup 128 : : * 129 : : * \brief Convenient class that can be used to obtain a datasetgroup on vertices that represents the Z value of the mesh vertices 130 : : * 131 : : * \since QGIS 3.16 132 : : */ 133 : 0 : class ANALYSIS_EXPORT QgsMeshZValueDatasetGroup: public QgsMeshDatasetGroup 134 : : { 135 : : public: 136 : : 137 : : /** 138 : : * Constructor 139 : : * 140 : : * \param datasetGroupName the name of the dataset group 141 : : * \param mesh the mesh used to create the Z value dataset 142 : : */ 143 : : QgsMeshZValueDatasetGroup( const QString &datasetGroupName, const QgsMesh &mesh ); 144 : : 145 : : void initialize() override; 146 : : QgsMeshDatasetMetadata datasetMetadata( int datasetIndex ) const override; 147 : : int datasetCount() const override; 148 : : QgsMeshDataset *dataset( int index ) const override; 149 : 0 : QgsMeshDatasetGroup::Type type() const override {return QgsMeshDatasetGroup::Virtual;} 150 : : QDomElement writeXml( QDomDocument &doc, const QgsReadWriteContext &context ) const override; 151 : : 152 : : private: 153 : : #ifdef SIP_RUN 154 : : QgsMeshZValueDatasetGroup( const QgsMeshZValueDatasetGroup &rhs ); 155 : : #endif 156 : : std::unique_ptr<QgsMeshZValueDataset> mDataset; 157 : : }; 158 : : 159 : : #endif // QGSMESHTRIANGULATION_H