Skip to content

Commit

Permalink
Port more processing dataobjects methods to c++
Browse files Browse the repository at this point in the history
Also
- simplify and add tests
- remove large memory leak (persistant store of all non-project layers)
- remove broken support for direct loading postgres/virtual layers
by string (Python version was very broken and would never match
a postgres/virtual layer)
  • Loading branch information
nyalldawson committed Apr 5, 2017
1 parent ee29fa6 commit 377b181
Show file tree
Hide file tree
Showing 161 changed files with 428 additions and 275 deletions.
28 changes: 28 additions & 0 deletions python/core/processing/qgsprocessingutils.sip
Expand Up @@ -64,6 +64,34 @@ class QgsProcessingUtils
\see compatibleVectorLayers()
%End


static QgsMapLayer *mapLayerFromProject( const QString &string, QgsProject *project );
%Docstring
Interprets a string as a map layer from a project.

This method attempts to match a string to a project map layer, using
first the layer ID, then layer names, and finally layer source.
If the string matches a normalized version of any layer source
for layers in the specified project, then those matching layers will be
returned.
\see mapLayerFromString()
%End

static QgsMapLayer *mapLayerFromString( const QString &string ) /Factory/;
%Docstring
Interprets a string as a map layer. The method will attempt to
load a layer matching the passed string. E.g. if the string is a file path,
then the layer at this file path will be loaded.
The caller takes responsibility for deleting the returned map layer.
\see mapLayerFromProject()
%End

static QString normalizeLayerSource( const QString &source );
%Docstring
Normalizes a layer source string for safe comparison across different
operating system environments.
%End

};


Expand Down
Expand Up @@ -88,10 +88,10 @@ def processAlgorithm(self, feedback):
output = self.getOutputValue(self.OUTPUT_LAYER)

# Input layers vales are always a string with its location.
# That string can be converted into a QGIS object (a
# That string can be converted into a QGIS layer (a
# QgsVectorLayer in this case) using the
# processing.getObjectFromUri() method.
vectorLayer = dataobjects.getObjectFromUri(inputFilename)
# dataobjects.getLayerFromString() method.
vectorLayer = dataobjects.getLayerFromString(inputFilename)

# And now we can process

Expand Down
2 changes: 1 addition & 1 deletion python/plugins/processing/algs/gdal/ClipByMask.py
Expand Up @@ -103,7 +103,7 @@ def defineCharacteristics(self):
def getConsoleCommands(self):
out = self.getOutputValue(self.OUTPUT)
mask = self.getParameterValue(self.MASK)
maskLayer = dataobjects.getObjectFromUri(
maskLayer = dataobjects.getLayerFromString(
self.getParameterValue(self.MASK))
ogrMask = ogrConnectionString(mask)[1:-1]
noData = self.getParameterValue(self.NO_DATA)
Expand Down
4 changes: 2 additions & 2 deletions python/plugins/processing/algs/gdal/rasterize_over.py
Expand Up @@ -69,8 +69,8 @@ def defineCharacteristics(self):
self.tr('Existing raster layer'), False))

def getConsoleCommands(self):
inLayer = dataobjects.getObjectFromUri(self.getParameterValue(self.INPUT))
inRasterLayer = dataobjects.getObjectFromUri(self.getParameterValue(self.INPUT_RASTER))
inLayer = dataobjects.getLayerFromString(self.getParameterValue(self.INPUT))
inRasterLayer = dataobjects.getLayerFromString(self.getParameterValue(self.INPUT_RASTER))

ogrLayer = ogrConnectionString(inLayer)[1:-1]
ogrRasterLayer = ogrConnectionString(inRasterLayer)[1:-1]
Expand Down
10 changes: 5 additions & 5 deletions python/plugins/processing/algs/grass7/Grass7Algorithm.py
Expand Up @@ -229,15 +229,15 @@ def getDefaultCellsize(self):
if isinstance(param.value, QgsRasterLayer):
layer = param.value
else:
layer = dataobjects.getObjectFromUri(param.value)
layer = dataobjects.getLayerFromString(param.value)
cellsize = max(cellsize, (layer.extent().xMaximum() -
layer.extent().xMinimum()) /
layer.width())
elif isinstance(param, ParameterMultipleInput):

