23
23
# This will get replaced with a git SHA1 when you do a git archive
24
24
__revision__ = '$Format:%H$'
25
25
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
+
30
28
from 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
33
33
from sextante .core .QGisLayers import QGisLayers
34
34
from 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
36
42
37
43
38
44
class FieldsPyculator (GeoAlgorithm ):
39
45
40
46
INPUT_LAYER = "INPUT_LAYER"
41
- USE_SELECTED = "USE_SELECTED"
42
47
FIELD_NAME = "FIELD_NAME"
48
+ FIELD_TYPE = "FIELD_TYPE"
49
+ FIELD_LENGTH = "FIELD_LENGTH"
50
+ FIELD_PRECISION = "FIELD_PRECISION"
43
51
GLOBAL = "GLOBAL"
44
52
FORMULA = "FORMULA"
45
53
OUTPUT_LAYER = "OUTPUT_LAYER"
46
54
RESULT_VAR_NAME = "value"
47
55
56
+ TYPE_NAMES = ["Integer" , "Float" , "String" ]
57
+ TYPES = [QVariant .Int , QVariant .Double , QVariant .String ]
58
+
59
+
48
60
#===========================================================================
49
61
# def getIcon(self):
50
62
# return QtGui.QIcon(os.path.dirname(__file__) + "/../images/qgis.png")
@@ -55,21 +67,27 @@ def defineCharacteristics(self):
55
67
self .group = "Vector table tools"
56
68
self .addParameter (ParameterVector (self .INPUT_LAYER , "Input layer" , ParameterVector .VECTOR_TYPE_ANY , False ))
57
69
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 ))
58
73
self .addParameter (ParameterString (self .GLOBAL , "Global expression" , multiline = True ))
59
74
self .addParameter (ParameterString (self .FORMULA , "Formula" , "value = " , multiline = True ))
60
75
self .addOutput (OutputVector (self .OUTPUT_LAYER , "Output layer" ))
61
76
62
-
63
77
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 )
65
82
code = self .getParameterValue (self .FORMULA )
66
83
globalExpression = self .getParameterValue (self .GLOBAL )
67
84
output = self .getOutputFromName (self .OUTPUT_LAYER )
85
+
68
86
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 ())
73
91
outFeat = QgsFeature ()
74
92
new_ns = {}
75
93
@@ -84,22 +102,21 @@ def processAlgorithm(self, progress):
84
102
(unicode (sys .exc_info ()[0 ].__name__ ), unicode (sys .exc_info ()[1 ])))
85
103
86
104
#replace all fields tags
87
- fields = vprovider .fields ()
105
+ fields = provider .fields ()
88
106
num = 0
89
107
for field in fields :
90
108
field_name = unicode (field .name ())
91
109
replval = '__attr[' + str (num ) + ']'
92
- code = code .replace ("<" + field_name + ">" ,replval )
110
+ code = code .replace ("<" + field_name + ">" , replval )
93
111
num += 1
94
112
95
113
#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' )
98
116
need_id = code .find ("__id" ) != - 1
99
117
need_geom = code .find ("__geom" ) != - 1
100
118
need_attrs = code .find ("__attr" ) != - 1
101
119
102
-
103
120
#compile
104
121
try :
105
122
bytecode = compile (code , '<string>' , 'exec' )
@@ -114,7 +131,7 @@ def processAlgorithm(self, progress):
114
131
nElement = 1
115
132
for feat in features :
116
133
progress .setPercentage (int ((100 * nElement )/ nFeatures ))
117
- attrMap = feat .attributes ()
134
+ attrs = feat .attributes ()
118
135
feat_id = feat .id ()
119
136
120
137
#add needed vars
@@ -126,14 +143,13 @@ def processAlgorithm(self, progress):
126
143
new_ns ['__geom' ] = geom
127
144
128
145
if need_attrs :
129
- pyattrs = [self .Qvar2py (a ) for a in attrMap ]
146
+ pyattrs = [self .Qvar2py (a ) for a in attrs ]
130
147
new_ns ['__attr' ] = pyattrs
131
148
132
149
#clear old result
133
150
if new_ns .has_key (self .RESULT_VAR_NAME ):
134
151
del new_ns [self .RESULT_VAR_NAME ]
135
152
136
-
137
153
#exec
138
154
#try:
139
155
exec bytecode in new_ns
@@ -153,17 +169,15 @@ def processAlgorithm(self, progress):
153
169
"Field code block does not return '%s1' variable! Please declare this variable in your code!" %
154
170
self .RESULT_VAR_NAME )
155
171
156
-
157
172
#write feature
158
173
nElement += 1
159
174
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 )
162
177
writer .addFeature (outFeat )
163
178
164
179
del writer
165
180
166
-
167
181
def Qvar2py (self ,qv ):
168
182
if qv .type () == 2 :
169
183
return qv .toInt ()[0 ]
@@ -173,9 +187,6 @@ def Qvar2py(self,qv):
173
187
return qv .toDouble ()[0 ]
174
188
return None
175
189
176
-
177
190
def checkParameterValuesBeforeExecuting (self ):
178
191
##TODO check that formula is correct and fields exist
179
192
pass
180
-
181
-
0 commit comments