Skip to content

Commit e6167d2

Browse files
committedJan 3, 2012
fix #4523:
- make geometry validation optional: none, QGIS and GEOS - move internal validation to QgsGeometryValidator thread - cache wkt in QgsCoordinateReferenceSystem - fTools: leave progress of geometry validatation at 100% - move coordinate capture to vector menu
1 parent cc9864e commit e6167d2

22 files changed

+700
-425
lines changed
 

‎python/plugins/fTools/tools/doValidate.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ def run( self ):
211211
self.running = True
212212
output = self.check_geometry( self.vlayer )
213213
self.emit( SIGNAL( "runFinished(PyQt_PyObject)" ), output )
214-
self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), 0 )
214+
self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), 100 )
215215

216216
def stop(self):
217217
self.running = False

‎src/app/main.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
#include <QFile>
2222
#include <QFileInfo>
2323
#include <QFont>
24-
#include <QMessageBox>
2524
#include <QPixmap>
2625
#include <QLocale>
2726
#include <QSettings>
@@ -35,6 +34,7 @@
3534

3635
#include "qgscustomization.h"
3736
#include "qgspluginregistry.h"
37+
#include "qgsmessagelog.h"
3838

3939
#include <cstdio>
4040
#include <stdio.h>
@@ -164,11 +164,20 @@ void myMessageOutput( QtMsgType type, const char *msg )
164164
case QtWarningMsg:
165165
fprintf( stderr, "Warning: %s\n", msg );
166166

167+
#ifdef QGISDEBUG
168+
if ( 0 == strncmp( msg, "Object::", 8 )
169+
|| 0 == strncmp( msg, "QWidget::", 9 )
170+
|| 0 == strncmp( msg, "QPainter::", 10 ) )
171+
{
172+
QgsMessageLog::logMessage( msg, "Qt" );
173+
}
174+
#endif
175+
167176
// TODO: Verify this code in action.
168177
if ( 0 == strncmp( msg, "libpng error:", 13 ) )
169178
{
170179
// Let the user know
171-
QMessageBox::warning( 0, "libpng Error", msg );
180+
QgsMessageLog::logMessage( msg, "libpng" );
172181
}
173182

174183
break;

‎src/app/qgsmaptoolcapture.cpp

Lines changed: 55 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "qgsmaprenderer.h"
2424
#include "qgsvectorlayer.h"
2525
#include "qgslogger.h"
26+
#include "qgsgeometryvalidator.h"
2627

