Skip to content

Commit 17423d4

Browse files
author
volayaf@gmail.com
committed
fixed #6221 (single to multiparts)
adapted SEXTANTE native algs to be able to handle all kinds of vector outputs git-svn-id: http://sextante.googlecode.com/svn/trunk/soft/bindings/qgis-plugin@354 881b9c09-3ef8-f3c2-ec3d-21d735c97f4d
1 parent 13e6dcb commit 17423d4

9 files changed

+46
-37
lines changed

src/sextante/algs/AddTableField.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,14 @@ def defineCharacteristics(self):
3434
def processAlgorithm(self, progress):
3535
fieldtype = self.getParameterValue(self.FIELD_TYPE)
3636
fieldname = self.getParameterValue(self.FIELD_NAME)
37-
settings = QSettings()
38-
systemEncoding = settings.value( "/UI/encoding", "System" ).toString()
39-
output = self.getOutputValue(self.OUTPUT_LAYER)
37+
output = self.getOutputFromName(self.OUTPUT_LAYER)
4038
vlayer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT_LAYER))
4139
vprovider = vlayer.dataProvider()
4240
allAttrs = vprovider.attributeIndexes()
4341
vprovider.select( allAttrs )
4442
fields = vprovider.fields()
4543
fields[len(fields)] = QgsField(fieldname, self.TYPES[fieldtype])
46-
writer = QgsVectorFileWriter( output, systemEncoding,fields, vprovider.geometryType(), vprovider.crs() )
44+
writer = output.getVectorWriter(fields, vprovider.geometryType(), vprovider.crs() )
4745
inFeat = QgsFeature()
4846
outFeat = QgsFeature()
4947
inGeom = QgsGeometry()

src/sextante/algs/AutoincrementalField.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,14 @@ def getIcon(self):
1616
return QtGui.QIcon(os.path.dirname(__file__) + "/../images/toolbox.png")
1717

1818
def processAlgorithm(self, progress):
19-
settings = QSettings()
20-
systemEncoding = settings.value( "/UI/encoding", "System" ).toString()
21-
output = self.getOutputValue(self.OUTPUT)
19+
output = self.getOutputFromName(self.OUTPUT)
2220
vlayer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT))
2321
vprovider = vlayer.dataProvider()
2422
allAttrs = vprovider.attributeIndexes()
2523
vprovider.select( allAttrs )
2624
fields = vprovider.fields()
2725
fields[len(fields)] = QgsField("AUTO", QVariant.Int)
28-
writer = QgsVectorFileWriter( output, systemEncoding,fields, vprovider.geometryType(), vprovider.crs() )
26+
writer = output.getVectorWriter(fields, vprovider.geometryType(), vprovider.crs() )
2927
inFeat = QgsFeature()
3028
outFeat = QgsFeature()
3129
inGeom = QgsGeometry()

src/sextante/algs/EquivalentNumField.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,14 @@ def getIcon(self):
1919

2020
def processAlgorithm(self, progress):
2121
field_index = self.getParameterValue(self.FIELD)
22-
settings = QSettings()
23-
systemEncoding = settings.value( "/UI/encoding", "System" ).toString()
24-
output = self.getOutputValue(self.OUTPUT)
22+
output = self.getOutputFromName(self.OUTPUT)
2523
vlayer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT))
2624
vprovider = vlayer.dataProvider()
2725
allAttrs = vprovider.attributeIndexes()
2826
vprovider.select( allAttrs )
2927
fields = vprovider.fields()
3028
fields[len(fields)] = QgsField("NUM_FIELD", QVariant.Int)
31-
writer = QgsVectorFileWriter( output, systemEncoding,fields, vprovider.geometryType(), vprovider.crs() )
29+
writer = output.getVectorWriter(fields, vprovider.geometryType(), vprovider.crs() )
3230
inFeat = QgsFeature()
3331
outFeat = QgsFeature()
3432
inGeom = QgsGeometry()

src/sextante/algs/Explode.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,13 @@ def getIcon(self):
1717
return QtGui.QIcon(os.path.dirname(__file__) + "/../images/toolbox.png")
1818