layers = param.value.split(';')
for layername in layers:
layer = dataobjects.getObjectFromUri(layername)
layer = dataobjects.getLayerFromString(layername)
if isinstance(layer, QgsRasterLayer):
cellsize = max(cellsize, (
layer.extent().xMaximum() -
Expand Down Expand Up @@ -515,11 +515,11 @@ def exportVectorLayer(self, orgFilename):
# but the functionality of v.in.ogr could be used for this.
# We also export if there is a selection
if not os.path.exists(orgFilename) or not orgFilename.endswith('shp'):
layer = dataobjects.getObjectFromUri(orgFilename, False)
layer = dataobjects.getLayerFromString(orgFilename, False)
if layer:
filename = dataobjects.exportVectorLayer(layer)
else:
layer = dataobjects.getObjectFromUri(orgFilename, False)
layer = dataobjects.getLayerFromString(orgFilename, False)
if layer:
useSelection = \
ProcessingConfig.getSetting(ProcessingConfig.USE_SELECTED)
Expand Down Expand Up @@ -553,7 +553,7 @@ def setSessionProjectionFromProject(self, commands):

def setSessionProjectionFromLayer(self, layer, commands):
if not Grass7Utils.projectionSet:
qGisLayer = dataobjects.getObjectFromUri(layer)
qGisLayer = dataobjects.getLayerFromString(layer)
if qGisLayer:
proj4 = str(qGisLayer.crs().toProj4())
command = 'g.proj'
Expand Down
4 changes: 2 additions & 2 deletions python/plugins/processing/algs/grass7/nviz7.py
Expand Up @@ -173,15 +173,15 @@ def getDefaultCellsize(self):
if isinstance(param.value, QgsRasterLayer):
layer = param.value
else:
layer = dataobjects.getObjectFromUri(param.value)
layer = dataobjects.getLayerFromString(param.value)
cellsize = max(cellsize, (layer.extent().xMaximum() -
layer.extent().xMinimum()) /
layer.width())
elif isinstance(param, ParameterMultipleInput):

layers = param.value.split(';')
for layername in layers:
layer = dataobjects.getObjectFromUri(layername)
layer = dataobjects.getLayerFromString(layername)
if isinstance(layer, QgsRasterLayer):
cellsize = max(cellsize, (
layer.extent().xMaximum() -
Expand Down
2 changes: 1 addition & 1 deletion python/plugins/processing/algs/qgis/AddTableField.py
Expand Up @@ -90,7 +90,7 @@ def processAlgorithm(self, feedback):
fieldPrecision = self.getParameterValue(self.FIELD_PRECISION)
output = self.getOutputFromName(self.OUTPUT_LAYER)

layer = dataobjects.getObjectFromUri(
layer = dataobjects.getLayerFromString(
self.getParameterValue(self.INPUT_LAYER))

fields = layer.fields()
Expand Down
Expand Up @@ -63,7 +63,7 @@ def defineCharacteristics(self):
def processAlgorithm(self, feedback):
output = self.getOutputFromName(self.OUTPUT)
vlayer = \
dataobjects.getObjectFromUri(self.getParameterValue(self.INPUT))
dataobjects.getLayerFromString(self.getParameterValue(self.INPUT))
fields = vlayer.fields()
fields.append(QgsField('AUTO', QVariant.Int))
writer = output.getVectorWriter(fields, vlayer.wkbType(),
Expand Down
2 changes: 1 addition & 1 deletion python/plugins/processing/algs/qgis/BarPlot.py
Expand Up @@ -74,7 +74,7 @@ def defineCharacteristics(self):
self.addOutput(OutputHTML(self.OUTPUT, self.tr('Bar plot')))

def processAlgorithm(self, feedback):
layer = dataobjects.getObjectFromUri(
layer = dataobjects.getLayerFromString(
self.getParameterValue(self.INPUT))
namefieldname = self.getParameterValue(self.NAME_FIELD)
valuefieldname = self.getParameterValue(self.VALUE_FIELD)
Expand Down
2 changes: 1 addition & 1 deletion python/plugins/processing/algs/qgis/BasicStatistics.py
Expand Up @@ -121,7 +121,7 @@ def defineCharacteristics(self):
self.addOutput(OutputNumber(self.IQR, self.tr('Interquartile Range (IQR)')))

def processAlgorithm(self, feedback):
layer = dataobjects.getObjectFromUri(
layer = dataobjects.getLayerFromString(
self.getParameterValue(self.INPUT_LAYER))
field_name = self.getParameterValue(self.FIELD_NAME)
field = layer.fields().at(layer.fields().lookupField(field_name))
Expand Down
Expand Up @@ -115,7 +115,7 @@ def defineCharacteristics(self):
self.addOutput(OutputNumber(self.IQR, self.tr('Interquartile Range (IQR)')))

def processAlgorithm(self, feedback):
layer = dataobjects.getObjectFromUri(
layer = dataobjects.getLayerFromString(
self.getParameterValue(self.INPUT_LAYER))
fieldName = self.getParameterValue(self.FIELD_NAME)

Expand Down
Expand Up @@ -101,7 +101,7 @@ def defineCharacteristics(self):
self.addOutput(OutputNumber(self.MAX_VALUE, self.tr('Maximum string value')))

def processAlgorithm(self, feedback):
layer = dataobjects.getObjectFromUri(
layer = dataobjects.getLayerFromString(
self.getParameterValue(self.INPUT_LAYER))
fieldName = self.getParameterValue(self.FIELD_NAME)

Expand Down
2 changes: 1 addition & 1 deletion python/plugins/processing/algs/qgis/Boundary.py
Expand Up @@ -64,7 +64,7 @@ def defineCharacteristics(self):
self.addOutput(OutputVector(self.OUTPUT_LAYER, self.tr('Boundary')))

def processAlgorithm(self, feedback):
layer = dataobjects.getObjectFromUri(
layer = dataobjects.getLayerFromString(
self.getParameterValue(self.INPUT_LAYER))

input_wkb = layer.wkbType()
Expand Down
2 changes: 1 addition & 1 deletion python/plugins/processing/algs/qgis/BoundingBox.py
Expand Up @@ -63,7 +63,7 @@ def defineCharacteristics(self):
self.addOutput(OutputVector(self.OUTPUT_LAYER, self.tr('Bounds'), datatype=[dataobjects.TYPE_VECTOR_POLYGON]))

def processAlgorithm(self, feedback):
layer = dataobjects.getObjectFromUri(
layer = dataobjects.getLayerFromString(
self.getParameterValue(self.INPUT_LAYER))

writer = self.getOutputFromName(
Expand Down
2 changes: 1 addition & 1 deletion python/plugins/processing/algs/qgis/Centroids.py
Expand Up @@ -64,7 +64,7 @@ def defineCharacteristics(self):
self.addOutput(OutputVector(self.OUTPUT_LAYER, self.tr('Centroids'), datatype=[dataobjects.TYPE_VECTOR_POINT]))

def processAlgorithm(self, feedback):
layer = dataobjects.getObjectFromUri(
layer = dataobjects.getLayerFromString(
self.getParameterValue(self.INPUT_LAYER))

writer = self.getOutputFromName(
Expand Down
2 changes: 1 addition & 1 deletion python/plugins/processing/algs/qgis/CheckValidity.py
Expand Up @@ -100,7 +100,7 @@ def processAlgorithm(self, feedback):
settings.setValue(settings_method_key, initial_method_setting)

def doCheck(self, feedback):
layer = dataobjects.getObjectFromUri(
layer = dataobjects.getLayerFromString(
self.getParameterValue(self.INPUT_LAYER))

settings = QgsSettings()
Expand Down
4 changes: 2 additions & 2 deletions python/plugins/processing/algs/qgis/Clip.py
Expand Up @@ -66,9 +66,9 @@ def defineCharacteristics(self):
self.addOutput(OutputVector(Clip.OUTPUT, self.tr('Clipped')))

def processAlgorithm(self, feedback):
source_layer = dataobjects.getObjectFromUri(
source_layer = dataobjects.getLayerFromString(
self.getParameterValue(Clip.INPUT))
mask_layer = dataobjects.getObjectFromUri(
mask_layer = dataobjects.getLayerFromString(
self.getParameterValue(Clip.OVERLAY))

writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(
Expand Down
6 changes: 3 additions & 3 deletions python/plugins/processing/algs/qgis/ConcaveHull.py
Expand Up @@ -79,15 +79,15 @@ def defineCharacteristics(self):
OutputVector(ConcaveHull.OUTPUT, self.tr('Concave hull'), datatype=[dataobjects.TYPE_VECTOR_POLYGON]))

def processAlgorithm(self, feedback):
layer = dataobjects.getObjectFromUri(self.getParameterValue(ConcaveHull.INPUT))
layer = dataobjects.getLayerFromString(self.getParameterValue(ConcaveHull.INPUT))
alpha = self.getParameterValue(self.ALPHA)
holes = self.getParameterValue(self.HOLES)
no_multigeom = self.getParameterValue(self.NO_MULTIGEOMETRY)

# Delaunay triangulation from input point layer
feedback.setProgressText(self.tr('Creating Delaunay triangles...'))
delone_triangles = processing.run("qgis:delaunaytriangulation", layer, None)['OUTPUT']
delaunay_layer = processing.getObject(delone_triangles)
delaunay_layer = dataobjects.getLayerFromString(delone_triangles)

# Get max edge length from Delaunay triangles
feedback.setProgressText(self.tr('Computing edges max length...'))
Expand Down Expand Up @@ -127,7 +127,7 @@ def processAlgorithm(self, feedback):
feedback.setProgressText(self.tr('Dissolving Delaunay triangles...'))
dissolved = processing.run("qgis:dissolve", delaunay_layer,
True, None, None)['OUTPUT']
dissolved_layer = processing.getObject(dissolved)
dissolved_layer = dataobjects.getLayerFromString(dissolved)

# Save result
feedback.setProgressText(self.tr('Saving data...'))
Expand Down
2 changes: 1 addition & 1 deletion python/plugins/processing/algs/qgis/ConvexHull.py
Expand Up @@ -77,7 +77,7 @@ def defineCharacteristics(self):
self.addOutput(OutputVector(self.OUTPUT, self.tr('Convex hull'), datatype=[dataobjects.TYPE_VECTOR_POLYGON]))

def processAlgorithm(self, feedback):
layer = dataobjects.getObjectFromUri(
layer = dataobjects.getLayerFromString(
self.getParameterValue(self.INPUT))
useField = self.getParameterValue(self.METHOD) == 1
fieldName = self.getParameterValue(self.FIELD)
Expand Down
Expand Up @@ -68,7 +68,7 @@ def defineCharacteristics(self):

def processAlgorithm(self, feedback):
file_name = self.getParameterValue(self.INPUT)
layer = dataobjects.getObjectFromUri(file_name)
layer = dataobjects.getLayerFromString(file_name)
field = self.getParameterValue(self.FIELD)
provider = layer.dataProvider()

Expand Down
Expand Up @@ -68,7 +68,7 @@ def defineCharacteristics(self):
self.tr('Constant')))

def processAlgorithm(self, feedback):
layer = dataobjects.getObjectFromUri(
layer = dataobjects.getLayerFromString(
self.getParameterValue(self.INPUT))
value = self.getParameterValue(self.NUMBER)

Expand Down
2 changes: 1 addition & 1 deletion python/plugins/processing/algs/qgis/DefineProjection.py
Expand Up @@ -75,7 +75,7 @@ def defineCharacteristics(self):

def processAlgorithm(self, feedback):
fileName = self.getParameterValue(self.INPUT)
layer = dataobjects.getObjectFromUri(fileName)
layer = dataobjects.getLayerFromString(fileName)
crs = QgsCoordinateReferenceSystem(self.getParameterValue(self.CRS))

provider = layer.dataProvider()
Expand Down
2 changes: 1 addition & 1 deletion python/plugins/processing/algs/qgis/Delaunay.py
Expand Up @@ -70,7 +70,7 @@ def defineCharacteristics(self):
datatype=[dataobjects.TYPE_VECTOR_POLYGON]))

def processAlgorithm(self, feedback):
layer = dataobjects.getObjectFromUri(
layer = dataobjects.getLayerFromString(
self.getParameterValue(self.INPUT))

fields = [QgsField('POINTA', QVariant.Double, '', 24, 15),
Expand Down
2 changes: 1 addition & 1 deletion python/plugins/processing/algs/qgis/DeleteColumn.py
Expand Up @@ -65,7 +65,7 @@ def defineCharacteristics(self):
self.addOutput(OutputVector(self.OUTPUT, self.tr('Output layer')))

def processAlgorithm(self, feedback):
layer = dataobjects.getObjectFromUri(self.getParameterValue(self.INPUT))
layer = dataobjects.getLayerFromString(self.getParameterValue(self.INPUT))

fields_to_delete = self.getParameterValue(self.COLUMNS).split(';')
fields = layer.fields()
Expand Down
Expand Up @@ -59,7 +59,7 @@ def defineCharacteristics(self):
self.addOutput(OutputVector(self.OUTPUT, self.tr('Cleaned')))

def processAlgorithm(self, feedback):
layer = dataobjects.getObjectFromUri(
layer = dataobjects.getLayerFromString(
self.getParameterValue(self.INPUT))

fields = layer.fields()
Expand Down
2 changes: 1 addition & 1 deletion python/plugins/processing/algs/qgis/DeleteHoles.py
Expand Up @@ -65,7 +65,7 @@ def defineCharacteristics(self):
self.addOutput(OutputVector(self.OUTPUT, self.tr('Cleaned'), datatype=[dataobjects.TYPE_VECTOR_POLYGON]))

def processAlgorithm(self, feedback):
layer = dataobjects.getObjectFromUri(
layer = dataobjects.getLayerFromString(
self.getParameterValue(self.INPUT))
min_area = self.getParameterValue(self.MIN_AREA)
if min_area is not None:
Expand Down
2 changes: 1 addition & 1 deletion python/plugins/processing/algs/qgis/DensifyGeometries.py
Expand Up @@ -77,7 +77,7 @@ def defineCharacteristics(self):
self.tr('Densified')))

def processAlgorithm(self, feedback):
layer = dataobjects.getObjectFromUri(
layer = dataobjects.getLayerFromString(
self.getParameterValue(self.INPUT))
vertices = self.getParameterValue(self.VERTICES)

Expand Down
Expand Up @@ -72,7 +72,7 @@ def defineCharacteristics(self):
self.addOutput(OutputVector(self.OUTPUT, self.tr('Densified')))

def processAlgorithm(self, feedback):
layer = dataobjects.getObjectFromUri(self.getParameterValue(self.INPUT))
layer = dataobjects.getLayerFromString(self.getParameterValue(self.INPUT))
interval = self.getParameterValue(self.INTERVAL)

isPolygon = layer.geometryType() == QgsWkbTypes.PolygonGeometry
Expand Down
4 changes: 2 additions & 2 deletions python/plugins/processing/algs/qgis/Difference.py
Expand Up @@ -66,9 +66,9 @@ def defineCharacteristics(self):
self.addOutput(OutputVector(Difference.OUTPUT, self.tr('Difference')))

def processAlgorithm(self, feedback):
layerA = dataobjects.getObjectFromUri(
layerA = dataobjects.getLayerFromString(
self.getParameterValue(Difference.INPUT))
layerB = dataobjects.getObjectFromUri(
layerB = dataobjects.getLayerFromString(
self.getParameterValue(Difference.OVERLAY))

geomType = QgsWkbTypes.multiType(layerA.wkbType())
Expand Down
2 changes: 1 addition & 1 deletion python/plugins/processing/algs/qgis/Dissolve.py
Expand Up @@ -76,7 +76,7 @@ def defineCharacteristics(self):
def processAlgorithm(self, feedback):
useField = not self.getParameterValue(Dissolve.DISSOLVE_ALL)
field_names = self.getParameterValue(Dissolve.FIELD)
vlayerA = dataobjects.getObjectFromUri(
vlayerA = dataobjects.getLayerFromString(
self.getParameterValue(Dissolve.INPUT))

writer = self.getOutputFromName(
Expand Down
2 changes: 1 addition & 1 deletion python/plugins/processing/algs/qgis/DropGeometry.py
Expand Up @@ -66,7 +66,7 @@ def defineCharacteristics(self):
self.addOutput(OutputVector(self.OUTPUT_TABLE, self.tr('Dropped geometry')))

def processAlgorithm(self, feedback):
layer = dataobjects.getObjectFromUri(
layer = dataobjects.getLayerFromString(
self.getParameterValue(self.INPUT_LAYER))
writer = self.getOutputFromName(
self.OUTPUT_TABLE).getVectorWriter(
Expand Down
2 changes: 1 addition & 1 deletion python/plugins/processing/algs/qgis/EliminateSelection.py
Expand Up @@ -78,7 +78,7 @@ def defineCharacteristics(self):
self.addOutput(OutputVector(self.OUTPUT, self.tr('Eliminated'), datatype=[dataobjects.TYPE_VECTOR_POLYGON]))

def processAlgorithm(self, feedback):
inLayer = dataobjects.getObjectFromUri(self.getParameterValue(self.INPUT))
inLayer = dataobjects.getLayerFromString(self.getParameterValue(self.INPUT))
boundary = self.getParameterValue(self.MODE) == self.MODE_BOUNDARY
smallestArea = self.getParameterValue(self.MODE) == self.MODE_SMALLEST_AREA

Expand Down
2 changes: 1 addition & 1 deletion python/plugins/processing/algs/qgis/EquivalentNumField.py
Expand Up @@ -67,7 +67,7 @@ def defineCharacteristics(self):
def processAlgorithm(self, feedback):
fieldname = self.getParameterValue(self.FIELD)
output = self.getOutputFromName(self.OUTPUT)
vlayer = dataobjects.getObjectFromUri(
vlayer = dataobjects.getLayerFromString(
self.getParameterValue(self.INPUT))
fieldindex = vlayer.fields().lookupField(fieldname)
fields = vlayer.fields()
Expand Down

0 comments on commit 377b181

Please sign in to comment.