27
27
28
28
from qgis .core import (QgsWkbTypes ,
29
29
QgsFeatureSink ,
30
+ QgsFeatureRequest ,
31
+ QgsProcessingFeatureSource ,
30
32
QgsGeometry ,
31
- QgsApplication ,
32
- QgsMessageLog ,
33
- QgsProcessingUtils )
33
+ QgsProcessingParameterDefinition ,
34
+ QgsProcessingParameterFeatureSource ,
35
+ QgsProcessingParameterFeatureSink ,
36
+ QgsProcessingOutputVectorLayer )
34
37
35
38
from processing .algs .qgis .QgisAlgorithm import QgisAlgorithm
36
- from processing .core .parameters import ParameterVector
37
- from processing .core .outputs import OutputVector
38
- from processing .core .GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
39
- from processing .tools import dataobjects
40
39
41
40
42
41
class FixGeometry (QgisAlgorithm ):
@@ -52,11 +51,9 @@ def group(self):
52
51
53
52
def __init__ (self ):
54
53
super ().__init__ ()
55
- self .addParameter (ParameterVector (self .INPUT ,
56
- self .tr ('Input Layer' ),
57
- [dataobjects .TYPE_VECTOR_POLYGON , dataobjects .TYPE_VECTOR_LINE ]))
58
- self .addOutput (OutputVector (self .OUTPUT ,
59
- self .tr ('Layer with fixed geometries' )))
54
+ self .addParameter (QgsProcessingParameterFeatureSource (self .INPUT , self .tr ('Input layer' ), [QgsProcessingParameterDefinition .TypeVectorLine , QgsProcessingParameterDefinition .TypeVectorPolygon ]))
55
+ self .addParameter (QgsProcessingParameterFeatureSink (self .OUTPUT , self .tr ('Fixed geometries' )))
56
+ self .addOutput (QgsProcessingOutputVectorLayer (self .OUTPUT , self .tr ("Fixed geometries" )))
60
57
61
58
def name (self ):
62
59
return 'fixgeometries'
@@ -65,22 +62,22 @@ def displayName(self):
65
62
return self .tr ('Fix geometries' )
66
63
67
64
def processAlgorithm (self , parameters , context , feedback ):
68
- layer = QgsProcessingUtils . mapLayerFromString ( self .getParameterValue ( self .INPUT ) , context )
65
+ source = self .parameterAsSource ( parameters , self .INPUT , context )
69
66
70
- writer = self .getOutputFromName (
71
- self . OUTPUT ). getVectorWriter ( layer . fields (), QgsWkbTypes .multiType (layer .wkbType ()), layer . crs (), context )
67
+ ( sink , dest_id ) = self .parameterAsSink ( parameters , self . OUTPUT , context ,
68
+ source . fields (), QgsWkbTypes .multiType (source .wkbType ()), source . sourceCrs () )
72
69
73
- features = QgsProcessingUtils .getFeatures (layer , context )
74
- if QgsProcessingUtils .featureCount (layer , context ) == 0 :
75
- raise GeoAlgorithmExecutionException (self .tr ('There are no features in the input layer' ))
76
-
77
- total = 100.0 / layer .featureCount () if layer .featureCount () else 0
70
+ features = source .getFeatures (QgsFeatureRequest (), QgsProcessingFeatureSource .FlagSkipGeometryValidityChecks )
71
+ total = 100.0 / source .featureCount () if source .featureCount () else 0
78
72
for current , inputFeature in enumerate (features ):
73
+ if feedback .isCanceled ():
74
+ break
75
+
79
76
outputFeature = inputFeature
80
77
if inputFeature .geometry ():
81
78
outputGeometry = inputFeature .geometry ().makeValid ()
82
79
if not outputGeometry :
83
- QgsMessageLog . logMessage ('makeValid failed for feature {}' .format (inputFeature .id ()), self . tr ( 'Processing' ), QgsMessageLog . WARNING )
80
+ feedback . pushInfo ('makeValid failed for feature {}' .format (inputFeature .id ()))
84
81
85
82
if outputGeometry .wkbType () == QgsWkbTypes .Unknown or QgsWkbTypes .flatType (outputGeometry .geometry ().wkbType ()) == QgsWkbTypes .GeometryCollection :
86
83
tmpGeometries = outputGeometry .asGeometryCollection ()
@@ -89,7 +86,7 @@ def processAlgorithm(self, parameters, context, feedback):
89
86
try :
90
87
g .convertToMultiType ()
91
88
outputFeature .setGeometry (QgsGeometry (g ))
92
- writer .addFeature (outputFeature , QgsFeatureSink .FastInsert )
89
+ sink .addFeature (outputFeature , QgsFeatureSink .FastInsert )
93
90
except :
94
91
pass
95
92
feedback .setProgress (int (current * total ))
@@ -98,7 +95,7 @@ def processAlgorithm(self, parameters, context, feedback):
98
95
outputGeometry .convertToMultiType ()
99
96
outputFeature .setGeometry (outputGeometry )
100
97
101
- writer .addFeature (outputFeature , QgsFeatureSink .FastInsert )
98
+ sink .addFeature (outputFeature , QgsFeatureSink .FastInsert )
102
99
feedback .setProgress (int (current * total ))
103
100
104
- del writer
101
+ return { self . OUTPUT : dest_id }
1 commit comments
nirvn commentedon Jun 26, 2017
Ahh, thanks.