def processAlgorithm(self, parameters, context, feedback): """ Here is where the processing itself takes place. """ layerHandler = LayerHandler() inputLyr = self.parameterAsVectorLayer(parameters, self.INPUT, context) if inputLyr is None: raise QgsProcessingException( self.invalidSourceError(parameters, self.INPUT)) outputLyr = self.parameterAsVectorLayer(parameters, self.OUTPUT, context) if outputLyr is None: raise QgsProcessingException( self.invalidSourceError(parameters, self.OUTPUT)) if inputLyr == outputLyr: raise QgsProcessingException( self.tr('Input must be different from output!')) inputExpression = self.parameterAsExpression( parameters, self.INPUT_FILTER_EXPRESSION, context) filterLyr = self.parameterAsVectorLayer(parameters, self.FILTER_LAYER, context) behavior = self.parameterAsEnum(parameters, self.BEHAVIOR, context) prepairedLyr = layerHandler.prepareConversion( inputLyr=inputLyr, context=context, inputExpression=inputExpression, filterLyr=filterLyr, behavior=behavior, feedback=feedback) return {self.INPUT: inputLyr}
def prepareInputLayers(self, inputLayers, stepConversionMap, context=None, feedback=None): """ Prepare layers for a translation unit (step) to be executed (e.g. applies filters). :param inputLayers: (dict) a map from layer name to each vector layer contained by the input datasource. :param stepConversionMap: (dict) conversion map generated by Datasource Conversion tool for a conversion step. :param context: (QgsProcessingContext) environment parameters in which processing tools are used. :param feedback: (QgsProcessingMultiStepFeedback) QGIS tool for progress tracking. :return: (dict) map of layers to have its features mapped to output format. """ lh = LayerHandler() context = context if context is not None else QgsProcessingContext() layerFilters = stepConversionMap["filter"]["layer_filter"] spatialFilters = stepConversionMap["filter"]["spatial_filter"] # in case a selection of layers was made, only chosen layers should be translated inputLayers = inputLayers if layerFilters == {} else { layer: inputLayers[layer] for layer in layerFilters } multiStepFeedback = QgsProcessingMultiStepFeedback( len(inputLayers), feedback) if spatialFilters: # spatial filtering behaviour is set based on the modes defined in convertLayer2LayerAlgorithm behaviour = self.getSpatialFilterBehaviour( spatialFilters["predicate"] if "predicate" in spatialFilters else None) spatialFilterlLayer = self.prepareSpatialFilterLayer( spatialFilters, context) else: behaviour = None spatialFilters = None preparedLayers = dict() currentStep = 0 for layer, vl in inputLayers.items(): if feedback is not None: multiStepFeedback.setCurrentStep(currentStep) if multiStepFeedback.isCanceled(): break currentStep += 1 translatedLayer = lh.prepareConversion( inputLyr=vl, context=context, inputExpression=layerFilters[layer]["expression"] if layer in layerFilters else None, filterLyr=spatialFilterlLayer, behavior=behaviour, conversionMap=stepConversionMap, feedback=multiStepFeedback if feedback is not None else None) if translatedLayer.featureCount() > 0: preparedLayers[layer] = translatedLayer return preparedLayers