@@ -56,24 +56,22 @@ def __init__(self, iface):
56
56
# populate layer list
57
57
self .progressBar .setValue (0 )
58
58
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 )
64
62
65
63
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 )
68
66
self .inField .clear ()
69
67
for i in changedField :
70
68
self .inField .addItem (unicode (changedField [i ].name ()))
71
69
72
70
def jupdate (self ):
73
71
inputLayer = self .joinShape .currentText ()
74
72
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 )
77
75
self .joinField .clear ()
78
76
for i in changedField :
79
77
self .joinField .addItem (unicode (changedField [i ].name ()))
@@ -103,18 +101,12 @@ def accept(self):
103
101
useTable = True
104
102
joinField = self .joinField .currentText ()
105
103
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 )
112
104
self .compute (inName , inField , joinName , joinField , outPath , keep , useTable , self .progressBar )
113
105
self .outShape .clear ()
114
106
addToTOC = QMessageBox .question (self , self .tr ("Join Attributes" ), self .tr ("Created output shapefile:\n %1\n \n Would you like to add the new layer to the TOC?" ).arg ( unicode (self .shapefileName ) ), QMessageBox .Yes , QMessageBox .No , QMessageBox .NoButton )
115
107
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 ) ) )
118
110
self .progressBar .setValue (0 )
119
111
120
112
def outFile (self ):
@@ -152,11 +144,11 @@ def updateTableFields(self):
152
144
table = None
153
145
154
146
def compute (self , inName , inField , joinName , joinField , outName , keep , useTable , progressBar ):
155
- layer1 = self .getVectorLayerByName (inName )
147
+ layer1 = ftools_utils .getVectorLayerByName (inName )
156
148
provider1 = layer1 .dataProvider ()
157
149
allAttrs = provider1 .attributeIndexes ()
158
150
provider1 .select (allAttrs )
159
- fieldList1 = self .getFieldList (layer1 ).values ()
151
+ fieldList1 = ftools_utils .getFieldList (layer1 ).values ()
160
152
index1 = provider1 .fieldNameIndex (inField )
161
153
if useTable :
162
154
f = open (unicode (joinName ), 'rb' )
@@ -168,11 +160,11 @@ def compute(self, inName, inField, joinName, joinField, outName, keep, useTable,
168
160
table = map (lambda f : map (func , f ), table )
169
161
170
162
else :
171
- layer2 = self .getVectorLayerByName (joinName )
163
+ layer2 = ftools_utils .getVectorLayerByName (joinName )
172
164
provider2 = layer2 .dataProvider ()
173
165
allAttrs = provider2 .attributeIndexes ()
174
166
provider2 .select (allAttrs )
175
- fieldList2 = self .getFieldList (layer2 )
167
+ fieldList2 = ftools_utils .getFieldList (layer2 )
176
168
index2 = provider2 .fieldNameIndex (joinField )
177
169
fieldList2 = self .testForUniqueness (fieldList1 , fieldList2 .values ())
178
170
seq = range (0 , len (fieldList1 ) + len (fieldList2 ))
@@ -185,7 +177,6 @@ def compute(self, inName, inField, joinName, joinField, outName, keep, useTable,
185
177
if not QgsVectorFileWriter .deleteShapeFile (self .shapefileName ):
186
178
return
187
179
writer = QgsVectorFileWriter (self .shapefileName , self .encoding , fieldList1 , provider1 .geometryType (), sRs )
188
-
189
180
inFeat = QgsFeature ()
190
181
outFeat = QgsFeature ()
191
182
joinFeat = QgsFeature ()
@@ -196,7 +187,7 @@ def compute(self, inName, inField, joinName, joinField, outName, keep, useTable,
196
187
count = 0
197
188
provider1 .rewind ()
198
189
while provider1 .nextFeature (inFeat ):
199
- inGeom = inFeat .geometry ()
190
+ inGeom = QgsGeometry ( inFeat .geometry () )
200
191
atMap1 = inFeat .attributeMap ()
201
192
outFeat .setAttributeMap (atMap1 )
202
193
outFeat .setGeometry (inGeom )
@@ -265,45 +256,10 @@ def testForUniqueness(self, fieldList1, fieldList2):
265
256
for i in fieldList1 :
266
257
for j in fieldList2 :
267
258
if j .name () == i .name ():
268
- j = self .createUniqueFieldName (j )
259
+ j = ftools_utils .createUniqueFieldName (j )
269
260
changed = True
270
261
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" ))
299
262
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
307
263
def dbfreader (self , f ):
308
264
"""Returns an iterator over records in a Xbase DBF file.
309
265
0 commit comments