26
26
__revision__ = '$Format:%H$'
27
27
28
28
import os
29
+ from collections import defaultdict
29
30
30
31
from qgis .PyQt .QtGui import QIcon
31
32
36
37
from processing .core .GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
37
38
from processing .core .parameters import ParameterVector
38
39
from processing .core .parameters import ParameterBoolean
39
- from processing .core .parameters import ParameterTableField
40
+ from processing .core .parameters import ParameterTableMultipleField
40
41
from processing .core .outputs import OutputVector
41
42
from processing .tools import vector , dataobjects
42
43
@@ -60,14 +61,14 @@ def defineCharacteristics(self):
60
61
self .tr ('Input layer' ),
61
62
[ParameterVector .VECTOR_TYPE_POLYGON , ParameterVector .VECTOR_TYPE_LINE ]))
62
63
self .addParameter (ParameterBoolean (Dissolve .DISSOLVE_ALL ,
63
- self .tr ('Dissolve all (do not use field )' ), True ))
64
- self .addParameter (ParameterTableField (Dissolve .FIELD ,
65
- self .tr ('Unique ID field ' ), Dissolve .INPUT , optional = True ))
64
+ self .tr ('Dissolve all (do not use fields )' ), True ))
65
+ self .addParameter (ParameterTableMultipleField (Dissolve .FIELD ,
66
+ self .tr ('Unique ID fields ' ), Dissolve .INPUT , optional = True ))
66
67
self .addOutput (OutputVector (Dissolve .OUTPUT , self .tr ('Dissolved' )))
67
68
68
69
def processAlgorithm (self , progress ):
69
70
useField = not self .getParameterValue (Dissolve .DISSOLVE_ALL )
70
- fieldname = self .getParameterValue (Dissolve .FIELD )
71
+ field_names = self .getParameterValue (Dissolve .FIELD )
71
72
vlayerA = dataobjects .getObjectFromUri (
72
73
self .getParameterValue (Dissolve .INPUT ))
73
74
fields = vlayerA .fields ()
@@ -124,20 +125,16 @@ def processAlgorithm(self, progress):
124
125
outFeat .setAttributes (attrs )
125
126
writer .addFeature (outFeat )
126
127
else :
127
- fieldIdx = vlayerA .fieldNameIndex (fieldname )
128
- unique = vector .getUniqueValues (vlayerA , int (fieldIdx ))
129
- nFeat = len (unique )
130
- myDict = {}
131
- attrDict = {}
132
- for item in unique :
133
- myDict [unicode (item ).strip ()] = []
134
- attrDict [unicode (item ).strip ()] = None
128
+ field_indexes = [vlayerA .fieldNameIndex (f ) for f in field_names .split (';' )]
135
129
136
- unique = None
130
+ attribute_dict = {}
131
+ geometry_dict = defaultdict (lambda : [])
137
132
138
133
for inFeat in features :
139
134
attrs = inFeat .attributes ()
140
- tempItem = attrs [fieldIdx ]
135
+
136
+ index_attrs = tuple ([attrs [i ] for i in field_indexes ])
137
+
141
138
tmpInGeom = QgsGeometry (inFeat .geometry ())
142
139
if tmpInGeom .isGeosEmpty ():
143
140
continue
@@ -151,16 +148,17 @@ def processAlgorithm(self, progress):
151
148
'geometry: ' )
152
149
+ error .what ())
153
150
154
- if attrDict [ unicode ( tempItem ). strip ()] is None :
151
+ if not index_attrs in attribute_dict :
155
152
# keep attributes of first feature
156
- attrDict [ unicode ( tempItem ). strip () ] = attrs
153
+ attribute_dict [ index_attrs ] = attrs
157
154
158
- myDict [ unicode ( tempItem ). strip () ].append (tmpInGeom )
155
+ geometry_dict [ index_attrs ].append (tmpInGeom )
159
156
160
- features = None
157
+ nFeat = len ( attribute_dict )
161
158
162
159
nElement = 0
163
- for key , value in myDict .items ():
160
+ for key , value in geometry_dict .items ():
161
+ outFeat = QgsFeature ()
164
162
nElement += 1
165
163
progress .setPercentage (int (nElement * 100 / nFeat ))
166
164
try :
@@ -169,7 +167,7 @@ def processAlgorithm(self, progress):
169
167
raise GeoAlgorithmExecutionException (
170
168
self .tr ('Geometry exception while dissolving' ))
171
169
outFeat .setGeometry (tmpOutGeom )
172
- outFeat .setAttributes (attrDict [key ])
170
+ outFeat .setAttributes (attribute_dict [key ])
173
171
writer .addFeature (outFeat )
174
172
175
173
del writer
0 commit comments