Skip to content

Commit f0da7b0

Browse files
author
Médéric Ribreux
committed
Improve MultiLayers and FileDestination support
1 parent 9a52e34 commit f0da7b0

File tree

3 files changed

+41
-44
lines changed

3 files changed

+41
-44
lines changed

python/plugins/processing/algs/grass7/Grass7Algorithm.py

+34-43
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636

3737
from qgis.core import (QgsRasterLayer,
3838
QgsApplication,
39+
QgsMapLayer,
3940
QgsProcessingUtils,
4041
QgsMessageLog,
4142
QgsVectorFileWriter,
@@ -407,7 +408,7 @@ def processAlgorithm(self, parameters, context, feedback):
407408

408409
def processInputs(self, parameters, context):
409410
"""Prepare the GRASS import commands"""
410-
layers=[]
411+
inputLayers=[]
411412
inputs = [p for p in self.parameterDefinitions()
412413
if isinstance(p, (QgsProcessingParameterVectorLayer,
413414
QgsProcessingParameterRasterLayer,
@@ -425,11 +426,11 @@ def processInputs(self, parameters, context):
425426
if paramName in self.exportedLayers:
426427
continue
427428
else:
428-
layers.append(layer)
429+
inputLayers.append(layer)
429430
self.setSessionProjectionFromLayer(layer)
430431
self.commands.append(self.exportRasterLayer(paramName, layerSrc))
431432
# Vector inputs needs to be imported into temp GRASS DB
432-
if isinstance(param, QgsProcessingParameterVectorLayer):
433+
elif isinstance(param, QgsProcessingParameterVectorLayer):
433434
if not paramName in parameters:
434435
continue
435436
layer = self.parameterAsVectorLayer(parameters, paramName, context)
@@ -441,43 +442,35 @@ def processInputs(self, parameters, context):
441442
if paramName in self.exportedLayers:
442443
continue
443444
else:
444-
layers.append(layer)
445+
inputLayers.append(layer)
445446
self.setSessionProjectionFromLayer(layer)
446447
self.commands.append(self.exportVectorLayer(paramName, layerSrc))
447448
# TODO: find the best replacement for ParameterTable
448449
#if isinstance(param, ParameterTable):
449450
# pass
450-
if isinstance(param, QgsProcessingParameterMultipleLayers):
451-
if not param.name() in parameters:
452-
continue
453-
value = parameters[param.name()]
454-
layers = value.split(';')
455-
if layers is None or len(layers) == 0:
451+
elif isinstance(param, QgsProcessingParameterMultipleLayers):
452+
if not paramName in parameters:
456453
continue
457-
if param.datatype == dataobjects.TYPE_RASTER:
458-
for layer in layers:
459-
if layer in list(self.exportedLayers.keys()):
460-
continue
461-
else:
462-
self.setSessionProjectionFromLayer(layer, self.commands)
463-
self.commands.append(self.exportRasterLayer(layer))
464-
elif param.datatype in [dataobjects.TYPE_VECTOR_ANY,
465-
dataobjects.TYPE_VECTOR_LINE,
466-
dataobjects.TYPE_VECTOR_POLYGON,
467-
dataobjects.TYPE_VECTOR_POINT]:
468-
for layer in layers:
469-
if layer in list(self.exportedLayers.keys()):
470-
continue
471-
else:
472-
self.setSessionProjectionFromLayer(layer)
473-
self.commands.append(self.exportVectorLayer(layer))
474-
454+
layers = self.parameterAsLayerList(parameters, paramName, context)
455+
for idx, layer in enumerate(layers):
456+
layerName = '{}_{}'.format(paramName, idx)
457+
layerSrc = layer.source()
458+
if layerName not in self.exportedLayers:
459+
inputLayers.append(layer)
460+
self.setSessionProjectionFromLayer(layer)
461+
# Add a raster layer
462+
if layer.type() == QgsMapLayer.RasterLayer:
463+
self.commands.append(self.exportRasterLayer(layerName, layerSrc))
464+
# Add a vector layer
465+
elif layer.type() == QgsMapLayer.VectorLayer:
466+
self.commands.append(self.exportVectorLayer(layerName, layerSrc))
467+
475468
# If projection has not already be set, use the project
476469
self.setSessionProjectionFromProject()
477470

478471
# Build GRASS region
479472
if self.region.isEmpty():
480-
self.region = QgsProcessingUtils.combineLayerExtents(layers)
473+
self.region = QgsProcessingUtils.combineLayerExtents(inputLayers)
481474
command = 'g.region n={} s={} e={} w={}'.format(
482475
self.region.yMaximum(), self.region.yMinimum(),
483476
self.region.xMaximum(), self.region.xMinimum()
@@ -498,7 +491,6 @@ def processCommand(self, parameters, context):
498491
:param parameters:
499492
"""
500493
noOutputs = [o for o in self.parameterDefinitions() if o not in self.destinationParameterDefinitions()]
501-
QgsMessageLog.logMessage('processCommand', 'Grass7', QgsMessageLog.INFO)
502494
command = '{} '.format(self.grass7Name)
503495
command += '{}'.join(self.hardcodedStrings)
504496

@@ -526,18 +518,18 @@ def processCommand(self, parameters, context):
526518
parameters, paramName, context,
527519
QgsVectorFileWriter.supportedFormatExtensions()
528520
)
529-
530-
# TODO: handle multipleLayers!
531-
#elif isinstance(param, QgsProcessingParameterMultipleLayers):
532-
# s = param.value
533-
# for layer in list(self.exportedLayers.keys()):
534-
# s = s.replace(layer, self.exportedLayers[layer])
535-
# s = s.replace(';', ',')
536-
# command += ' ' + param.name() + '=' + s
521+
# MultipleLayers
522+
elif isinstance(param, QgsProcessingParameterMultipleLayers):
523+
layers = self.parameterAsLayerList(parameters, paramName, context)
524+
values = []
525+
for idx in range(len(layers)):
526+
layerName = '{}_{}'.format(paramName, idx)
527+
values.append(self.exportedLayers[layerName])
528+
value = ','.join(values)
537529
# For booleans, we just add the parameter name
538530
elif isinstance(param, QgsProcessingParameterBoolean):
539531
if self.parameterAsBool(parameters, paramName, context):
540-
value = paramName
532+
command += ' {}'.format(paramName)
541533
# For enumeration, we need to grab the string value
542534
elif isinstance(param, QgsProcessingParameterEnum):
543535
idx = self.parameterAsEnum(parameters, paramName, context)
@@ -562,10 +554,10 @@ def processCommand(self, parameters, context):
562554
# Handle outputs
563555
for out in self.destinationParameterDefinitions():
564556
outName = out.name()
557+
# For File destination
565558
if isinstance(out, QgsProcessingParameterFileDestination):
566-
command += ' > {}'.format(self.parameterAsFileOutput(parameters, outName, context))
567-
# TODO: handle OutputHTML
568-
#elif not isinstance(out, OutputHTML):
559+
command += ' {}="{}"'.format(outName,
560+
self.parameterAsFileOutput(parameters, outName, context))
569561
else:
570562
# We add an output name to make sure it is unique if the session
571563
# uses this algorithm several times.
@@ -583,7 +575,6 @@ def processCommand(self, parameters, context):
583575

584576
def processOutputs(self, parameters, context):
585577
"""Prepare the GRASS v.out.ogr commands"""
586-
# TODO: use outputDefinitions() or destionationParametersDefinitions() ?
587578
# TODO: support multiple raster formats.
588579
# TODO: support multiple vector formats.
589580
for out in self.destinationParameterDefinitions():

python/plugins/processing/algs/grass7/description/r.report.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,4 @@ QgsProcessingParameterBoolean|-h|Suppress page headers|True
99
QgsProcessingParameterBoolean|-f|Use formfeeds between pages|True
1010
QgsProcessingParameterBoolean|-e|Scientific format|True
1111
QgsProcessingParameterBoolean|-n|Do not report no data cells|True
12-
OutputHTML|html|Report
12+
QgsProcessingParameterFileDestination|output|Name for output file to hold the report|Txt files (*.txt)|None|True

python/plugins/processing/core/parameters.py

+6
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
QgsProcessingParameterField,
6060
QgsProcessingParameterRasterDestination, # NOQA
6161
QgsProcessingParameterVectorDestination, # NOQA
62+
QgsProcessingParameterFileDestination,
6263
QgsProcessingParameterString, # NOQA
6364
QgsProcessingParameterMultipleLayers,
6465
QgsProcessingParameterFeatureSource,
@@ -676,9 +677,14 @@ def getParameterFromString(s):
676677
params[3] = True if params[3].lower() == 'true' else False
677678
if len(params) > 4:
678679
params[4] = True if params[4].lower() == 'true' else False
680+
elif clazz == QgsProcessingParameterFileDestination:
681+
if len(params) > 4:
682+
params[4] = True if params[4].lower() == 'true' else False
683+
679684
param = clazz(*params)
680685
if isAdvanced:
681686
param.setFlags(param.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
687+
682688
return param
683689
else:
684690
return None

0 commit comments

Comments
 (0)