2728
#include <QCursor>
2829
#include <QPixmap>
@@ -35,6 +36,7 @@ QgsMapToolCapture::QgsMapToolCapture( QgsMapCanvas* canvas, enum CaptureMode too
3536
: QgsMapToolEdit( canvas )
3637
, mCaptureMode( tool )
3738
, mRubberBand( 0 )
39+
, mValidator( 0 )
3840
{
3941
mCaptureModeFromLayer = tool == CaptureNone;
4042
mCapturing = false;
@@ -52,6 +54,12 @@ QgsMapToolCapture::~QgsMapToolCapture()
5254
delete mSnappingMarkers.takeFirst();
5355

5456
stopCapturing();
57+
58+
if( mValidator )
59+
{
60+
mValidator->deleteLater();
61+
mValidator = 0;
62+
}
5563
}
5664

5765
void QgsMapToolCapture::deactivate()
@@ -271,12 +279,25 @@ void QgsMapToolCapture::closePolygon()
271279

272280
void QgsMapToolCapture::validateGeometry()
273281
{
282+
QSettings settings;
283+
if ( settings.value( "/qgis/digitizing/validate_geometries", 1 ).toInt() == 0 )
284+
return;
285+
286+
if( mValidator )
287+
{
288+
mValidator->deleteLater();
289+
mValidator = 0;
290+
}
291+
292+
mTip = "";
274293
mGeomErrors.clear();
275294
while ( !mGeomErrorMarkers.isEmpty() )
276295
{
277296
delete mGeomErrorMarkers.takeFirst();
278297
}
279298

299+
QgsGeometry *g;
300+
280301
switch ( mCaptureMode )
281302
{
282303
case CaptureNone:
@@ -285,38 +306,59 @@ void QgsMapToolCapture::validateGeometry()
285306
case CaptureLine:
286307
if ( mCaptureList.size() < 2 )
287308
return;
288-
QgsGeometry::validatePolyline( mGeomErrors, 0, mCaptureList.toVector() );
309+
g = QgsGeometry::fromPolyline( mCaptureList.toVector() );
289310
break;
290311
case CapturePolygon:
291312
if ( mCaptureList.size() < 3 )
292313
return;
293-
QgsGeometry::validatePolyline( mGeomErrors, 0, mCaptureList.toVector() << mCaptureList[0], true );
314+
g = QgsGeometry::fromPolygon( QgsPolygon() << ( QgsPolyline () << mCaptureList.toVector() << mCaptureList[0] ) );
294315
break;
295316
}
296317

318+
if ( !g )
319+
return;
320+
321+
mValidator = new QgsGeometryValidator( g );
322+
connect( mValidator, SIGNAL( errorFound( QgsGeometry::Error ) ), this, SLOT( addError( QgsGeometry::Error ) ) );
323+
connect( mValidator, SIGNAL( finished() ), this, SLOT( validationFinished() ) );
324+
mValidator->start();
325+
326+
QStatusBar *sb = QgisApp::instance()->statusBar();
327+
sb->showMessage( tr( "Validation started." ) );
328+
}
329+
330+
void QgsMapToolCapture::addError( QgsGeometry::Error e )
331+
{
332+
mGeomErrors << e;
297333
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( mCanvas->currentLayer() );
298334
if ( !vlayer )
299335
return;
300336

301-
QString tip;
302-
for ( int i = 0; i < mGeomErrors.size(); i++ )
303-
{
304-
tip += mGeomErrors[i].what() + "\n";
305-
if ( !mGeomErrors[i].hasWhere() )
306-
continue;
337+
if ( !mTip.isEmpty() )
338+
mTip += "\n";
339+
340+
mTip += e.what();
307341

342+
if ( e.hasWhere() )
343+
{
308344
QgsVertexMarker *vm = new QgsVertexMarker( mCanvas );
309-
vm->setCenter( mCanvas->mapRenderer()->layerToMapCoordinates( vlayer, mGeomErrors[i].where() ) );
345+
vm->setCenter( mCanvas->mapRenderer()->layerToMapCoordinates( vlayer, e.where() ) );
310346
vm->setIconType( QgsVertexMarker::ICON_X );
311347
vm->setPenWidth( 2 );
312-
vm->setToolTip( mGeomErrors[i].what() );
348+
vm->setToolTip( e.what() );
313349
vm->setColor( Qt::green );
314350
vm->setZValue( vm->zValue() + 1 );
315351
mGeomErrorMarkers << vm;
316352
}
317353

318354
QStatusBar *sb = QgisApp::instance()->statusBar();
319-
sb->showMessage( QObject::tr( "%n geometry error(s) found.", "number of geometry errors", mGeomErrors.size() ) );
320-
if ( !tip.isEmpty() )
321-
sb->setToolTip( tip );
355+
sb->showMessage( e.what() );
356+
if ( !mTip.isEmpty() )
357+
sb->setToolTip( mTip );
358+
}
359+
360+
void QgsMapToolCapture::validationFinished()
361+
{
362+
QStatusBar *sb = QgisApp::instance()->statusBar();
363+
sb->showMessage( tr( "Validation finished." ) );
322364
}

‎src/app/qgsmaptoolcapture.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,13 @@
2222
#include "qgsgeometry.h"
2323
#include "qgslegend.h"
2424

25-
class QgsGeometry;
25+
#include <QPoint>
26+
#include <QList>
27+
2628
class QgsRubberBand;
2729
class QgsVertexMarker;
2830
class QgsMapLayer;
29-
30-
#include <QPoint>
31-
#include <QList>
31+
class QgsGeometryValidator;
3232

3333
class QgsMapToolCapture : public QgsMapToolEdit
3434
{
@@ -69,6 +69,8 @@ class QgsMapToolCapture : public QgsMapToolEdit
6969

7070
public slots:
7171
void currentLayerChanged( QgsMapLayer *layer );
72+
void addError( QgsGeometry::Error );
73+
void validationFinished();
7274

7375
protected:
7476
int nextPoint( const QPoint &p, QgsPoint &layerPoint, QgsPoint &mapPoint );
@@ -105,6 +107,8 @@ class QgsMapToolCapture : public QgsMapToolEdit
105107
QList<QgsPoint> mCaptureList;
106108

107109
void validateGeometry();
110+
QString mTip;
111+
QgsGeometryValidator *mValidator;
108112
QList< QgsGeometry::Error > mGeomErrors;
109113
QList< QgsVertexMarker * > mGeomErrorMarkers;
110114

‎src/app/qgsmaptoolnodetool.cpp

Lines changed: 52 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,13 @@
2121
#include "qgsvectordataprovider.h"
2222
#include "qgstolerance.h"
2323
#include "qgsgeometry.h"
24-
#include <cmath>
25-
#include <QMouseEvent>
26-
#include <QMessageBox>
2724
#include "qgslogger.h"
2825
#include "qgisapp.h"
2926
#include "qgslegend.h"
3027

28+
#include <cmath>
29+
#include <QMouseEvent>
30+
#include <QMessageBox>
3131
#include <QStatusBar>
3232

3333

@@ -458,7 +458,7 @@ bool QgsMapToolNodeTool::checkCorrectnessOfFeature( QgsVectorLayer *vlayer )
458458
qDebug( "feature doesn't exist any more" );
459459
QMessageBox::warning( NULL,
460460
tr( "Node tool" ),
461-
tr( "Feature was deleted on background.\n" ),
461+
tr( "Feature was deleted on background." ),
462462
QMessageBox::Ok ,
463463
QMessageBox::Ok );
464464
delete mSelectionFeature;
@@ -890,6 +890,7 @@ SelectionFeature::SelectionFeature()
890890
mFeature = new QgsFeature();
891891
mFeatureId = 0;
892892
mFeatureSelected = false;
893+
mValidator = 0;
893894
}
894895

895896
SelectionFeature::~SelectionFeature()
@@ -900,6 +901,12 @@ SelectionFeature::~SelectionFeature()
900901
{
901902
delete mGeomErrorMarkers.takeFirst();
902903
}
904+
905+
if( mValidator )
906+
{
907+
mValidator->deleteLater();
908+
mValidator = 0;
909+
}
903910
}
904911

905912
void SelectionFeature::updateFeature()
@@ -954,43 +961,63 @@ void SelectionFeature::setSelectedFeature( QgsFeatureId featureId,
954961

955962
void SelectionFeature::validateGeometry( QgsGeometry *g )
956963
{
957-
if ( g == NULL )
958-
g = mFeature->geometry();
959-
960-
if ( g->isGeosValid() )
961-
{
962-
QgsDebugMsg( "geometry is valid - not validating." );
964+
QSettings settings;
965+
if ( settings.value( "/qgis/digitizing/validate_geometries", 1 ).toInt() == 0 )
963966
return;
964-
}
967+
968+
if ( !g )
969+
g = mFeature->geometry();
965970

966971
QgsDebugMsg( "validating geometry" );
967972

968-
g->validateGeometry( mGeomErrors );
973+
mTip.clear();
969974

975+
mGeomErrors.clear();
970976
while ( !mGeomErrorMarkers.isEmpty() )
971977
{
972978
delete mGeomErrorMarkers.takeFirst();
973979
}
974980

975-
QString tip;
976-
977-
for ( int i = 0; i < mGeomErrors.size(); i++ )
981+
if( mValidator )
978982
{
979-
tip += mGeomErrors[i].what() + "\n";
980-
if ( !mGeomErrors[i].hasWhere() )
981-
continue;
983+
mValidator->deleteLater();
984+
mValidator = 0;
985+
}
986+
987+
mValidator = new QgsGeometryValidator( g );
988+
connect( mValidator, SIGNAL( errorFound( QgsGeometry::Error ) ), this, SLOT( addError( QgsGeometry::Error ) ) );
989+
connect( mValidator, SIGNAL( finished() ), this, SLOT( validationFinished() ) );
990+
mValidator->start();
991+
992+
QStatusBar *sb = QgisApp::instance()->statusBar();
993+
sb->showMessage( tr( "Validation started." ) );
994+
}
995+
996+
void SelectionFeature::addError( QgsGeometry::Error e )
997+
{
998+
mGeomErrors << e;
999+
if ( !mTip.isEmpty() )
1000+
mTip += "\n";
1001+
mTip += e.what();
9821002

983-
QgsVertexMarker *vm = createVertexMarker( mGeomErrors[i].where(), QgsVertexMarker::ICON_X );
984-
vm->setToolTip( mGeomErrors[i].what() );
1003+
if ( e.hasWhere() )
1004+
{
1005+
QgsVertexMarker *vm = createVertexMarker( e.where(), QgsVertexMarker::ICON_X );
1006+
vm->setToolTip( e.what() );
9851007
vm->setColor( Qt::green );
9861008
vm->setZValue( vm->zValue() + 1 );
9871009
mGeomErrorMarkers << vm;
9881010
}
9891011

9901012
QStatusBar *sb = QgisApp::instance()->statusBar();
991-
sb->showMessage( QObject::tr( "%n geometry error(s) found.", "number of geometry errors", mGeomErrors.size() ) );
992-
if ( !tip.isEmpty() )
993-
sb->setToolTip( tip );
1013+
sb->showMessage( e.what() );
1014+
sb->setToolTip( mTip );
1015+
}
1016+
1017+
void SelectionFeature::validationFinished()
1018+
{
1019+
QStatusBar *sb = QgisApp::instance()->statusBar();
1020+
sb->showMessage( tr( "Validation finished." ) );
9941021
}
9951022

9961023
void SelectionFeature::deleteSelectedVertexes()
@@ -1043,7 +1070,7 @@ void SelectionFeature::deleteSelectedVertexes()
10431070
{
10441071
QMessageBox::warning( NULL,
10451072
tr( "Node tool" ),
1046-
tr( "Result geometry is invalid. Reverting last changes.\n" ),
1073+
tr( "Result geometry is invalid. Reverting last changes." ),
10471074
QMessageBox::Ok ,
10481075
QMessageBox::Ok );
10491076
}
@@ -1061,7 +1088,6 @@ void SelectionFeature::deleteSelectedVertexes()
10611088
updateFromFeature();
10621089
}
10631090

1064-
10651091
void SelectionFeature::moveSelectedVertexes( double changeX, double changeY )
10661092
{
10671093
mVlayer->beginEditCommand( QObject::tr( "Moved vertices" ) );
@@ -1117,7 +1143,7 @@ void SelectionFeature::moveSelectedVertexes( double changeX, double changeY )
11171143
{
11181144
QMessageBox::warning( NULL,
11191145
tr( "Node tool" ),
1120-
tr( "Result geometry is invalid. Reverting last changes.\n" ),
1146+
tr( "Result geometry is invalid. Reverting last changes." ),
11211147
QMessageBox::Ok ,
11221148
QMessageBox::Ok );
11231149
//redo last operations

‎src/app/qgsmaptoolnodetool.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
#include "qgsmaptoolvertexedit.h"
2020
#include "qgsfeature.h"
2121
#include "qgsvertexmarker.h"
22+
#include "qgsgeometryvalidator.h"
23+
2224
#include <QRect>
2325
#include <QRubberBand>
2426

@@ -169,6 +171,9 @@ class SelectionFeature: public QObject
169171
*/
170172
QgsVectorLayer* vlayer();
171173

174+
public slots:
175+
void addError( QgsGeometry::Error );
176+
void validationFinished();
172177

173178
private:
174179
/**
@@ -214,6 +219,8 @@ class SelectionFeature: public QObject
214219
QList<VertexEntry> mVertexMap;
215220
QgsMapCanvas* mCanvas;
216221

222+
QgsGeometryValidator *mValidator;
223+
QString mTip;
217224
QList< QgsGeometry::Error > mGeomErrors;
218225
QList< QgsVertexMarker * > mGeomErrorMarkers;
219226
};

0 commit comments

Comments
 (0)
Please sign in to comment.