2929from qgis .core import (QgsField ,
3030 QgsFeature ,
3131 QgsApplication ,
32- QgsProcessingUtils )
33- from processing .algs .qgis import QgisAlgorithm
34- from processing .core .parameters import ParameterVector
35- from processing .core .parameters import ParameterString
36- from processing .core .parameters import ParameterNumber
37- from processing .core .parameters import ParameterSelection
38- from processing .core .outputs import OutputVector
32+ QgsProcessingUtils ,
33+ QgsProcessingParameterFeatureSource ,
34+ QgsProcessingParameterString ,
35+ QgsProcessingParameterNumber ,
36+ QgsProcessingParameterEnum ,
37+ QgsProcessingParameterFeatureSink ,
38+ QgsProcessingOutputVectorLayer )
39+ from processing .algs .qgis .QgisAlgorithm import QgisAlgorithm
3940
4041
4142class AddTableField (QgisAlgorithm ):
@@ -64,18 +65,19 @@ def __init__(self):
6465 self .tr ('Float' ),
6566 self .tr ('String' )]
6667
67- self .addParameter (ParameterVector (self .INPUT_LAYER ,
68- self .tr ('Input layer' )))
69- self .addParameter (ParameterString (self .FIELD_NAME ,
70- self .tr ('Field name' )))
71- self .addParameter (ParameterSelection (self .FIELD_TYPE ,
72- self .tr ('Field type' ), self .type_names ))
73- self .addParameter (ParameterNumber (self .FIELD_LENGTH ,
74- self .tr ('Field length' ), 1 , 255 , 10 ))
75- self .addParameter (ParameterNumber (self .FIELD_PRECISION ,
76- self .tr ('Field precision' ), 0 , 10 , 0 ))
77- self .addOutput (OutputVector (
78- self .OUTPUT_LAYER , self .tr ('Added' )))
68+ self .addParameter (QgsProcessingParameterFeatureSource (self .INPUT_LAYER ,
69+ self .tr ('Input layer' )))
70+ self .addParameter (QgsProcessingParameterString (self .FIELD_NAME ,
71+ self .tr ('Field name' )))
72+ self .addParameter (QgsProcessingParameterEnum (self .FIELD_TYPE ,
73+ self .tr ('Field type' ), self .type_names ))
74+ self .addParameter (QgsProcessingParameterNumber (self .FIELD_LENGTH ,
75+ self .tr ('Field length' ), QgsProcessingParameterNumber .Integer ,
76+ 10 , False , 1 , 255 ))
77+ self .addParameter (QgsProcessingParameterNumber (self .FIELD_PRECISION ,
78+ self .tr ('Field precision' ), QgsProcessingParameterNumber .Integer , 0 , False , 0 , 10 ))
79+ self .addParameter (QgsProcessingParameterFeatureSink (self .OUTPUT_LAYER , self .tr ('Added' )))
80+ self .addOutput (QgsProcessingOutputVectorLayer (self .OUTPUT_LAYER , self .tr ('Added' )))
7981
8082 def name (self ):
8183 return 'addfieldtoattributestable'
@@ -84,27 +86,32 @@ def displayName(self):
8486 return self .tr ('Add field to attributes table' )
8587
8688 def processAlgorithm (self , parameters , context , feedback ):
87- fieldType = self .getParameterValue (self .FIELD_TYPE )
88- fieldName = self .getParameterValue (self .FIELD_NAME )
89- fieldLength = self .getParameterValue (self .FIELD_LENGTH )
90- fieldPrecision = self .getParameterValue (self .FIELD_PRECISION )
91- output = self .getOutputFromName (self .OUTPUT_LAYER )
89+ source = self .parameterAsSource (parameters , self .INPUT_LAYER , context )
9290
93- layer = QgsProcessingUtils .mapLayerFromString (self .getParameterValue (self .INPUT_LAYER ), context )
91+ fieldType = self .parameterAsEnum (parameters , self .FIELD_TYPE , context )
92+ fieldName = self .parameterAsString (parameters , self .FIELD_NAME , context )
93+ fieldLength = self .parameterAsInt (parameters , self .FIELD_LENGTH , context )
94+ fieldPrecision = self .parameterAsInt (parameters , self .FIELD_PRECISION , context )
9495
95- fields = layer .fields ()
96+ fields = source .fields ()
9697 fields .append (QgsField (fieldName , self .TYPES [fieldType ], '' ,
9798 fieldLength , fieldPrecision ))
98- writer = output .getVectorWriter (fields , layer .wkbType (), layer .crs (), context )
99- outFeat = QgsFeature ()
100- features = QgsProcessingUtils .getFeatures (layer , context )
101- total = 100.0 / QgsProcessingUtils .featureCount (layer , context )
102- for current , feat in enumerate (features ):
99+ (sink , dest_id ) = self .parameterAsSink (parameters , self .OUTPUT_LAYER , context ,
100+ fields , source .wkbType (), source .sourceCrs ())
101+
102+ features = source .getFeatures ()
103+ total = 100.0 / source .featureCount ()
104+
105+ for current , input_feature in enumerate (features ):
106+ if feedback .isCanceled ():
107+ break
108+
109+ output_feature = input_feature
110+ attributes = input_feature .attributes ()
111+ attributes .append (None )
112+ output_feature .setAttributes (attributes )
113+
114+ sink .addFeature (output_feature )
103115 feedback .setProgress (int (current * total ))
104- geom = feat .geometry ()
105- outFeat .setGeometry (geom )
106- atMap = feat .attributes ()
107- atMap .append (None )
108- outFeat .setAttributes (atMap )
109- writer .addFeature (outFeat )
110- del writer
116+
117+ return {self .OUTPUT_LAYER : dest_id }
0 commit comments