Skip to content

Commit

Permalink
[processing] Add missing field types to the advanced (i.e. python) fi…
Browse files Browse the repository at this point in the history
…eld calculator algorithm
  • Loading branch information
nirvn authored and nyalldawson committed Jan 31, 2022
1 parent 688a3fc commit 835fe14
Showing 1 changed file with 55 additions and 9 deletions.
64 changes: 55 additions & 9 deletions python/plugins/processing/algs/qgis/FieldPyculator.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,15 @@
from qgis.PyQt.QtCore import QVariant
from qgis.core import (QgsProcessingException,
QgsField,
QgsFields,
QgsFeatureSink,
QgsProcessing,
QgsProcessingParameterFeatureSource,
QgsProcessingParameterString,
QgsProcessingParameterEnum,
QgsProcessingParameterNumber,
QgsProcessingParameterFeatureSink)
QgsProcessingParameterFeatureSink,
QgsVariantUtils)
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm


Expand All @@ -59,16 +61,31 @@ def __init__(self):
super().__init__()

def initAlgorithm(self, config=None):
self.type_names = [self.tr('Integer'),
self.tr('Float'),
self.tr('String')]

self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT, self.tr('Input layer'),
types=[QgsProcessing.TypeVector]))
self.addParameter(QgsProcessingParameterString(self.FIELD_NAME,
self.tr('Result field name'), defaultValue='NewField'))
self.addParameter(QgsProcessingParameterEnum(self.FIELD_TYPE,
self.tr('Field type'), options=self.type_names))

types = [[QVariant.Int, QVariant.Invalid],
[QVariant.Double, QVariant.Invalid],
[QVariant.String, QVariant.Invalid],
[QVariant.Bool, QVariant.Invalid],
[QVariant.Date, QVariant.Invalid],
[QVariant.Time, QVariant.Invalid],
[QVariant.DateTime, QVariant.Invalid],
[QVariant.ByteArray, QVariant.Invalid],
[QVariant.StringList, QVariant.String],
[QVariant.List, QVariant.Int],
[QVariant.List, QVariant.Double]]
type_names = []
type_icons = []
for t in types:
type_names.append(QgsVariantUtils.typeToDisplayString(t[0], t[1]))
type_icons.append(QgsFields.iconForFieldType(t[0], t[1]))
param = QgsProcessingParameterEnum('FIELD_TYPE', 'Field type', options=type_names)
param.setMetadata({'widget_wrapper': {'icons': type_icons}})
self.addParameter(param)

self.addParameter(QgsProcessingParameterNumber(self.FIELD_LENGTH,
self.tr('Field length'), minValue=0,
defaultValue=10))
Expand All @@ -94,14 +111,43 @@ def processAlgorithm(self, parameters, context, feedback):
raise QgsProcessingException(self.invalidSourceError(parameters, self.INPUT))

field_name = self.parameterAsString(parameters, self.FIELD_NAME, context)
field_type = self.TYPES[self.parameterAsEnum(parameters, self.FIELD_TYPE, context)]

field_type = QVariant.Invalid
field_sub_type = QVariant.Invalid
field_type_parameter = self.parameterAsEnum(parameters, self.FIELD_TYPE, context)
if field_type_parameter == 0: # Integer
field_type = QVariant.Int
elif field_type_parameter == 1: # Float
field_type = QVariant.Double
elif field_type_parameter == 2: # String
field_type = QVariant.String
elif field_type_parameter == 3: # Boolean
field_type = QVariant.Bool
elif field_type_parameter == 4: # Date
field_type = QVariant.Date
elif field_type_parameter == 5: # Time
field_type = QVariant.Time
elif field_type_parameter == 6: # DateTime
field_type = QVariant.DateTime
elif field_type_parameter == 7: # Binary
field_type = QVariant.ByteArray
elif field_type_parameter == 8: # StringList
field_type = QVariant.StringList
field_sub_type = QVariant.String
elif field_type_parameter == 9: # IntegerList
field_type = QVariant.List
field_sub_type = QVariant.Int
elif field_type_parameter == 10: # DoubleList
field_type = QVariant.List
field_sub_type = QVariant.Double

width = self.parameterAsInt(parameters, self.FIELD_LENGTH, context)
precision = self.parameterAsInt(parameters, self.FIELD_PRECISION, context)
code = self.parameterAsString(parameters, self.FORMULA, context)
globalExpression = self.parameterAsString(parameters, self.GLOBAL, context)

fields = source.fields()
field = QgsField(field_name, field_type, '', width, precision)
field = QgsField(field_name, field_type, '', width, precision, '', field_sub_type)
fields.append(field)
new_ns = {}

Expand Down

0 comments on commit 835fe14

Please sign in to comment.