Skip to content

Commit 8cc9a50

Browse files
committed
[processing] moved script syntax from script algorithm class to parameters classes
1 parent a69b358 commit 8cc9a50

File tree

2 files changed

+206
-144
lines changed

2 files changed

+206
-144
lines changed

python/plugins/processing/core/parameters.py

+200-11
Original file line numberDiff line numberDiff line change
@@ -30,26 +30,31 @@
3030

3131
import sys
3232
import os
33+
import inspect
3334

3435
from qgis.PyQt.QtCore import QCoreApplication
3536
from qgis.core import QgsRasterLayer, QgsVectorLayer
3637
from processing.tools.vector import resolveFieldIndex, features
3738
from processing.tools.system import isWindows
3839
from processing.tools import dataobjects
3940

40-
41-
def getParameterFromString(s):
42-
tokens = s.split("|")
43-
params = [t if str(t) != str(None) else None for t in tokens[1:]]
44-
clazz = getattr(sys.modules[__name__], tokens[0])
45-
return clazz(*params)
46-
47-
4841
def parseBool(s):
4942
if s is None or s == str(None).lower():
5043
return None
5144
return str(s).lower() == str(True).lower()
5245

46+
def _splitParameterOptions(line):
47+
tokens = line.split('=', 1)
48+
if tokens[1].lower().strip().startswith('optional'):
49+
isOptional = True
50+
definition = tokens[1].strip()[len('optional') + 1:]
51+
else:
52+
isOptional = False
53+
definition = tokens[1]
54+
return isOptional, tokens[0], definition
55+
56+
def _createDescriptiveName(s):
57+
return s.replace('_', ' ')
5358

5459
class Parameter(object):
5560

@@ -128,8 +133,7 @@ def tr(self, string, context=''):
128133
if context == '':
129134
context = 'Parameter'
130135
return QCoreApplication.translate(context, string)
131-
132-
136+
133137
class ParameterBoolean(Parameter):
134138

