@@ -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 \n Would 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
0 commit comments