1919
def processAlgorithm(self, progress):
20-
settings = QSettings()
21-
systemEncoding = settings.value( "/UI/encoding", "System" ).toString()
2220
vlayer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT))
23-
output = self.getOutputValue(self.OUTPUT)
21+
output = self.getOutputFromName(self.OUTPUT)
2422
vprovider = vlayer.dataProvider()
2523
allAttrs = vprovider.attributeIndexes()
2624
vprovider.select( allAttrs )
2725
fields = vprovider.fields()
28-
writer = QgsVectorFileWriter( output, systemEncoding,
29-
fields, QGis.WKBLineString, vprovider.crs() )
26+
writer = output.getVectorWriter(fields, QGis.WKBLineString, vprovider.crs() )
3027
inFeat = QgsFeature()
3128
outFeat = QgsFeature()
3229
inGeom = QgsGeometry()

src/sextante/algs/FieldPyculator.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ class FieldsPyculator(GeoAlgorithm):
1818
INPUT_LAYER = "INPUT_LAYER"
1919
USE_SELECTED = "USE_SELECTED"
2020
FIELD_NAME = "FIELD_NAME"
21-
#USE_GLOBAL = "USE_GLOBAL"
2221
GLOBAL = "GLOBAL"
2322
FORMULA = "FORMULA"
2423
OUTPUT_LAYER ="OUTPUT_LAYER"
@@ -33,7 +32,6 @@ def defineCharacteristics(self):
3332
self.addParameter(ParameterVector(self.INPUT_LAYER, "Input layer", ParameterVector.VECTOR_TYPE_ANY, False))
3433
self.addParameter(ParameterBoolean(self.USE_SELECTED, "Use only selected features", False))
3534
self.addParameter(ParameterString(self.FIELD_NAME, "Result field name", "NewField"))
36-
#self.addParameter(ParameterBoolean(self.USE_GLOBAL, "Use global expression", False))
3735
self.addParameter(ParameterString(self.GLOBAL, "Global expression", multiline = True))
3836
self.addParameter(ParameterString(self.FORMULA, "Formula", "value = ", multiline = True))
3937
self.addOutput(OutputVector(self.OUTPUT_LAYER, "Output layer"))
@@ -43,18 +41,17 @@ def processAlgorithm(self, progress):
4341
fieldname = self.getParameterValue(self.FIELD_NAME)
4442
code = self.getParameterValue(self.FORMULA)
4543
globalExpression = self.getParameterValue(self.GLOBAL)
46-
#useGlobal = self.getParameterValue(self.USE_GLOBAL)
4744
useSelected = self.getParameterValue(self.USE_SELECTED)
4845
settings = QSettings()
4946
systemEncoding = settings.value( "/UI/encoding", "System" ).toString()
50-
output = self.getOutputValue(self.OUTPUT_LAYER)
47+
output = self.getOutputFromName(self.OUTPUT_LAYER)
5148
layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT_LAYER))
5249
vprovider = layer.dataProvider()
5350
allAttrs = vprovider.attributeIndexes()
5451
vprovider.select( allAttrs )
5552
fields = vprovider.fields()
5653
fields[len(fields)] = QgsField(fieldname, QVariant.Double)
57-
writer = QgsVectorFileWriter( output, systemEncoding,fields, vprovider.geometryType(), vprovider.crs() )
54+
writer = output.getVectorWriter(fields, vprovider.geometryType(), vprovider.crs() )
5855
outFeat = QgsFeature()
5956
nFeatures = vprovider.featureCount()
6057
nElement = 0

src/sextante/algs/FieldsCalculator.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,14 @@ def defineCharacteristics(self):
3232
def processAlgorithm(self, progress):
3333
fieldname = self.getParameterValue(self.FIELD_NAME)
3434
formula = self.getParameterValue(self.FORMULA)
35-
settings = QSettings()
36-
systemEncoding = settings.value( "/UI/encoding", "System" ).toString()
37-
output = self.getOutputValue(self.OUTPUT_LAYER)
35+
output = self.getOutputFromName(self.OUTPUT_LAYER)
3836
vlayer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT_LAYER))
3937
vprovider = vlayer.dataProvider()
4038
allAttrs = vprovider.attributeIndexes()
4139
vprovider.select( allAttrs )
4240
fields = vprovider.fields()
4341
fields[len(fields)] = QgsField(fieldname, QVariant.Double)
44-
writer = QgsVectorFileWriter( output, systemEncoding,fields, vprovider.geometryType(), vprovider.crs() )
42+
writer = output.getVectorWriter(fields, vprovider.geometryType(), vprovider.crs() )
4543
inFeat = QgsFeature()
4644
outFeat = QgsFeature()
4745
inGeom = QgsGeometry()

