Skip to content

Commit baede35

Browse files
committedAug 8, 2017
Refactoring
1 parent bbfdcf3 commit baede35

File tree

3 files changed

+167
-35
lines changed

3 files changed

+167
-35
lines changed
 

‎python/plugins/processing/algs/qgis/Rasterize.py

Lines changed: 88 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
QgsProcessingParameterString,
3636
QgsProcessingParameterNumber,
3737
QgsProcessingParameterRasterLayer,
38-
QgsProcessingOutputRasterLayer,
38+
QgsProcessingParameterMapLayer,
3939
QgsProcessingParameterRasterDestination
4040
)
4141

@@ -70,7 +70,7 @@ class RasterizeAlgorithm(QgisAlgorithm):
7070
# used when calling the algorithm from another algorithm, or when
7171
# calling from the QGIS console.
7272

73-
OUTPUT_LAYER = 'OUTPUT_LAYER'
73+
OUTPUT = 'OUTPUT'
7474
MAP_THEME = 'MAP_THEME'
7575
LAYER = 'LAYER'
7676
EXTENT = 'EXTENT'
@@ -84,38 +84,54 @@ def initAlgorithm(self, config=None):
8484
"""Here we define the inputs and output of the algorithm, along
8585
with some other properties.
8686
"""
87-
8887
# The parameters
89-
self.addParameter(
90-
QgsProcessingParameterString(self.MAP_THEME,
91-
description=self.tr(
92-
'Map theme to render.'),
93-
defaultValue=None, optional=True))
88+
map_theme_param = QgsProcessingParameterString(
89+
self.MAP_THEME,
90+
description=self.tr(
91+
'Map theme to render.'),
92+
defaultValue=None, optional=True)
93+
94+
map_theme_param.setMetadata(
95+
{'widget_wrapper': {
96+
'class':
97+
'processing.gui.wrappers_map_theme.MapThemeWrapper'}})
98+
self.addParameter(map_theme_param)
9499

95100
self.addParameter(
96-
QgsProcessingParameterRasterLayer(self.LAYER, description=self.tr(
97-
'Layer to render. Will only be used if the map theme is not '
98-
'set. '
99-
'If both, map theme and layer are not '
100-
'set, the current map content will be rendered.'),
101+
# TODO Why is this restricted to raster layers only? I think
102+
# QgsProcessingParameterMapLayer makes more sense here so that
103+
# users can choose to render single vector layers if desired.
104+
QgsProcessingParameterRasterLayer(
105+
self.LAYER,
106+
description=self.tr(
107+
'Layer to render. Will only be used if the map theme '
108+
'is not set. '
109+
'If both, map theme and layer are not '
110+
'set, the current map content will be rendered.'),
101111
optional=True))
102112
self.addParameter(
103113
QgsProcessingParameterExtent(self.EXTENT, description=self.tr(
104114
'The minimum extent to render. Will internally be extended to '
105-
'be '
106-
'a multiple of the tile sizes.')))
115+
'be a multiple of the tile sizes.')))
107116
self.addParameter(
108-
QgsProcessingParameterNumber(self.TILE_SIZE, self.tr('Tile size'),
109-
defaultValue=1024))
110-
self.addParameter(QgsProcessingParameterNumber(self.MAP_UNITS_PER_PIXEL,
111-
self.tr(
112-
'Map units per '
113-
'pixel'),
114-
defaultValue=100))
117+
QgsProcessingParameterNumber(
118+
self.TILE_SIZE,
119+
self.tr('Tile size'),
120+
defaultValue=1024))
121+
122+
self.addParameter(QgsProcessingParameterNumber(
123+
self.MAP_UNITS_PER_PIXEL,
124+
self.tr(
125+
'Map units per '
126+
'pixel'),
127+
defaultValue=100,
128+
minValue=0,
129+
type=QgsProcessingParameterNumber.Double
130+
))
115131

116132
# We add a raster layer as output
117133
self.addParameter(QgsProcessingParameterRasterDestination(
118-
self.OUTPUT_LAYER,
134+
self.OUTPUT,
119135
self.tr(
120136
'Output layer')))
121137

@@ -130,30 +146,64 @@ def displayName(self):
130146
def group(self):
131147
return self.tr('Raster tools')
132148

149+
def tags(self):
150+
return self.tr('layer,raster,convert,file,map themes,tiles').split(',')
151+
133152
# def processAlgorithm(self, progress):
134153
def processAlgorithm(self, parameters, context, feedback):
135154
"""Here is where the processing itself takes place."""
136155

137156
# The first thing to do is retrieve the values of the parameters
138157
# entered by the user
139-
map_theme = self.parameterAsString(parameters, self.MAP_THEME, context)
140-
layer = self.parameterAsString(parameters, self.LAYER, context)
141-
extent = self.parameterAsExtent(parameters, self.EXTENT,
142-
context)
143-
tile_size = self.parameterAsInt(parameters, self.TILE_SIZE, context)
144-
mupp = self.parameterAsInt(parameters, self.MAP_UNITS_PER_PIXEL, context)
145-
146-
output_layer = self.parameterAsOutputLayer(parameters, self.OUTPUT_LAYER,
147-
context)
158+
map_theme = self.parameterAsString(
159+
parameters,
160+
self.MAP_THEME,
161+
context)
162+
163+
layer = self.parameterAsLayer(
164+
parameters,
165+
self.LAYER,
166+
context)
167+
168+
extent = self.parameterAsExtent(
169+
parameters,
170+
self.EXTENT,
171+
context)
172+
173+
tile_size = self.parameterAsInt(
174+
parameters,
175+
self.TILE_SIZE,
176+
context)
177+
178+
mupp = self.parameterAsDouble(
179+
parameters,
180+
self.MAP_UNITS_PER_PIXEL,
181+
context)
182+
183+
output_layer = self.parameterAsOutputLayer(
184+
parameters,
185+
self.OUTPUT,
186+
context)
187+
188+
print('map_theme {}'.format(map_theme))
189+
print('layer {}'.format(layer))
190+
print('extent {}'.format(extent))
191+
print('tile_size {}'.format(tile_size))
192+
print('mupp {}'.format(mupp))
193+
print('output_layer {}'.format(output_layer))
148194

