24
24
#include < math.h>
25
25
#include < QMouseEvent>
26
26
#include < QMessageBox>
27
+ #include " qgslogger.h"
28
+ #include " qgisapp.h"
29
+
30
+ #include < QStatusBar>
27
31
28
32
29
33
QgsRubberBand* QgsMapToolNodeTool::createRubberBandMarker ( QgsPoint center, QgsVectorLayer* vlayer )
@@ -128,7 +132,7 @@ void QgsMapToolNodeTool::layerModified( bool onlyGeometry )
128
132
catch ( ... )
129
133
{
130
134
// GEOS is throwing exception when polygon is not valid to be able to edit it
131
- // Only possibility to fix this operation sice node tool doesn't allow to strore invalid geometry after editing
135
+ // Only possibility to fix this operation since node tool doesn't allow to store invalid geometry after editing
132
136
mSelectionFeature ->updateFromFeature ();
133
137
// if it does update markers just to be sure of correctness
134
138
}
@@ -148,7 +152,7 @@ void QgsMapToolNodeTool::createMovingRubberBands()
148
152
for ( int i = 0 ; i < vertexMap.size (); i++ )
149
153
{
150
154
// create rubber band
151
- if ( vertexMap[i].selected && !( vertexMap[i].inRubberBand ) )
155
+ if ( vertexMap[i].selected && !vertexMap[i].inRubberBand )
152
156
{
153
157
geometry->adjacentVertices ( i, beforeVertex, afterVertex );
154
158
vertex = i;
@@ -774,7 +778,7 @@ void QgsMapToolNodeTool::removeRubberBands()
774
778
mTopologyMovingVertexes .clear ();
775
779
mTopologyRubberBandVertexes .clear ();
776
780
777
- // remove all data from selected feature (no change to rubber bands itself
781
+ // remove all data from selected feature (no change to rubber bands itself)
778
782
if ( mSelectionFeature != NULL )
779
783
mSelectionFeature ->cleanRubberBandsData ();
780
784
}
@@ -936,8 +940,46 @@ void SelectionFeature::setSelectedFeature( int featureId, QgsVectorLayer* vlaye
936
940
{
937
941
mFeature = feature;
938
942
}
943
+
939
944
// createvertexmap
940
945
createVertexMap ();
946
+
947
+ validateGeometry ();
948
+ }
949
+
950
+ void SelectionFeature::validateGeometry ( QgsGeometry *g )
951
+ {
952
+ QgsDebugMsg ( " validating geometry" );
953
+
954
+ if ( g == NULL )
955
+ g = mFeature ->geometry ();
956
+
957
+ g->validateGeometry ( mGeomErrors );
958
+
959
+ while ( !mGeomErrorMarkers .isEmpty () )
960
+ {
961
+ delete mGeomErrorMarkers .takeFirst ();
962
+ }
963
+
964
+ QString tip;
965
+
966
+ for ( int i = 0 ; i < mGeomErrors .size (); i++ )
967
+ {
968
+ tip += mGeomErrors [i].what () + " \n " ;
969
+ if ( !mGeomErrors [i].hasWhere () )
970
+ continue ;
971
+
972
+ QgsVertexMarker *vm = createVertexMarker ( mGeomErrors [i].where (), QgsVertexMarker::ICON_X );
973
+ vm->setToolTip ( mGeomErrors [i].what () );
974
+ vm->setColor ( Qt::green );
975
+ vm->setZValue ( vm->zValue () + 1 );
976
+ mGeomErrorMarkers << vm;
977
+ }
978
+
979
+ QStatusBar *sb = QgisApp::instance ()->statusBar ();
980
+ sb->showMessage ( QObject::tr ( " %n geometry error(s) found." , " number of geometry errors" , mGeomErrors .size () ) );
981
+ if ( !tip.isEmpty () )
982
+ sb->setToolTip ( tip );
941
983
}
942
984
943
985
void SelectionFeature::deleteSelectedVertexes ()
@@ -983,7 +1025,10 @@ void SelectionFeature::deleteSelectedVertexes()
983
1025
}
984
1026
QgsFeature f;
985
1027
mVlayer ->featureAtId ( mFeatureId , f, true , false );
986
- if ( !GEOSisValid ( f.geometry ()->asGeos () ) )
1028
+
1029
+ bool wasValid = false ; // mGeomErrors.isEmpty();
1030
+ bool isValid = GEOSisValid ( f.geometry ()->asGeos () );
1031
+ if ( wasValid && !isValid )
987
1032
{
988
1033
QMessageBox::warning ( NULL ,
989
1034
tr ( " Node tool" ),
@@ -992,7 +1037,7 @@ void SelectionFeature::deleteSelectedVertexes()
992
1037
QMessageBox::Ok );
993
1038
}
994
1039
995
- if ( count != 0 && GEOSisValid ( f. geometry ()-> asGeos () ) )
1040
+ if ( count != 0 && ( !wasValid || isValid ) )
996
1041
{
997
1042
mVlayer ->endEditCommand ();
998
1043
}
@@ -1054,7 +1099,9 @@ void SelectionFeature::moveSelectedVertexes( double changeX, double changeY )
1054
1099
}
1055
1100
QgsFeature f;
1056
1101
mVlayer ->featureAtId ( mFeatureId , f, true , false );
1057
- if ( !GEOSisValid ( f.geometry ()->asGeos () ) )
1102
+ bool wasValid = false ; // mGeomErrors.isEmpty();
1103
+ bool isValid = GEOSisValid ( f.geometry ()->asGeos () );
1104
+ if ( wasValid && !isValid )
1058
1105
{
1059
1106
QMessageBox::warning ( NULL ,
1060
1107
tr ( " Node tool" ),
@@ -1068,17 +1115,18 @@ void SelectionFeature::moveSelectedVertexes( double changeX, double changeY )
1068
1115
else
1069
1116
{
1070
1117
mVlayer ->endEditCommand ();
1118
+ validateGeometry ( f.geometry () );
1071
1119
}
1072
1120
updateFeature ();
1073
1121
}
1074
1122
1075
- QgsVertexMarker* SelectionFeature::createVertexMarker ( QgsPoint center )
1123
+ QgsVertexMarker * SelectionFeature::createVertexMarker ( QgsPoint center, QgsVertexMarker::IconType type )
1076
1124
{
1077
- QgsVertexMarker* marker = new QgsVertexMarker ( mCanvas );
1125
+ QgsVertexMarker * marker = new QgsVertexMarker ( mCanvas );
1078
1126
QgsPoint newCenter = mCanvas ->mapRenderer ()->layerToMapCoordinates ( mVlayer , center );
1079
1127
marker->setCenter ( newCenter );
1080
1128
1081
- marker->setIconType ( QgsVertexMarker::ICON_BOX );
1129
+ marker->setIconType ( type );
1082
1130
1083
1131
marker->setColor ( Qt::red );
1084
1132
@@ -1103,6 +1151,11 @@ void SelectionFeature::deleteVertexMap()
1103
1151
VertexEntry entry = mVertexMap .takeLast ();
1104
1152
delete entry.vertexMarker ;
1105
1153
}
1154
+
1155
+ while ( !mGeomErrorMarkers .isEmpty () )
1156
+ {
1157
+ delete mGeomErrorMarkers .takeFirst ();
1158
+ }
1106
1159
}
1107
1160
1108
1161
bool SelectionFeature::isSelected ( int vertexNr )
@@ -1134,6 +1187,7 @@ void SelectionFeature::createVertexMapPolygon()
1134
1187
entry.originalIndex = i;
1135
1188
entry.inRubberBand = false ;
1136
1189
QgsVertexMarker* marker = createVertexMarker ( poly[i] );
1190
+ marker->setToolTip ( tr ( " ring %1, vertex %2" ).arg ( i2 ).arg ( i ) );
1137
1191
entry.vertexMarker = marker;
1138
1192
mVertexMap .insert ( y + i, entry );
1139
1193
}
@@ -1161,7 +1215,7 @@ void SelectionFeature::createVertexMapPolygon()
1161
1215
entry.originalIndex = y + i - 1 ;
1162
1216
entry.inRubberBand = false ;
1163
1217
QgsVertexMarker* marker = createVertexMarker ( poly[i] );
1164
-
1218
+ marker-> setToolTip ( tr ( " polygon %1, ring %2, vertex %3 " ). arg ( i2 ). arg ( i3 ). arg ( i ) );
1165
1219
entry.vertexMarker = marker;
1166
1220
mVertexMap .insert ( y + i, entry );
1167
1221
}
@@ -1194,6 +1248,7 @@ void SelectionFeature::createVertexMapLine()
1194
1248
entry.originalIndex = i;
1195
1249
entry.inRubberBand = false ;
1196
1250
QgsVertexMarker* marker = createVertexMarker ( poly[i] );
1251
+ marker->setToolTip ( tr ( " polyline %1, vertex %2" ).arg ( i2 ).arg ( i ) );
1197
1252
entry.vertexMarker = marker;
1198
1253
mVertexMap .insert ( y + i, entry );
1199
1254
}
@@ -1214,6 +1269,7 @@ void SelectionFeature::createVertexMapLine()
1214
1269
entry.originalIndex = i;
1215
1270
entry.inRubberBand = false ;
1216
1271
QgsVertexMarker* marker = createVertexMarker ( poly[i] );
1272
+ marker->setToolTip ( tr ( " vertex %1" ).arg ( i ) );
1217
1273
entry.vertexMarker = marker;
1218
1274
mVertexMap .insert ( i, entry );
1219
1275
}
@@ -1236,6 +1292,7 @@ void SelectionFeature::createVertexMapPoint()
1236
1292
entry.originalIndex = 1 ;
1237
1293
entry.inRubberBand = false ;
1238
1294
QgsVertexMarker* marker = createVertexMarker ( poly[i] );
1295
+ marker->setToolTip ( tr ( " point %1" ).arg ( i ) );
1239
1296
entry.vertexMarker = marker;
1240
1297
mVertexMap .insert ( i, entry );
1241
1298
}
@@ -1251,6 +1308,7 @@ void SelectionFeature::createVertexMapPoint()
1251
1308
entry.originalIndex = 1 ;
1252
1309
entry.inRubberBand = false ;
1253
1310
QgsVertexMarker* marker = createVertexMarker ( poly );
1311
+ marker->setToolTip ( tr ( " single point" ) );
1254
1312
entry.vertexMarker = marker;
1255
1313
mVertexMap .insert ( 1 , entry );
1256
1314
}
@@ -1372,4 +1430,3 @@ QgsVectorLayer* SelectionFeature::vlayer()
1372
1430
{
1373
1431
return mVlayer ;
1374
1432
}
1375
-
0 commit comments