Does anyone know how I can turn this console script into a script that I can integrate into the processing toolbox? I tried a few options, but I don't do very well in python, and I always get stuck.
# Change your settings here:
layername = 'line'
triggerfield = 'Trigger' # field must already exist
groupfieldname = 'mygroup' # will be added if does not exist
newlineindicator = 1
#####
# no changes needed below #
#####
layer = QgsProject.instance().mapLayersByName(layername)[0] # get the layer
layer.startEditing() # start editing the layer
layer.dataProvider().addAttributes([QgsField(groupfieldname,QVariant.Int)]) # add a group field
layer.commitChanges() # save new added field to prevent crash when searching for it later
layer.startEditing() # start editing the layer again
groupid = 0 # initialize groupid
fieldindex = layer.fields().indexFromName(groupfieldname) # get fieldindex of groupfield
for feat in layer.getFeatures(): # itereate over layer
if feat[triggerfield] == newlineindicator: # if a new trigger appears, increase groupcounter
groupid += 1
attrs = { fieldindex : groupid } # prepare attributes
layer.dataProvider().changeAttributeValues({ feat.id() : attrs }) # assign current groupid to current feature
layer.commitChanges() # save changes
What do you think? Can it be transformed into a function, with input and output parameters?
EDIT:
I got stuck at this point. Does anyone know how I can solve this script? How should I define "newlineindicator = 1" and "groupid = 0"?
# -*- coding: utf-8 -*-
from PyQt5.QtCore import QCoreApplication, QVariant
from qgis.core import (QgsProcessing,
QgsFeatureSink,
QgsFeature,
QgsField,
QgsFields,
QgsProcessingException,
QgsProcessingAlgorithm,
QgsProcessingParameterString,
QgsProcessingParameterNumber,
QgsProcessingParameterEnum,
QgsProcessingParameterFeatureSource,
QgsProcessingParameterFeatureSink,
QgsProcessingParameterField,
)
import processing
class MergingMultipleLinesByValueField(QgsProcessingAlgorithm):
INPUT = 'INPUT'
OUTPUT = 'OUTPUT'
TRIGGER_FIELD = 'trigger_field'
groupfieldname = 'mygrup'
def tr(self, string):
return QCoreApplication.translate('Processing', string)
def createInstance(self):
return MergingMultipleLinesByValueField()
def name(self):
return 'myscript'
def displayName(self):
return self.tr('My Script')
def group(self):
return self.tr('Example scripts')
def groupId(self):
return 'examplescripts'
def shortHelpString(self):
return self.tr("Example algorithm short description")
def initAlgorithm(self, config=None):
self.addParameter(
QgsProcessingParameterFeatureSource(
self.INPUT,
self.tr('Input layer'),
[QgsProcessing.TypeVectorAnyGeometry]
)
)
self.addParameter(
QgsProcessingParameterField(
self.TRIGGER_FIELD,
'Choose Trigger Field',
'',
self.INPUT
)
)
self.addParameter(
QgsProcessingParameterField(
self.groupfieldname,
'Choose Trigger Field',
'',
self.INPUT
)
)
self.addParameter(
QgsProcessingParameterFeatureSink(
self.OUTPUT,
self.tr('Output layer')
)
)
def processAlgorithm(self, parameters, context, feedback):
source = self.parameterAsSource(
parameters,
self.INPUT,
context
)
trigger = self.parameterAsString(
parameters,
self.TRIGGER_FIELD,
context)
groupfield = self.parameterAsString(
parameters,
self.groupfieldname,
context)
if source is None:
raise QgsProcessingException(self.invalidSourceError(parameters, self.INPUT))
fields = QgsFields()
fields.append(QgsField(trigger, QVariant.String))
(sink, dest_id) = self.parameterAsSink(
parameters,
self.OUTPUT,
context,
source.fields(),
source.wkbType(),
source.sourceCrs()
)
feedback.pushInfo('Extracting unique values from dissolve_field and computing sum')
features = source.getFeatures()
groupid = set(f[trigger] for f in features)
groupid = source.fields().indexFromName(trigger)
fieldindex = source.fields().indexFromName(groupfieldname) # get fieldindex of groupfield
newlineindicator = 1
groupid = 0
for feat in source.getFeatures(): # itereate over layer
if feat[trigger] == newlineindicator: # if a new trigger appears, increase groupcounter
groupid += 1
attrs = { fieldindex : groupid } # prepare attributes
layer.dataProvider().changeAttributeValues({ feat.id() : attrs }) # assign current groupid to current feature
layer.commitChanges() # save changes
return {self.OUTPUT: dest_id}