149195
# This probably affects the whole system but it's a lot nicer
150196
osgeo.gdal.UseExceptions()
151197

152-
tile_set = TileSet(map_theme, layer, extent, tile_size, mupp, output_layer,
198+
tile_set = TileSet(map_theme, layer, extent, tile_size, mupp,
199+
output_layer,
153200
qgis.utils.iface.mapCanvas().mapSettings())
201+
# TODO Can you add feedback as a parameter to render and add
202+
# appropriate hooks within render to check for feedback.isCanceled()
203+
# and abort the render early?
154204
tile_set.render()
155205

156-
return {self.OUTPUT_LAYER: output_layer}
206+
return {self.OUTPUT: output_layer}
157207

158208

159209
class TileSet():
@@ -268,14 +318,17 @@ def renderTile(self, x, y):
268318

269319
def getDriverForFile(self, filename):
270320
"""
271-
Get the GDAL driver for a filename, based on its extension. (.gpkg, .mbtiles...)
321+
Get the GDAL driver for a filename, based on its extension. (.gpkg,
322+
.mbtiles...)
272323
"""
273324
_, extension = os.path.splitext(filename)
274325

275326
# If no extension is set, use .tif as default
276327
if extension == '':
277328
extension = '.tif'
278329

330+
# TODO It should be removed and
331+
# QgsRasterFileWriter::driverForExtension used instead.
279332
for i in range(osgeo.gdal.GetDriverCount()):
280333
driver = osgeo.gdal.GetDriver(i)
281334
if driver.GetMetadataItem('DMD_EXTENSION') == extension[1:]:

‎python/plugins/processing/gui/wrappers.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,11 @@ def value(self):
754754
return self.widget.currentData()
755755

756756

757+
class LayerWidgetWrapper(WidgetWrapper):
758+
def __init__(self):
759+
raise NotImplementedError('Layer widget is not implemented yet')
760+
761+
757762
class VectorWidgetWrapper(WidgetWrapper):
758763

759764
NOT_SELECTED = '[Not selected]'
@@ -1388,6 +1393,8 @@ def create_wrapper_from_class(param, dialog, row=0, col=0):
13881393
wrapper = VectorWidgetWrapper
13891394
elif param.type() == 'band':
13901395
wrapper = BandWidgetWrapper
1396+
elif param.type() == 'layer':
1397+
wrapper = LayerWidgetWrapper
13911398
else:
13921399
assert False, param.type()
13931400
return wrapper(param, dialog, row, col)
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
# -*- coding: utf-8 -*-
2+
3+
"""
4+
***************************************************************************
5+
wrappers_map_theme.py - Map theme widget wrappers
6+
---------------------
7+
Date : August 2017
8+
Copyright : (C) 2017 by OPENGIS.ch
9+
Email : mario@opengis.ch
10+
***************************************************************************
11+
* *
12+
* This program is free software; you can redistribute it and/or modify *
13+
* it under the terms of the GNU General Public License as published by *
14+
* the Free Software Foundation; either version 2 of the License, or *
15+
* (at your option) any later version. *
16+
* *
17+
***************************************************************************
18+
"""
19+
20+
21+
from qgis.core import (QgsSettings,
22+
QgsProcessingParameterNumber,
23+
QgsProcessingParameterFile,
24+
QgsProcessingParameterField,
25+
QgsProcessingParameterExpression,
26+
QgsProcessingOutputString,
27+
QgsProcessingParameterString,
28+
QgsMapThemeCollection,
29+
QgsProject
30+
)
31+
32+
from qgis.PyQt.QtWidgets import QComboBox
33+
from qgis.PyQt.QtCore import pyqtSignal
34+
35+
from processing.gui.wrappers import (
36+
BasicWidgetWrapper
37+
)
38+
from processing.tools.postgis import GeoDB
39+
40+
41+
class MapThemeWrapper(BasicWidgetWrapper):
42+
"""
43+
WidgetWrapper for ParameterString that create and manage a combobox widget
44+
with existing postgis connections.
45+
"""
46+
47+
def createWidget(self):
48+
self._combo = QComboBox()
49+
for item in self.items():
50+
self._combo.addItem(item, item)
51+
self._combo.currentIndexChanged.connect(lambda:
52+
self.widgetValueHasChanged.emit(self))
53+
return self._combo
54+
55+
def items(self):
56+
items = QgsProject.instance().mapThemeCollection().mapThemes()
57+
#if self.dialogType == DIALOG_MODELER:
58+
# strings = self.dialog.getAvailableValuesOfType(
59+
# [QgsProcessingParameterString, QgsProcessingParameterNumber,
60+
# QgsProcessingParameterFile,
61+
# QgsProcessingParameterField,
62+
# QgsProcessingParameterExpression], QgsProcessingOutputString)
63+
# items = items + [(self.dialog.resolveValueDescription(s),
64+
# s) for s in strings]
65+
#
66+
return items
67+
68+
def setValue(self, value):
69+
self.setComboValue(value, self._combo)
70+
71+
def value(self):
72+
return self.comboValue(combobox=self._combo)

0 commit comments

Comments
 (0)
Please sign in to comment.