Skip to content

Commit 24ba030

Browse files
author
cfarmer
committed
Large commit with several related bug fixes:
1) All fTools functions should now add all layers to dropdowns (including non-visible layers), 2) All fTools functions should now be non-modal 3) Several fTools functions have been spead up slightly 4) Where possible, internal (cpp) functions have be used to replace older Python functions 5) Defining projections now also considers .qpj files Fixes bugs #2502 and #2506, and possibly others? git-svn-id: http://svn.osgeo.org/qgis/trunk@13037 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 63c3671 commit 24ba030

16 files changed

+671
-971
lines changed

python/plugins/fTools/tools/doDefineProj.py

+10-2
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,13 @@ def __init__(self, iface):
3030
self.cmbLayer.addItems(layers)
3131

3232
def updateProj1(self, layerName):
33+
self.inRef.clear()
3334
tempLayer = ftools_utils.getVectorLayerByName(layerName)
3435
crs = tempLayer.dataProvider().crs().toProj4()
3536
self.inRef.insert(unicode(crs))
3637

3738
def updateProj2(self, layerName):
39+
self.outRef.clear()
3840
tempLayer = ftools_utils.getVectorLayerByName(layerName)
3941
crs = tempLayer.dataProvider().crs().toProj4()
4042
self.outRef.insert(unicode(crs))
@@ -82,11 +84,17 @@ def accept(self):
8284
outputFile = QFile( inPath + ".prj" )
8385
outputFile.open( QIODevice.WriteOnly | QIODevice.Text )
8486
outputPrj = QTextStream( outputFile )
85-
self.progressBar.setValue(70)
8687
outputPrj << outputWkt
87-
self.progressBar.setValue(75)
8888
outputPrj.flush()
8989
outputFile.close()
90+
self.progressBar.setValue(70)
91+
checkFile = QFile( inPath + ".qpj" )
92+
if checkFile.exists():
93+
checkFile.open( QIODevice.WriteOnly | QIODevice.Text )
94+
outputPrj = QTextStream( checkFile )
95+
outputPrj << outputWkt
96+
outputPrj.flush()
97+
checkFile.close()
9098
self.progressBar.setValue(95)
9199
vLayer.setCrs(srsDefine)
92100
self.progressBar.setValue(100)

python/plugins/fTools/tools/doJoinAttributes.py

+15-59
Original file line numberDiff line numberDiff line change
@@ -56,24 +56,22 @@ def __init__(self, iface):
5656
# populate layer list
5757
self.progressBar.setValue(0)
5858
mapCanvas = self.iface.mapCanvas()
59-
for i in range(mapCanvas.layerCount()):
60-
layer = mapCanvas.layer(i)
61-
if layer.type() == layer.VectorLayer:
62-
self.inShape.addItem(layer.name())
63-
self.joinShape.addItem(layer.name())
59+
layers = ftools_utils.getLayerNames([QGis.Point, QGis.Line, QGis.Polygon])
60+
self.inShape.addItems(layers)
61+
self.joinShape.addItems(layers)
6462

6563
def iupdate(self, inputLayer):
66-
changedLayer = self.getVectorLayerByName(unicode(inputLayer))
67-
changedField = self.getFieldList(changedLayer)
64+
changedLayer = ftools_utils.getVectorLayerByName(unicode(inputLayer))
65+
changedField = ftools_utils.getFieldList(changedLayer)
6866
self.inField.clear()
6967
for i in changedField:
7068
self.inField.addItem(unicode(changedField[i].name()))
7169

