2323# This will get replaced with a git SHA1 when you do a git archive
2424__revision__ = '$Format:%H$'
2525
26- from sextante .core .GeoAlgorithm import GeoAlgorithm
27- from sextante .outputs .OutputVector import OutputVector
28- from sextante .parameters .ParameterVector import ParameterVector
29- from qgis .core import *
26+ import sys
27+
3028from PyQt4 .QtCore import *
31- from PyQt4 .QtGui import *
32- from sextante .parameters .ParameterString import ParameterString
29+
30+ from qgis .core import *
31+
32+ from sextante .core .GeoAlgorithm import GeoAlgorithm
3333from sextante .core .QGisLayers import QGisLayers
3434from sextante .core .GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
35- import sys
35+
36+ from sextante .parameters .ParameterVector import ParameterVector
37+ from sextante .parameters .ParameterString import ParameterString
38+ from sextante .parameters .ParameterNumber import ParameterNumber
39+ from sextante .parameters .ParameterSelection import ParameterSelection
40+
41+ from sextante .outputs .OutputVector import OutputVector
3642
3743
3844class FieldsPyculator (GeoAlgorithm ):
3945
4046 INPUT_LAYER = "INPUT_LAYER"
41- USE_SELECTED = "USE_SELECTED"
4247 FIELD_NAME = "FIELD_NAME"
48+ FIELD_TYPE = "FIELD_TYPE"
49+ FIELD_LENGTH = "FIELD_LENGTH"
50+ FIELD_PRECISION = "FIELD_PRECISION"
4351 GLOBAL = "GLOBAL"
4452 FORMULA = "FORMULA"
4553 OUTPUT_LAYER = "OUTPUT_LAYER"
4654 RESULT_VAR_NAME = "value"
4755
56+ TYPE_NAMES = ["Integer" , "Float" , "String" ]
57+ TYPES = [QVariant .Int , QVariant .Double , QVariant .String ]
58+
59+
4860 #===========================================================================
4961 # def getIcon(self):
5062 # return QtGui.QIcon(os.path.dirname(__file__) + "/../images/qgis.png")
@@ -55,21 +67,27 @@ def defineCharacteristics(self):
5567 self .group = "Vector table tools"
5668 self .addParameter (ParameterVector (self .INPUT_LAYER , "Input layer" , ParameterVector .VECTOR_TYPE_ANY , False ))
5769 self .addParameter (ParameterString (self .FIELD_NAME , "Result field name" , "NewField" ))
70+ self .addParameter (ParameterSelection (self .FIELD_TYPE , "Field type" , self .TYPE_NAMES ))
71+ self .addParameter (ParameterNumber (self .FIELD_LENGTH , "Field lenght" , 1 , 255 , 10 ))
72+ self .addParameter (ParameterNumber (self .FIELD_PRECISION , "Field precision" , 0 , 10 , 0 ))
5873 self .addParameter (ParameterString (self .GLOBAL , "Global expression" , multiline = True ))
5974 self .addParameter (ParameterString (self .FORMULA , "Formula" , "value = " , multiline = True ))
6075 self .addOutput (OutputVector (self .OUTPUT_LAYER , "Output layer" ))
6176
62-
6377 def processAlgorithm (self , progress ):
64- fieldname = self .getParameterValue (self .FIELD_NAME )
78+ fieldName = self .getParameterValue (self .FIELD_NAME )
79+ fieldType = self .getParameterValue (self .FIELD_TYPE )
80+ fieldLength = self .getParameterValue (self .FIELD_LENGTH )
81+ fieldPrecision = self .getParameterValue (self .FIELD_PRECISION )
6582 code = self .getParameterValue (self .FORMULA )
6683 globalExpression = self .getParameterValue (self .GLOBAL )
6784 output = self .getOutputFromName (self .OUTPUT_LAYER )
85+
6886 layer = QGisLayers .getObjectFromUri (self .getParameterValue (self .INPUT_LAYER ))
69- vprovider = layer .dataProvider ()
70- fields = vprovider .fields ()
71- fields .append (QgsField (fieldname , QVariant . Double ))
72- writer = output .getVectorWriter (fields , vprovider .geometryType (), layer .crs () )
87+ provider = layer .dataProvider ()
88+ fields = provider .fields ()
89+ fields .append (QgsField (fieldName , self . TYPES [ fieldType ], "" , fieldLength , fieldPrecision ))
90+ writer = output .getVectorWriter (fields , provider .geometryType (), layer .crs ())
7391 outFeat = QgsFeature ()
7492 new_ns = {}
7593
@@ -84,22 +102,21 @@ def processAlgorithm(self, progress):
84102 (unicode (sys .exc_info ()[0 ].__name__ ), unicode (sys .exc_info ()[1 ])))
85103
86104 #replace all fields tags
87- fields = vprovider .fields ()
105+ fields = provider .fields ()
88106 num = 0
89107 for field in fields :
90108 field_name = unicode (field .name ())
91109 replval = '__attr[' + str (num ) + ']'
92- code = code .replace ("<" + field_name + ">" ,replval )
110+ code = code .replace ("<" + field_name + ">" , replval )
93111 num += 1
94112
95113 #replace all special vars
96- code = code .replace ('$id' ,'__id' )
97- code = code .replace ('$geom' ,'__geom' )
114+ code = code .replace ('$id' , '__id' )
115+ code = code .replace ('$geom' , '__geom' )
98116 need_id = code .find ("__id" ) != - 1
99117 need_geom = code .find ("__geom" ) != - 1
100118 need_attrs = code .find ("__attr" ) != - 1
101119
102-
103120 #compile
104121 try :
105122 bytecode = compile (code , '<string>' , 'exec' )
@@ -114,7 +131,7 @@ def processAlgorithm(self, progress):
114131 nElement = 1
115132 for feat in features :
116133 progress .setPercentage (int ((100 * nElement )/ nFeatures ))
117- attrMap = feat .attributes ()
134+ attrs = feat .attributes ()
118135 feat_id = feat .id ()
119136
120137 #add needed vars
@@ -126,14 +143,13 @@ def processAlgorithm(self, progress):
126143 new_ns ['__geom' ] = geom
127144
128145 if need_attrs :
129- pyattrs = [self .Qvar2py (a ) for a in attrMap ]
146+ pyattrs = [self .Qvar2py (a ) for a in attrs ]
130147 new_ns ['__attr' ] = pyattrs
131148
132149 #clear old result
133150 if new_ns .has_key (self .RESULT_VAR_NAME ):
134151 del new_ns [self .RESULT_VAR_NAME ]
135152
136-
137153 #exec
138154 #try:
139155 exec bytecode in new_ns
@@ -153,17 +169,15 @@ def processAlgorithm(self, progress):
153169 "Field code block does not return '%s1' variable! Please declare this variable in your code!" %
154170 self .RESULT_VAR_NAME )
155171
156-
157172 #write feature
158173 nElement += 1
159174 outFeat .setGeometry ( feat .geometry () )
160- attrMap .append (QVariant (new_ns [self .RESULT_VAR_NAME ]))
161- outFeat .setAttributeMap ( attrMap )
175+ attrs .append (QVariant (new_ns [self .RESULT_VAR_NAME ]))
176+ outFeat .setAttributes ( attrs )
162177 writer .addFeature (outFeat )
163178
164179 del writer
165180
166-
167181 def Qvar2py (self ,qv ):
168182 if qv .type () == 2 :
169183 return qv .toInt ()[0 ]
@@ -173,9 +187,6 @@ def Qvar2py(self,qv):
173187 return qv .toDouble ()[0 ]
174188 return None
175189
176-
177190 def checkParameterValuesBeforeExecuting (self ):
178191 ##TODO check that formula is correct and fields exist
179192 pass
180-
181-
0 commit comments