Skip to content

Commit f4760f2

Browse files
author
cfarmer
committedMay 13, 2010
New warning when creating empty multipart layer; Ok button disabled on all functions while running; General bug fixes. Fixes #2260, #2057, and #1986. Another great patch from alexbruy :-)
git-svn-id: http://svn.osgeo.org/qgis/trunk@13481 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 7f7a5ac commit f4760f2

16 files changed

+95
-89
lines changed
 

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ def __init__(self, iface):
1919
self.label_2.setVisible(False)
2020
self.label_2.setEnabled(False)
2121
self.setWindowTitle(self.tr("Define current projection"))
22+
self.buttonOk = self.buttonBox_2.button( QDialogButtonBox.Ok )
2223
QObject.connect(self.btnProjection, SIGNAL("clicked()"), self.outProjFile)
2324
QObject.connect(self.inShape, SIGNAL("currentIndexChanged(QString)"), self.updateProj1)
2425
QObject.connect(self.cmbLayer, SIGNAL("currentIndexChanged(QString)"), self.updateProj2)
@@ -42,6 +43,7 @@ def updateProj2(self, layerName):
4243
self.outRef.insert(unicode(crs))
4344

4445
def accept(self):
46+
self.buttonOk.setEnabled( False )
4547
if self.inShape.currentText() == "":
4648
QMessageBox.information(self, self.tr("Define current projection"), self.tr("No input shapefile specified"))
4749
elif self.txtProjection.text() == "" and self.rdoProjection.isChecked():
@@ -103,6 +105,7 @@ def accept(self):
103105
self.progressBar.setValue(100)
104106
QMessageBox.information(self, self.tr("Define current projection"), self.tr("Defined Projection For:\n%1.shp").arg( inPath ) )
105107
self.progressBar.setValue(0)
108+
self.buttonOk.setEnabled( True )
106109

107110
def outProjFile(self):
108111
format = QString( "<h2>%1</h2>%2 <br/> %3" )

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ def __init__(self, iface, function):
1414
self.iface = iface
1515
self.setupUi(self)
1616
self.myFunction = function
17+
self.buttonOk = self.buttonBox_2.button( QDialogButtonBox.Ok )
1718
QObject.connect(self.toolOut, SIGNAL("clicked()"), self.outFile)
1819
if self.myFunction == 1:
1920
QObject.connect(self.inShape, SIGNAL("currentIndexChanged(QString)"), self.update)
@@ -126,7 +127,7 @@ def manageGui(self):
126127
elif self.myFunction == 9:
127128
myList = ftools_utils.getLayerNames( "all" )
128129
else:
129-
myList = ftools_utils.getLayerNames( [ QGis.Point, QGis.Line, QGis.Polygon ] )
130+
myList = ftools_utils.getLayerNames( [ QGis.Point, QGis.Line, QGis.Polygon ] )
130131
self.inShape.addItems( myList )
131132
return
132133

@@ -151,6 +152,7 @@ def geometry( self, myLayer, myParam, myField ):
151152
if not QgsVectorFileWriter.deleteShapeFile( self.shapefileName ):
152153
QMessageBox.warning( self, self.tr("Geoprocessing"), self.tr( "Unable to delete existing shapefile." ) )
153154
return
155+
self.buttonOk.setEnabled( False )
154156
self.testThread = geometryThread( self.iface.mainWindow(), self, self.myFunction, vlayer, myParam,
155157
myField, self.shapefileName, self.encoding )
156158
QObject.connect( self.testThread, SIGNAL( "runFinished(PyQt_PyObject)" ), self.runFinishedFromThread )
@@ -162,13 +164,19 @@ def geometry( self, myLayer, myParam, myField ):
162164

163165
def cancelThread( self ):
164166
self.testThread.stop()
167+
self.buttonOk.setEnabled( True )
165168

