From 8c42295ae42de4828cb27f925bf696c34722b641 Mon Sep 17 00:00:00 2001 From: volayaf Date: Wed, 15 Aug 2012 12:21:03 +0000 Subject: [PATCH] updated remaining ftools algorithms to new architecture git-svn-id: http://sextante.googlecode.com/svn/trunk/soft/bindings/qgis-plugin@348 881b9c09-3ef8-f3c2-ec3d-21d735c97f4d --- src/sextante/ftools/Buffer.py | 12 +++------- src/sextante/ftools/Centroids.py | 7 +----- src/sextante/ftools/Delaunay.py | 5 +---- src/sextante/ftools/Difference.py | 5 +---- src/sextante/ftools/Dissolve.py | 5 +---- src/sextante/ftools/ExportGeometryInfo.py | 5 +---- src/sextante/ftools/ExtentFromLayer.py | 5 +---- src/sextante/ftools/ExtractNodes.py | 5 +---- src/sextante/ftools/FixedDistanceBuffer.py | 8 +++++-- src/sextante/ftools/Intersection.py | 5 +---- src/sextante/ftools/LayerFromExtent.py | 5 +---- src/sextante/ftools/LinesIntersection.py | 9 +------- src/sextante/ftools/LinesToPolygons.py | 5 +---- src/sextante/ftools/MeanCoords.py | 5 +---- src/sextante/ftools/MultipartToSingleparts.py | 6 +---- src/sextante/ftools/PointsInPolygon.py | 9 +------- src/sextante/ftools/PolygonsToLines.py | 8 +------ src/sextante/ftools/SimplifyGeometries.py | 11 ++-------- .../ftools/SinglePartsToMultiparts.py | 7 +----- src/sextante/ftools/SumLines.py | 10 +-------- src/sextante/ftools/Union.py | 5 +---- src/sextante/ftools/VariableDistanceBuffer.py | 8 +++++-- src/sextante/ftools/VoronoiPolygons.py | 5 +---- src/sextante/outputs/OutputVector.py | 22 ++++++++++++++----- 24 files changed, 52 insertions(+), 125 deletions(-) diff --git a/src/sextante/ftools/Buffer.py b/src/sextante/ftools/Buffer.py index d68ce09c8ba..d66255d831c 100644 --- a/src/sextante/ftools/Buffer.py +++ b/src/sextante/ftools/Buffer.py @@ -4,9 +4,7 @@ from qgis.core import * from sextante.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException from sextante.core.SextanteLog import SextanteLog -def buffering(progress, output, distance, field, useSelection, useField, layer, dissolve, segments ): - settings = QSettings() - systemEncoding = settings.value( "/UI/encoding", "System" ).toString() +def buffering(progress, writer, distance, field, useSelection, useField, layer, dissolve, segments ): GEOS_EXCEPT = True FEATURE_EXCEPT = True vproviderA = layer.dataProvider() @@ -15,10 +13,6 @@ def buffering(progress, output, distance, field, useSelection, useField, layer, fields = vproviderA.fields() if useField: field = vproviderA.fieldNameIndex(field) - writer = QgsVectorFileWriter(output, systemEncoding, fields, QGis.WKBPolygon, vproviderA.crs() ) - # check if writer was created properly, if not, return with error - if writer.hasError(): - raise GeoAlgorithmExecutionException("Could not create output file"); outFeat = QgsFeature() inFeat = QgsFeature() inGeom = QgsGeometry() @@ -64,9 +58,9 @@ def buffering(progress, output, distance, field, useSelection, useField, layer, for inFeat in selectionA: atMap = inFeat.attributeMap() if useField: - value = atMap[ self.myParam ].toDouble()[ 0 ] + value = atMap[ field ].toDouble()[ 0 ] else: - value = self.myParam + value = distance inGeom = QgsGeometry( inFeat.geometry() ) try: outGeom = inGeom.buffer( float( value ), segments ) diff --git a/src/sextante/ftools/Centroids.py b/src/sextante/ftools/Centroids.py index 44b9ef62252..d3562376f84 100644 --- a/src/sextante/ftools/Centroids.py +++ b/src/sextante/ftools/Centroids.py @@ -28,14 +28,9 @@ class Centroids(GeoAlgorithm): def processAlgorithm(self, progress): layer = QGisLayers.getObjectFromUri(self.getParameterValue(Centroids.INPUT_LAYER)) - outFileName = self.getOutputValue(Centroids.OUTPUT_LAYER) - provider = layer.dataProvider() - settings = QSettings() - encoding = settings.value( "/UI/encoding", "System" ).toString() - - writer = QgsVectorFileWriter(outFileName, encoding, provider.fields(), + writer = self.getOutputFromName(Centroids.OUTPUT_LAYER).getVectorWriter(provider.fields(), QGis.WKBPoint, provider.crs()) allAttrs = provider.attributeIndexes() diff --git a/src/sextante/ftools/Delaunay.py b/src/sextante/ftools/Delaunay.py index 4b6b97bcf11..7205147451e 100644 --- a/src/sextante/ftools/Delaunay.py +++ b/src/sextante/ftools/Delaunay.py @@ -19,9 +19,6 @@ class Delaunay(GeoAlgorithm): return QtGui.QIcon(os.path.dirname(__file__) + "/icons/delaunay.png") def processAlgorithm(self, progress): - settings = QSettings() - systemEncoding = settings.value( "/UI/encoding", "System" ).toString() - output = self.getOutputValue(Delaunay.OUTPUT) vlayer = QGisLayers.getObjectFromUri(self.getParameterValue(Delaunay.INPUT)) vprovider = vlayer.dataProvider() allAttrs = vprovider.attributeIndexes() @@ -30,7 +27,7 @@ class Delaunay(GeoAlgorithm): 0 : QgsField( "POINTA", QVariant.Double ), 1 : QgsField( "POINTB", QVariant.Double ), 2 : QgsField( "POINTC", QVariant.Double ) } - writer = QgsVectorFileWriter( output, systemEncoding, fields, QGis.WKBPolygon, vprovider.crs() ) + writer = self.getOutputFromName(Delaunay.OUTPUT).getVectorWriter(fields, QGis.WKBPolygon, vprovider.crs() ) inFeat = QgsFeature() c = voronoi.Context() pts = [] diff --git a/src/sextante/ftools/Difference.py b/src/sextante/ftools/Difference.py index 25ffec99440..44bcbb821a0 100644 --- a/src/sextante/ftools/Difference.py +++ b/src/sextante/ftools/Difference.py @@ -24,9 +24,6 @@ class Difference(GeoAlgorithm): return QtGui.QIcon(os.path.dirname(__file__) + "/icons/difference.png") def processAlgorithm(self, progress): - settings = QSettings() - systemEncoding = settings.value( "/UI/encoding", "System" ).toString() - output = self.getOutputValue(Difference.OUTPUT) useSelection = self.getParameterValue(Difference.USE_SELECTED) useSelection2 = self.getParameterValue(Difference.USE_SELECTED2) vlayerA = QGisLayers.getObjectFromUri(self.getParameterValue(Difference.INPUT)) @@ -48,7 +45,7 @@ class Difference(GeoAlgorithm): else: if not crsA != crsB: SextanteLog.addToLog(SextanteLog.LOG_WARNING, "Difference. Non-matching CRSs. Results might be unexpected") - writer = QgsVectorFileWriter(output, systemEncoding, fields, vproviderA.geometryType(), vproviderA.crs() ) + writer = self.getOutputFromName(Difference.OUTPUT).getVectorWriter(fields, vproviderA.geometryType(), vproviderA.crs() ) inFeatA = QgsFeature() inFeatB = QgsFeature() outFeat = QgsFeature() diff --git a/src/sextante/ftools/Dissolve.py b/src/sextante/ftools/Dissolve.py index 879e5fd5654..cefbe98d3de 100644 --- a/src/sextante/ftools/Dissolve.py +++ b/src/sextante/ftools/Dissolve.py @@ -24,9 +24,6 @@ class Dissolve(GeoAlgorithm): return QtGui.QIcon(os.path.dirname(__file__) + "/icons/dissolve.png") def processAlgorithm(self, progress): - settings = QSettings() - systemEncoding = settings.value( "/UI/encoding", "System" ).toString() - output = self.getOutputValue(Dissolve.OUTPUT) useSelection = self.getParameterValue(Dissolve.USE_SELECTED) useField = not self.getParameterValue(Dissolve.USE_SELECTED) fieldname = self.getParameterValue(Dissolve.FIELD) @@ -37,7 +34,7 @@ class Dissolve(GeoAlgorithm): vproviderA = vlayerA.dataProvider() allAttrsA = vproviderA.attributeIndexes() fields = vproviderA.fields() - writer = QgsVectorFileWriter( output, systemEncoding, fields, vproviderA.geometryType(), vproviderA.crs() ) + writer = self.getOutputFromName(Dissolve.OUTPUT).getVectorWriter(fields, vproviderA.geometryType(), vproviderA.crs() ) if writer.hasError(): raise GeoAlgorithmExecutionException("Could not create output file"); inFeat = QgsFeature() diff --git a/src/sextante/ftools/ExportGeometryInfo.py b/src/sextante/ftools/ExportGeometryInfo.py index 4862fd0f8ed..c5c87f1d651 100644 --- a/src/sextante/ftools/ExportGeometryInfo.py +++ b/src/sextante/ftools/ExportGeometryInfo.py @@ -17,15 +17,12 @@ class ExportGeometryInfo(GeoAlgorithm): return QtGui.QIcon(os.path.dirname(__file__) + "/icons/export_geometry.png") def processAlgorithm(self, progress): - settings = QSettings() - systemEncoding = settings.value( "/UI/encoding", "System" ).toString() - output = self.getOutputValue(ExportGeometryInfo.OUTPUT) vlayer = QGisLayers.getObjectFromUri(self.getParameterValue(ExportGeometryInfo.INPUT)) vprovider = vlayer.dataProvider() allAttrs = vprovider.attributeIndexes() vprovider.select( allAttrs ) ( fields, index1, index2 ) = self.checkGeometryFields(vlayer) - writer = QgsVectorFileWriter( output, systemEncoding,fields, vprovider.geometryType(), vprovider.crs() ) + writer = self.getOutputFromName(ExportGeometryInfo.OUTPUT).getVectorWriter(fields, vprovider.geometryType(), vprovider.crs() ) inFeat = QgsFeature() outFeat = QgsFeature() inGeom = QgsGeometry() diff --git a/src/sextante/ftools/ExtentFromLayer.py b/src/sextante/ftools/ExtentFromLayer.py index 0e2264949f3..b5a425182cd 100644 --- a/src/sextante/ftools/ExtentFromLayer.py +++ b/src/sextante/ftools/ExtentFromLayer.py @@ -17,9 +17,6 @@ class ExtentFromLayer(GeoAlgorithm): return QtGui.QIcon(os.path.dirname(__file__) + "/icons/layer_extent.png") def processAlgorithm(self, progress): - settings = QSettings() - systemEncoding = settings.value( "/UI/encoding", "System" ).toString() - output = self.getOutputValue(ExtentFromLayer.OUTPUT) vlayer = QGisLayers.getObjectFromUri(self.getParameterValue(ExtentFromLayer.INPUT)) fields = { 0 : QgsField( "MINX", QVariant.Double ), @@ -33,7 +30,7 @@ class ExtentFromLayer(GeoAlgorithm): 8 : QgsField( "HEIGHT", QVariant.Double ), 9 : QgsField( "WIDTH", QVariant.Double ) } - writer = QgsVectorFileWriter(output, systemEncoding, fields, QGis.WKBPolygon, vlayer.crs() ) + writer = self.getOutputFromName(ExtentFromLayer.OUTPUT).getVectorWriter(fields, QGis.WKBPolygon, vlayer.crs() ) rect = vlayer.extent() minx = rect.xMinimum() miny = rect.yMinimum() diff --git a/src/sextante/ftools/ExtractNodes.py b/src/sextante/ftools/ExtractNodes.py index 873ec626398..f00072ee207 100644 --- a/src/sextante/ftools/ExtractNodes.py +++ b/src/sextante/ftools/ExtractNodes.py @@ -18,15 +18,12 @@ class ExtractNodes(GeoAlgorithm): return QtGui.QIcon(os.path.dirname(__file__) + "/icons/extract_nodes.png") def processAlgorithm(self, progress): - settings = QSettings() - systemEncoding = settings.value( "/UI/encoding", "System" ).toString() - output = self.getOutputValue(ExtractNodes.OUTPUT) vlayer = QGisLayers.getObjectFromUri(self.getParameterValue(ExtractNodes.INPUT)) vprovider = vlayer.dataProvider() allAttrs = vprovider.attributeIndexes() vprovider.select( allAttrs ) fields = vprovider.fields() - writer = QgsVectorFileWriter( output, systemEncoding, fields, QGis.WKBPoint, vprovider.crs() ) + writer = self.getOutputFromName(ExtractNodes.OUTPUT).getVectorWriter(fields, QGis.WKBPoint, vprovider.crs() ) inFeat = QgsFeature() outFeat = QgsFeature() inGeom = QgsGeometry() diff --git a/src/sextante/ftools/FixedDistanceBuffer.py b/src/sextante/ftools/FixedDistanceBuffer.py index 3ae12611e92..ebf9ab917a0 100644 --- a/src/sextante/ftools/FixedDistanceBuffer.py +++ b/src/sextante/ftools/FixedDistanceBuffer.py @@ -25,13 +25,17 @@ class FixedDistanceBuffer(GeoAlgorithm): return QtGui.QIcon(os.path.dirname(__file__) + "/icons/buffer.png") def processAlgorithm(self, progress): - output = self.getOutputValue(FixedDistanceBuffer.OUTPUT) + vlayer = QGisLayers.getObjectFromUri(self.getParameterValue(FixedDistanceBuffer.INPUT)) + vprovider = vlayer.dataProvider() + allAttrs = vprovider.attributeIndexes() + vprovider.select(allAttrs) + writer = self.getOutputFromName(FixedDistanceBuffer.OUTPUT).getVectorWriter(vprovider.fields(), QGis.WKBPolygon, vprovider.crs() ) useSelection = self.getParameterValue(FixedDistanceBuffer.USE_SELECTED) distance = self.getParameterValue(FixedDistanceBuffer.DISTANCE) dissolve = self.getParameterValue(FixedDistanceBuffer.DISSOLVE) segments = int(self.getParameterValue(FixedDistanceBuffer.SEGMENTS)) layer = QGisLayers.getObjectFromUri(self.getParameterValue(FixedDistanceBuffer.INPUT)) - buff.buffering(progress, output, distance, None, useSelection, False, layer, dissolve, segments) + buff.buffering(progress, writer, distance, None, useSelection, False, layer, dissolve, segments) def defineCharacteristics(self): self.name = "Fixed distance buffer" diff --git a/src/sextante/ftools/Intersection.py b/src/sextante/ftools/Intersection.py index d4c2c9153f4..26c70bf28e5 100644 --- a/src/sextante/ftools/Intersection.py +++ b/src/sextante/ftools/Intersection.py @@ -24,9 +24,6 @@ class Intersection(GeoAlgorithm): return QtGui.QIcon(os.path.dirname(__file__) + "/icons/intersect.png") def processAlgorithm(self, progress): - settings = QSettings() - systemEncoding = settings.value( "/UI/encoding", "System" ).toString() - output = self.getOutputValue(Intersection.OUTPUT) useSelection = self.getParameterValue(Intersection.USE_SELECTED) useSelection2 = self.getParameterValue(Intersection.USE_SELECTED2) vlayerA = QGisLayers.getObjectFromUri(self.getParameterValue(Intersection.INPUT)) @@ -51,7 +48,7 @@ class Intersection(GeoAlgorithm): longNames = ftools_utils.checkFieldNameLength( fields ) if not longNames.isEmpty(): raise GeoAlgorithmExecutionException("Following field names are longer than 10 characters:\n" + longNames.join('\n') ) - writer = QgsVectorFileWriter( output, systemEncoding, fields, vproviderA.geometryType(), vproviderA.crs() ) + writer = self.getOutputFromName(Intersection.OUTPUT).getVectorWriter(fields, vproviderA.geometryType(), vproviderA.crs() ) inFeatA = QgsFeature() inFeatB = QgsFeature() outFeat = QgsFeature() diff --git a/src/sextante/ftools/LayerFromExtent.py b/src/sextante/ftools/LayerFromExtent.py index 41276abb998..73a75c4fd8e 100644 --- a/src/sextante/ftools/LayerFromExtent.py +++ b/src/sextante/ftools/LayerFromExtent.py @@ -18,9 +18,6 @@ class LayerFromExtent(GeoAlgorithm): return QtGui.QIcon(os.path.dirname(__file__) + "/icons/layer_extent.png") def processAlgorithm(self, progress): - settings = QSettings() - systemEncoding = settings.value( "/UI/encoding", "System" ).toString() - output = self.getOutputValue(LayerFromExtent.OUTPUT) vlayer = QGisLayers.getObjectFromUri(self.getParameterValue(LayerFromExtent.INPUT)) fields = { 0 : QgsField( "MINX", QVariant.Double ), @@ -34,7 +31,7 @@ class LayerFromExtent(GeoAlgorithm): 8 : QgsField( "HEIGHT", QVariant.Double ), 9 : QgsField( "WIDTH", QVariant.Double ) } - writer = QgsVectorFileWriter( output, systemEncoding, fields, QGis.WKBPolygon, self.vlayer.crs() ) + writer = self.getOutputFromName(LayerFromExtent.OUTPUT).getVectorWriter(fields, QGis.WKBPolygon, self.vlayer.crs() ) rect = vlayer.extent() minx = rect.xMinimum() miny = rect.yMinimum() diff --git a/src/sextante/ftools/LinesIntersection.py b/src/sextante/ftools/LinesIntersection.py index 716490a8dbd..f32e662f912 100644 --- a/src/sextante/ftools/LinesIntersection.py +++ b/src/sextante/ftools/LinesIntersection.py @@ -23,9 +23,6 @@ class LinesIntersection(GeoAlgorithm): return QtGui.QIcon(os.path.dirname(__file__) + "/icons/intersections.png") def processAlgorithm(self, progress): - settings = QSettings() - systemEncoding = settings.value( "/UI/encoding", "System" ).toString() - output = self.getOutputValue(LinesIntersection.OUTPUT) layer1 = QGisLayers.getObjectFromUri(self.getParameterValue(LinesIntersection.INPUT1)) layer2 = QGisLayers.getObjectFromUri(self.getParameterValue(LinesIntersection.INPUT2)) field1 = self.getParameterValue(LinesIntersection.FIELD1) @@ -46,11 +43,7 @@ class LinesIntersection(GeoAlgorithm): field2.setName(unicode(field2.name()) + "_2") fieldList = {0:field1, 1:field2} sRs = provider1.crs() - check = QFile(output) - if check.exists(): - if not QgsVectorFileWriter.deleteShapeFile(output): - raise GeoAlgorithmExecutionException("Could not delete existing output file") - writer = QgsVectorFileWriter(output, systemEncoding, fieldList, QGis.WKBPoint, sRs) + writer = self.getOutputFromName(LinesIntersection.OUTPUT).getVectorWriter(fieldList, QGis.WKBPoint, sRs) #writer = QgsVectorFileWriter(outPath, "UTF-8", fieldList, QGis.WKBPoint, sRs) inFeat = QgsFeature() inFeatB = QgsFeature() diff --git a/src/sextante/ftools/LinesToPolygons.py b/src/sextante/ftools/LinesToPolygons.py index 98d890537f0..581f271488c 100644 --- a/src/sextante/ftools/LinesToPolygons.py +++ b/src/sextante/ftools/LinesToPolygons.py @@ -17,15 +17,12 @@ class LinesToPolygons(GeoAlgorithm): return QtGui.QIcon(os.path.dirname(__file__) + "/icons/to_lines.png") def processAlgorithm(self, progress): - settings = QSettings() - systemEncoding = settings.value( "/UI/encoding", "System" ).toString() - output = self.getOutputValue(LinesToPolygons.OUTPUT) vlayer = QGisLayers.getObjectFromUri(self.getParameterValue(LinesToPolygons.INPUT)) vprovider = vlayer.dataProvider() allAttrs = vprovider.attributeIndexes() vprovider.select( allAttrs ) fields = vprovider.fields() - writer = QgsVectorFileWriter( output, systemEncoding, fields, QGis.WKBPolygon, vprovider.crs() ) + writer = self.getOutputFromName(LinesToPolygons.OUTPUT).getVectorWriter(fields, QGis.WKBPolygon, vprovider.crs() ) inFeat = QgsFeature() outFeat = QgsFeature() inGeom = QgsGeometry() diff --git a/src/sextante/ftools/MeanCoords.py b/src/sextante/ftools/MeanCoords.py index 33d5a2aeff9..8231f33b5ce 100644 --- a/src/sextante/ftools/MeanCoords.py +++ b/src/sextante/ftools/MeanCoords.py @@ -22,9 +22,6 @@ class MeanCoords(GeoAlgorithm): return QtGui.QIcon(os.path.dirname(__file__) + "/icons/mean.png") def processAlgorithm(self, progress): - settings = QSettings() - systemEncoding = settings.value( "/UI/encoding", "System" ).toString() - output = self.getOutputValue(MeanCoords.OUTPUT) vlayer = QGisLayers.getObjectFromUri(self.getParameterValue(MeanCoords.POINTS)) weightField = self.getParameterValue(MeanCoords.WEIGHT) uniqueField = self.getParameterValue(MeanCoords.UID) @@ -42,7 +39,7 @@ class MeanCoords(GeoAlgorithm): uniqueValues = [QVariant(1)] single = True fieldList = { 0 : QgsField("MEAN_X", QVariant.Double), 1 : QgsField("MEAN_Y", QVariant.Double), 2 : QgsField("UID", QVariant.String) } - writer = QgsVectorFileWriter(output, systemEncoding, fieldList, QGis.WKBPoint, sRs) + writer = self.getOutputFromName(MeanCoords.OUTPUT).getVectorWriter(fieldList, QGis.WKBPoint, sRs) outfeat = QgsFeature() points = [] weights = [] diff --git a/src/sextante/ftools/MultipartToSingleparts.py b/src/sextante/ftools/MultipartToSingleparts.py index db6d961cd3c..74073c2b238 100644 --- a/src/sextante/ftools/MultipartToSingleparts.py +++ b/src/sextante/ftools/MultipartToSingleparts.py @@ -18,17 +18,13 @@ class MultipartToSingleparts(GeoAlgorithm): return QtGui.QIcon(os.path.dirname(__file__) + "/icons/multi_to_single.png") def processAlgorithm(self, progress): - settings = QSettings() - systemEncoding = settings.value( "/UI/encoding", "System" ).toString() vlayer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT)) - output = self.getOutputValue(self.OUTPUT) vprovider = vlayer.dataProvider() allAttrs = vprovider.attributeIndexes() vprovider.select( allAttrs ) fields = vprovider.fields() geomType = self.multiToSingleGeom(vprovider.geometryType()) - writer = QgsVectorFileWriter( output, systemEncoding, - fields, geomType, vprovider.crs() ) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, geomType, vprovider.crs() ) inFeat = QgsFeature() outFeat = QgsFeature() inGeom = QgsGeometry() diff --git a/src/sextante/ftools/PointsInPolygon.py b/src/sextante/ftools/PointsInPolygon.py index d12aa9102e8..96e95ff0b1e 100644 --- a/src/sextante/ftools/PointsInPolygon.py +++ b/src/sextante/ftools/PointsInPolygon.py @@ -23,9 +23,6 @@ class PointsInPolygon(GeoAlgorithm): return QtGui.QIcon(os.path.dirname(__file__) + "/icons/sum_points.png") def processAlgorithm(self, progress): - settings = QSettings() - systemEncoding = settings.value( "/UI/encoding", "System" ).toString() - output = self.getOutputValue(PointsInPolygon.OUTPUT) inField = self.getParameterValue(PointsInPolygon.FIELD) polyLayer = QGisLayers.getObjectFromUri(self.getParameterValue(PointsInPolygon.POLYGONS)) pointLayer = QGisLayers.getObjectFromUri(self.getParameterValue(PointsInPolygon.POINTS)) @@ -45,11 +42,7 @@ class PointsInPolygon(GeoAlgorithm): field = QgsField(unicode(inField), QVariant.Double, "real", 24, 15, "point count field") fieldList[index] = field sRs = polyProvider.crs() - check = QFile(output) - if check.exists(): - if not QgsVectorFileWriter.deleteShapeFile(output): - raise GeoAlgorithmExecutionException("could not delete file: " + output) - writer = QgsVectorFileWriter(output, systemEncoding, fieldList, polyProvider.geometryType(), sRs) + writer = self.getOutputFromName(PointsInPolygon.OUTPUT).getVectorWriter(fieldList, polyProvider.geometryType(), sRs) inFeat = QgsFeature() inFeatB = QgsFeature() outFeat = QgsFeature() diff --git a/src/sextante/ftools/PolygonsToLines.py b/src/sextante/ftools/PolygonsToLines.py index ce98b4747ef..37bb6497d71 100644 --- a/src/sextante/ftools/PolygonsToLines.py +++ b/src/sextante/ftools/PolygonsToLines.py @@ -18,28 +18,22 @@ class PolygonsToLines(GeoAlgorithm): return QtGui.QIcon(os.path.dirname(__file__) + "/icons/to_lines.png") def processAlgorithm(self, progress): - settings = QSettings() - systemEncoding = settings.value( "/UI/encoding", "System" ).toString() - output = self.getOutputValue(PolygonsToLines.OUTPUT) vlayer = QGisLayers.getObjectFromUri(self.getParameterValue(PolygonsToLines.INPUT)) vprovider = vlayer.dataProvider() allAttrs = vprovider.attributeIndexes() vprovider.select( allAttrs ) fields = vprovider.fields() - writer = QgsVectorFileWriter( output, systemEncoding,fields, QGis.WKBLineString, vprovider.crs() ) + writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, QGis.WKBLineString, vprovider.crs() ) inFeat = QgsFeature() outFeat = QgsFeature() inGeom = QgsGeometry() outGeom = QgsGeometry() nFeat = vprovider.featureCount() nElement = 0 - #self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), 0) - #self.emit( SIGNAL( "runRange(PyQt_PyObject)" ), ( 0, nFeat ) ) while vprovider.nextFeature(inFeat): multi = False nElement += 1 progress.setPercentage(int(nElement/nFeat * 100)) - #self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), nElement ) inGeom = inFeat.geometry() if inGeom.isMultipart(): multi = True diff --git a/src/sextante/ftools/SimplifyGeometries.py b/src/sextante/ftools/SimplifyGeometries.py index 3b4d4a3bb1b..bb128341a53 100644 --- a/src/sextante/ftools/SimplifyGeometries.py +++ b/src/sextante/ftools/SimplifyGeometries.py @@ -24,13 +24,10 @@ class SimplifyGeometries(GeoAlgorithm): def processAlgorithm(self, progress): self.processedFeatures = 0 self.progress = progress - settings = QSettings() - systemEncoding = settings.value( "/UI/encoding", "System" ).toString() - output = self.getOutputValue(SimplifyGeometries.OUTPUT) tolerance =self.getParameterValue(SimplifyGeometries.TOLERANCE) useSelection = self.getParameterValue(SimplifyGeometries.USE_SELECTION) vlayer = QGisLayers.getObjectFromUri(self.getParameterValue(SimplifyGeometries.INPUT)) - self.generalize(vlayer, useSelection, tolerance, output, systemEncoding) + self.generalize(vlayer, useSelection, tolerance) def defineCharacteristics(self): @@ -60,12 +57,8 @@ class SimplifyGeometries(GeoAlgorithm): self.inputLayer = inputLayer self.useSelection = useSelection self.tolerance = tolerance - self.outputFileName = shapePath - self.outputEncoding = shapeEncoding - self.shapeFileWriter = None self.pointsBefore = 0 self.pointsAfter = 0 - shapeFileWriter = None vProvider = self.inputLayer.dataProvider() allAttrs = vProvider.attributeIndexes() vProvider.select( allAttrs ) @@ -74,7 +67,7 @@ class SimplifyGeometries(GeoAlgorithm): wkbType = self.inputLayer.wkbType() if not crs.isValid(): crs = None - shapeFileWriter = QgsVectorFileWriter( self.outputFileName, self.outputEncoding, shapeFields, wkbType, crs ) + shapeFileWriter = self.getOutputFromName(SimplifyGeometries.OUTPUT).getVectorWriter(shapeFields, wkbType, crs ) featureId = 0 if self.useSelection: selection = self.inputLayer.selectedFeatures() diff --git a/src/sextante/ftools/SinglePartsToMultiparts.py b/src/sextante/ftools/SinglePartsToMultiparts.py index a478613ff2b..8bbd36be790 100644 --- a/src/sextante/ftools/SinglePartsToMultiparts.py +++ b/src/sextante/ftools/SinglePartsToMultiparts.py @@ -21,17 +21,13 @@ class SinglePartsToMultiparts(GeoAlgorithm): return QtGui.QIcon(os.path.dirname(__file__) + "/icons/single_to_multi.png") def processAlgorithm(self, progress): - settings = QSettings() - systemEncoding = settings.value( "/UI/encoding", "System" ).toString() vlayer = QGisLayers.getObjectFromUri(self.getParameterValue(SinglePartsToMultiparts.INPUT)) - output = self.getOutputValue(SinglePartsToMultiparts.OUTPUT) vprovider = vlayer.dataProvider() allAttrs = vprovider.attributeIndexes() vprovider.select( allAttrs ) fields = vprovider.fields() geomType = self.singleToMultiGeom(vprovider.geometryType()) - writer = QgsVectorFileWriter( output, systemEncoding, - fields, geomType, vprovider.crs() ) + writer = self.getOutputFromName(SinglePartsToMultiparts.OUTPUT).getVectorWriter(fields, geomType, vprovider.crs() ) inFeat = QgsFeature() outFeat = QgsFeature() inGeom = QgsGeometry() @@ -60,7 +56,6 @@ class SinglePartsToMultiparts(GeoAlgorithm): feature_list = self.extractAsMulti( inGeom ) multi_feature.extend( feature_list ) nElement += 1 - #self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), nElement ) outFeat.setAttributeMap( atts ) outGeom = QgsGeometry( self.convertGeometry(multi_feature, vType) ) outFeat.setGeometry(outGeom) diff --git a/src/sextante/ftools/SumLines.py b/src/sextante/ftools/SumLines.py index 05a3540da34..1966731e56e 100644 --- a/src/sextante/ftools/SumLines.py +++ b/src/sextante/ftools/SumLines.py @@ -23,9 +23,6 @@ class SumLines(GeoAlgorithm): return QtGui.QIcon(os.path.dirname(__file__) + "/icons/sum_lines.png") def processAlgorithm(self, progress): - settings = QSettings() - systemEncoding = settings.value( "/UI/encoding", "System" ).toString() - output = self.getOutputValue(SumLines.OUTPUT) inField = self.getParameterValue(SumLines.FIELD) lineLayer = QGisLayers.getObjectFromUri(self.getParameterValue(SumLines.LINES)) polyLayer = QGisLayers.getObjectFromUri(self.getParameterValue(SumLines.POLYGONS)) @@ -54,12 +51,7 @@ class SumLines(GeoAlgorithm): lineProvider.rewind() start = 15.00 add = 85.00 / polyProvider.featureCount() - check = QFile(output) - if check.exists(): - if not QgsVectorFileWriter.deleteShapeFile(output): - raise GeoAlgorithmExecutionException("Could not delete existing output file") - writer = QgsVectorFileWriter(output, systemEncoding, fieldList, polyProvider.geometryType(), sRs) - #writer = QgsVectorFileWriter(outPath, "UTF-8", fieldList, polyProvider.geometryType(), sRs) + writer = self.getOutputFromName(SumLines.OUTPUT).getVectorWriter(fieldList, polyProvider.geometryType(), sRs) spatialIndex = ftools_utils.createIndex( lineProvider ) while polyProvider.nextFeature(inFeat): inGeom = QgsGeometry(inFeat.geometry()) diff --git a/src/sextante/ftools/Union.py b/src/sextante/ftools/Union.py index 9ae7bdf9619..45ebd9f30ca 100644 --- a/src/sextante/ftools/Union.py +++ b/src/sextante/ftools/Union.py @@ -21,9 +21,6 @@ class Union(GeoAlgorithm): return QtGui.QIcon(os.path.dirname(__file__) + "/icons/union.png") def processAlgorithm(self, progress): - settings = QSettings() - systemEncoding = settings.value( "/UI/encoding", "System" ).toString() - output = self.getOutputValue(Union.OUTPUT) vlayerA = QGisLayers.getObjectFromUri(self.getParameterValue(Union.INPUT)) vlayerB = QGisLayers.getObjectFromUri(self.getParameterValue(Union.INPUT2)) GEOS_EXCEPT = True @@ -47,7 +44,7 @@ class Union(GeoAlgorithm): longNames = ftools_utils.checkFieldNameLength( fields ) if not longNames.isEmpty(): raise GeoAlgorithmExecutionException("Following field names are longer than 10 characters:\n" + longNames.join('\n') ) - writer = QgsVectorFileWriter( output, systemEncoding, fields, vproviderA.geometryType(), vproviderA.crs() ) + writer = self.getOutputFromName(Union.OUTPUT).getVectorWriter(fields, vproviderA.geometryType(), vproviderA.crs() ) inFeatA = QgsFeature() inFeatB = QgsFeature() outFeat = QgsFeature() diff --git a/src/sextante/ftools/VariableDistanceBuffer.py b/src/sextante/ftools/VariableDistanceBuffer.py index f8c5e31ecc3..4fb9af6e1d5 100644 --- a/src/sextante/ftools/VariableDistanceBuffer.py +++ b/src/sextante/ftools/VariableDistanceBuffer.py @@ -25,13 +25,17 @@ class VariableDistanceBuffer(GeoAlgorithm): return QtGui.QIcon(os.path.dirname(__file__) + "/icons/buffer.png") def processAlgorithm(self, progress): - output = self.getOutputValue(VariableDistanceBuffer.OUTPUT) + vlayer = QGisLayers.getObjectFromUri(self.getParameterValue(VariableDistanceBuffer.INPUT)) + vprovider = vlayer.dataProvider() + allAttrs = vprovider.attributeIndexes() + vprovider.select(allAttrs) + writer = self.getOutputFromName(VariableDistanceBuffer.OUTPUT).getVectorWriter(vprovider.fields(), QGis.WKBPolygon, vprovider.crs() ) useSelection = self.getParameterValue(VariableDistanceBuffer.USE_SELECTED) dissolve = self.getParameterValue(VariableDistanceBuffer.DISSOLVE) field = self.getParameterValue(VariableDistanceBuffer.FIELD) segments = int(self.getParameterValue(VariableDistanceBuffer.SEGMENTS)) layer = QGisLayers.getObjectFromUri(self.getParameterValue(VariableDistanceBuffer.INPUT)) - buff.buffering(progress, output, 0, field, useSelection, True, layer, dissolve, segments) + buff.buffering(progress, writer, 0, field, useSelection, True, layer, dissolve, segments) def defineCharacteristics(self): self.name = "Variable distance buffer" diff --git a/src/sextante/ftools/VoronoiPolygons.py b/src/sextante/ftools/VoronoiPolygons.py index deb784b01f8..578fa5a5c52 100644 --- a/src/sextante/ftools/VoronoiPolygons.py +++ b/src/sextante/ftools/VoronoiPolygons.py @@ -15,14 +15,11 @@ class VoronoiPolygons(GeoAlgorithm): OUTPUT = "OUTPUT" def processAlgorithm(self, progress): - settings = QSettings() - systemEncoding = settings.value( "/UI/encoding", "System" ).toString() - output = self.getOutputValue(VoronoiPolygons.OUTPUT) vlayer = QGisLayers.getObjectFromUri(self.getParameterValue(VoronoiPolygons.INPUT)) vprovider = vlayer.dataProvider() allAttrs = vprovider.attributeIndexes() vprovider.select( allAttrs ) - writer = QgsVectorFileWriter( output, systemEncoding, vprovider.fields(), QGis.WKBPolygon, vprovider.crs() ) + writer = self.getOutputFromName(VoronoiPolygons.OUTPUT).getVectorWriter(vprovider.fields(), QGis.WKBPolygon, vprovider.crs() ) inFeat = QgsFeature() outFeat = QgsFeature() extent = vlayer.extent() diff --git a/src/sextante/outputs/OutputVector.py b/src/sextante/outputs/OutputVector.py index 8f866fa4c73..6f503176a7a 100644 --- a/src/sextante/outputs/OutputVector.py +++ b/src/sextante/outputs/OutputVector.py @@ -1,6 +1,7 @@ from sextante.outputs.Output import Output from qgis.core import * from PyQt4.QtCore import * +from sextante.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException class OutputVector(Output): @@ -19,7 +20,7 @@ class OutputVector(Output): '''Returns a suitable writer to which features can be added as a result of the algorithm. Use this to transparently handle output values instead of creating your own method. Parameters: - -field: an array with the fields of the attributes table + -field: an array with the fields of the attributes table or dict of int-QgsField -geomType: A suitable geometry type, as it would be passed to a QgsVectorFileWriter constructor -crs: the crs of the layer to create. Executing this method might modify the object, adding additional information to it, so the writer @@ -28,6 +29,8 @@ class OutputVector(Output): thus rendering a previously obtained writer useless''' if self.value.startswith(self.MEMORY_LAYER_PREFIX): + if isinstance(fields, dict): + fields = fields.values() types = { QGis.WKBPoint : "Point", QGis.WKBLineString : "Point", QGis.WKBPolygon : "Polygon", QGis.WKBMultiPoint : "MultiPoint", QGis.WKBMultiLineString : "MultiLineString", QGis.WKBMultiPolygon : "MultiPolygon",} v = QgsVectorLayer(types[geomType], self.description, "memory") @@ -38,6 +41,10 @@ class OutputVector(Output): return v else: #outputChannel is a file path #TODO: Add support for encodings + check = QFile(self.value) + if check.exists(): + if not QgsVectorFileWriter.deleteShapeFile(self.value): + raise GeoAlgorithmExecutionException("Could not delete existing output file") formats = QgsVectorFileWriter.supportedFiltersAndFormats() OGRCodes = {} for key,value in formats.items(): @@ -45,11 +52,14 @@ class OutputVector(Output): extension = extension[extension.find('*.') + 2:] extension = extension[:extension.find(" ")] OGRCodes[extension] = value - fieldsDict = {} - i = 0 - for field in fields: - fieldsDict[i] = field - i += 1 + if isinstance(fields, dict): + fieldsDict = fields + else: + fieldsDict = {} + i = 0 + for field in fields: + fieldsDict[i] = field + i += 1 settings = QSettings() systemEncoding = settings.value( "/UI/encoding", "System" ).toString() extension = self.value[self.value.find(".")+1:]