|
30 | 30 |
|
31 | 31 | import sys
|
32 | 32 | import os
|
| 33 | +import inspect |
33 | 34 |
|
34 | 35 | from qgis.PyQt.QtCore import QCoreApplication
|
35 | 36 | from qgis.core import QgsRasterLayer, QgsVectorLayer
|
36 | 37 | from processing.tools.vector import resolveFieldIndex, features
|
37 | 38 | from processing.tools.system import isWindows
|
38 | 39 | from processing.tools import dataobjects
|
39 | 40 |
|
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 |
| - |
48 | 41 | def parseBool(s):
|
49 | 42 | if s is None or s == str(None).lower():
|
50 | 43 | return None
|
51 | 44 | return str(s).lower() == str(True).lower()
|
52 | 45 |
|
| 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('_', ' ') |
53 | 58 |
|
54 | 59 | class Parameter(object):
|
55 | 60 |
|
@@ -128,8 +133,7 @@ def tr(self, string, context=''):
|
128 | 133 | if context == '':
|
129 | 134 | context = 'Parameter'
|
130 | 135 | return QCoreApplication.translate(context, string)
|
131 |
| - |
132 |
| - |
| 136 | + |
133 | 137 | class ParameterBoolean(Parameter):
|
134 | 138 |
|
135 | 139 | default_metadata = {
|
@@ -158,6 +162,20 @@ def getAsScriptCode(self):
|
158 | 162 | param_type += 'optional '
|
159 | 163 | param_type += 'boolean '
|
160 | 164 | 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 | + |
161 | 179 |
|
162 | 180 |
|
163 | 181 | class ParameterCrs(Parameter):
|
@@ -194,6 +212,16 @@ def getAsScriptCode(self):
|
194 | 212 | param_type += 'crs '
|
195 | 213 | return '##' + self.name + '=' + param_type + str(self.default)
|
196 | 214 |
|
| 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) |
197 | 225 |
|
198 | 226 | class ParameterDataObject(Parameter):
|
199 | 227 |
|
@@ -243,6 +271,14 @@ def getAsScriptCode(self):
|
243 | 271 | param_type += 'optional '
|
244 | 272 | param_type += 'extent'
|
245 | 273 | 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) |
246 | 282 |
|
247 | 283 |
|
248 | 284 | class ParameterPoint(Parameter):
|
@@ -279,6 +315,14 @@ def getAsScriptCode(self):
|
279 | 315 | param_type += 'point'
|
280 | 316 | return '##' + self.name + '=' + param_type
|
281 | 317 |
|
| 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 | + |
282 | 326 |
|
283 | 327 | class ParameterFile(Parameter):
|
284 | 328 |
|
@@ -318,6 +362,13 @@ def getAsScriptCode(self):
|
318 | 362 | param_type += 'file'
|
319 | 363 | return '##' + self.name + '=' + param_type
|
320 | 364 |
|
| 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 | + |
321 | 372 |
|
322 | 373 | class ParameterFixedTable(Parameter):
|
323 | 374 |
|
@@ -356,6 +407,14 @@ def tableToString(table):
|
356 | 407 | tablestring = tablestring[:-1]
|
357 | 408 | return tablestring
|
358 | 409 |
|
| 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 | + |
359 | 418 |
|
360 | 419 | class ParameterMultipleInput(ParameterDataObject):
|
361 | 420 |
|
@@ -542,6 +601,17 @@ def getAsScriptCode(self):
|
542 | 601 | param_type += 'multiple vector'
|
543 | 602 | return '##' + self.name + '=' + param_type
|
544 | 603 |
|
| 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 | + |
545 | 615 |
|
546 | 616 | class ParameterNumber(Parameter):
|
547 | 617 |
|
@@ -599,6 +669,13 @@ def getAsScriptCode(self):
|
599 | 669 | param_type += 'number'
|
600 | 670 | return '##' + self.name + '=' + param_type + str(self.default)
|
601 | 671 |
|
| 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) |
602 | 679 |
|
603 | 680 | class ParameterRange(Parameter):
|
604 | 681 |
|
@@ -701,6 +778,13 @@ def getAsScriptCode(self):
|
701 | 778 | param_type += 'raster'
|
702 | 779 | return '##' + self.name + '=' + param_type
|
703 | 780 |
|
| 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) |
704 | 788 |
|
705 | 789 | class ParameterSelection(Parameter):
|
706 | 790 |
|
@@ -744,7 +828,18 @@ def setValue(self, n):
|
744 | 828 | except:
|
745 | 829 | return False
|
746 | 830 |
|
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 | + |
748 | 843 | class ParameterString(Parameter):
|
749 | 844 |
|
750 | 845 | NEWLINE = '\n'
|
@@ -781,6 +876,22 @@ def getAsScriptCode(self):
|
781 | 876 | param_type += 'string'
|
782 | 877 | return '##' + self.name + '=' + param_type + self.default
|
783 | 878 |
|
| 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) |
784 | 895 |
|
785 | 896 | class ParameterTable(ParameterDataObject):
|
786 | 897 |
|
@@ -853,6 +964,13 @@ def getAsScriptCode(self):
|
853 | 964 | param_type += 'table'
|
854 | 965 | return '##' + self.name + '=' + param_type
|
855 | 966 |
|
| 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 | + |
856 | 974 |
|
857 | 975 | class ParameterTableField(Parameter):
|
858 | 976 |
|
@@ -908,6 +1026,24 @@ def getAsScriptCode(self):
|
908 | 1026 | return '##' + self.name + '=' + param_type + self.parent
|
909 | 1027 |
|
910 | 1028 |
|
| 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 | + |
911 | 1047 | class ParameterTableMultipleField(Parameter):
|
912 | 1048 |
|
913 | 1049 | """A parameter representing several table fields.
|
@@ -974,6 +1110,23 @@ def getAsScriptCode(self):
|
974 | 1110 | param_type += 'multiple field '
|
975 | 1111 | return '##' + self.name + '=' + param_type + self.parent
|
976 | 1112 |
|
| 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 | + |
977 | 1130 |
|
978 | 1131 | class ParameterVector(ParameterDataObject):
|
979 | 1132 |
|
@@ -1050,6 +1203,22 @@ def getAsScriptCode(self):
|
1050 | 1203 | param_type += 'vector'
|
1051 | 1204 | return '##' + self.name + '=' + param_type
|
1052 | 1205 |
|
| 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) |
1053 | 1222 |
|
1054 | 1223 | class ParameterGeometryPredicate(Parameter):
|
1055 | 1224 |
|
@@ -1089,3 +1258,23 @@ def setValue(self, value):
|
1089 | 1258 | else:
|
1090 | 1259 | self.value = value
|
1091 | 1260 | 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