166169
def runFinishedFromThread( self, success ):
167170
self.testThread.stop()
171+
self.buttonOk.setEnabled( True )
168172
if success == "math_error":
169173
QMessageBox.warning( self, self.tr("Geometry"), self.tr("Error processing specified tolerance!\nPlease choose larger tolerance...") )
170174
if not QgsVectorFileWriter.deleteShapeFile( self.shapefileName ):
171175
QMessageBox.warning( self, self.tr("Geometry"), self.tr( "Unable to delete incomplete shapefile." ) )
176+
elif success == "attr_error":
177+
QMessageBox.warning( self, self.tr("Geometry"), self.tr("At least two features must have same attribute value!\nPlease choose another field...") )
178+
if not QgsVectorFileWriter.deleteShapeFile( self.shapefileName ):
179+
QMessageBox.warning( self, self.tr("Geometry"), self.tr( "Unable to delete incomplete shapefile." ) )
172180
else:
173181
self.cancel_close.setText( "Close" )
174182
QObject.disconnect( self.cancel_close, SIGNAL( "clicked()" ), self.cancelThread )
@@ -267,6 +275,8 @@ def single_to_multi( self ):
267275
outFeat.setGeometry( outGeom )
268276
writer.addFeature( outFeat )
269277
del writer
278+
else:
279+
return "attr_error"
270280
return True
271281

272282
def multi_to_single( self ):

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ def __init__( self, iface, function ):
2222
self.manageGui()
2323
self.success = False
2424
self.cancel_close = self.buttonBox_2.button( QDialogButtonBox.Close )
25+
self.buttonOk = self.buttonBox_2.button( QDialogButtonBox.Ok )
2526
self.progressBar.setValue (0 )
2627

