From ca15e289c046d80b7d2e8579ab78bb660d7e1172 Mon Sep 17 00:00:00 2001 From: Hugo Roussaffa Date: Mon, 30 Oct 2017 16:23:48 +0100 Subject: [PATCH] [add script] : Duplicate Field --- scripts/duplicate_field.py | 68 +++++++++++++++++++++++++++++++++ scripts/duplicate_field.py.help | 1 + scripts/list.txt | 1 + 3 files changed, 70 insertions(+) create mode 100644 scripts/duplicate_field.py create mode 100644 scripts/duplicate_field.py.help diff --git a/scripts/duplicate_field.py b/scripts/duplicate_field.py new file mode 100644 index 0000000..98e7595 --- /dev/null +++ b/scripts/duplicate_field.py @@ -0,0 +1,68 @@ +from qgis.core import * +from qgis.gui import * +from qgis.utils import * +from PyQt4.QtCore import QVariant + + +##Duplicate Fied=name +##input_layer=vector +##field_to_duplicate=field input_layer +##fieldname_list=string + + +layer = processing.getObject(input_layer) + +pr = layer.dataProvider() + +caps = pr.capabilities() + +def refreshLayer(): + layer.setCacheImage( None ) + layer.dataProvider().forceReload() + layer.triggerRepaint() + iface.mapCanvas().refreshAllLayers() + +fields = layer.pendingFields() + + +QVariantDict = { + 4 : QVariant.Int, + 1 : QVariant.Double, + 10 : QVariant.String, + 14 : QVariant.Date, +} + +listFieldName = str(fieldname_list).split(';') + +newFieldIndex = len(fields) +FieldIdx=0 + +for field in fields: + if field.name() == field_to_duplicate: + FieldIdx = fields.indexFromName(field.name()) + field_type = QVariantDict[field.type()] + field_precision = field.precision() + field_length = field.length() + field_widget = layer.editorWidgetV2(FieldIdx) + field_widgetConfig = layer.editorWidgetV2Config(FieldIdx) + progress.setText("{},{},{},{}".format(str(field.name()),str(FieldIdx), str(field_widget), str(field_widgetConfig))) + else: + pass + +for f in listFieldName: + if f in fields: + pass + else : + if caps & QgsVectorDataProvider.AddAttributes: + modelProperties= QgsField(f, field_type, str(field_length), int(field_precision), QVariant.String ) + res = pr.addAttributes([modelProperties]) + layer.updateFields() + layer.setEditorWidgetV2(newFieldIndex , field_widget) + layer.setEditorWidgetV2Config(newFieldIndex , field_widgetConfig) + newField_widget = layer.editorWidgetV2(newFieldIndex) + newField_widgetConfig = layer.editorWidgetV2Config(newFieldIndex) + progress.setText("{},{},{},{}".format(str(f),str(newFieldIndex), str(newField_widget), str(newField_widgetConfig))) + newFieldIndex += 1 + + +refreshLayer() \ No newline at end of file diff --git a/scripts/duplicate_field.py.help b/scripts/duplicate_field.py.help new file mode 100644 index 0000000..8633387 --- /dev/null +++ b/scripts/duplicate_field.py.help @@ -0,0 +1 @@ +{"field_to_duplicate": "the field you want to duplicate", "ALG_DESC": "This script create fields based on an existing field properties (type, length, precision) and widget configuration", "ALG_CREATOR": "Hugo Roussaffa - Geodatup. contact@geodatup.fr", "ALG_VERSION": "0.1", "input_layer": "The layer you want to work with (creating new fields", "fieldname_list": "the list of field name you want to create, separate by semi-colon ; \nBy exemple : FIELD1;FIELD2 /n /nnote: If a field already exist, the algorithm automaticaly create a suffix '_1' to the name's field ", "ALG_HELP_CREATOR": "Hugo Roussaffa - Geodatup. contact@geodatup.fr"} \ No newline at end of file diff --git a/scripts/list.txt b/scripts/list.txt index a66e636..2f7e12e 100644 --- a/scripts/list.txt +++ b/scripts/list.txt @@ -14,6 +14,7 @@ Define_1_raster_layer_properties.py,1.0,Define 1 raster layer properties Define_1_vector_layer_properties.py,1.0,Define 1 vector layer properties Define_vector_layer_properties.py,1.0,Define vector layer properties DissolveWithStats.py,0.4,DissolveWithStats +duplicate_field.py,0.1,Duplicate Field EquivalentNumField.py,1.0,EquivalentNumField Extract_raster_values_to_CSV.py,1,Extract raster values to CSV Extract_raster_values_to_shapefile.py,1,Extract raster values to shapefile