src/sextante/algs/SaveSelectedFeatures.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def processAlgorithm(self, progress):
5050
#the first thing to do is retrieve the values of the parameters
5151
#entered by the user
5252
inputFilename = self.getParameterValue(self.INPUT_LAYER)
53-
output = self.getOutputValue(self.OUTPUT_LAYER)
53+
output = self.getOutputFromName(self.OUTPUT_LAYER)
5454

5555
#input layers values are always a string with its location.
5656
#That string can be converted into a QGIS object (a QgsVectorLayer in this case))
@@ -60,12 +60,10 @@ def processAlgorithm(self, progress):
6060
#And now we can process
6161

6262
#First we create the output layer.
63-
#The output value entered by the user is a string containing a filename,
64-
#so we can use it directly
65-
settings = QSettings()
66-
systemEncoding = settings.value( "/UI/encoding", "System" ).toString()
63+
#To do so, we call the getVectorWriter method in the Output object.
64+
#That will give as a SextanteVectorWriter, that we can later use to add features.
6765
provider = vectorLayer.dataProvider()
68-
writer = QgsVectorFileWriter( output, systemEncoding, provider.fields(), provider.geometryType(), provider.crs() )
66+
writer = output.getVectorWriter( provider.fields(), provider.geometryType(), provider.crs() )
6967

7068
#Now we take the selected features and add them to the output layer
7169
selection = vectorLayer.selectedFeatures()

src/sextante/ftools/SinglePartsToMultiparts.py

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,6 @@ def processAlgorithm(self, progress):
3737
unique = ftools_utils.getUniqueValues( vprovider, int( index ) )
3838
nFeat = vprovider.featureCount() * len( unique )
3939
nElement = 0
40-
#self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), 0 )
41-
# self.emit( SIGNAL( "runRange(PyQt_PyObject)" ), ( 0, nFeat ) )
4240
if not len( unique ) == vlayer.featureCount():
4341
for i in unique:
4442
vprovider.rewind()
@@ -65,8 +63,26 @@ def processAlgorithm(self, progress):
6563
else:
6664
raise GeoAlgorithmExecutionException("Invalid unique ID Field")
6765

66+
def extractAsMulti( self, geom ):
67+
temp_geom = []
68+
if geom.type() == 0:
69+
if geom.isMultipart():
70+
return geom.asMultiPoint()
71+
else:
72+
return [ geom.asPoint() ]
73+
elif geom.type() == 1:
74+
if geom.isMultipart():
75+
return geom.asMultiPolyline()
76+
else:
77+
return [ geom.asPolyline() ]
78+
else:
79+
if geom.isMultipart():
80+
return geom.asMultiPolygon()
81+
else:
82+
return [ geom.asPolygon() ]
83+
6884
def singleToMultiGeom(self, wkbType):
69-
try:
85+
try:
7086
if wkbType in (QGis.WKBPoint, QGis.WKBMultiPoint,
7187
QGis.WKBPoint25D, QGis.WKBMultiPoint25D):
7288
return QGis.WKBMultiPoint
@@ -81,6 +97,15 @@ def singleToMultiGeom(self, wkbType):
8197
except Exception, err:
8298
print str(err)
8399

100+
def convertGeometry( self, geom_list, vType ):
101+
if vType == 0:
102+
return QgsGeometry().fromMultiPoint( geom_list )
103+
elif vType == 1:
104+
return QgsGeometry().fromMultiPolyline( geom_list )
105+
else:
106+
return QgsGeometry().fromMultiPolygon( geom_list )
107+
108+
84109
def defineCharacteristics(self):
85110
self.name = "Singleparts to multipart"
86111
self.group = "Geometry tools"

src/sextante/gui/AlgorithmExecutor.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,9 @@ def raiseInternalError(self, error):
6868
def runalg(self):
6969
try:
7070
self.algorithm.execute(self.progress)
71-
except GeoAlgorithmExecutionException as e :
71+
except GeoAlgorithmExecutionException, e :
7272
self.error.emit(e.msg)
73-
except BaseException as e:
73+
except BaseException, e:
7474
self.internalError.emit(e)
7575
# catch *all* errors, because QGIS tries to handle them in the GUI, which is fatal, this
7676
# being a separate thread.

0 commit comments

Comments
 (0)