7270
def jupdate(self):
7371
inputLayer = self.joinShape.currentText()
7472
if inputLayer != "":
75-
changedLayer = self.getVectorLayerByName(unicode(inputLayer))
76-
changedField = self.getFieldList(changedLayer)
73+
changedLayer = ftools_utils.getVectorLayerByName(unicode(inputLayer))
74+
changedField = ftools_utils.getFieldList(changedLayer)
7775
self.joinField.clear()
7876
for i in changedField:
7977
self.joinField.addItem(unicode(changedField[i].name()))
@@ -103,18 +101,12 @@ def accept(self):
103101
useTable = True
104102
joinField = self.joinField.currentText()
105103
outPath = self.outShape.text()
106-
if outPath.contains("\\"):
107-
outName = outPath.right((outPath.length() - outPath.lastIndexOf("\\")) - 1)
108-
else:
109-
outName = outPath.right((outPath.length() - outPath.lastIndexOf("/")) - 1)
110-
if outName.endsWith(".shp"):
111-
outName = outName.left(outName.length() - 4)
112104
self.compute(inName, inField, joinName, joinField, outPath, keep, useTable, self.progressBar)
113105
self.outShape.clear()
114106
addToTOC = QMessageBox.question(self, self.tr("Join Attributes"), self.tr("Created output shapefile:\n%1\n\nWould you like to add the new layer to the TOC?").arg( unicode(self.shapefileName) ), QMessageBox.Yes, QMessageBox.No, QMessageBox.NoButton)
115107
if addToTOC == QMessageBox.Yes:
116-
vlayer = QgsVectorLayer(self.shapefileName, outName, "ogr")
117-
QgsMapLayerRegistry.instance().addMapLayer(vlayer)
108+
if not ftools_utils.addShapeToCanvas( unicode( outPath ) ):
109+
QMessageBox.warning( self, self.tr("Geoprocessing"), self.tr( "Error loading output shapefile:\n%1" ).arg( unicode( outPath ) ))
118110
self.progressBar.setValue(0)
119111

120112
def outFile(self):
@@ -152,11 +144,11 @@ def updateTableFields(self):
152144
table = None
153145