2728
def checkA( self ):
@@ -180,6 +181,7 @@ def geoprocessing( self, myLayerA, myLayerB, myParam, myMerge, mySelectionA,
180181
if not QgsVectorFileWriter.deleteShapeFile( self.shapefileName ):
181182
QMessageBox.warning( self, self.tr("Geoprocessing"), self.tr( "Unable to delete existing shapefile." ) )
182183
return
184+
self.buttonOk.setEnabled( False )
183185
self.testThread = geoprocessingThread( self.iface.mainWindow(), self, self.myFunction, myLayerA,
184186
myLayerB, myParam, myMerge, mySelectionA, mySelectionB, self.shapefileName, self.encoding )
185187
QObject.connect( self.testThread, SIGNAL( "runFinished(PyQt_PyObject)" ), self.runFinishedFromThread )
@@ -192,9 +194,11 @@ def geoprocessing( self, myLayerA, myLayerB, myParam, myMerge, mySelectionA,
192194

193195
def cancelThread( self ):
194196
self.testThread.stop()
197+
self.buttonOk.setEnabled( True )
195198

196199
def runFinishedFromThread( self, results ):
197200
self.testThread.stop()
201+
self.buttonOk.setEnabled( True )
198202
self.cancel_close.setText( self.tr("Close") )
199203
QObject.disconnect( self.cancel_close, SIGNAL( "clicked()" ), self.cancelThread )
200204
out_text = ""

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ def __init__(self, iface):
4848
QObject.connect(self.inLine1, SIGNAL("currentIndexChanged(QString)"), self.update1)
4949
QObject.connect(self.inLine2, SIGNAL("currentIndexChanged(QString)"), self.update2)
5050
self.setWindowTitle( self.tr("Line intersections") )
51+
self.buttonOk = self.buttonBox_2.button( QDialogButtonBox.Ok )
5152
# populate layer list
5253
self.progressBar.setValue(0)
5354
mapCanvas = self.iface.mapCanvas()
@@ -70,6 +71,7 @@ def update2(self, inputLayer):
7071
self.inField2.addItem(unicode(changedField[i].name()))
7172

7273
def accept(self):
74+
self.buttonOk.setEnabled( False )
7375
if self.inLine1.currentText() == "":
7476
QMessageBox.information(self, self.tr("Locate Line Intersections"), self.tr("Please specify input line layer") )
7577
elif self.outShape.text() == "":
@@ -94,6 +96,7 @@ def accept(self):
9496
if not ftools_utils.addShapeToCanvas( unicode( outPath ) ):
9597
QMessageBox.warning( self, self.tr("Geoprocessing"), self.tr( "Error loading output shapefile:\n%1" ).arg( unicode( outPath ) ))
9698
self.progressBar.setValue(0)
99+
self.buttonOk.setEnabled( True )
97100

98101
def outFile(self):
99102
self.outShape.clear()

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

Lines changed: 5 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ def __init__(self, iface, function):
1515
self.updateUi()
1616
QObject.connect(self.toolOut, SIGNAL("clicked()"), self.outFile)
1717
QObject.connect(self.inShape, SIGNAL("currentIndexChanged(QString)"), self.update)
18+
self.buttonOk = self.buttonBox_2.button( QDialogButtonBox.Ok )
1819

1920
# populate layer list
2021
self.progressBar.setValue(0)
@@ -44,6 +45,7 @@ def update(self, inputLayer):
4445
self.uniqueField.addItem(unicode(changedField[i].name()))
4546

4647
def accept(self):
48+
self.buttonOk.setEnabled( False )
4749
if self.inShape.currentText() == "":
4850
QMessageBox.information(self, self.tr("Coordinate statistics"), self.tr("No input vector layer specified"))
4951
elif self.outShape.text() == "":
@@ -74,7 +76,8 @@ def accept(self):
7476
render.addSymbol(symbol)
7577
self.vlayer.setRenderer(render)
7678
QgsMapLayerRegistry.instance().addMapLayer(self.vlayer)
77-
self.progressBar.setValue(0)
79+
self.progressBar.setValue(0)
80+
self.buttonOk.setEnabled( True )
7881

7982
def outFile(self):
8083
self.outShape.clear()
@@ -137,7 +140,7 @@ def compute(self, inName, outName, weightField="", times=1, uniqueField=""):
137140
else:
138141
weight = float(feat.attributeMap()[weightIndex].toDouble()[0])
139142
geom = QgsGeometry(feat.geometry())
140-
geom = self.extract(geom)
143+
geom = ftools_utils.extractPoints(geom)
141144
for i in geom:
142145
cx += i.x()
143146
cy += i.y()
@@ -180,31 +183,3 @@ def compute(self, inName, outName, weightField="", times=1, uniqueField=""):
180183
if single:
181184
break
182185
del writer
183-
184-
def extract(self, geom):
185-
multi_geom = QgsGeometry()
186-
temp_geom = []
187-
if geom.type() == 0: # it's a point
188-
if geom.isMultipart():
189-
temp_geom = geom.asMultiPoint()
190-
else:
191-
temp_geom.append(geom.asPoint())
192-
if geom.type() == 1: # it's a line
193-
if geom.isMultipart():
194-
multi_geom = geom.asMultiPolyline() #multi_geog is a multiline
195-
for i in multi_geom: #i is a line
196-
temp_geom.extend(i)
197-
else:
198-
temp_geom = geom.asPolyline()
199-
elif geom.type() == 2: # it's a polygon
200-
if geom.isMultipart():
201-
multi_geom = geom.asMultiPolygon() #multi_geom is a multipolygon
202-
for i in multi_geom: #i is a polygon
203-
for j in i: #j is a line
204-
temp_geom.extend(j)
205-
else:
206-
multi_geom = geom.asPolygon() #multi_geom is a polygon
207-
for i in multi_geom: #i is a line
208-
temp_geom.extend(i)
209-
return temp_geom
210-

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ def __init__(self, iface):
4646
self.setupUi(self)
4747
QObject.connect(self.toolOut, SIGNAL("clicked()"), self.outFile)
4848
self.setWindowTitle(self.tr("Count Points in Polygon"))
49+
self.buttonOk = self.buttonBox_2.button( QDialogButtonBox.Ok )
4950
# populate layer list
5051
self.progressBar.setValue(0)
5152
mapCanvas = self.iface.mapCanvas()
@@ -55,6 +56,7 @@ def __init__(self, iface):
5556
self.inPoint.addItems(layers)
5657

5758
def accept(self):
59+
self.buttonOk.setEnabled( False )
5860
if self.inPolygon.currentText() == "":
5961
QMessageBox.information(self, self.tr("Count Points In Polygon"), self.tr("Please specify input polygon vector layer"))
6062
elif self.outShape.text() == "":
@@ -81,6 +83,7 @@ def accept(self):
8183
self.vlayer = QgsVectorLayer(outPath, unicode(outName), "ogr")
8284
QgsMapLayerRegistry.instance().addMapLayer(self.vlayer)
8385
self.progressBar.setValue(0)
86+
self.buttonOk.setEnabled( True )
8487

8588
def outFile(self):
8689
self.outShape.clear()

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

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,12 @@ def __init__(self, iface):
4848
QObject.connect(self.inShape, SIGNAL("currentIndexChanged(QString)"), self.update)
4949
self.progressBar.setValue(0)
5050
self.setWindowTitle(self.tr("Random Points"))
51+
self.buttonOk = self.buttonBox_2.button( QDialogButtonBox.Ok )
5152
self.mapCanvas = self.iface.mapCanvas()
5253
layers = ftools_utils.getLayerNames([QGis.Polygon, "Raster"])
5354
self.inShape.addItems(layers)
5455

55-
# If input layer is changed, update field list
56+
# If input layer is changed, update field list
5657
def update(self, inputLayer):
5758
self.cmbField.clear()
5859
changedLayer = ftools_utils.getMapLayerByName(unicode(inputLayer))
@@ -75,8 +76,9 @@ def update(self, inputLayer):
7576
self.cmbField.setEnabled(False)
7677
self.label_4.setEnabled(False)
7778

78-
# when 'OK' button is pressed, gather required inputs, and initiate random points generation
79+
# when 'OK' button is pressed, gather required inputs, and initiate random points generation
7980
def accept(self):
81+
self.buttonOk.setEnabled( False )
8082
if self.inShape.currentText() == "":
8183
QMessageBox.information(self, self.tr("Random Points"), self.tr("No input layer specified"))
8284
elif self.outShape.text() == "":
@@ -127,7 +129,8 @@ def accept(self):
127129
if addToTOC == QMessageBox.Yes:
128130
self.vlayer = QgsVectorLayer(outPath, unicode(outName), "ogr")
129131
QgsMapLayerRegistry.instance().addMapLayer(self.vlayer)
130-
self.progressBar.setValue(0)
132+
self.progressBar.setValue(0)
133+
self.buttonOk.setEnabled( True )
131134

132135
def outFile(self):
133136
self.outShape.clear()
@@ -136,7 +139,7 @@ def outFile(self):
136139
return
137140
self.outShape.setText( QString( self.shapefileName ) )
138141

139-
# combine all polygons in layer to create single polygon (slow for complex polygons)
142+
# combine all polygons in layer to create single polygon (slow for complex polygons)
140143
def createSinglePolygon(self, vlayer):
141144
provider = vlayer.dataProvider()
142145
allAttrs = provider.attributeIndexes()
@@ -157,7 +160,7 @@ def createSinglePolygon(self, vlayer):
157160
self.progressBar.setValue(count)
158161
return geom
159162

160-
# Generate list of random points
163+
# Generate list of random points
161164
def simpleRandom(self, n, bound, xmin, xmax, ymin, ymax):
162165
seed()
163166
points = []

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

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,36 +17,39 @@ def __init__(self, iface):
1717
# populate layer list
1818
self.progressBar.setValue(0)
1919
mapCanvas = self.iface.mapCanvas()
20+
self.buttonOk = self.buttonBox_2.button( QDialogButtonBox.Ok )
2021
layers = ftools_utils.getLayerNames([QGis.Point, QGis.Line, QGis.Polygon])
2122
self.inShape.addItems(layers)
2223

2324
def changed(self, inputLayer):
24-
changedLayer = ftools_utils.getVectorLayerByName(inputLayer)
25-
changedProvider = changedLayer.dataProvider()
26-
upperVal = changedProvider.featureCount()
27-
self.spnNumber.setMaximum(upperVal)
25+
changedLayer = ftools_utils.getVectorLayerByName(inputLayer)
26+
changedProvider = changedLayer.dataProvider()
27+
upperVal = changedProvider.featureCount()
28+
self.spnNumber.setMaximum(upperVal)
2829

2930
def accept(self):
30-
if self.inShape.currentText() == "":
31-
QMessageBox.information(self, self.tr("Random Selection Tool"), self.tr("No input shapefile specified"))
32-
else:
31+
self.buttonOk.setEnabled( False )
32+
if self.inShape.currentText() == "":
33+
QMessageBox.information(self, self.tr("Random Selection Tool"), self.tr("No input shapefile specified"))
34+
else:
3335
self.progressBar.setValue(10)
3436
inName = self.inShape.currentText()
35-
self.progressBar.setValue(20)
36-
layer = ftools_utils.getVectorLayerByName(inName)
37-
self.progressBar.setValue(30)
38-
if self.rdoNumber.isChecked():
39-
value = self.spnNumber.value()
40-
self.progressBar.setValue(60)
41-
else:
42-
value = self.spnPercent.value()
43-
self.progressBar.setValue(50)
44-
value = int(round((value / 100.0000), 4) * layer.featureCount())
45-
self.progressBar.setValue(60)
46-
selran = random.sample(xrange(0, layer.featureCount()), value)
47-
self.progressBar.setValue(70)
48-
self.progressBar.setValue(80)
49-
self.progressBar.setValue(90)
50-
self.progressBar.setValue(100)
51-
layer.setSelectedFeatures(selran)
52-
self.progressBar.setValue(0)
37+
self.progressBar.setValue(20)
38+
layer = ftools_utils.getVectorLayerByName(inName)
39+
self.progressBar.setValue(30)
40+
if self.rdoNumber.isChecked():
41+
value = self.spnNumber.value()
42+
self.progressBar.setValue(60)
43+
else:
44+
value = self.spnPercent.value()
45+
self.progressBar.setValue(50)
46+
value = int(round((value / 100.0000), 4) * layer.featureCount())
47+
self.progressBar.setValue(60)
48+
selran = random.sample(xrange(0, layer.featureCount()), value)
49+
self.progressBar.setValue(70)
50+
self.progressBar.setValue(80)
51+
self.progressBar.setValue(90)
52+
self.progressBar.setValue(100)
53+
layer.setSelectedFeatures(selran)
54+
self.progressBar.setValue(0)
55+
self.buttonOk.setEnabled( True )

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ def __init__(self, iface):
1818
QObject.connect(self.inShape, SIGNAL("currentIndexChanged(QString)"), self.updateProj1)
1919
QObject.connect(self.cmbLayer, SIGNAL("currentIndexChanged(QString)"), self.updateProj2)
2020
self.setWindowTitle( self.tr("Export to new projection") )
21+
self.buttonOk = self.buttonBox_2.button( QDialogButtonBox.Ok )
2122
self.progressBar.setValue(0)
2223
mapCanvas = self.iface.mapCanvas()
2324
layers = ftools_utils.getLayerNames([QGis.Point, QGis.Line, QGis.Polygon])
@@ -37,6 +38,7 @@ def updateProj2(self, layerName):
3738
self.outRef.insert(unicode(crs))
3839

3940
def accept(self):
41+
self.buttonOk.setEnabled( False )
4042
if self.inShape.currentText() == "":
4143
QMessageBox.information(self, self.tr("Export to new projection"), self.tr("No input layer specified"))
4244
elif self.outShape.text() == "":
@@ -64,6 +66,7 @@ def accept(self):
6466
self.vlayer = QgsVectorLayer(outPath, unicode(outName), "ogr")
6567
QgsMapLayerRegistry.instance().addMapLayer(self.vlayer)
6668
self.progressBar.setValue(0)
69+
self.buttonOk.setEnabled( True )
6770

6871
def outProjFile(self):
6972
format = QString( "<h2>%1</h2>%2 <br/> %3" )

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,14 @@ def __init__(self, iface):
5050
self.yMax.setValidator(QDoubleValidator(self.yMax))
5151
QObject.connect(self.toolOut, SIGNAL("clicked()"), self.outFile)
5252
self.setWindowTitle( self.tr("Regular points") )
53+
self.buttonOk = self.buttonBox_2.button( QDialogButtonBox.Ok )
5354
self.progressBar.setValue(0)
5455
self.mapCanvas = self.iface.mapCanvas()
5556
layers = ftools_utils.getLayerNames("all")
5657
self.inShape.addItems(layers)
5758

5859
def accept(self):
60+
self.buttonOk.setEnabled( False )
5961
if not self.rdoCoordinates.isChecked() and self.inShape.currentText() == "":
6062
QMessageBox.information(self, self.tr("Generate Regular Points"), self.tr("Please specify input layer"))
6163
elif self.rdoCoordinates.isChecked() and (self.xMin.text() == "" or self.xMax.text() == "" or self.yMin.text() == "" or self.yMax.text() == ""):
@@ -90,7 +92,8 @@ def accept(self):
9092
if addToTOC == QMessageBox.Yes:
9193
self.vlayer = QgsVectorLayer(outPath, unicode(outName), "ogr")
9294
QgsMapLayerRegistry.instance().addMapLayer(self.vlayer)
93-
self.progressBar.setValue(0)
95+
self.progressBar.setValue(0)
96+
self.buttonOk.setEnabled( True )
9497

9598
def outFile(self):
9699
self.outShape.clear()
@@ -99,7 +102,7 @@ def outFile(self):
99102
return
100103
self.outShape.setText( QString( self.shapefileName ) )
101104

102-
# Generate list of random points
105+
# Generate list of random points
103106
def simpleRandom(self, n, bound, xmin, xmax, ymin, ymax):
104107
seed()
105108
points = []

0 commit comments

Comments
 (0)
Please sign in to comment.