mirror of
https://github.com/qgis/QGIS.git
synced 2025-12-09 00:04:30 -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
|
##Table=group
|
||||||
##Input=vector
|
|
||||||
##Fields=Field Input
|
#inputs
|
||||||
|
|
||||||
|
##Input=source
|
||||||
|
##Fields=field Input
|
||||||
##Frequency=output table
|
##Frequency=output table
|
||||||
|
|
||||||
|
#outputs
|
||||||
|
|
||||||
|
|
||||||
from processing.tools.vector import TableWriter
|
from processing.tools.vector import TableWriter
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from qgis.core import QgsProcessingUtils
|
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.")
|
feedback.pushInfo("'To keep' value has been modified to be at least 1.")
|
||||||
To_keep = 1
|
To_keep = 1
|
||||||
|
|
||||||
|
count = Polygons.featureCount()
|
||||||
source = self.parameterAsSource(parameters, 'Polygons', context)
|
|
||||||
count = source.featureCount()
|
|
||||||
(sink, Biggest_parts) = self.parameterAsSink(parameters, 'Biggest parts', context,
|
(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():
|
if feedback.isCanceled():
|
||||||
break
|
break
|
||||||
feedback.setProgress(int(100 * n / count))
|
feedback.setProgress(int(100 * n / count))
|
||||||
|
|||||||
@ -1,25 +1,36 @@
|
|||||||
##Vector table tools=group
|
##Vector table tools=group
|
||||||
##input=vector
|
|
||||||
|
# inputs
|
||||||
|
|
||||||
|
|
||||||
|
##input=source
|
||||||
##class_field=field input
|
##class_field=field input
|
||||||
##value_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.PyQt.QtCore import QVariant
|
||||||
from qgis.core import QgsFeature, QgsField, QgsProcessingUtils
|
from qgis.core import QgsFeature, QgsField, QgsProcessingUtils
|
||||||
|
|
||||||
layer = QgsProcessingUtils.mapLayerFromString(input, context)
|
fields = input.fields()
|
||||||
fields = layer.fields()
|
|
||||||
fields.append(QgsField('UNIQ_COUNT', QVariant.Int))
|
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)
|
(sink, N_unique_values) = self.parameterAsSink(parameters, 'N_unique_values', context,
|
||||||
value_field_index = layer.fields().lookupField(value_field)
|
fields, input.wkbType(), input.sourceCrs())
|
||||||
|
|
||||||
|
|
||||||
|
class_field_index = input.fields().lookupField(class_field)
|
||||||
|
value_field_index = input.fields().lookupField(value_field)
|
||||||
|
|
||||||
outFeat = QgsFeature()
|
outFeat = QgsFeature()
|
||||||
classes = {}
|
classes = {}
|
||||||
feats = QgsProcessingUtils.getFeatures(layer, context)
|
feats = input.getFeatures()
|
||||||
nFeat = QgsProcessingUtils.featureCount(layer, context)
|
nFeat = input.featureCount()
|
||||||
for n, inFeat in enumerate(feats):
|
for n, inFeat in enumerate(feats):
|
||||||
|
if feedback.isCanceled():
|
||||||
|
break
|
||||||
feedback.setProgress(int(100 * n / nFeat))
|
feedback.setProgress(int(100 * n / nFeat))
|
||||||
attrs = inFeat.attributes()
|
attrs = inFeat.attributes()
|
||||||
clazz = attrs[class_field_index]
|
clazz = attrs[class_field_index]
|
||||||
@ -29,8 +40,10 @@ for n, inFeat in enumerate(feats):
|
|||||||
if value not in classes[clazz]:
|
if value not in classes[clazz]:
|
||||||
classes[clazz].append(value)
|
classes[clazz].append(value)
|
||||||
|
|
||||||
feats = processing.features(layer)
|
feats = input.getFeatures()
|
||||||
for n, inFeat in enumerate(feats):
|
for n, inFeat in enumerate(feats):
|
||||||
|
if feedback.isCanceled():
|
||||||
|
break
|
||||||
feedback.setProgress(int(100 * n / nFeat))
|
feedback.setProgress(int(100 * n / nFeat))
|
||||||
inGeom = inFeat.geometry()
|
inGeom = inFeat.geometry()
|
||||||
outFeat.setGeometry(inGeom)
|
outFeat.setGeometry(inGeom)
|
||||||
@ -38,6 +51,4 @@ for n, inFeat in enumerate(feats):
|
|||||||
clazz = attrs[class_field_index]
|
clazz = attrs[class_field_index]
|
||||||
attrs.append(len(classes[clazz]))
|
attrs.append(len(classes[clazz]))
|
||||||
outFeat.setAttributes(attrs)
|
outFeat.setAttributes(attrs)
|
||||||
writer.addFeature(outFeat)
|
sink.addFeature(outFeat)
|
||||||
|
|
||||||
del writer
|
|
||||||
|
|||||||
@ -181,16 +181,53 @@ class ScriptAlgorithm(QgsProcessingAlgorithm):
|
|||||||
ns['scriptDescriptionFile'] = self.descriptionFile
|
ns['scriptDescriptionFile'] = self.descriptionFile
|
||||||
|
|
||||||
for param in self.parameterDefinitions():
|
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['self'] = self
|
||||||
ns['parameters'] = parameters
|
ns['parameters'] = parameters
|
||||||
ns['feedback'] = feedback
|
ns['feedback'] = feedback
|
||||||
ns['context'] = context
|
ns['context'] = context
|
||||||
|
|
||||||
# for out in self.outputDefinitions():
|
|
||||||
# ns[out.name()] = out.value
|
|
||||||
|
|
||||||
variables = re.findall('@[a-zA-Z0-9_]*', self.script)
|
variables = re.findall('@[a-zA-Z0-9_]*', self.script)
|
||||||
script = 'import processing\n'
|
script = 'import processing\n'
|
||||||
script += self.script
|
script += self.script
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user