mirror of
https://github.com/qgis/QGIS.git
synced 2025-12-07 00:03:52 -05:00
Fix auto creation of variables when running script algorithms
This commit is contained in:
parent
94619d0df3
commit
a72eea2256
@ -1,8 +1,14 @@
|
||||
##Table=group
|
||||
##Input=vector
|
||||
##Fields=Field Input
|
||||
|
||||
#inputs
|
||||
|
||||
##Input=source
|
||||
##Fields=field Input
|
||||
##Frequency=output table
|
||||
|
||||
#outputs
|
||||
|
||||
|
||||
from processing.tools.vector import TableWriter
|
||||
from collections import defaultdict
|
||||
from qgis.core import QgsProcessingUtils
|
||||
|
||||
@ -19,14 +19,12 @@ if To_keep < 1:
|
||||
feedback.pushInfo("'To keep' value has been modified to be at least 1.")
|
||||
To_keep = 1
|
||||
|
||||
|
||||
source = self.parameterAsSource(parameters, 'Polygons', context)
|
||||
count = source.featureCount()
|
||||
count = Polygons.featureCount()
|
||||
(sink, Biggest_parts) = self.parameterAsSink(parameters, 'Biggest parts', context,
|
||||
source.fields(), QgsWkbTypes.MultiPolygon, source.sourceCrs())
|
||||
Polygons.fields(), QgsWkbTypes.MultiPolygon, Polygons.sourceCrs())
|
||||
|
||||
|
||||
for n, feat in enumerate(source.getFeatures()):
|
||||
for n, feat in enumerate(Polygons.getFeatures()):
|
||||
if feedback.isCanceled():
|
||||
break
|
||||
feedback.setProgress(int(100 * n / count))
|
||||
|
||||
@ -1,25 +1,36 @@
|
||||
##Vector table tools=group
|
||||
##input=vector
|
||||
|
||||
# inputs
|
||||
|
||||
|
||||
##input=source
|
||||
##class_field=field input
|
||||
##value_field=field input
|
||||
##N_unique_values=output vector
|
||||
##N_unique_values=sink
|
||||
|
||||
#outputs
|
||||
##N_unique_values=output outputVector
|
||||
|
||||
from qgis.PyQt.QtCore import QVariant
|
||||
from qgis.core import QgsFeature, QgsField, QgsProcessingUtils
|
||||
|
||||
layer = QgsProcessingUtils.mapLayerFromString(input, context)
|
||||
fields = layer.fields()
|
||||
fields = input.fields()
|
||||
fields.append(QgsField('UNIQ_COUNT', QVariant.Int))
|
||||
writer, writer_dest = QgsProcessingUtils.createFeatureSink(N_unique_values, context, fields, layer.wkbType(), layer.crs())
|
||||
|
||||
class_field_index = layer.fields().lookupField(class_field)
|
||||
value_field_index = layer.fields().lookupField(value_field)
|
||||
(sink, N_unique_values) = self.parameterAsSink(parameters, 'N_unique_values', context,
|
||||
fields, input.wkbType(), input.sourceCrs())
|
||||
|
||||
|
||||
class_field_index = input.fields().lookupField(class_field)
|
||||
value_field_index = input.fields().lookupField(value_field)
|
||||
|
||||
outFeat = QgsFeature()
|
||||
classes = {}
|
||||
feats = QgsProcessingUtils.getFeatures(layer, context)
|
||||
nFeat = QgsProcessingUtils.featureCount(layer, context)
|
||||
feats = input.getFeatures()
|
||||
nFeat = input.featureCount()
|
||||
for n, inFeat in enumerate(feats):
|
||||
if feedback.isCanceled():
|
||||
break
|
||||
feedback.setProgress(int(100 * n / nFeat))
|
||||
attrs = inFeat.attributes()
|
||||
clazz = attrs[class_field_index]
|
||||
@ -29,8 +40,10 @@ for n, inFeat in enumerate(feats):
|
||||
if value not in classes[clazz]:
|
||||
classes[clazz].append(value)
|
||||
|
||||
feats = processing.features(layer)
|
||||
feats = input.getFeatures()
|
||||
for n, inFeat in enumerate(feats):
|
||||
if feedback.isCanceled():
|
||||
break
|
||||
feedback.setProgress(int(100 * n / nFeat))
|
||||
inGeom = inFeat.geometry()
|
||||
outFeat.setGeometry(inGeom)
|
||||
@ -38,6 +51,4 @@ for n, inFeat in enumerate(feats):
|
||||
clazz = attrs[class_field_index]
|
||||
attrs.append(len(classes[clazz]))
|
||||
outFeat.setAttributes(attrs)
|
||||
writer.addFeature(outFeat)
|
||||
|
||||
del writer
|
||||
sink.addFeature(outFeat)
|
||||
|
||||
@ -181,16 +181,53 @@ class ScriptAlgorithm(QgsProcessingAlgorithm):
|
||||
ns['scriptDescriptionFile'] = self.descriptionFile
|
||||
|
||||
for param in self.parameterDefinitions():
|
||||
ns[param.name()] = parameters[param.name()]
|
||||
method = None
|
||||
if param.type() == "boolean":
|
||||
method = self.parameterAsBool
|
||||
elif param.type() == "crs":
|
||||
method = self.parameterAsCrs
|
||||
elif param.type() == "layer":
|
||||
method = self.parameterAsLayer
|
||||
elif param.type() == "extent":
|
||||
method = self.parameterAsExtent
|
||||
elif param.type() == "point":
|
||||
method = self.parameterAsPoint
|
||||
elif param.type() == "file":
|
||||
method = self.parameterAsFile
|
||||
elif param.type() == "matrix":
|
||||
method = self.parameterAsMatrix
|
||||
elif param.type() == "multilayer":
|
||||
method = self.parameterAsLayerList
|
||||
elif param.type() == "number":
|
||||
method = self.parameterAsDouble
|
||||
elif param.type() == "range":
|
||||
method = self.parameterAsRange
|
||||
elif param.type() == "raster":
|
||||
method = self.parameterAsRasterLayer
|
||||
elif param.type() == "enum":
|
||||
method = self.parameterAsEnum
|
||||
elif param.type() == "string":
|
||||
method = self.parameterAsString
|
||||
elif param.type() == "expression":
|
||||
method = self.parameterAsString
|
||||
elif param.type() == "vector":
|
||||
method = self.parameterAsVectorLayer
|
||||
elif param.type() == "field":
|
||||
method = self.parameterAsString
|
||||
elif param.type() == "source":
|
||||
method = self.parameterAsSource
|
||||
|
||||
if method:
|
||||
ns[param.name()] = method(parameters, param.name(), context)
|
||||
|
||||
for out in self.outputDefinitions():
|
||||
ns[out.name()] = None
|
||||
|
||||
ns['self'] = self
|
||||
ns['parameters'] = parameters
|
||||
ns['feedback'] = feedback
|
||||
ns['context'] = context
|
||||
|
||||
# for out in self.outputDefinitions():
|
||||
# ns[out.name()] = out.value
|
||||
|
||||
variables = re.findall('@[a-zA-Z0-9_]*', self.script)
|
||||
script = 'import processing\n'
|
||||
script += self.script
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user