27
27
28
28
import math
29
29
from processing .algs .qgis .QgisAlgorithm import QgisAlgorithm
30
- from processing .core .GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
31
- from processing .core .parameters import ParameterVector , ParameterString
32
- from processing .core .outputs import OutputVector
33
- from processing .tools import dataobjects
34
30
35
31
from qgis .core import (QgsWkbTypes ,
36
32
QgsFeature ,
37
33
QgsFeatureSink ,
38
34
QgsGeometry ,
39
35
QgsField ,
40
- QgsApplication ,
41
- QgsProcessingUtils )
36
+ QgsProcessing ,
37
+ QgsProcessingParameterFeatureSource ,
38
+ QgsProcessingParameterString ,
39
+ QgsProcessingParameterFeatureSink ,
40
+ QgsProcessingException )
42
41
from qgis .PyQt .QtCore import QVariant
43
42
44
43
45
44
class ExtractSpecificNodes (QgisAlgorithm ):
46
-
47
- INPUT_LAYER = 'INPUT_LAYER'
48
- OUTPUT_LAYER = 'OUTPUT_LAYER'
45
+ INPUT = 'INPUT'
46
+ OUTPUT = 'OUTPUT'
49
47
NODES = 'NODES'
50
48
51
49
def group (self ):
@@ -55,11 +53,12 @@ def __init__(self):
55
53
super ().__init__ ()
56
54
57
55
def initAlgorithm (self , config = None ):
58
- self .addParameter (ParameterVector (self .INPUT_LAYER ,
59
- self .tr ('Input layer' ), [dataobjects .TYPE_VECTOR_ANY ]))
60
- self .addParameter (ParameterString (self .NODES ,
61
- self .tr ('Node indices' ), default = '0' ))
62
- self .addOutput (OutputVector (self .OUTPUT_LAYER , self .tr ('Nodes' ), datatype = [dataobjects .TYPE_VECTOR_POINT ]))
56
+ self .addParameter (QgsProcessingParameterFeatureSource (self .INPUT ,
57
+ self .tr ('Input layer' ), [QgsProcessing .TypeVectorAny ]))
58
+ self .addParameter (QgsProcessingParameterString (self .NODES ,
59
+ self .tr ('Node indices' ), defaultValue = '0' ))
60
+
61
+ self .addParameter (QgsProcessingParameterFeatureSink (self .OUTPUT , self .tr ('Nodes' ), QgsProcessing .TypeVectorPoint ))
63
62
64
63
def name (self ):
65
64
return 'extractspecificnodes'
@@ -68,34 +67,42 @@ def displayName(self):
68
67
return self .tr ('Extract specific nodes' )
69
68
70
69
def processAlgorithm (self , parameters , context , feedback ):
71
- layer = QgsProcessingUtils .mapLayerFromString (self .getParameterValue (self .INPUT_LAYER ), context )
72
-
73
- fields = layer .fields ()
70
+ source = self .parameterAsSource (parameters , self .INPUT , context )
71
+ fields = source .fields ()
74
72
fields .append (QgsField ('node_pos' , QVariant .Int ))
75
73
fields .append (QgsField ('node_index' , QVariant .Int ))
76
74
fields .append (QgsField ('distance' , QVariant .Double ))
77
75
fields .append (QgsField ('angle' , QVariant .Double ))
76
+ fields .append (QgsField ('NUM_FIELD' , QVariant .Int ))
77
+
78
+ wkb_type = QgsWkbTypes .Point
79
+ if QgsWkbTypes .hasM (source .wkbType ()):
80
+ wkb_type = QgsWkbTypes .addM (wkb_type )
81
+ if QgsWkbTypes .hasZ (source .wkbType ()):
82
+ wkb_type = QgsWkbTypes .addZ (wkb_type )
78
83
79
- writer = self .getOutputFromName (
80
- self . OUTPUT_LAYER ). getVectorWriter ( fields , QgsWkbTypes . Point , layer . crs (), context )
84
+ ( sink , dest_id ) = self .parameterAsSink ( parameters , self . OUTPUT , context ,
85
+ fields , wkb_type , source . sourceCrs () )
81
86
82
- node_indices_string = self .getParameterValue ( self .NODES )
87
+ node_indices_string = self .parameterAsString ( parameters , self .NODES , context )
83
88
indices = []
84
89
for node in node_indices_string .split (',' ):
85
90
try :
86
91
indices .append (int (node ))
87
92
except :
88
- raise GeoAlgorithmExecutionException (
93
+ raise QgsProcessingException (
89
94
self .tr ('\' {}\' is not a valid node index' ).format (node ))
90
95
91
- features = QgsProcessingUtils .getFeatures (layer , context )
92
- total = 100.0 / layer .featureCount () if layer .featureCount () else 0
96
+ features = source .getFeatures ()
97
+ total = 100.0 / source .featureCount () if source .featureCount () else 0
93
98
94
99
for current , f in enumerate (features ):
100
+ if feedback .isCanceled ():
101
+ break
95
102
96
103
input_geometry = f .geometry ()
97
104
if not input_geometry :
98
- writer .addFeature (f , QgsFeatureSink .FastInsert )
105
+ sink .addFeature (f , QgsFeatureSink .FastInsert )
99
106
else :
100
107
total_nodes = input_geometry .geometry ().nCoordinates ()
101
108
@@ -122,8 +129,8 @@ def processAlgorithm(self, parameters, context, feedback):
122
129
point = input_geometry .vertexAt (node_index )
123
130
output_feature .setGeometry (QgsGeometry (point ))
124
131
125
- writer .addFeature (output_feature , QgsFeatureSink .FastInsert )
132
+ sink .addFeature (output_feature , QgsFeatureSink .FastInsert )
126
133
127
134
feedback .setProgress (int (current * total ))
128
135
129
- del writer
136
+ return { self . OUTPUT : dest_id }
0 commit comments