154146
def compute(self, inName, inField, joinName, joinField, outName, keep, useTable, progressBar):
155-
layer1 = self.getVectorLayerByName(inName)
147+
layer1 = ftools_utils.getVectorLayerByName(inName)
156148
provider1 = layer1.dataProvider()
157149
allAttrs = provider1.attributeIndexes()
158150
provider1.select(allAttrs)
159-
fieldList1 = self.getFieldList(layer1).values()
151+
fieldList1 = ftools_utils.getFieldList(layer1).values()
160152
index1 = provider1.fieldNameIndex(inField)
161153
if useTable:
162154
f = open(unicode(joinName), 'rb')
@@ -168,11 +160,11 @@ def compute(self, inName, inField, joinName, joinField, outName, keep, useTable,
168160
table = map(lambda f: map(func, f), table)
169161

170162
else:
171-
layer2 = self.getVectorLayerByName(joinName)
163+
layer2 = ftools_utils.getVectorLayerByName(joinName)
172164
provider2 = layer2.dataProvider()
173165
allAttrs = provider2.attributeIndexes()
174166
provider2.select(allAttrs)
175-
fieldList2 = self.getFieldList(layer2)
167+
fieldList2 = ftools_utils.getFieldList(layer2)
176168
index2 = provider2.fieldNameIndex(joinField)
177169
fieldList2 = self.testForUniqueness(fieldList1, fieldList2.values())
178170
seq = range(0, len(fieldList1) + len(fieldList2))
@@ -185,7 +177,6 @@ def compute(self, inName, inField, joinName, joinField, outName, keep, useTable,
185177
if not QgsVectorFileWriter.deleteShapeFile(self.shapefileName):
186178
return
187179
writer = QgsVectorFileWriter(self.shapefileName, self.encoding, fieldList1, provider1.geometryType(), sRs)
188-
189180
inFeat = QgsFeature()
190181
outFeat = QgsFeature()
191182
joinFeat = QgsFeature()
@@ -196,7 +187,7 @@ def compute(self, inName, inField, joinName, joinField, outName, keep, useTable,
196187
count = 0
197188
provider1.rewind()
198189
while provider1.nextFeature(inFeat):
199-
inGeom = inFeat.geometry()
190+
inGeom = QgsGeometry(inFeat.geometry())
200191
atMap1 = inFeat.attributeMap()
201192
outFeat.setAttributeMap(atMap1)
202193
outFeat.setGeometry(inGeom)
@@ -265,45 +256,10 @@ def testForUniqueness(self, fieldList1, fieldList2):
265256
for i in fieldList1:
266257
for j in fieldList2:
267258
if j.name() == i.name():
268-
j = self.createUniqueFieldName(j)
259+
j = ftools_utils.createUniqueFieldName(j)
269260
changed = True
270261
return fieldList2
271-
272-
def createUniqueFieldName(self, field):
273-
check = field.name().right(2)
274-
if check.startsWith("_"):
275-
(val,test) = check.right(1).toInt()
276-
if test:
277-
if val < 2:
278-
val = 2
279-
else:
280-
val = val + 1
281-
field.setName(field.name().left(len(field.name())-1) + unicode(val))
282-
else:
283-
field.setName(field.name() + "_2")
284-
else:
285-
field.setName(field.name() + "_2")
286-
return field
287-
288-
def getVectorLayerByName(self, myName):
289-
mc = self.iface.mapCanvas()
290-
nLayers = mc.layerCount()
291-
for l in range(nLayers):
292-
layer = mc.layer(l)
293-
if layer.name() == unicode(myName):
294-
vlayer = QgsVectorLayer(unicode(layer.source()), unicode(myName), unicode(layer.dataProvider().name()))
295-
if vlayer.isValid():
296-
return vlayer
297-
else:
298-
QMessageBox.information(self, self.tr("Join Attributes"), self.tr("Vector layer is not valid"))
299262

300-
def getFieldList(self, vlayer):
301-
fProvider = vlayer.dataProvider()
302-
feat = QgsFeature()
303-
allAttrs = fProvider.attributeIndexes()
304-
fProvider.select(allAttrs)
305-
myFields = fProvider.fields()
306-
return myFields
307263
def dbfreader(self, f):
308264
"""Returns an iterator over records in a Xbase DBF file.
309265

python/plugins/fTools/tools/doMeanCoords.py

+2-4
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,8 @@ def __init__(self, iface, function):
1919
# populate layer list
2020
self.progressBar.setValue(0)
2121
mapCanvas = self.iface.mapCanvas()
22-
for i in range(mapCanvas.layerCount()):
23-
layer = mapCanvas.layer(i)
24-
if layer.type() == layer.VectorLayer:
25-
self.inShape.addItem(layer.name())
22+
layers = ftools_utils.getLayerNames([QGis.Point, QGis.Line, QGis.Polygon])
23+
self.inShape.addItems(layers)
2624

2725
def updateUi(self):
2826
if self.function == 1:

python/plugins/fTools/tools/doPointsInPolygon.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ def compute(self, inPoly, inPts, inField, outPath, progressBar):
104104
index = polyProvider.fieldNameIndex(unicode(inField))
105105
if index == -1:
106106
index = polyProvider.fieldCount()
107-
field = QgsField(unicode(inField), QVariant.Int, "real", 24, 15, self.tr("point count field"))
107+
field = QgsField(unicode(inField), QVariant.Double, "real", 24, 15, self.tr("point count field"))
108108
fieldList[index] = field
109109
sRs = polyProvider.crs()
110110
check = QFile(self.shapefileName)

python/plugins/fTools/tools/doRandPoints.py

+6-40
Original file line numberDiff line numberDiff line change
@@ -49,22 +49,20 @@ def __init__(self, iface):
4949
self.progressBar.setValue(0)
5050
self.setWindowTitle(self.tr("Random Points"))
5151
self.mapCanvas = self.iface.mapCanvas()
52-
for i in range(self.mapCanvas.layerCount()):
53-
layer = self.mapCanvas.layer(i)
54-
if (layer.type() == layer.VectorLayer and layer.geometryType() == QGis.Polygon) or layer.type() == layer.RasterLayer:
55-
self.inShape.addItem(layer.name())
52+
layers = ftools_utils.getLayerNames([QGis.Polygon, "Raster"])
53+
self.inShape.addItems(layers)
5654

5755
# If input layer is changed, update field list
5856
def update(self, inputLayer):
5957
self.cmbField.clear()
60-
changedLayer = self.getMapLayerByName(inputLayer)
58+
changedLayer = ftools_utils.getMapLayerByName(unicode(inputLayer))
6159
if changedLayer.type() == changedLayer.VectorLayer:
6260
self.rdoStratified.setEnabled(True)
6361
self.rdoDensity.setEnabled(True)
6462
self.rdoField.setEnabled(True)
6563
self.label_4.setEnabled(True)
66-
changedLayer = self.getVectorLayerByName(inputLayer)
67-
changedFields = self.getFieldList(changedLayer)
64+
changedLayer = ftools_utils.getVectorLayerByName(inputLayer)
65+
changedFields = ftools_utils.getFieldList(changedLayer)
6866
for i in changedFields:
6967
self.cmbField.addItem(unicode(changedFields[i].name()))
7068
else:
@@ -95,7 +93,7 @@ def accept(self):
9593
if outName.endsWith(".shp"):
9694
outName = outName.left(outName.length() - 4)
9795
self.progressBar.setValue(5)
98-
mLayer = self.getMapLayerByName(unicode(inName))
96+
mLayer = ftools_utils.getMapLayerByName(unicode(inName))
9997
if mLayer.type() == mLayer.VectorLayer:
10098
inLayer = QgsVectorLayer(unicode(mLayer.source()), unicode(mLayer.name()), unicode(mLayer.dataProvider().name()))
10199
if self.rdoUnstratified.isChecked():
@@ -174,38 +172,6 @@ def simpleRandom(self, n, bound, xmin, xmax, ymin, ymax):
174172
count = count + add
175173
self.progressBar.setValue(count)
176174
return points
177-
178-
# Get vector layer by name from TOC
179-
def getVectorLayerByName(self, myName):
180-
mc = self.mapCanvas
181-
nLayers = mc.layerCount()
182-
for l in range(nLayers):
183-
layer = mc.layer(l)
184-
if layer.name() == unicode(myName):
185-
vlayer = QgsVectorLayer(unicode(layer.source()), unicode(myName), unicode(layer.dataProvider().name()))
186-
if vlayer.isValid():
187-
return vlayer
188-
else:
189-
QMessageBox.information(self, self.tr("Random Points"), self.tr("Vector layer is not valid"))
190-
191-
# Get map layer by name from TOC
192-
def getMapLayerByName(self, myName):
193-
mc = self.mapCanvas
194-
nLayers = mc.layerCount()
195-
for l in range(nLayers):
196-
layer = mc.layer(l)
197-
if layer.name() == unicode(myName):
198-
if layer.isValid():
199-
return layer
200-
# Retrieve the field map of a vector Layer
201-
def getFieldList(self, vlayer):
202-
fProvider = vlayer.dataProvider()
203-
feat = QgsFeature()
204-
allAttrs = fProvider.attributeIndexes()
205-
fProvider.select(allAttrs)
206-
myFields = fProvider.fields()
207-
return myFields
208-
209175

210176
def randomize(self, inLayer, outPath, minimum, design, value):
211177
outFeat = QgsFeature()

python/plugins/fTools/tools/doRandom.py

+6-18
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1+
# -*- coding: utf-8 -*-
12
from PyQt4.QtCore import *
23
from PyQt4.QtGui import *
34

45
from qgis.core import *
5-
6+
import ftools_utils
67
from ui_frmRandom import Ui_Dialog
78
import random
89
class Dialog(QDialog, Ui_Dialog):
@@ -16,13 +17,11 @@ def __init__(self, iface):
1617
# populate layer list
1718
self.progressBar.setValue(0)
1819
mapCanvas = self.iface.mapCanvas()
19-
for i in range(mapCanvas.layerCount()):
20-
layer = mapCanvas.layer(i)
21-
if layer.type() == layer.VectorLayer:
22-
self.inShape.addItem(layer.name())
20+
layers = ftools_utils.getLayerNames([QGis.Point, QGis.Line, QGis.Polygon])
21+
self.inShape.addItems(layers)
2322

2423
def changed(self, inputLayer):
25-
changedLayer = self.getVectorLayerByName(inputLayer)
24+
changedLayer = ftools_utils.getVectorLayerByName(inputLayer)
2625
changedProvider = changedLayer.dataProvider()
2726
upperVal = changedProvider.featureCount()
2827
self.spnNumber.setMaximum(upperVal)
@@ -34,7 +33,7 @@ def accept(self):
3433
self.progressBar.setValue(10)
3534
inName = self.inShape.currentText()
3635
self.progressBar.setValue(20)
37-
layer = self.getVectorLayerByName(inName)
36+
layer = ftools_utils.getVectorLayerByName(inName)
3837
self.progressBar.setValue(30)
3938
if self.rdoNumber.isChecked():
4039
value = self.spnNumber.value()
@@ -51,14 +50,3 @@ def accept(self):
5150
self.progressBar.setValue(100)
5251
layer.setSelectedFeatures(selran)
5352
self.progressBar.setValue(0)
54-
55-
#Gets vector layer by layername in canvas
56-
#Return: QgsVectorLayer
57-
def getVectorLayerByName(self, myName):
58-
mc = self.iface.mapCanvas()
59-
nLayers = mc.layerCount()
60-
for l in range(nLayers):
61-
layer = mc.layer(l)
62-
if layer.name() == unicode(myName):
63-
if layer.isValid():
64-
return layer

0 commit comments

Comments
 (0)