|
17 | 17 | #include "qgsgeometryutils.h"
|
18 | 18 | #include "../utils/qgsfeaturepool.h"
|
19 | 19 |
|
20 |
| -void QgsGeometryAngleCheck::collectErrors( QList<QgsGeometryCheckError *> &errors, QStringList &/*messages*/, QAtomicInt *progressCounter, const QgsFeatureIds &ids ) const |
| 20 | +void QgsGeometryAngleCheck::collectErrors( QList<QgsGeometryCheckError *> &errors, QStringList &/*messages*/, QAtomicInt *progressCounter, const QMap<QString, QgsFeatureIds> &ids ) const |
21 | 21 | {
|
22 |
| - const QgsFeatureIds &featureIds = ids.isEmpty() ? mFeaturePool->getFeatureIds() : ids; |
23 |
| - Q_FOREACH ( QgsFeatureId featureid, featureIds ) |
| 22 | + QMap<QString, QgsFeatureIds> featureIds = ids.isEmpty() ? allLayerFeatureIds() : ids; |
| 23 | + for ( const QString &layerId : featureIds.keys() ) |
24 | 24 | {
|
25 |
| - if ( progressCounter ) progressCounter->fetchAndAddRelaxed( 1 ); |
26 |
| - QgsFeature feature; |
27 |
| - if ( !mFeaturePool->get( featureid, feature ) ) |
| 25 | + if ( !getCompatibility( getFeaturePool( layerId )->getLayer()->geometryType() ) ) |
28 | 26 | {
|
29 | 27 | continue;
|
30 | 28 | }
|
31 |
| - QgsGeometry g = feature.geometry(); |
32 |
| - const QgsAbstractGeometry *geom = g.geometry(); |
33 |
| - for ( int iPart = 0, nParts = geom->partCount(); iPart < nParts; ++iPart ) |
| 29 | + for ( QgsFeatureId featureid : featureIds[layerId] ) |
34 | 30 | {
|
35 |
| - for ( int iRing = 0, nRings = geom->ringCount( iPart ); iRing < nRings; ++iRing ) |
| 31 | + if ( progressCounter ) progressCounter->fetchAndAddRelaxed( 1 ); |
| 32 | + QgsFeature feature; |
| 33 | + if ( !getFeaturePool( layerId )->get( featureid, feature ) ) |
36 | 34 | {
|
37 |
| - int nVerts = QgsGeometryCheckerUtils::polyLineSize( geom, iPart, iRing ); |
38 |
| - // Less than three points, no angles to check |
39 |
| - if ( nVerts < 3 ) |
40 |
| - { |
41 |
| - continue; |
42 |
| - } |
43 |
| - for ( int iVert = 0; iVert < nVerts; ++iVert ) |
| 35 | + continue; |
| 36 | + } |
| 37 | + QgsGeometry g = feature.geometry(); |
| 38 | + const QgsAbstractGeometry *geom = g.geometry(); |
| 39 | + for ( int iPart = 0, nParts = geom->partCount(); iPart < nParts; ++iPart ) |
| 40 | + { |
| 41 | + for ( int iRing = 0, nRings = geom->ringCount( iPart ); iRing < nRings; ++iRing ) |
44 | 42 | {
|
45 |
| - const QgsPoint &p1 = geom->vertexAt( QgsVertexId( iPart, iRing, ( iVert - 1 + nVerts ) % nVerts ) ); |
46 |
| - const QgsPoint &p2 = geom->vertexAt( QgsVertexId( iPart, iRing, iVert ) ); |
47 |
| - const QgsPoint &p3 = geom->vertexAt( QgsVertexId( iPart, iRing, ( iVert + 1 ) % nVerts ) ); |
48 |
| - QgsVector v21, v23; |
49 |
| - try |
| 43 | + int nVerts = QgsGeometryCheckerUtils::polyLineSize( geom, iPart, iRing ); |
| 44 | + // Less than three points, no angles to check |
| 45 | + if ( nVerts < 3 ) |
50 | 46 | {
|
51 |
| - v21 = QgsVector( p1.x() - p2.x(), p1.y() - p2.y() ).normalized(); |
52 |
| - v23 = QgsVector( p3.x() - p2.x(), p3.y() - p2.y() ).normalized(); |
53 |
| - } |
54 |
| - catch ( const QgsException & ) |
55 |
| - { |
56 |
| - // Zero length vectors |
57 | 47 | continue;
|
58 | 48 | }
|
59 |
| - |
60 |
| - double angle = std::acos( v21 * v23 ) / M_PI * 180.0; |
61 |
| - if ( angle < mMinAngle ) |
| 49 | + for ( int iVert = 0; iVert < nVerts; ++iVert ) |
62 | 50 | {
|
63 |
| - errors.append( new QgsGeometryCheckError( this, featureid, p2, QgsVertexId( iPart, iRing, iVert ), angle ) ); |
| 51 | + const QgsPoint &p1 = geom->vertexAt( QgsVertexId( iPart, iRing, ( iVert - 1 + nVerts ) % nVerts ) ); |
| 52 | + const QgsPoint &p2 = geom->vertexAt( QgsVertexId( iPart, iRing, iVert ) ); |
| 53 | + const QgsPoint &p3 = geom->vertexAt( QgsVertexId( iPart, iRing, ( iVert + 1 ) % nVerts ) ); |
| 54 | + QgsVector v21, v23; |
| 55 | + try |
| 56 | + { |
| 57 | + v21 = QgsVector( p1.x() - p2.x(), p1.y() - p2.y() ).normalized(); |
| 58 | + v23 = QgsVector( p3.x() - p2.x(), p3.y() - p2.y() ).normalized(); |
| 59 | + } |
| 60 | + catch ( const QgsException & ) |
| 61 | + { |
| 62 | + // Zero length vectors |
| 63 | + continue; |
| 64 | + } |
| 65 | + |
| 66 | + double angle = std::acos( v21 * v23 ) / M_PI * 180.0; |
| 67 | + if ( angle < mMinAngle ) |
| 68 | + { |
| 69 | + errors.append( new QgsGeometryCheckError( this, layerId, featureid, p2, QgsVertexId( iPart, iRing, iVert ), angle ) ); |
| 70 | + } |
64 | 71 | }
|
65 | 72 | }
|
66 | 73 | }
|
67 | 74 | }
|
68 | 75 | }
|
69 | 76 | }
|
70 | 77 |
|
71 |
| -void QgsGeometryAngleCheck::fixError( QgsGeometryCheckError *error, int method, int /*mergeAttributeIndex*/, Changes &changes ) const |
| 78 | +void QgsGeometryAngleCheck::fixError( QgsGeometryCheckError *error, int method, const QMap<QString, int> & /*mergeAttributeIndices*/, Changes &changes ) const |
72 | 79 | {
|
73 | 80 | QgsFeature feature;
|
74 |
| - if ( !mFeaturePool->get( error->featureId(), feature ) ) |
| 81 | + if ( !getFeaturePool( error->layerId() )->get( error->featureId(), feature ) ) |
75 | 82 | {
|
76 | 83 | error->setObsolete();
|
77 | 84 | return;
|
@@ -132,15 +139,15 @@ void QgsGeometryAngleCheck::fixError( QgsGeometryCheckError *error, int method,
|
132 | 139 | }
|
133 | 140 | else
|
134 | 141 | {
|
135 |
| - changes[error->featureId()].append( Change( ChangeNode, ChangeRemoved, vidx ) ); |
| 142 | + changes[error->layerId()][error->featureId()].append( Change( ChangeNode, ChangeRemoved, vidx ) ); |
136 | 143 | if ( QgsGeometryUtils::sqrDistance2D( p1, p3 ) < QgsGeometryCheckPrecision::tolerance() * QgsGeometryCheckPrecision::tolerance()
|
137 | 144 | && QgsGeometryCheckerUtils::canDeleteVertex( geometry, vidx.part, vidx.ring ) &&
|
138 | 145 | geometry->deleteVertex( error->vidx() ) ) // error->vidx points to p3 after removing p2
|
139 | 146 | {
|
140 |
| - changes[error->featureId()].append( Change( ChangeNode, ChangeRemoved, QgsVertexId( vidx.part, vidx.ring, ( vidx.vertex + 1 ) % n ) ) ); |
| 147 | + changes[error->layerId()][error->featureId()].append( Change( ChangeNode, ChangeRemoved, QgsVertexId( vidx.part, vidx.ring, ( vidx.vertex + 1 ) % n ) ) ); |
141 | 148 | }
|
142 | 149 | feature.setGeometry( g );
|
143 |
| - mFeaturePool->updateFeature( feature ); |
| 150 | + getFeaturePool( error->layerId() )->updateFeature( feature ); |
144 | 151 | error->setFixed( method );
|
145 | 152 | }
|
146 | 153 | }
|
|
0 commit comments