2

I have the following PyQGIS script with QGIS 3 that tries to ask for a layer, add a new field in that layer and modify the value of this field. But the code doesn't work. I get either Seems there is no valid script in the file when I use layer = QgsVectorLayer(Layer) or AttributeError: 'NoneType' object has no attribute 'isValid' when I use QgsProcessingUtils.mapLayerFromString :

##Layer=vector
context = QgsProcessingContext()
layer= QgsProcessingUtils.mapLayerFromString(Layer, context)

layer.startEditing()

if layer.dataProvider().fieldNameIndex("new_col_name") == -1:
    layer.dataProvider().addAttributes([QgsField("new_col_name", QVariant.String)])
layer.updateFields()

id_new_col= feuilles.dataProvider().fieldNameIndex("new_col_name")

for feature in layer.getFeatures():
  column_value= feature["column"]
  ... some operations ...
  layer.changeAttributeValue(feature.id(), id_new_col, new_column_value)

layer.commitChanges()
PolyGeo
  • 65,136
  • 29
  • 109
  • 338
dmjf08
  • 1,263
  • 7
  • 16
  • Are you creating a processing script? In QGIS 3.x the Python interface has been redesigned. See https://gis.stackexchange.com/questions/282773/writing-a-python-processing-script-with-qgis-3-0 – Zoltan Jan 10 '19 at 16:17

1 Answers1

7

Not sure how to prompt for a layer, but working code below (with a shapefile) uses the currently selected layer. Note that the new field name was shortened due to name length constraints on shapefiles.

layer = iface.mapCanvas().currentLayer()
layer.startEditing()

if layer.dataProvider().fieldNameIndex("new_col_na") == -1:
    layer.dataProvider().addAttributes([QgsField("new_col_na", QVariant.String)])
    layer.updateFields()

id_new_col= layer.dataProvider().fieldNameIndex("new_col_na")

for feature in layer.getFeatures():
    layer.changeAttributeValue(feature.id(), id_new_col, "val")

layer.commitChanges()
cokrzys
  • 657
  • 3
  • 7