36
36
QgsField ,
37
37
QgsWkbTypes ,
38
38
QgsProcessingUtils ,
39
- QgsFields )
39
+ QgsFields ,
40
+ QgsProcessingParameterFeatureSource ,
41
+ QgsProcessingParameterEnum ,
42
+ QgsProcessingParameterFeatureSink ,
43
+ QgsProcessingOutputVectorLayer ,
44
+ QgsProcessingParameterDefinition
45
+ )
40
46
from processing .algs .qgis .QgisAlgorithm import QgisAlgorithm
41
- from processing .core .parameters import ParameterVector
42
- from processing .core .parameters import ParameterSelection
43
- from processing .core .outputs import OutputVector
44
47
45
48
settings_method_key = "/qgis/digitizing/validate_geometries"
46
49
pluginPath = os .path .split (os .path .split (os .path .dirname (__file__ ))[0 ])[0 ]
@@ -66,26 +69,17 @@ def __init__(self):
66
69
'QGIS' ,
67
70
'GEOS' ]
68
71
69
- self .addParameter (ParameterVector (
70
- self .INPUT_LAYER ,
71
- self .tr ('Input layer' )))
72
+ self .addParameter (QgsProcessingParameterFeatureSource (self .INPUT_LAYER ,
73
+ self .tr ('Input layer' )))
74
+ self .addParameter (QgsProcessingParameterEnum (self .METHOD ,
75
+ self .tr ('Method' ), self .methods ))
72
76
73
- self .addParameter (ParameterSelection (
74
- self .METHOD ,
75
- self .tr ('Method' ),
76
- self .methods ))
77
-
78
- self .addOutput (OutputVector (
79
- self .VALID_OUTPUT ,
80
- self .tr ('Valid output' )))
81
-
82
- self .addOutput (OutputVector (
83
- self .INVALID_OUTPUT ,
84
- self .tr ('Invalid output' )))
85
-
86
- self .addOutput (OutputVector (
87
- self .ERROR_OUTPUT ,
88
- self .tr ('Error output' )))
77
+ self .addParameter (QgsProcessingParameterFeatureSink (self .VALID_OUTPUT , self .tr ('Valid output' ), QgsProcessingParameterDefinition .TypeVectorAny , '' , True ))
78
+ self .addOutput (QgsProcessingOutputVectorLayer (self .VALID_OUTPUT , self .tr ('Valid output' )))
79
+ self .addParameter (QgsProcessingParameterFeatureSink (self .INVALID_OUTPUT , self .tr ('Invalid output' ), QgsProcessingParameterDefinition .TypeVectorAny , '' , True ))
80
+ self .addOutput (QgsProcessingOutputVectorLayer (self .INVALID_OUTPUT , self .tr ('Invalid output' )))
81
+ self .addParameter (QgsProcessingParameterFeatureSink (self .ERROR_OUTPUT , self .tr ('Error output' ), QgsProcessingParameterDefinition .TypeVectorAny , '' , True ))
82
+ self .addOutput (QgsProcessingOutputVectorLayer (self .ERROR_OUTPUT , self .tr ('Error output' )))
89
83
90
84
def name (self ):
91
85
return 'checkvalidity'
@@ -94,51 +88,48 @@ def displayName(self):
94
88
return self .tr ('Check validity' )
95
89
96
90
def processAlgorithm (self , parameters , context , feedback ):
97
- settings = QgsSettings ()
98
- initial_method_setting = settings .value (settings_method_key , 1 )
99
-
100
- method = self .getParameterValue (self .METHOD )
101
- if method != 0 :
102
- settings .setValue (settings_method_key , method )
103
- try :
104
- self .doCheck (context , feedback )
105
- finally :
106
- settings .setValue (settings_method_key , initial_method_setting )
107
-
108
- def doCheck (self , context , feedback ):
109
- layer = QgsProcessingUtils .mapLayerFromString (self .getParameterValue (self .INPUT_LAYER ), context )
110
-
111
- settings = QgsSettings ()
112
- method = int (settings .value (settings_method_key , 1 ))
113
-
114
- valid_output = self .getOutputFromName (self .VALID_OUTPUT )
115
- valid_fields = layer .fields ()
116
- valid_writer = valid_output .getVectorWriter (valid_fields , layer .wkbType (), layer .crs (), context )
91
+ method_param = self .parameterAsEnum (parameters , self .METHOD , context )
92
+ if method_param == 0 :
93
+ settings = QgsSettings ()
94
+ method = int (settings .value (settings_method_key , 0 )) - 1
95
+ if method < 0 :
96
+ method = 0
97
+ else :
98
+ method = method_param - 1
99
+
100
+ results = self .doCheck (method , parameters , context , feedback )
101
+ return results
102
+
103
+ def doCheck (self , method , parameters , context , feedback ):
104
+ source = self .parameterAsSource (parameters , self .INPUT_LAYER , context )
105
+
106
+ (valid_output_sink , valid_output_dest_id ) = self .parameterAsSink (parameters , self .VALID_OUTPUT , context ,
107
+ source .fields (), source .wkbType (), source .sourceCrs ())
117
108
valid_count = 0
118
109
119
- invalid_output = self .getOutputFromName (self .INVALID_OUTPUT )
120
- invalid_fields = layer .fields ()
121
- invalid_fields .append (QgsField ('_errors' ,
122
- QVariant .String ,
123
- 255 ))
124
- invalid_writer = invalid_output .getVectorWriter (invalid_fields , layer .wkbType (), layer .crs (), context )
110
+ invalid_fields = source .fields ()
111
+ invalid_fields .append (QgsField ('_errors' , QVariant .String , 'string' , 255 ))
112
+ (invalid_output_sink , invalid_output_dest_id ) = self .parameterAsSink (parameters , self .INVALID_OUTPUT , context ,
113
+ invalid_fields , source .wkbType (), source .sourceCrs ())
125
114
invalid_count = 0
126
115
127
- error_output = self .getOutputFromName (self .ERROR_OUTPUT )
128
116
error_fields = QgsFields ()
129
- error_fields .append (QgsField ('message' , QVariant .String , 255 ))
130
- error_writer = error_output .getVectorWriter (error_fields , QgsWkbTypes .Point , layer .crs (), context )
117
+ error_fields .append (QgsField ('message' , QVariant .String , 'string' , 255 ))
118
+ (error_output_sink , error_output_dest_id ) = self .parameterAsSink (parameters , self .ERROR_OUTPUT , context ,
119
+ error_fields , QgsWkbTypes .Point , source .sourceCrs ())
131
120
error_count = 0
132
121
133
- features = QgsProcessingUtils .getFeatures (layer , context )
134
- total = 100.0 / QgsProcessingUtils .featureCount (layer , context )
122
+ features = source .getFeatures ()
123
+ total = 100.0 / source .featureCount ()
135
124
for current , inFeat in enumerate (features ):
125
+ if feedback .isCanceled ():
126
+ break
136
127
geom = inFeat .geometry ()
137
128
attrs = inFeat .attributes ()
138
129
139
130
valid = True
140
131
if not geom .isNull () and not geom .isEmpty ():
141
- errors = list (geom .validateGeometry ())
132
+ errors = list (geom .validateGeometry (method ))
142
133
if errors :
143
134
# QGIS method return a summary at the end
144
135
if method == 1 :
@@ -150,7 +141,8 @@ def doCheck(self, context, feedback):
150
141
error_geom = QgsGeometry .fromPoint (error .where ())
151
142
errFeat .setGeometry (error_geom )
152
143
errFeat .setAttributes ([error .what ()])
153
- error_writer .addFeature (errFeat )
144
+ if error_output_sink :
145
+ error_output_sink .addFeature (errFeat )
154
146
error_count += 1
155
147
156
148
reasons .append (error .what ())
@@ -165,22 +157,22 @@ def doCheck(self, context, feedback):
165
157
outFeat .setAttributes (attrs )
166
158
167
159
if valid :
168
- valid_writer .addFeature (outFeat )
160
+ if valid_output_sink :
161
+ valid_output_sink .addFeature (outFeat )
169
162
valid_count += 1
170
163
171
164
else :
172
- invalid_writer .addFeature (outFeat )
165
+ if invalid_output_sink :
166
+ invalid_output_sink .addFeature (outFeat )
173
167
invalid_count += 1
174
168
175
169
feedback .setProgress (int (current * total ))
176
170
177
- del valid_writer
178
- del invalid_writer
179
- del error_writer
180
-
181
- if valid_count != 0 :
182
- context .addLayerToLoadOnCompletion (valid_output .value )
183
- if invalid_count != 0 :
184
- context .addLayerToLoadOnCompletion (invalid_output .value )
185
- if error_count != 0 :
186
- context .addLayerToLoadOnCompletion (error_output .value )
171
+ results = {}
172
+ if valid_output_sink :
173
+ results [self .VALID_OUTPUT ] = valid_output_dest_id
174
+ if invalid_output_sink :
175
+ results [self .INVALID_OUTPUT ] = invalid_output_dest_id
176
+ if error_output_sink :
177
+ results [self .ERROR_OUTPUT ] = error_output_dest_id
178
+ return results
0 commit comments