Skip to content

Commit 076fdc9

Browse files
committed
Port rectangles, ovals, diamonds to new API
1 parent 4820216 commit 076fdc9

File tree

4 files changed

+300
-206
lines changed

4 files changed

+300
-206
lines changed

python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,8 @@
119119
from .RandomSelectionWithinSubsets import RandomSelectionWithinSubsets
120120
from .Rasterize import RasterizeAlgorithm
121121
from .RasterLayerStatistics import RasterLayerStatistics
122+
from .RectanglesOvalsDiamondsFixed import RectanglesOvalsDiamondsFixed
123+
from .RectanglesOvalsDiamondsVariable import RectanglesOvalsDiamondsVariable
122124
from .RegularPoints import RegularPoints
123125
from .Relief import Relief
124126
from .ReverseLineDirection import ReverseLineDirection
@@ -166,8 +168,6 @@
166168
# from .FieldPyculator import FieldsPyculator
167169
# from .SelectByAttributeSum import SelectByAttributeSum
168170
# from .DefineProjection import DefineProjection
169-
# from .RectanglesOvalsDiamondsVariable import RectanglesOvalsDiamondsVariable
170-
# from .RectanglesOvalsDiamondsFixed import RectanglesOvalsDiamondsFixed
171171
# from .IdwInterpolation import IdwInterpolation
172172
# from .TinInterpolation import TinInterpolation
173173
# from .RasterCalculator import RasterCalculator
@@ -194,8 +194,6 @@ def getAlgs(self):
194194
# FieldsPyculator(),
195195
# FieldsMapper(), SelectByAttributeSum()
196196
# DefineProjection(),
197-
# RectanglesOvalsDiamondsVariable(),
198-
# RectanglesOvalsDiamondsFixed(),
199197
# IdwInterpolation(), TinInterpolation(),
200198
# RasterCalculator(),
201199
# ExecuteSQL(), FindProjection(),
@@ -279,6 +277,8 @@ def getAlgs(self):
279277
RandomSelectionWithinSubsets(),
280278
RasterizeAlgorithm(),
281279
RasterLayerStatistics(),
280+
RectanglesOvalsDiamondsFixed(),
281+
RectanglesOvalsDiamondsVariable(),
282282
RegularPoints(),
283283
Relief(),
284284
ReverseLineDirection(),

python/plugins/processing/algs/qgis/RectanglesOvalsDiamondsFixed.py

+100-52
Original file line numberDiff line numberDiff line change
@@ -28,31 +28,29 @@
2828

2929
import math
3030

31-
from qgis.core import (QgsApplication,
31+
from qgis.core import (QgsProcessingParameterFeatureSource,
32+
QgsProcessingParameterEnum,
33+
QgsProcessingParameterNumber,
34+
QgsProcessingParameterFeatureSink,
3235
QgsFeature,
3336
QgsFeatureSink,
3437
QgsGeometry,
3538
QgsPointXY,
3639
QgsWkbTypes,
37-
QgsProcessingUtils)
40+
QgsProcessing)
3841

3942
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
40-
from processing.core.parameters import ParameterVector
41-
from processing.core.parameters import ParameterSelection
42-
from processing.core.parameters import ParameterNumber
43-
from processing.core.outputs import OutputVector
44-
from processing.tools import dataobjects
4543

4644

4745
class RectanglesOvalsDiamondsFixed(QgisAlgorithm):
4846

49-
INPUT_LAYER = 'INPUT_LAYER'
47+
INPUT = 'INPUT'
5048
SHAPE = 'SHAPE'
5149
WIDTH = 'WIDTH'
5250
HEIGHT = 'HEIGHT'
5351
ROTATION = 'ROTATION'
5452
SEGMENTS = 'SEGMENTS'
55-
OUTPUT_LAYER = 'OUTPUT_LAYER'
53+
OUTPUT = 'OUTPUT'
5654

5755
def group(self):
5856
return self.tr('Vector geometry tools')
@@ -63,26 +61,26 @@ def __init__(self):
6361
def initAlgorithm(self, config=None):
6462
self.shapes = [self.tr('Rectangles'), self.tr('Diamonds'), self.tr('Ovals')]
6563

