Skip to content

Commit 59a24b8

Browse files
author
cfarmer
committed
Fixes crash when 'use selected' checkbox is check but no features are selected. Fixes #2504.
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@13031 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 67eb263 commit 59a24b8

File tree

1 file changed

+39
-33
lines changed

1 file changed

+39
-33
lines changed

python/plugins/fTools/tools/doVisual.py

+39-33
Original file line numberDiff line numberDiff line change
@@ -237,8 +237,9 @@ def basic_statistics( self, vlayer, myField ):
237237
if self.mySelection: # only selected features
238238
selection = vlayer.selectedFeatures()
239239
nFeat = vlayer.selectedFeatureCount()
240-
self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), 0 )
241-
self.emit( SIGNAL( "runRange(PyQt_PyObject)" ), ( 0, nFeat ) )
240+
if nFeat > 0:
241+
self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), 0 )
242+
self.emit( SIGNAL( "runRange(PyQt_PyObject)" ), ( 0, nFeat ) )
242243
for f in selection:
243244
atMap = f.attributeMap()
244245
lenVal = float( len( atMap[ index ].toString() ) )
@@ -281,16 +282,18 @@ def basic_statistics( self, vlayer, myField ):
281282
nElement += 1
282283
self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), nElement )
283284
nVal= float( len( values ) )
284-
if nVal > 0.00:
285+
if nVal > 0:
285286
meanVal = sumVal / nVal
286-
lstStats = []
287-
lstStats.append( self.tr( "Max. len:" ) + unicode( maxVal ) )
288-
lstStats.append( self.tr( "Min. len:" ) + unicode( minVal ) )
289-
lstStats.append( self.tr( "Mean. len:" ) + unicode( meanVal ) )
290-
lstStats.append( self.tr( "Filled:" ) + unicode( fillVal ) )
291-
lstStats.append( self.tr( "Empty:" ) + unicode( emptyVal ) )
292-
lstStats.append( self.tr( "N:" ) + unicode( nVal ) )
293-
return ( lstStats, [] )
287+
lstStats = []
288+
lstStats.append( self.tr( "Max. len:" ) + unicode( maxVal ) )
289+
lstStats.append( self.tr( "Min. len:" ) + unicode( minVal ) )
290+
lstStats.append( self.tr( "Mean. len:" ) + unicode( meanVal ) )
291+
lstStats.append( self.tr( "Filled:" ) + unicode( fillVal ) )
292+
lstStats.append( self.tr( "Empty:" ) + unicode( emptyVal ) )
293+
lstStats.append( self.tr( "N:" ) + unicode( nVal ) )
294+
return ( lstStats, [] )
295+
else:
296+
return ( ["Error:No features selected!"], [] )
294297
else: # numeric field
295298
stdVal = 0.00
296299
cvVal = 0.00
@@ -302,8 +305,9 @@ def basic_statistics( self, vlayer, myField ):
302305
selection = vlayer.selectedFeatures()
303306
nFeat = vlayer.selectedFeatureCount()
304307
uniqueVal = ftools_utils.getUniqueValuesCount( vlayer, index, True )
305-
self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), 0 )
306-
self.emit( SIGNAL( "runRange(PyQt_PyObject)" ), ( 0, nFeat ) )
308+
if nFeat > 0:
309+
self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), 0 )
310+
self.emit( SIGNAL( "runRange(PyQt_PyObject)" ), ( 0, nFeat ) )
307311
for f in selection:
308312
atMap = f.attributeMap()
309313
value = float( atMap[ index ].toDouble()[ 0 ] )
@@ -339,33 +343,35 @@ def basic_statistics( self, vlayer, myField ):
339343
nElement += 1
340344
self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), nElement )
341345
nVal= float( len( values ) )
342-
rangeVal = maxVal - minVal
343346
if nVal > 0.00:
347+
rangeVal = maxVal - minVal
344348
meanVal = sumVal / nVal
345349
if meanVal != 0.00:
346350
for val in values:
347351
stdVal += ( ( val - meanVal ) * ( val - meanVal ) )
348352
stdVal = math.sqrt( stdVal / nVal )
349353
cvVal = stdVal / meanVal
350-
if nVal > 1:
351-
lstVal = values
352-
lstVal.sort()
353-
if ( nVal % 2 ) == 0:
354-
medianVal = 0.5 * ( lstVal[ int( ( nVal - 1 ) / 2 ) ] + lstVal[ int( ( nVal ) / 2 ) ] )
355-
else:
356-
medianVal = lstVal[ int( ( nVal + 1 ) / 2 ) ]
357-
lstStats = []
358-
lstStats.append( self.tr( "Mean:" ) + unicode( meanVal ) )
359-
lstStats.append( self.tr( "StdDev:" ) + unicode( stdVal ) )
360-
lstStats.append( self.tr( "Sum:" ) + unicode( sumVal) )
361-
lstStats.append( self.tr( "Min:" ) + unicode( minVal ) )
362-
lstStats.append( self.tr( "Max:" ) + unicode( maxVal ) )
363-
lstStats.append( self.tr( "N:" ) + unicode( nVal ) )
364-
lstStats.append( self.tr( "CV:" ) + unicode( cvVal ) )
365-
lstStats.append( self.tr( "Number of unique values:" ) + unicode( uniqueVal ) )
366-
lstStats.append( self.tr( "Range:" ) + unicode( rangeVal ) )
367-
lstStats.append( self.tr( "Median:" ) + unicode( medianVal ) )
368-
return ( lstStats, [] )
354+
if nVal > 1:
355+
lstVal = values
356+
lstVal.sort()
357+
if ( nVal % 2 ) == 0:
358+
medianVal = 0.5 * ( lstVal[ int( ( nVal - 1 ) / 2 ) ] + lstVal[ int( ( nVal ) / 2 ) ] )
359+
else:
360+
medianVal = lstVal[ int( ( nVal + 1 ) / 2 ) ]
361+
lstStats = []
362+
lstStats.append( self.tr( "Mean:" ) + unicode( meanVal ) )
363+
lstStats.append( self.tr( "StdDev:" ) + unicode( stdVal ) )
364+
lstStats.append( self.tr( "Sum:" ) + unicode( sumVal) )
365+
lstStats.append( self.tr( "Min:" ) + unicode( minVal ) )
366+
lstStats.append( self.tr( "Max:" ) + unicode( maxVal ) )
367+
lstStats.append( self.tr( "N:" ) + unicode( nVal ) )
368+
lstStats.append( self.tr( "CV:" ) + unicode( cvVal ) )
369+
lstStats.append( self.tr( "Number of unique values:" ) + unicode( uniqueVal ) )
370+
lstStats.append( self.tr( "Range:" ) + unicode( rangeVal ) )
371+
lstStats.append( self.tr( "Median:" ) + unicode( medianVal ) )
372+
return ( lstStats, [] )
373+
else:
374+
return ( ["Error:No features selected!"], [] )
369375

370376
def nearest_neighbour_analysis( self, vlayer ):
371377
vprovider = vlayer.dataProvider()

0 commit comments

Comments
 (0)