Skip to content

Commit 7bfbb76

Browse files
author
cfarmer
committedMar 8, 2010
Basic statistics tool should no longer crash with PostGIS layers. Also adds support for varchar, char, and text fields (PostGIS layers). Should fix #2510
git-svn-id: http://svn.osgeo.org/qgis/trunk@13028 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent f0e23e3 commit 7bfbb76

File tree

2 files changed

+57
-57
lines changed

2 files changed

+57
-57
lines changed
 

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

Lines changed: 37 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# -*- coding: utf-8 -*-
12
from PyQt4.QtCore import *
23
from PyQt4.QtGui import *
34
from qgis.core import *
@@ -17,7 +18,7 @@ def __init__( self, iface, function ):
1718
self.cancel_close = self.buttonBox_2.button( QDialogButtonBox.Close )
1819
self.progressBar.setValue( 0 )
1920
self.partProgressBar.setValue( 0 )
20-
self.partProgressBar.setEnabled( False )
21+
self.partProgressBar.setVisible( False )
2122

2223
def keyPressEvent( self, e ):
2324
'''
@@ -27,11 +28,11 @@ def keyPressEvent( self, e ):
2728
selection = self.lstUnique.selectedItems()
2829
items = QString()
2930
if self.myFunction in ( 1, 2 ):
30-
for rec in range( self.tblUnique.rowCount() ):
31-
items.append( self.tblUnique.item( rec, 0 ).text() + "\n" )
31+
for rec in range( self.tblUnique.rowCount() ):
32+
items.append( self.tblUnique.item( rec, 0 ).text() + "\n" )
3233
else:
33-
for rec in range( self.tblUnique.rowCount() ):
34-
items.append( self.tblUnique.item( rec, 0 ).text() + ":" + self.tblUnique.item( rec, 1 ).text() + "\n" )
34+
for rec in range( self.tblUnique.rowCount() ):
35+
items.append( self.tblUnique.item( rec, 0 ).text() + ":" + self.tblUnique.item( rec, 1 ).text() + "\n" )
3536
if not items.isEmpty():
3637
clip_board = QApplication.clipboard()
3738
clip_board.setText( items )
@@ -125,26 +126,25 @@ def cancelThread( self ):
125126

126127
def runFinishedFromThread( self, output ):
127128
self.testThread.stop()
128-
129129
result = output[ 0 ]
130130
numRows = len( result )
131131
self.tblUnique.setRowCount( numRows )
132132
if self.myFunction in ( 1, 2 ):
133133
self.tblUnique.setColumnCount( 1 )
134134
for rec in range( numRows ):
135-
item = QTableWidgetItem( result[ rec ] )
136-
self.tblUnique.setItem( rec, 0, item )
135+
item = QTableWidgetItem( result[ rec ] )
136+
self.tblUnique.setItem( rec, 0, item )
137137
else:
138138
self.tblUnique.setColumnCount( 2 )
139139
for rec in range( numRows ):
140-
tmp = result[ rec ].split( ":" )
141-
item = QTableWidgetItem( tmp[ 0 ] )
142-
self.tblUnique.setItem( rec, 0, item )
143-
item = QTableWidgetItem( tmp[ 1 ] )
144-
self.tblUnique.setItem( rec, 1, item )
145-
self.tblUnique.setHorizontalHeaderLabels( [ self.tr("Parameter"), self.tr("Value") ] )
146-
self.tblUnique.horizontalHeader().setResizeMode( 1, QHeaderView.ResizeToContents )
147-
self.tblUnique.horizontalHeader().show()
140+
tmp = result[ rec ].split( ":" )
141+
item = QTableWidgetItem( tmp[ 0 ] )
142+
self.tblUnique.setItem( rec, 0, item )
143+
item = QTableWidgetItem( tmp[ 1 ] )
144+
self.tblUnique.setItem( rec, 1, item )
145+
self.tblUnique.setHorizontalHeaderLabels( [ self.tr("Parameter"), self.tr("Value") ] )
146+
self.tblUnique.horizontalHeader().setResizeMode( 1, QHeaderView.ResizeToContents )
147+
self.tblUnique.horizontalHeader().show()
148148
self.tblUnique.horizontalHeader().setResizeMode( 0, QHeaderView.Stretch )
149149
self.tblUnique.resizeRowsToContents()
150150

@@ -162,11 +162,11 @@ def runRangeFromThread( self, range_vals ):
162162
def runPartStatusFromThread( self, status ):
163163
self.partProgressBar.setValue( status )
164164
if status >= self.part_max:
165-
self.partProgressBar.setEnabled( False )
165+
self.partProgressBar.setVisible( False )
166166

167167
def runPartRangeFromThread( self, range_vals ):
168168
self.part_max = range_vals[ 1 ]
169-
self.partProgressBar.setEnabled( True )
169+
self.partProgressBar.setVisible( True )
170170
self.partProgressBar.setRange( range_vals[ 0 ], range_vals[ 1 ] )
171171

172172
class visualThread( QThread ):
@@ -230,7 +230,8 @@ def basic_statistics( self, vlayer, myField ):
230230
first = True
231231
nElement = 0
232232
# determine selected field type
233-
if ftools_utils.getFieldType( vlayer, myField ) == 'String':
233+
if ftools_utils.getFieldType( vlayer, myField ) in (
234+
'String', 'varchar', 'char', 'text'):
234235
fillVal = 0
235236
emptyVal = 0
236237
if self.mySelection: # only selected features
@@ -260,6 +261,7 @@ def basic_statistics( self, vlayer, myField ):
260261
nFeat = vprovider.featureCount()
261262
self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), 0 )
262263
self.emit( SIGNAL( "runRange(PyQt_PyObject)" ), ( 0, nFeat ) )
264+
vprovider.select( allAttrs )
263265
while vprovider.nextFeature( feat ):
264266
atMap = feat.attributeMap()
265267
lenVal = float( len( atMap[ index ].toString() ) )
@@ -290,14 +292,16 @@ def basic_statistics( self, vlayer, myField ):
290292
lstStats.append( self.tr( "N:" ) + unicode( nVal ) )
291293
return ( lstStats, [] )
292294
else: # numeric field
293-
stdVal = 0
294-
cvVal = 0
295-
rangeVal = 0
296-
medianVal = 0
295+
stdVal = 0.00
296+
cvVal = 0.00
297+
rangeVal = 0.00
298+
medianVal = 0.00
299+
maxVal = 0.00
300+
minVal = 0.00
297301
if self.mySelection: # only selected features
298302
selection = vlayer.selectedFeatures()
299303
nFeat = vlayer.selectedFeatureCount()
300-
uniqueVal = ftools_utils.getUniqueValuesCount( vlayer, index, True )
304+
uniqueVal = ftools_utils.getUniqueValuesCount( vlayer, index, True )
301305
self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), 0 )
302306
self.emit( SIGNAL( "runRange(PyQt_PyObject)" ), ( 0, nFeat ) )
303307
for f in selection:
@@ -316,9 +320,10 @@ def basic_statistics( self, vlayer, myField ):
316320
self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), nElement )
317321
else: # there is no selection, process the whole layer
318322
nFeat = vprovider.featureCount()
319-
uniqueVal = ftools_utils.getUniqueValuesCount( vlayer, index, False )
323+
uniqueVal = ftools_utils.getUniqueValuesCount( vlayer, index, False )
320324
self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), 0 )
321325
self.emit( SIGNAL( "runRange(PyQt_PyObject)" ), ( 0, nFeat ) )
326+
vprovider.select( allAttrs )
322327
while vprovider.nextFeature( feat ):
323328
atMap = feat.attributeMap()
324329
value = float( atMap[ index ].toDouble()[ 0 ] )
@@ -343,12 +348,12 @@ def basic_statistics( self, vlayer, myField ):
343348
stdVal = math.sqrt( stdVal / nVal )
344349
cvVal = stdVal / meanVal
345350
if nVal > 1:
346-
lstVal = values
347-
lstVal.sort()
348-
if ( nVal % 2 ) == 0:
349-
medianVal = 0.5 * ( lstVal[ int( ( nVal - 1 ) / 2 ) ] + lstVal[ int( ( nVal ) / 2 ) ] )
350-
else:
351-
medianVal = lstVal[ int( ( nVal + 1 ) / 2 ) ]
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 ) ]
352357
lstStats = []
353358
lstStats.append( self.tr( "Mean:" ) + unicode( meanVal ) )
354359
lstStats.append( self.tr( "StdDev:" ) + unicode( stdVal ) )
@@ -411,6 +416,7 @@ def check_geometry( self, vlayer ):
411416
nElement = 0
412417
self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), 0 )
413418
self.emit( SIGNAL( "runRange(PyQt_PyObject)" ), ( 0, nFeat ) )
419+
414420
while vprovider.nextFeature( feat ):
415421
geom = QgsGeometry( feat.geometry() )
416422
nElement += 1

‎python/plugins/fTools/tools/frmVisual.ui

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,17 @@
3434
</item>
3535
</layout>
3636
</item>
37+
<item row="3" column="0">
38+
<layout class="QVBoxLayout" name="verticalLayout">
39+
<item>
40+
<widget class="QCheckBox" name="useSelected">
41+
<property name="text">
42+
<string>Use only selected features</string>
43+
</property>
44+
</widget>
45+
</item>
46+
</layout>
47+
</item>
3748
<item row="4" column="0" colspan="2">
3849
<layout class="QVBoxLayout">
3950
<item>
@@ -114,16 +125,15 @@
114125
</item>
115126
</layout>
116127
</item>
117-
<item row="3" column="0">
118-
<layout class="QVBoxLayout" name="verticalLayout">
119-
<item>
120-
<widget class="QCheckBox" name="useSelected">
121-
<property name="text">
122-
<string>Use only selected features</string>
123-
</property>
124-
</widget>
125-
</item>
126-
</layout>
128+
<item row="9" column="0">
129+
<widget class="QProgressBar" name="progressBar">
130+
<property name="value">
131+
<number>24</number>
132+
</property>
133+
<property name="alignment">
134+
<set>Qt::AlignCenter</set>
135+
</property>
136+
</widget>
127137
</item>
128138
<item row="8" column="1" rowspan="2">
129139
<widget class="QDialogButtonBox" name="buttonBox_2">
@@ -135,27 +145,11 @@
135145
</property>
136146
</widget>
137147
</item>
138-
<item row="9" column="0">
139-
<widget class="QProgressBar" name="progressBar">
140-
<property name="value">
141-
<number>24</number>
142-
</property>
143-
<property name="alignment">
144-
<set>Qt::AlignCenter</set>
145-
</property>
146-
</widget>
147-
</item>
148148
<item row="8" column="0">
149149
<widget class="QProgressBar" name="partProgressBar">
150-
<property name="enabled">
151-
<bool>false</bool>
152-
</property>
153150
<property name="value">
154151
<number>24</number>
155152
</property>
156-
<property name="alignment">
157-
<set>Qt::AlignCenter</set>
158-
</property>
159153
</widget>
160154
</item>
161155
</layout>

0 commit comments

Comments
 (0)
Please sign in to comment.