@@ -60,7 +60,7 @@ def setGeom(self, p):
60
60
61
61
def reset (self ):
62
62
if not self .__marker is None :
63
- self .__canvas .scene ().removeItem (self .__marker )
63
+ self .__canvas .scene ().removeItem (self .__marker )
64
64
del self .__marker
65
65
self .__marker = None
66
66
@@ -83,9 +83,10 @@ def __init__(self, iface):
83
83
self .tblUnique .setSelectionBehavior (QAbstractItemView .SelectRows )
84
84
# populate list of available layers
85
85
myList = ftools_utils .getLayerNames ( [ QGis .Point , QGis .Line , QGis .Polygon ] )
86
- self .connect (self .tblUnique , SIGNAL ("currentItemChanged(QTableWidgetItem*, QTableWidgetItem*)" ),
86
+ self .connect (self .tblUnique , SIGNAL ("currentItemChanged(QTableWidgetItem*, QTableWidgetItem*)" ),
87
87
self .zoomToError )
88
88
self .inShape .addItems ( myList )
89
+ self .buttonBox_2 .setOrientation (Qt .Horizontal )
89
90
self .cancel_close = self .buttonBox_2 .button (QDialogButtonBox .Close )
90
91
self .buttonOk = self .buttonBox_2 .button (QDialogButtonBox .Ok )
91
92
self .progressBar .setValue (0 )
@@ -96,12 +97,16 @@ def __init__(self, iface):
96
97
settings = QSettings ()
97
98
self .restoreGeometry ( settings .value ("/fTools/ValidateDialog/geometry" ).toByteArray () )
98
99
100
+ QObject .connect ( self .browseShpError , SIGNAL ( "clicked()" ), self .outFile )
101
+ QObject .connect ( self .ckBoxShpError , SIGNAL ( "stateChanged( int )" ), self .updateGui )
102
+ self .updateGui ()
103
+
99
104
def closeEvent (self , e ):
100
105
settings = QSettings ()
101
106
settings .setValue ( "/fTools/ValidateDialog/geometry" , QVariant (self .saveGeometry ()) )
102
107
QDialog .closeEvent (self , e )
103
108
del self .marker
104
-
109
+
105
110
def keyPressEvent ( self , e ):
106
111
if ( e .modifiers () == Qt .ControlModifier or \
107
112
e .modifiers () == Qt .MetaModifier ) and \
@@ -122,10 +127,37 @@ def accept( self ):
122
127
QMessageBox .information ( self , self .tr ("Error!" ), self .tr ( "Please specify input vector layer" ) )
123
128
elif self .cmbField .isVisible () and self .cmbField .currentText () == "" :
124
129
QMessageBox .information ( self , self .tr ("Error!" ), self .tr ( "Please specify input field" ) )
130
+ elif self .ckBoxShpError .isChecked () and self .lineEditShpError .text () == "" :
131
+ QMessageBox .information ( self , self .tr ( "Error!" ), self .tr ( "Please specify output shapefile" ) )
125
132
else :
126
133
self .vlayer = ftools_utils .getVectorLayerByName ( self .inShape .currentText () )
127
134
self .validate ( self .useSelected .checkState () )
128
-
135
+
136
+ def updateGui ( self ):
137
+ if self .ckBoxShpError .isChecked ():
138
+ self .lineEditShpError .setEnabled ( True )
139
+ self .browseShpError .setEnabled ( True )
140
+ self .tblUnique .setEnabled ( False )
141
+ self .lstCount .setEnabled ( False )
142
+ self .label_2 .setEnabled ( False )
143
+ self .label_4 .setEnabled ( False )
144
+ self .label_5 .setEnabled ( False )
145
+ else :
146
+ self .lineEditShpError .setEnabled ( False )
147
+ self .browseShpError .setEnabled ( False )
148
+ self .tblUnique .setEnabled ( True )
149
+ self .lstCount .setEnabled ( True )
150
+ self .label_2 .setEnabled ( True )
151
+ self .label_4 .setEnabled ( True )
152
+ self .label_5 .setEnabled ( True )
153
+
154
+ def outFile ( self ):
155
+ self .lineEditShpError .clear ()
156
+ (self .shapefileName , self .encoding ) = ftools_utils .saveDialog ( self )
157
+ if self .shapefileName is None or self .encoding is None :
158
+ return
159
+ self .lineEditShpError .setText ( QString ( self .shapefileName ) )
160
+
129
161
def zoomToError (self , curr , prev ):
130
162
if curr is None :
131
163
return
@@ -162,11 +194,16 @@ def zoomToError(self, curr, prev):
162
194
mc .refresh ()
163
195
164
196
def validate ( self , mySelection ):
165
- self .tblUnique .clearContents ()
166
- self .tblUnique .setRowCount ( 0 )
167
- self .lstCount .clear ()
197
+ if not self .ckBoxShpError .isChecked ():
198
+ self .tblUnique .clearContents ()
199
+ self .tblUnique .setRowCount ( 0 )
200
+ self .lstCount .clear ()
201
+ self .shapefileName = None
202
+ self .encoding = None
203
+
168
204
self .buttonOk .setEnabled ( False )
169
- self .testThread = validateThread ( self .iface .mainWindow (), self , self .vlayer , mySelection )
205
+
206
+ self .testThread = validateThread ( self .iface .mainWindow (), self , self .vlayer , mySelection , self .shapefileName , self .encoding , self .ckBoxShpError .isChecked () )
170
207
QObject .connect ( self .testThread , SIGNAL ( "runFinished(PyQt_PyObject)" ), self .runFinishedFromThread )
171
208
QObject .connect ( self .testThread , SIGNAL ( "runStatus(PyQt_PyObject)" ), self .runStatusFromThread )
172
209
QObject .connect ( self .testThread , SIGNAL ( "runRange(PyQt_PyObject)" ), self .runRangeFromThread )
@@ -180,60 +217,73 @@ def reject(self):
180
217
# Remove Marker
181
218
self .marker .reset ()
182
219
QDialog .reject (self )
183
-
220
+
184
221
def cancelThread ( self ):
185
222
self .testThread .stop ()
186
223
QApplication .restoreOverrideCursor ()
187
224
self .buttonOk .setEnabled ( True )
188
-
189
- def runFinishedFromThread ( self , output ):
225
+
226
+ def runFinishedFromThread ( self , success ):
190
227
self .testThread .stop ()
191
228
QApplication .restoreOverrideCursor ()
192
229
self .buttonOk .setEnabled ( True )
193
- self .tblUnique .setColumnCount ( 2 )
194
- count = 0
195
- for rec in output :
196
- if len (rec [1 ]) < 1 :
197
- continue
198
- where = None
199
- for err in rec [1 ]: # for each error we find
200
- self .tblUnique .insertRow (count )
201
- fidItem = QTableWidgetItem ( str (rec [0 ]) )
202
- self .tblUnique .setItem ( count , 0 , fidItem )
203
- message = err .what ()
204
- errItem = QTableWidgetItem ( message )
205
- if err .hasWhere (): # if there is a location associated with the error
206
- errItem .setData (Qt .UserRole , QVariant (err .where ()))
207
- self .tblUnique .setItem ( count , 1 , errItem )
208
- count += 1
209
- self .tblUnique .setHorizontalHeaderLabels ( [ self .tr ("Feature" ), self .tr ("Error(s)" ) ] )
210
- self .tblUnique .horizontalHeader ().setResizeMode ( 0 , QHeaderView .ResizeToContents )
211
- self .tblUnique .horizontalHeader ().show ()
212
- self .tblUnique .horizontalHeader ().setResizeMode ( 1 , QHeaderView .Stretch )
213
- self .tblUnique .resizeRowsToContents ()
214
- self .lstCount .insert (str (count ))
230
+ if success == "writeShape" :
231
+ extra = ""
232
+ addToTOC = QMessageBox .question ( self , self .tr ("Geometry" ),
233
+ self .tr ( "Created output shapefile:\n %1\n %2\n \n Would you like to add the new layer to the TOC?" ).arg ( unicode ( self .shapefileName ) ).arg ( extra ),
234
+ QMessageBox .Yes , QMessageBox .No , QMessageBox .NoButton )
235
+ if addToTOC == QMessageBox .Yes :
236
+ if not ftools_utils .addShapeToCanvas ( unicode ( self .shapefileName ) ):
237
+ QMessageBox .warning ( self , self .tr ( "Geometry" ),
238
+ self .tr ( "Error loading output shapefile:\n %1" ).arg ( unicode ( self .shapefileName ) ) )
239
+ else :
240
+ self .tblUnique .setColumnCount ( 2 )
241
+ count = 0
242
+ for rec in success :
243
+ if len (rec [1 ]) < 1 :
244
+ continue
245
+ where = None
246
+ for err in rec [1 ]: # for each error we find
247
+ self .tblUnique .insertRow (count )
248
+ fidItem = QTableWidgetItem ( str (rec [0 ]) )
249
+ self .tblUnique .setItem ( count , 0 , fidItem )
250
+ message = err .what ()
251
+ errItem = QTableWidgetItem ( message )
252
+ if err .hasWhere (): # if there is a location associated with the error
253
+ errItem .setData (Qt .UserRole , QVariant (err .where ()))
254
+ self .tblUnique .setItem ( count , 1 , errItem )
255
+ count += 1
256
+ self .tblUnique .setHorizontalHeaderLabels ( [ self .tr ("Feature" ), self .tr ("Error(s)" ) ] )
257
+ self .tblUnique .horizontalHeader ().setResizeMode ( 0 , QHeaderView .ResizeToContents )
258
+ self .tblUnique .horizontalHeader ().show ()
259
+ self .tblUnique .horizontalHeader ().setResizeMode ( 1 , QHeaderView .Stretch )
260
+ self .tblUnique .resizeRowsToContents ()
261
+ self .lstCount .insert (str (count ))
215
262
self .cancel_close .setText ( "Close" )
216
263
QObject .disconnect ( self .cancel_close , SIGNAL ( "clicked()" ), self .cancelThread )
217
264
return True
218
-
265
+
219
266
def runStatusFromThread ( self , status ):
220
267
self .progressBar .setValue ( status )
221
-
268
+
222
269
def runRangeFromThread ( self , range_vals ):
223
270
self .progressBar .setRange ( range_vals [ 0 ], range_vals [ 1 ] )
224
271
225
272
class validateThread ( QThread ):
226
- def __init__ ( self , parentThread , parentObject , vlayer , mySelection ):
273
+ def __init__ ( self , parentThread , parentObject , vlayer , mySelection , myName , myEncoding , myNewShape ):
227
274
QThread .__init__ ( self , parentThread )
228
275
self .parent = parentObject
229
276
self .running = False
230
277
self .vlayer = vlayer
231
278
self .mySelection = mySelection
279
+ self .myName = myName
280
+ self .myEncoding = myEncoding
281
+ self .writeShape = myNewShape
232
282
233
283
def run ( self ):
234
284
self .running = True
235
- output = self .check_geometry ( self .vlayer )
236
- self .emit ( SIGNAL ( "runFinished(PyQt_PyObject)" ), output )
285
+ success = self .check_geometry ( self .vlayer )
286
+ self .emit ( SIGNAL ( "runFinished(PyQt_PyObject)" ), success )
237
287
238
288
def stop (self ):
239
289
self .running = False
@@ -265,4 +315,30 @@ def check_geometry( self, vlayer ):
265
315
if not geom .isGeosEmpty ():
266
316
lstErrors .append ((feat .id (), list (geom .validateGeometry ())))
267
317
self .emit ( SIGNAL ( "runStatus(PyQt_PyObject)" ), nFeat )
268
- return lstErrors
318
+
319
+ if self .writeShape :
320
+ fields = { 0 : QgsField ( "FEAT_ID" , QVariant .Int ),
321
+ 1 : QgsField ( "ERROR" , QVariant .String ) }
322
+ writer = QgsVectorFileWriter ( self .myName , self .myEncoding , fields ,
323
+ QGis .WKBPoint , vlayer .crs () )
324
+ for rec in lstErrors :
325
+ if len (rec [1 ]) < 1 :
326
+ continue
327
+ for err in rec [1 ]:
328
+ fidItem = str (rec [0 ])
329
+ message = err .what ()
330
+ if err .hasWhere ():
331
+ locErr = err .where ()
332
+ xP = locErr .x ()
333
+ yP = locErr .y ()
334
+ myPoint = QgsPoint ( xP , yP )
335
+ geometry = QgsGeometry ().fromPoint ( myPoint )
336
+ ft = QgsFeature ()
337
+ ft .setGeometry ( geometry )
338
+ ft .setAttributeMap ( { 0 : QVariant ( fidItem ),
339
+ 1 : QVariant ( message ) } )
340
+ writer .addFeature ( ft )
341
+ del writer
342
+ return "writeShape"
343
+ else :
344
+ return lstErrors
0 commit comments