135139
default_metadata = {
@@ -158,6 +162,20 @@ def getAsScriptCode(self):
158162
param_type += 'optional '
159163
param_type += 'boolean '
160164
return '##' + self.name + '=' + param_type + str(self.default)
165+
166+
@classmethod
167+
def fromScriptCode(self, line):
168+
isOptional, name, definition = _splitParameterOptions(line)
169+
if definition.startswith("boolean"):
170+
descName = _createDescriptiveName(name)
171+
default = definition.strip()[len('boolean') + 1:]
172+
if default:
173+
param = ParameterBoolean(name, descName, default)
174+
else:
175+
param = ParameterBoolean(name, descName)
176+
param.optional = isOptional
177+
return param
178+
161179

162180

163181
class ParameterCrs(Parameter):
@@ -194,6 +212,16 @@ def getAsScriptCode(self):
194212
param_type += 'crs '
195213
return '##' + self.name + '=' + param_type + str(self.default)
196214

215+
@classmethod
216+
def fromScriptCode(self, line):
217+
isOptional, name, definition = _splitParameterOptions(line)
218+
if definition.startswith("crs"):
219+
descName = _createDescriptiveName(name)
220+
default = definition.strip()[len('crs') + 1:]
221+
if default:
222+
return ParameterCrs(name, descName, default, isOptional)
223+
else:
224+
return ParameterCrs(name, descName, None, isOptional)
197225

198226
class ParameterDataObject(Parameter):
199227

@@ -243,6 +271,14 @@ def getAsScriptCode(self):
243271
param_type += 'optional '
244272
param_type += 'extent'
245273
return '##' + self.name + '=' + param_type
274+
275+
@classmethod
276+
def fromScriptCode(self, line):
277+
isOptional, name, definition = _splitParameterOptions(line)
278+
if definition.startswith("extent"):
279+
descName = _createDescriptiveName(name)
280+
default = definition.strip()[len('extent') + 1:] or None
281+
return ParameterExtent(name, descName, default, isOptional)
246282

247283

248284
class ParameterPoint(Parameter):
@@ -279,6 +315,14 @@ def getAsScriptCode(self):
279315
param_type += 'point'
280316
return '##' + self.name + '=' + param_type
281317

318+
@classmethod
319+
def fromScriptCode(self, line):
320+
isOptional, name, definition = _splitParameterOptions(line)
321+
if definition.startswith("point"):
322+
descName = _createDescriptiveName(name)
323+
default = definition.strip()[len('point') + 1:] or None
324+
return ParameterPoint(name, descName, default, isOptional)
325+
282326

283327
class ParameterFile(Parameter):
284328

@@ -318,6 +362,13 @@ def getAsScriptCode(self):
318362
param_type += 'file'
319363
return '##' + self.name + '=' + param_type
320364

365+
@classmethod
366+
def fromScriptCode(self, line):
367+
isOptional, name, definition = _splitParameterOptions(line)
368+
if definition.startswith("file") or definition.startswith("folder"):
369+
descName = _createDescriptiveName(name)
370+
return ParameterFile(name, descName, definition.startswith("folder"), isOptional)
371+
321372

322373
class ParameterFixedTable(Parameter):
323374

@@ -356,6 +407,14 @@ def tableToString(table):
356407
tablestring = tablestring[:-1]
357408
return tablestring
358409

410+
@classmethod
411+
def fromScriptCode(self, line):
412+
isOptional, name, definition = _splitParameterOptions(line)
413+
if definition.startswith("point"):
414+
descName = _createDescriptiveName(name)
415+
default = definition.strip()[len('point') + 1:] or None
416+
return ParameterPoint(name, descName, default, isOptional)
417+
359418

360419
class ParameterMultipleInput(ParameterDataObject):
361420

@@ -542,6 +601,17 @@ def getAsScriptCode(self):
542601
param_type += 'multiple vector'
543602
return '##' + self.name + '=' + param_type
544603

604+
@classmethod
605+
def fromScriptCode(self, line):
606+
isOptional, name, definition = _splitParameterOptions(line)
607+
descName = _createDescriptiveName(name)
608+
if definition.lower().strip() == 'multiple raster':
609+
return ParameterMultipleInput(name, descName,
610+
dataobjects.TYPE_RASTER, isOptional)
611+
elif definition.lower().strip() == 'multiple vector':
612+
return ParameterMultipleInput(name, definition,
613+
dataobjects.TYPE_VECTOR_ANY, isOptional)
614+
545615

546616
class ParameterNumber(Parameter):
547617

@@ -599,6 +669,13 @@ def getAsScriptCode(self):
599669
param_type += 'number'
600670
return '##' + self.name + '=' + param_type + str(self.default)
601671

672+
@classmethod
673+
def fromScriptCode(self, line):
674+
isOptional, name, definition = _splitParameterOptions(line)
675+
descName = _createDescriptiveName(name)
676+
if definition.lower().strip().startswith('number'):
677+
default = definition.strip()[len('number') + 1:] or None
678+
return ParameterNumber(name, descName, default=default, optional=isOptional)
602679

603680
class ParameterRange(Parameter):
604681

@@ -701,6 +778,13 @@ def getAsScriptCode(self):
701778
param_type += 'raster'
702779
return '##' + self.name + '=' + param_type
703780

781+
@classmethod
782+
def fromScriptCode(self, line):
783+
isOptional, name, definition = _splitParameterOptions(line)
784+
descName = _createDescriptiveName(name)
785+
print isOptional, name, definition
786+
if definition.lower().strip().startswith('raster'):
787+
return ParameterRaster(name, descName, optional=isOptional)
704788

705789
class ParameterSelection(Parameter):
706790

@@ -744,7 +828,18 @@ def setValue(self, n):
744828
except:
745829
return False
746830

747-
831+
@classmethod
832+
def fromScriptCode(self, line):
833+
isOptional, name, definition = _splitParameterOptions(line)
834+
descName = _createDescriptiveName(name)
835+
if definition.lower().strip().startswith('selectionfromfile'):
836+
options = definition.strip()[len('selectionfromfile '):].split(';')
837+
return ParameterSelection(name, descName, options, isSource=True, optional=isOptional)
838+
elif definition.lower().strip().startswith('selection'):
839+
options = definition.strip()[len('selection '):].split(';')
840+
return ParameterSelection(name, descName, options, optional=isOptional)
841+
842+
748843
class ParameterString(Parameter):
749844

750845
NEWLINE = '\n'
@@ -781,6 +876,22 @@ def getAsScriptCode(self):
781876
param_type += 'string'
782877
return '##' + self.name + '=' + param_type + self.default
783878

879+
@classmethod
880+
def fromScriptCode(self, line):
881+
isOptional, name, definition = _splitParameterOptions(line)
882+
descName = _createDescriptiveName(name)
883+
if definition.lower().strip().startswith('string'):
884+
default = definition.strip()[len('string') + 1:]
885+
if default:
886+
return ParameterString(name, descName, default, optional=isOptional)
887+
else:
888+
return ParameterString(name, descName, optional=isOptional)
889+
elif definition.lower().strip().startswith('longstring'):
890+
default = definition.strip()[len('longstring') + 1:]
891+
if default:
892+
return ParameterString(name, descName, default, multiline=True, optional=isOptional)
893+
else:
894+
return ParameterString(name, descName, multiline=True, optional=isOptional)
784895

785896
class ParameterTable(ParameterDataObject):
786897

@@ -853,6 +964,13 @@ def getAsScriptCode(self):
853964
param_type += 'table'
854965
return '##' + self.name + '=' + param_type
855966

967+
@classmethod
968+
def fromScriptCode(self, line):
969+
isOptional, name, definition = _splitParameterOptions(line)
970+
descName = _createDescriptiveName(name)
971+
if definition.lower().strip().startswith('table'):
972+
return ParameterTable(name, descName, isOptional)
973+
856974

857975
class ParameterTableField(Parameter):
858976

@@ -908,6 +1026,24 @@ def getAsScriptCode(self):
9081026
return '##' + self.name + '=' + param_type + self.parent
9091027

9101028

1029+
@classmethod
1030+
def fromScriptCode(self, line):
1031+
isOptional, name, definition = _splitParameterOptions(line)
1032+
descName = _createDescriptiveName(name)
1033+
if definition.lower().strip().startswith('field'):
1034+
if definition.lower().strip().startswith('field number'):
1035+
parent = definition.strip()[len('field number') + 1:]
1036+
datatype = ParameterTableField.DATA_TYPE_NUMBER
1037+
elif definition.lower().strip().startswith('field string'):
1038+
parent = definition.strip()[len('field string') + 1:]
1039+
datatype = ParameterTableField.DATA_TYPE_STRING
1040+
else:
1041+
parent = definition.strip()[len('field') + 1:]
1042+
datatype = ParameterTableField.DATA_TYPE_ANY
1043+
1044+
return ParameterTableField(name, descName, parent, datatype, isOptional)
1045+
1046+
9111047
class ParameterTableMultipleField(Parameter):
9121048

9131049
"""A parameter representing several table fields.
@@ -974,6 +1110,23 @@ def getAsScriptCode(self):
9741110
param_type += 'multiple field '
9751111
return '##' + self.name + '=' + param_type + self.parent
9761112

1113+
@classmethod
1114+
def fromScriptCode(self, line):
1115+
isOptional, name, definition = _splitParameterOptions(line)
1116+
if definition.lower().strip().startswith('multiple field'):
1117+
descName = _createDescriptiveName(name)
1118+
if definition.lower().strip().startswith('multiple field number'):
1119+
field = definition.strip()[len('multiple field number') + 1:]
1120+
datatype = ParameterTableMultipleField.DATA_TYPE_NUMBER
1121+
elif definition.lower().strip().startswith('multiple field string'):
1122+
field = definition.strip()[len('multiple field string') + 1:]
1123+
datatype = ParameterTableMultipleField.DATA_TYPE_STRING
1124+
else:
1125+
field = definition.strip()[len('multiple field') + 1:]
1126+
datatype = ParameterTableMultipleField.DATA_TYPE_ANY
1127+
1128+
return ParameterTableMultipleField(name, descName, field, datatype, isOptional)
1129+
9771130

9781131
class ParameterVector(ParameterDataObject):
9791132

@@ -1050,6 +1203,22 @@ def getAsScriptCode(self):
10501203
param_type += 'vector'
10511204
return '##' + self.name + '=' + param_type
10521205

1206+
@classmethod
1207+
def fromScriptCode(self, line):
1208+
isOptional, name, definition = _splitParameterOptions(line)
1209+
descName = _createDescriptiveName(name)
1210+
if definition.lower().strip() == 'vector':
1211+
return ParameterVector(name, descName,
1212+
[dataobjects.TYPE_VECTOR_ANY], isOptional)
1213+
elif definition.lower().strip() == 'vector point':
1214+
return ParameterVector(name, descName,
1215+
[dataobjects.TYPE_VECTOR_POINT], isOptional)
1216+
elif definition.lower().strip() == 'vector line':
1217+
return ParameterVector(name, descName,
1218+
[dataobjects.TYPE_VECTOR_LINE], isOptional)
1219+
elif definition.lower().strip() == 'vector polygon':
1220+
return ParameterVector(name, descName,
1221+
[dataobjects.TYPE_VECTOR_POLYGON], isOptional)
10531222

10541223
class ParameterGeometryPredicate(Parameter):
10551224

@@ -1089,3 +1258,23 @@ def setValue(self, value):
10891258
else:
10901259
self.value = value
10911260
return True
1261+
1262+
1263+
paramClasses = [c for c in sys.modules[__name__].__dict__.values() if inspect.isclass(c) and issubclass(c, Parameter)]
1264+
1265+
def getParameterFromString(s):
1266+
print s
1267+
#Try the parameter definitions used in description files
1268+
if '|' in s:
1269+
tokens = s.split("|")
1270+
params = [t if unicode(t) != unicode(None) else None for t in tokens[1:]]
1271+
clazz = getattr(sys.modules[__name__], tokens[0])
1272+
return clazz(*params)
1273+
else: #try script syntax
1274+
for paramClass in paramClasses:
1275+
try:
1276+
param = paramClass.fromScriptCode(s)
1277+
if param is not None:
1278+
return param
1279+
except AttributeError:
1280+
pass

0 commit comments

Comments
 (0)