26
26
__revision__ = '$Format:%H$'
27
27
28
28
import os
29
+ import json
29
30
30
31
from PyQt4 import uic
31
- from PyQt4 .QtGui import QWidget , QIcon , QTableWidgetItem , QComboBox , QLineEdit , QHeaderView
32
+ from PyQt4 .QtGui import (QWidget , QIcon , QTableWidgetItem , QComboBox , QLineEdit ,
33
+ QHeaderView , QFileDialog )
32
34
33
35
from qgis .core import QgsApplication
34
36
59
61
60
62
class BatchPanel (BASE , WIDGET ):
61
63
64
+ PARAMETERS = "PARAMETERS"
65
+ OUTPUTS = "OUTPUTS"
66
+
62
67
def __init__ (self , parent , alg ):
63
68
super (BatchPanel , self ).__init__ (None )
64
69
self .setupUi (self )
@@ -68,13 +73,17 @@ def __init__(self, parent, alg):
68
73
# Set icons
69
74
self .btnAdd .setIcon (QgsApplication .getThemeIcon ('/symbologyAdd.svg' ))
70
75
self .btnRemove .setIcon (QgsApplication .getThemeIcon ('/symbologyRemove.svg' ))
76
+ self .btnOpen .setIcon (QgsApplication .getThemeIcon ('/mActionFileOpen.svg' ))
77
+ self .btnSave .setIcon (QgsApplication .getThemeIcon ('/mActionFileSave.svg' ))
71
78
self .btnAdvanced .setIcon (QIcon (os .path .join (pluginPath , 'images' , 'alg.png' )))
72
79
73
80
self .alg = alg
74
81
self .parent = parent
75
82
76
83
self .btnAdd .clicked .connect (self .addRow )
77
84
self .btnRemove .clicked .connect (self .removeRows )
85
+ self .btnOpen .clicked .connect (self .load )
86
+ self .btnSave .clicked .connect (self .save )
78
87
self .btnAdvanced .toggled .connect (self .toggleAdvancedMode )
79
88
self .tblParameters .horizontalHeader ().sectionDoubleClicked .connect (
80
89
self .fillParameterValues )
@@ -164,6 +173,137 @@ def getWidgetFromParameter(self, param, row, col):
164
173
165
174
return item
166
175
176
+ def load (self ):
177
+ filename = unicode (QFileDialog .getOpenFileName (self ,
178
+ self .tr ('Open batch' ), None ,
179
+ self .tr ('JSON files (*.json)' )))
180
+ if filename :
181
+ with open (filename ) as f :
182
+ values = json .load (f )
183
+
184
+ self .tblParameters .setRowCount (0 )
185
+ for row , alg in enumerate (values ):
186
+ self .addRow ()
187
+ params = alg [self .PARAMETERS ]
188
+ outputs = alg [self .OUTPUTS ]
189
+ column = 0
190
+ for param in self .alg .parameters :
191
+ if param .hidden :
192
+ continue
193
+ widget = self .tblParameters .cellWidget (row , column )
194
+ if param .name in params :
195
+ value = params [param .name ]
196
+ self .setValueInWidget (widget , value )
197
+ column += 1
198
+
199
+ for out in self .alg .outputs :
200
+ if out .hidden :
201
+ continue
202
+ widget = self .tblParameters .cellWidget (row , column )
203
+ if out .name in outputs :
204
+ value = outputs [out .name ]
205
+ self .setValueInWidget (widget , value )
206
+ column += 1
207
+
208
+ def setValueInWidget (self , widget , value ):
209
+ if isinstance (widget , (BatchInputSelectionPanel , QLineEdit , FileSelectionPanel )):
210
+ widget .setText (unicode (value ))
211
+ elif isinstance (widget , (BatchOutputSelectionPanel , GeometryPredicateSelectionPanel )):
212
+ widget .setValue (unicode (value ))
213
+
214
+ elif isinstance (widget , QComboBox ):
215
+ idx = widget .findText (unicode (value ))
216
+ if idx != - 1 :
217
+ widget .setCurrentIndex (idx )
218
+ elif isinstance (widget , ExtentSelectionPanel ):
219
+ if value is not None :
220
+ widget .setExtentFromString (value )
221
+ else :
222
+ widget .setExtentFromString ('' )
223
+ elif isinstance (widget , CrsSelectionPanel ):
224
+ widget .setAuthId (value )
225
+
226
+
227
+ def save (self ):
228
+ toSave = []
229
+ for row in range (self .tblParameters .rowCount ()):
230
+ algParams = {}
231
+ algOutputs = {}
232
+ col = 0
233
+ alg = self .alg .getCopy ()
234
+ for param in alg .parameters :
235
+ if param .hidden :
236
+ continue
237
+ if isinstance (param , ParameterExtent ):
238
+ col += 1
239
+ continue
240
+ widget = self .tblParameters .cellWidget (row , col )
241
+ if not self .setParamValue (param , widget , alg ):
242
+ self .parent .lblProgress .setText (
243
+ self .tr ('<b>Missing parameter value: %s (row %d)</b>' ) % (param .description , row + 1 ))
244
+ return
245
+ algParams [param .name ] = param .getValueAsCommandLineParameter ()
246
+ col += 1
247
+ col = 0
248
+ for param in alg .parameters :
249
+ if param .hidden :
250
+ continue
251
+ if isinstance (param , ParameterExtent ):
252
+ widget = self .tblParameters .cellWidget (row , col )
253
+ if not self .setParamValue (param , widget , alg ):
254
+ self .parent .lblProgress .setText (
255
+ self .tr ('<b>Missing parameter value: %s (row %d)</b>' ) % (param .description , row + 1 ))
256
+ return
257
+ algParams [param .name ] = unicode (param .value ())
258
+ col += 1
259
+ for out in alg .outputs :
260
+ if out .hidden :
261
+ continue
262
+ widget = self .tblParameters .cellWidget (row , col )
263
+ text = widget .getValue ()
264
+ if text .strip () != '' :
265
+ algOutputs [out .name ] = text .strip ()
266
+ col += 1
267
+ else :
268
+ self .parent .lblProgress .setText (
269
+ self .tr ('<b>Wrong or missing parameter value: %s (row %d)</b>' ) % (out .description , row + 1 ))
270
+ return
271
+ toSave .append ({self .PARAMETERS : algParams , self .OUTPUTS : algOutputs })
272
+
273
+ filename = unicode (QFileDialog .getSaveFileName (self ,
274
+ self .tr ('Save batch' ),
275
+ None ,
276
+ self .tr ('JSON files (*.json)' )))
277
+ if filename :
278
+ if not filename .endswith ('.json' ):
279
+ filename += '.json'
280
+ with open (filename , 'w' ) as f :
281
+ json .dump (toSave , f )
282
+
283
+ def setParamValue (self , param , widget , alg = None ):
284
+ if isinstance (param , (ParameterRaster , ParameterVector , ParameterTable ,
285
+ ParameterMultipleInput )):
286
+ value = widget .getText ()
287
+ if unicode (value ).strip () == '' :
288
+ value = None
289
+ return param .setValue (value )
290
+ elif isinstance (param , ParameterBoolean ):
291
+ return param .setValue (widget .currentIndex () == 0 )
292
+ elif isinstance (param , ParameterSelection ):
293
+ return param .setValue (widget .currentIndex ())
294
+ elif isinstance (param , ParameterFixedTable ):
295
+ return param .setValue (widget .table )
296
+ elif isinstance (param , ParameterExtent ):
297
+ if alg is not None :
298
+ widget .useNewAlg (alg )
299
+ return param .setValue (widget .getValue ())
300
+ elif isinstance (param , (ParameterCrs , ParameterFile )):
301
+ return param .setValue (widget .getValue ())
302
+ elif isinstance (param , ParameterGeometryPredicate ):
303
+ return param .setValue (widget .value ())
304
+ else :
305
+ return param .setValue (widget .text ())
306
+
167
307
def addRow (self ):
168
308
self .tblParameters .setRowCount (self .tblParameters .rowCount () + 1 )
169
309
0 commit comments