36
36
37
37
from qgis .core import (QgsRasterLayer ,
38
38
QgsApplication ,
39
+ QgsMapLayer ,
39
40
QgsProcessingUtils ,
40
41
QgsMessageLog ,
41
42
QgsVectorFileWriter ,
@@ -407,7 +408,7 @@ def processAlgorithm(self, parameters, context, feedback):
407
408
408
409
def processInputs (self , parameters , context ):
409
410
"""Prepare the GRASS import commands"""
410
- layers = []
411
+ inputLayers = []
411
412
inputs = [p for p in self .parameterDefinitions ()
412
413
if isinstance (p , (QgsProcessingParameterVectorLayer ,
413
414
QgsProcessingParameterRasterLayer ,
@@ -425,11 +426,11 @@ def processInputs(self, parameters, context):
425
426
if paramName in self .exportedLayers :
426
427
continue
427
428
else :
428
- layers .append (layer )
429
+ inputLayers .append (layer )
429
430
self .setSessionProjectionFromLayer (layer )
430
431
self .commands .append (self .exportRasterLayer (paramName , layerSrc ))
431
432
# Vector inputs needs to be imported into temp GRASS DB
432
- if isinstance (param , QgsProcessingParameterVectorLayer ):
433
+ elif isinstance (param , QgsProcessingParameterVectorLayer ):
433
434
if not paramName in parameters :
434
435
continue
435
436
layer = self .parameterAsVectorLayer (parameters , paramName , context )
@@ -441,43 +442,35 @@ def processInputs(self, parameters, context):
441
442
if paramName in self .exportedLayers :
442
443
continue
443
444
else :
444
- layers .append (layer )
445
+ inputLayers .append (layer )
445
446
self .setSessionProjectionFromLayer (layer )
446
447
self .commands .append (self .exportVectorLayer (paramName , layerSrc ))
447
448
# TODO: find the best replacement for ParameterTable
448
449
#if isinstance(param, ParameterTable):
449
450
# 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 :
456
453
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
+
475
468
# If projection has not already be set, use the project
476
469
self .setSessionProjectionFromProject ()
477
470
478
471
# Build GRASS region
479
472
if self .region .isEmpty ():
480
- self .region = QgsProcessingUtils .combineLayerExtents (layers )
473
+ self .region = QgsProcessingUtils .combineLayerExtents (inputLayers )
481
474
command = 'g.region n={} s={} e={} w={}' .format (
482
475
self .region .yMaximum (), self .region .yMinimum (),
483
476
self .region .xMaximum (), self .region .xMinimum ()
@@ -498,7 +491,6 @@ def processCommand(self, parameters, context):
498
491
:param parameters:
499
492
"""
500
493
noOutputs = [o for o in self .parameterDefinitions () if o not in self .destinationParameterDefinitions ()]
501
- QgsMessageLog .logMessage ('processCommand' , 'Grass7' , QgsMessageLog .INFO )
502
494
command = '{} ' .format (self .grass7Name )
503
495
command += '{}' .join (self .hardcodedStrings )
504
496
@@ -526,18 +518,18 @@ def processCommand(self, parameters, context):
526
518
parameters , paramName , context ,
527
519
QgsVectorFileWriter .supportedFormatExtensions ()
528
520
)
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 )
537
529
# For booleans, we just add the parameter name
538
530
elif isinstance (param , QgsProcessingParameterBoolean ):
539
531
if self .parameterAsBool (parameters , paramName , context ):
540
- value = paramName
532
+ command += ' {}' . format ( paramName )
541
533
# For enumeration, we need to grab the string value
542
534
elif isinstance (param , QgsProcessingParameterEnum ):
543
535
idx = self .parameterAsEnum (parameters , paramName , context )
@@ -562,10 +554,10 @@ def processCommand(self, parameters, context):
562
554
# Handle outputs
563
555
for out in self .destinationParameterDefinitions ():
564
556
outName = out .name ()
557
+ # For File destination
565
558
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 ))
569
561
else :
570
562
# We add an output name to make sure it is unique if the session
571
563
# uses this algorithm several times.
@@ -583,7 +575,6 @@ def processCommand(self, parameters, context):
583
575
584
576
def processOutputs (self , parameters , context ):
585
577
"""Prepare the GRASS v.out.ogr commands"""
586
- # TODO: use outputDefinitions() or destionationParametersDefinitions() ?
587
578
# TODO: support multiple raster formats.
588
579
# TODO: support multiple vector formats.
589
580
for out in self .destinationParameterDefinitions ():
0 commit comments