Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsgeometrycheckerror.h 3 : : -------- 4 : : begin : September 2018 5 : : copyright : (C) 2018 by Denis Rouzaud 6 : : email : denis@opengis.ch 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 QGSGEOMETRYCHECKERROR_H 19 : : #define QGSGEOMETRYCHECKERROR_H 20 : : 21 : : #include "qgis_analysis.h" 22 : : 23 : : #include "qgsgeometrycheck.h" 24 : : #include "qgsgeometrycheckerutils.h" 25 : : 26 : : class QgsPointXY; 27 : : 28 : : /** 29 : : * \ingroup analysis 30 : : * \brief This represents an error reported by a geometry check. 31 : : * 32 : : * \note This class is a technology preview and unstable API. 33 : : * \since QGIS 3.4 34 : : */ 35 : : class ANALYSIS_EXPORT QgsGeometryCheckError 36 : : { 37 : : public: 38 : : 39 : : /** 40 : : * The status of an error. 41 : : */ 42 : : enum Status 43 : : { 44 : : StatusPending, //!< The error is detected and pending to be handled 45 : : StatusFixFailed, //!< A fix has been tried on the error but failed 46 : : StatusFixed, //!< The error is fixed 47 : : StatusObsolete //!< The error is obsolete because of other modifications 48 : : }; 49 : : 50 : : /** 51 : : * Describes the type of an error value. 52 : : */ 53 : : enum ValueType 54 : : { 55 : : ValueLength, //!< The value is a length 56 : : ValueArea, //!< The value is an area 57 : : ValueOther //!< The value if of another type 58 : : }; 59 : : 60 : : /** 61 : : * Create a new geometry check error with the parent \a check and for the 62 : : * \a layerFeature pair at the \a errorLocation. Optionally the vertex can be 63 : : * specified via \a vixd and a \a value with its \a value Type for 64 : : * additional information. 65 : : */ 66 : : QgsGeometryCheckError( const QgsGeometryCheck *check, 67 : : const QgsGeometryCheckerUtils::LayerFeature &layerFeature, 68 : : const QgsPointXY &errorLocation, 69 : : QgsVertexId vidx = QgsVertexId(), 70 : : const QVariant &value = QVariant(), 71 : : ValueType valueType = ValueOther ); 72 : : 73 : 9 : virtual ~QgsGeometryCheckError() = default; 74 : : 75 : : const QgsGeometryCheckError &operator=( const QgsGeometryCheckError & ) = delete; 76 : : 77 : : /** 78 : : * The geometry check that created this error. 79 : : */ 80 : 20 : const QgsGeometryCheck *check() const { return mCheck; } 81 : : 82 : : /** 83 : : * The id of the layer on which this error has been detected. 84 : : */ 85 : 988 : const QString &layerId() const { return mLayerId; } 86 : : 87 : : /** 88 : : * The id of the feature on which this error has been detected. 89 : : */ 90 : 592 : QgsFeatureId featureId() const { return mFeatureId; } 91 : : 92 : : /** 93 : : * The geometry of the error in map units. 94 : : */ 95 : : QgsGeometry geometry() const; 96 : : 97 : : /** 98 : : * The context of the error. 99 : : * For topology checks like gap checks this returns the context of an error 100 : : * and the involved features. 101 : : * May be a NULL rectangle. 102 : : * 103 : : * \since QGIS 3.10 104 : : */ 105 : : virtual QgsRectangle contextBoundingBox() const; 106 : : 107 : : /** 108 : : * The bounding box of the affected area of the error. 109 : : */ 110 : : virtual QgsRectangle affectedAreaBBox() const; 111 : : 112 : : /** 113 : : * The error description. By default the description of the parent check 114 : : * will be returned. 115 : : */ 116 : 0 : virtual QString description() const { return mCheck->description(); } 117 : : 118 : : /** 119 : : * The location of the error in map units. 120 : : */ 121 : 470 : const QgsPointXY &location() const { return mErrorLocation; } 122 : : 123 : : /** 124 : : * An additional value for the error. 125 : : * Lengths and areas are provided in map units. 126 : : * \see valueType() 127 : : */ 128 : 191 : QVariant value() const { return mValue; } 129 : : 130 : : /** 131 : : * The type of the value. 132 : : * \see value() 133 : : */ 134 : : ValueType valueType() const { return mValueType; } 135 : : 136 : : /** 137 : : * The id of the affected vertex. May be valid or not, depending on the 138 : : * check. 139 : : */ 140 : 536 : const QgsVertexId &vidx() const { return mVidx; } 141 : : 142 : : /** 143 : : * The status of the error. 144 : : */ 145 : 56 : Status status() const { return mStatus; } 146 : : 147 : : /** 148 : : * A message with details, how the error has been resolved. 149 : : */ 150 : : QString resolutionMessage() const { return mResolutionMessage; } 151 : : 152 : : /** 153 : : * Set the status to fixed and specify the \a method that has been used to 154 : : * fix the error. 155 : : */ 156 : : void setFixed( int method ); 157 : : 158 : : /** 159 : : * Set the error status to failed and specify the \a reason for failure. 160 : : */ 161 : : void setFixFailed( const QString &reason ); 162 : : 163 : : /** 164 : : * Set the error status to obsolete. 165 : : */ 166 : 0 : void setObsolete() { mStatus = StatusObsolete; } 167 : : 168 : : /** 169 : : * Check if this error is equal to \a other. 170 : : * Is reimplemented by subclasses with additional information, comparison 171 : : * of base information is done in parent class. 172 : : */ 173 : : virtual bool isEqual( QgsGeometryCheckError *other ) const; 174 : : 175 : : /** 176 : : * Check if this error is almost equal to \a other. 177 : : * If this returns TRUE, it can be used to update existing errors after re-checking. 178 : : */ 179 : : virtual bool closeMatch( QgsGeometryCheckError * /*other*/ ) const; 180 : : 181 : : /** 182 : : * Update this error with the information from \a other. 183 : : * Will be used to update existing errors whenever they are re-checked. 184 : : */ 185 : : virtual void update( const QgsGeometryCheckError *other ); 186 : : 187 : : /** 188 : : * Apply a list of \a changes. 189 : : */ 190 : : virtual bool handleChanges( const QgsGeometryCheck::Changes &changes ) SIP_SKIP; 191 : : 192 : : /** 193 : : * Returns a list of involved features. 194 : : * By default returns an empty map. 195 : : * The map keys are layer ids, the map value is a set of feature ids. 196 : : * 197 : : * \since QGIS 3.8 198 : : */ 199 : : virtual QMap<QString, QgsFeatureIds > involvedFeatures() const SIP_SKIP; 200 : : 201 : : /** 202 : : * Returns an icon that should be shown for this kind of error. 203 : : * 204 : : * \since QGIS 3.8 205 : : */ 206 : : virtual QIcon icon() const; 207 : : protected: 208 : : 209 : : /** 210 : : * Create a new geometry check error with the parent \a check and for the 211 : : * layer with \a layerId and \a featureId. 212 : : * The \a geometry of the error and the \a errorLocation need to be 213 : : * specified in map coordinates. 214 : : * Optionally the vertex can be specified via \a vixd and a \a value with 215 : : * its \a value Type for additional information. 216 : : */ 217 : : QgsGeometryCheckError( const QgsGeometryCheck *check, 218 : : const QString &layerId, 219 : : QgsFeatureId featureId, 220 : : const QgsGeometry &geometry, 221 : : const QgsPointXY &errorLocation, 222 : : QgsVertexId vidx = QgsVertexId(), 223 : : const QVariant &value = QVariant(), 224 : : ValueType valueType = ValueOther ); 225 : : 226 : : const QgsGeometryCheck *mCheck = nullptr; 227 : : QString mLayerId; 228 : : QgsFeatureId mFeatureId; 229 : : QgsGeometry mGeometry; 230 : : QgsPointXY mErrorLocation; 231 : : QgsVertexId mVidx; 232 : : QVariant mValue; 233 : : ValueType mValueType; 234 : : Status mStatus; 235 : : QString mResolutionMessage; 236 : : 237 : : private: 238 : : 239 : : #ifdef SIP_RUN 240 : : const QgsGeometryCheckError &operator=( const QgsGeometryCheckError & ); 241 : : #endif 242 : : }; 243 : : 244 : : Q_DECLARE_METATYPE( QgsGeometryCheckError * ) 245 : : 246 : : #endif // QGSGEOMETRYCHECKERROR_H