66-
self.addParameter(ParameterVector(self.INPUT_LAYER,
67-
self.tr('Input layer'),
68-
[dataobjects.TYPE_VECTOR_POINT]))
69-
self.addParameter(ParameterSelection(self.SHAPE,
70-
self.tr('Buffer shape'), self.shapes))
71-
self.addParameter(ParameterNumber(self.WIDTH, self.tr('Width'),
72-
0.0000001, 999999999.0, 1.0))
73-
self.addParameter(ParameterNumber(self.HEIGHT, self.tr('Height'),
74-
0.0000001, 999999999.0, 1.0))
75-
self.addParameter(ParameterNumber(self.ROTATION, self.tr('Rotation'),
76-
0.0, 360.0, optional=True))
77-
self.addParameter(ParameterNumber(self.SEGMENTS,
78-
self.tr('Number of segments'),
79-
1,
80-
999999999,
81-
36))
82-
83-
self.addOutput(OutputVector(self.OUTPUT_LAYER,
84-
self.tr('Output'),
85-
datatype=[dataobjects.TYPE_VECTOR_POLYGON]))
64+
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT,
65+
self.tr('Input layer'),
66+
[QgsProcessing.TypeVectorPoint]))
67+
self.addParameter(QgsProcessingParameterEnum(self.SHAPE,
68+
self.tr('Buffer shape'), options=self.shapes))
69+
self.addParameter(QgsProcessingParameterNumber(self.WIDTH, self.tr('Width'), type=QgsProcessingParameterNumber.Double,
70+
minValue=0.0000001, maxValue=999999999.0, defaultValue=1.0))
71+
self.addParameter(QgsProcessingParameterNumber(self.HEIGHT, self.tr('Height'), type=QgsProcessingParameterNumber.Double,
72+
minValue=0.0000001, maxValue=999999999.0, defaultValue=1.0))
73+
self.addParameter(QgsProcessingParameterNumber(self.ROTATION, self.tr('Rotation'), type=QgsProcessingParameterNumber.Double,
74+
minValue=0.0, maxValue=360.0, optional=True))
75+
self.addParameter(QgsProcessingParameterNumber(self.SEGMENTS,
76+
self.tr('Number of segments'),
77+
minValue=1,
78+
maxValue=999999999,
79+
defaultValue=36))
80+
81+
self.addParameter(QgsProcessingParameterFeatureSink(self.OUTPUT,
82+
self.tr('Output'),
83+
type=QgsProcessing.TypeVectorPolygon))
8684

8785
def name(self):
8886
return 'rectanglesovalsdiamondsfixed'
@@ -91,36 +89,44 @@ def displayName(self):
9189
return self.tr('Rectangles, ovals, diamonds (fixed)')
9290

9391
def processAlgorithm(self, parameters, context, feedback):
94-
layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT_LAYER), context)
95-
shape = self.getParameterValue(self.SHAPE)
96-
width = self.getParameterValue(self.WIDTH)
97-
height = self.getParameterValue(self.HEIGHT)
98-
rotation = self.getParameterValue(self.ROTATION)
99-
segments = self.getParameterValue(self.SEGMENTS)
92+
source = self.parameterAsSource(parameters, self.INPUT, context)
93+
shape = self.parameterAsEnum(parameters, self.SHAPE, context)
94+
width = self.parameterAsDouble(parameters, self.WIDTH, context)
95+
height = self.parameterAsDouble(parameters, self.HEIGHT, context)
96+
rotation = self.parameterAsDouble(parameters, self.ROTATION, context)
97+
segments = self.parameterAsInt(parameters, self.SEGMENTS, context)
10098

101-
writer = self.getOutputFromName(
102-
self.OUTPUT_LAYER).getVectorWriter(layer.fields(), QgsWkbTypes.Polygon, layer.crs(), context)
103-
104-
features = QgsProcessingUtils.getFeatures(layer, context)
99+
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
100+
source.fields(), QgsWkbTypes.Polygon, source.sourceCrs())
105101

106102
if shape == 0:
107-
self.rectangles(writer, features, width, height, rotation)
103+
self.rectangles(sink, source, width, height, rotation, feedback)
108104
elif shape == 1:
109-
self.diamonds(writer, features, width, height, rotation)
105+
self.diamonds(sink, source, width, height, rotation, feedback)
110106
else:
111-
self.ovals(writer, features, width, height, rotation, segments)
107+
self.ovals(sink, source, width, height, rotation, segments, feedback)
108+
109+
return {self.OUTPUT: dest_id}
112110

113-
del writer
111+
def rectangles(self, sink, source, width, height, rotation, feedback):
114112

115-
def rectangles(self, writer, features, width, height, rotation):
113+
features = source.getFeatures()
116114
ft = QgsFeature()
117115

118116
xOffset = width / 2.0
119117
yOffset = height / 2.0
120118

119+
total = 100.0 / source.featureCount() if source.featureCount() else 0
120+
121121
if rotation is not None:
122122
phi = rotation * math.pi / 180
123123
for current, feat in enumerate(features):
124+
if feedback.isCanceled():
125+
break
126+
127+
if not feat.hasGeometry():
128+
continue
129+
124130
point = feat.geometry().asPoint()
125131
x = point.x()
126132
y = point.y()
@@ -130,9 +136,17 @@ def rectangles(self, writer, features, width, height, rotation):
130136

131137
ft.setGeometry(QgsGeometry.fromPolygon(polygon))
132138
ft.setAttributes(feat.attributes())
133-
writer.addFeature(ft, QgsFeatureSink.FastInsert)
139+
sink.addFeature(ft, QgsFeatureSink.FastInsert)
140+
141+
feedback.setProgress(int(current * total))
134142
else:
135143
for current, feat in enumerate(features):
144+
if feedback.isCanceled():
145+
break
146+
147+
if not feat.hasGeometry():
148+
continue
149+
136150
point = feat.geometry().asPoint()
137151
x = point.x()
138152
y = point.y()
@@ -141,17 +155,27 @@ def rectangles(self, writer, features, width, height, rotation):
141155

142156
ft.setGeometry(QgsGeometry.fromPolygon(polygon))
143157
ft.setAttributes(feat.attributes())
144-
writer.addFeature(ft, QgsFeatureSink.FastInsert)
158+
sink.addFeature(ft, QgsFeatureSink.FastInsert)
159+
160+
feedback.setProgress(int(current * total))
145161

146-
def diamonds(self, writer, features, width, height, rotation):
162+
def diamonds(self, sink, source, width, height, rotation, feedback):
163+
features = source.getFeatures()
147164
ft = QgsFeature()
148165

149166
xOffset = width / 2.0
150167
yOffset = height / 2.0
151168

169+
total = 100.0 / source.featureCount() if source.featureCount() else 0
152170
if rotation is not None:
153171
phi = rotation * math.pi / 180
154172
for current, feat in enumerate(features):
173+
if feedback.isCanceled():
174+
break
175+
176+
if not feat.hasGeometry():
177+
continue
178+
155179
point = feat.geometry().asPoint()
156180
x = point.x()
157181
y = point.y()
@@ -161,9 +185,16 @@ def diamonds(self, writer, features, width, height, rotation):
161185

162186
ft.setGeometry(QgsGeometry.fromPolygon(polygon))
163187
ft.setAttributes(feat.attributes())
164-
writer.addFeature(ft, QgsFeatureSink.FastInsert)
188+
sink.addFeature(ft, QgsFeatureSink.FastInsert)
189+
feedback.setProgress(int(current * total))
165190
else:
166191
for current, feat in enumerate(features):
192+
if feedback.isCanceled():
193+
break
194+
195+
if not feat.hasGeometry():
196+
continue
197+
167198
point = feat.geometry().asPoint()
168199
x = point.x()
169200
y = point.y()
@@ -172,17 +203,26 @@ def diamonds(self, writer, features, width, height, rotation):
172203

173204
ft.setGeometry(QgsGeometry.fromPolygon(polygon))
174205
ft.setAttributes(feat.attributes())
175-
writer.addFeature(ft, QgsFeatureSink.FastInsert)
206+
sink.addFeature(ft, QgsFeatureSink.FastInsert)
207+
feedback.setProgress(int(current * total))
176208

177-
def ovals(self, writer, features, width, height, rotation, segments):
209+
def ovals(self, sink, source, width, height, rotation, segments, feedback):
210+
features = source.getFeatures()
178211
ft = QgsFeature()
179212

180213
xOffset = width / 2.0
181214
yOffset = height / 2.0
182215

216+
total = 100.0 / source.featureCount() if source.featureCount() else 0
183217
if rotation is not None:
184218
phi = rotation * math.pi / 180
185219
for current, feat in enumerate(features):
220+
if feedback.isCanceled():
221+
break
222+
223+
if not feat.hasGeometry():
224+
continue
225+
186226
point = feat.geometry().asPoint()
187227
x = point.x()
188228
y = point.y()
@@ -194,9 +234,16 @@ def ovals(self, writer, features, width, height, rotation, segments):
194234

195235
ft.setGeometry(QgsGeometry.fromPolygon(polygon))
196236
ft.setAttributes(feat.attributes())
197-
writer.addFeature(ft, QgsFeatureSink.FastInsert)
237+
sink.addFeature(ft, QgsFeatureSink.FastInsert)
238+
feedback.setProgress(int(current * total))
198239
else:
199240
for current, feat in enumerate(features):
241+
if feedback.isCanceled():
242+
break
243+
244+
if not feat.hasGeometry():
245+
continue
246+
200247
point = feat.geometry().asPoint()
201248
x = point.x()
202249
y = point.y()
@@ -207,4 +254,5 @@ def ovals(self, writer, features, width, height, rotation, segments):
207254

208255
ft.setGeometry(QgsGeometry.fromPolygon(polygon))
209256
ft.setAttributes(feat.attributes())
210-
writer.addFeature(ft, QgsFeatureSink.FastInsert)
257+
sink.addFeature(ft, QgsFeatureSink.FastInsert)
258+
feedback.setProgress(int(current * total))

0 commit comments

Comments
 (0)