Skip to content

Commit d3a2f7c

Browse files
committedJun 20, 2017
Models can now be saved and restored
1 parent f21f502 commit d3a2f7c

File tree

10 files changed

+140
-106
lines changed

10 files changed

+140
-106
lines changed
 

‎python/core/processing/qgsprocessingmodelalgorithm.sip

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -675,15 +675,12 @@ Copies are protected to avoid slicing
675675
.. seealso:: removeModelParameter()
676676
%End
677677

678-
bool removeModelParameter( const QString &name );
678+
void removeModelParameter( const QString &name );
679679
%Docstring
680680
Removes an existing model parameter by ``name``. The definition of the matching parameter
681681
is deleted.
682-
Returns false if the parameter could not be deleted (e.g. if a child algorithm
683-
depends on the parameter).
684682
.. seealso:: addModelParameter()
685683
.. seealso:: updateModelParameter()
686-
:rtype: bool
687684
%End
688685

689686
bool childAlgorithmsDependOnParameter( const QString &name ) const;

‎python/core/processing/qgsprocessingparameters.sip

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,14 @@ class QgsProcessingParameters
520520
:rtype: list of str
521521
%End
522522

523+
static QgsProcessingParameterDefinition *parameterFromVariantMap( const QVariantMap &map ) /Factory/;
524+
%Docstring
525+
Creates a new QgsProcessingParameterDefinition using the configuration from a
526+
supplied variant ``map``.
527+
The caller takes responsibility for deleting the returned object.
528+
:rtype: QgsProcessingParameterDefinition
529+
%End
530+
523531
};
524532

525533

‎python/plugins/processing/modeler/ModelerAlgorithm.py

Lines changed: 0 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -301,70 +301,6 @@ def shortHelpString(self):
301301
return str(self.helpContent['ALG_DESC'])
302302
return None
303303

304-
def todict(self):
305-
keys = ["inputs", "_group", "_name", "algs", "helpContent"]
306-
return {k: v for k, v in list(self.__dict__.items()) if k in keys}
307-
308-
def toJson(self):
309-
def todict(o):
310-
if isinstance(o, QPointF):
311-
return {"class": "point", "values": {"x": o.x(), "y": o.y()}}
312-
try:
313-
d = o.todict()
314-
return {"class": o.__class__.__module__ + "." + o.__class__.__name__, "values": d}
315-
except Exception:
316-
pass
317-
return json.dumps(self, default=todict, indent=4)
318-
319-
@staticmethod
320-
def fromJson(s):
321-
def fromdict(d):
322-
try:
323-
fullClassName = d["class"]
324-
if isinstance(fullClassName, str):
325-
tokens = fullClassName.split(".")
326-
else:
327-
tokens = fullClassName.__class__.__name__.split(".")
328-
className = tokens[-1]
329-
moduleName = ".".join(tokens[:-1])
330-
values = d["values"]
331-
if className == "point":
332-
return QPointF(values["x"], values["y"])
333-
334-
def _import(name):
335-
__import__(name)
336-
return sys.modules[name]
337-
338-
if moduleName.startswith("processing.parameters"):
339-
moduleName = "processing.core.parameters"
340-
module = _import(moduleName)
341-
clazz = getattr(module, className)
342-
instance = clazz()
343-
for k, v in list(values.items()):
344-
# upgrade old model files
345-
if k == 'group':
346-
k = '_group'
347-
elif k == 'name':
348-
instance.__dict__['_name'] = v
349-
k = 'modeler_name'
350-
if not issubclass(clazz, GeoAlgorithm):
351-
instance.__dict__['name'] = v
352-
instance.__dict__[k] = v
353-
return instance
354-
except KeyError:
355-
return d
356-
except Exception as e:
357-
raise e
358-
359-
try:
360-
model = json.loads(s, object_hook=fromdict)
361-
except Exception as e:
362-
raise WrongModelException(e.args[0])
363-
364-
if hasattr(model, "modeler_name"):
365-
model._name = model.modeler_name
366-
return model
367-
368304
def toPython(self):
369305
s = ['##%s=name' % self.name()]
370306
for param in list(self.parameterComponents().values()):

‎python/plugins/processing/modeler/ModelerGraphicItem.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -194,10 +194,9 @@ def editElement(self):
194194
param=self.model.parameterDefinition(self.element.parameterName()))
195195
dlg.exec_()
196196
if dlg.param is not None:
197-
self.model.updateModelParameter(dlg.param)
197+
self.model.removeModelParameter(self.element.parameterName())
198198
self.element.setParameterName(dlg.param.name())
199-
# also need to update the model's stored component
200-
self.model.childAlgorithm(self.element.childId()).setParameterName(dlg.param.name())
199+
self.model.addModelParameter(dlg.param, self.element)
201200
self.text = dlg.param.description()
202201
self.update()
203202
elif isinstance(self.element, QgsProcessingModelAlgorithm.ChildAlgorithm):
@@ -228,11 +227,12 @@ def updateAlgorithm(self, alg):
228227

229228
def removeElement(self):
230229
if isinstance(self.element, QgsProcessingModelAlgorithm.ModelParameter):
231-
if not self.model.removeModelParameter(self.element.parameterName()):
230+
if self.model.childAlgorithmsDependOnParameter(self.element.parameterName()):
232231
QMessageBox.warning(None, 'Could not remove element',
233232
'Other elements depend on the selected one.\n'
234233
'Remove them before trying to remove it.')
235234
else:
235+
self.model.removeModelParameter(self.element.parameterName())
236236
self.scene.dialog.haschanged = True
237237
self.scene.dialog.repaintModel()
238238
elif isinstance(self.element, QgsProcessingModelAlgorithm.ChildAlgorithm):

‎python/plugins/processing/modeler/ModelerParametersDialog.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ def getAvailableDependencies(self): # spellok
207207
return opts
208208

209209
def getDependenciesPanel(self):
210-
return MultipleInputPanel([alg.description for alg in self.getAvailableDependencies()]) # spellok
210+
return MultipleInputPanel([alg.description() for alg in self.getAvailableDependencies()]) # spellok
211211

212212
def showAdvancedParametersClicked(self):
213213
self.showAdvanced = not self.showAdvanced
@@ -250,7 +250,7 @@ def getAvailableValuesOfType(self, paramType, outTypes=[], dataType=None):
250250
dependent = []
251251
else:
252252
dependent = list(self.model.dependentChildAlgorithms(self._algName))
253-
dependent.insert(self._algName)
253+
dependent.append(self._algName)
254254
for alg in list(self.model.childAlgorithms().values()):
255255
if alg.childId() not in dependent:
256256
for out in alg.algorithm().outputDefinitions():
@@ -291,6 +291,10 @@ def setPreviousValues(self):
291291
value = alg.parameterSources()[param.name()]
292292
else:
293293
value = param.defaultValue()
294+
295+
if isinstance(value, QgsProcessingModelAlgorithm.ChildParameterSource) and value.source() == QgsProcessingModelAlgorithm.ChildParameterSource.StaticValue:
296+
value = value.staticValue()
297+
294298
self.wrappers[param.name()].setValue(value)
295299
for name, out in list(alg.modelOutputs().items()):
296300
self.valueItems[name].setText(out.description())
@@ -316,11 +320,17 @@ def createAlgorithm(self):
316320
val.staticValue())) \
317321
or (not isinstance(val,
318322
QgsProcessingModelAlgorithm.ChildParameterSource) and not param.checkValueIsAcceptable(
319-
val)):
323+
val))\
324+
or (val is None and not param.flags() & QgsProcessingParameterDefinition.FlagOptional):
320325
self.bar.pushMessage("Error", "Wrong or missing value for parameter '%s'" % param.description(),
321326
level=QgsMessageBar.WARNING)
322327
return None
323-
alg.addParameterSource(param.name(), val)
328+
if val is None:
329+
continue
330+
elif isinstance(val, QgsProcessingModelAlgorithm.ChildParameterSource):
331+
alg.addParameterSource(param.name(), val)
332+
else:
333+
alg.addParameterSource(param.name(), QgsProcessingModelAlgorithm.ChildParameterSource.fromStaticValue(val))
324334

325335
# outputs = self._alg.outputDefinitions()
326336
# for output in outputs:

‎src/core/processing/qgsprocessingmodelalgorithm.cpp

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -396,11 +396,11 @@ bool QgsProcessingModelAlgorithm::loadVariant( const QVariant &model )
396396
QVariantMap::const_iterator paramDefIt = paramDefMap.constBegin();
397397
for ( ; paramDefIt != paramDefMap.constEnd(); ++paramDefIt )
398398
{
399-
//QgsProcessingParameterDefinition *param;
400-
//if ( !param.loadVariant( paramDefIt.value().toMap() ) )
401-
// return false;
399+
QgsProcessingParameterDefinition *param = QgsProcessingParameters::parameterFromVariantMap( paramDefIt.value().toMap() );
400+
if ( !param )
401+
return false;
402402

403-
//mParameterComponents.insert( param.parameterName(), param );
403+
addParameter( param );
404404
}
405405

406406
return true;
@@ -505,14 +505,10 @@ void QgsProcessingModelAlgorithm::updateModelParameter( QgsProcessingParameterDe
505505
addParameter( definition );
506506
}
507507

508-
bool QgsProcessingModelAlgorithm::removeModelParameter( const QString &name )
508+
void QgsProcessingModelAlgorithm::removeModelParameter( const QString &name )
509509
{
510-
if ( childAlgorithmsDependOnParameter( name ) )
511-
return false;
512-
513510
removeParameter( name );
514511
mParameterComponents.remove( name );
515-
return true;
516512
}
517513

518514
bool QgsProcessingModelAlgorithm::childAlgorithmsDependOnParameter( const QString &name ) const
@@ -772,9 +768,6 @@ QVariant QgsProcessingModelAlgorithm::ModelParameter::toVariant() const
772768
{
773769
QVariantMap map;
774770
map.insert( QStringLiteral( "name" ), mParameterName );
775-
776-
//TODO - parameter definition
777-
778771
saveCommonProperties( map );
779772
return map;
780773
}

‎src/core/processing/qgsprocessingmodelalgorithm.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -673,12 +673,10 @@ class CORE_EXPORT QgsProcessingModelAlgorithm : public QgsProcessingAlgorithm
673673
/**
674674
* Removes an existing model parameter by \a name. The definition of the matching parameter
675675
* is deleted.
676-
* Returns false if the parameter could not be deleted (e.g. if a child algorithm
677-
* depends on the parameter).
678676
* \see addModelParameter()
679677
* \see updateModelParameter()
680678
*/
681-
bool removeModelParameter( const QString &name );
679+
void removeModelParameter( const QString &name );
682680

683681
/**
684682
* Returns true if any child algorithms depend on the model parameter

‎src/core/processing/qgsprocessingparameters.cpp

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -711,6 +711,61 @@ QStringList QgsProcessingParameters::parameterAsFields( const QgsProcessingParam
711711
return resultStringList;
712712
}
713713

714+
QgsProcessingParameterDefinition *QgsProcessingParameters::parameterFromVariantMap( const QVariantMap &map )
715+
{
716+
QString type = map.value( QStringLiteral( "parameter_type" ) ).toString();
717+
QString name = map.value( QStringLiteral( "name" ) ).toString();
718+
std::unique_ptr< QgsProcessingParameterDefinition > def;
719+
if ( type == QStringLiteral( "boolean" ) )
720+
def.reset( new QgsProcessingParameterBoolean( name ) );
721+
else if ( type == QStringLiteral( "crs" ) )
722+
def.reset( new QgsProcessingParameterCrs( name ) );
723+
else if ( type == QStringLiteral( "layer" ) )
724+
def.reset( new QgsProcessingParameterMapLayer( name ) );
725+
else if ( type == QStringLiteral( "extent" ) )
726+
def.reset( new QgsProcessingParameterExtent( name ) );
727+
else if ( type == QStringLiteral( "point" ) )
728+
def.reset( new QgsProcessingParameterPoint( name ) );
729+
else if ( type == QStringLiteral( "file" ) )
730+
def.reset( new QgsProcessingParameterFile( name ) );
731+
else if ( type == QStringLiteral( "matrix" ) )
732+
def.reset( new QgsProcessingParameterMatrix( name ) );
733+
else if ( type == QStringLiteral( "multilayer" ) )
734+
def.reset( new QgsProcessingParameterMultipleLayers( name ) );
735+
else if ( type == QStringLiteral( "number" ) )
736+
def.reset( new QgsProcessingParameterNumber( name ) );
737+
else if ( type == QStringLiteral( "range" ) )
738+
def.reset( new QgsProcessingParameterRange( name ) );
739+
else if ( type == QStringLiteral( "raster" ) )
740+
def.reset( new QgsProcessingParameterRasterLayer( name ) );
741+
else if ( type == QStringLiteral( "enum" ) )
742+
def.reset( new QgsProcessingParameterEnum( name ) );
743+
else if ( type == QStringLiteral( "string" ) )
744+
def.reset( new QgsProcessingParameterString( name ) );
745+
else if ( type == QStringLiteral( "expression" ) )
746+
def.reset( new QgsProcessingParameterExpression( name ) );
747+
else if ( type == QStringLiteral( "table" ) )
748+
def.reset( new QgsProcessingParameterTable( name ) );
749+
else if ( type == QStringLiteral( "field" ) )
750+
def.reset( new QgsProcessingParameterTableField( name ) );
751+
else if ( type == QStringLiteral( "source" ) )
752+
def.reset( new QgsProcessingParameterFeatureSource( name ) );
753+
else if ( type == QStringLiteral( "sink" ) )
754+
def.reset( new QgsProcessingParameterFeatureSink( name ) );
755+
else if ( type == QStringLiteral( "rasterOut" ) )
756+
def.reset( new QgsProcessingParameterRasterOutput( name ) );
757+
else if ( type == QStringLiteral( "fileOut" ) )
758+
def.reset( new QgsProcessingParameterFileOutput( name ) );
759+
else if ( type == QStringLiteral( "folderOut" ) )
760+
def.reset( new QgsProcessingParameterFolderOutput( name ) );
761+
762+
if ( !def )
763+
return nullptr;
764+
765+
def->fromVariantMap( map );
766+
return def.release();
767+
}
768+
714769
//
715770
// QgsProcessingParameterDefinition
716771
//
@@ -744,6 +799,7 @@ QString QgsProcessingParameterDefinition::valueAsPythonString( const QVariant &v
744799
QVariantMap QgsProcessingParameterDefinition::toVariantMap() const
745800
{
746801
QVariantMap map;
802+
map.insert( QStringLiteral( "parameter_type" ), type() );
747803
map.insert( QStringLiteral( "name" ), mName );
748804
map.insert( QStringLiteral( "description" ), mDescription );
749805
map.insert( QStringLiteral( "default" ), mDefault );

‎src/core/processing/qgsprocessingparameters.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,13 @@ class CORE_EXPORT QgsProcessingParameters
532532
*/
533533
static QStringList parameterAsFields( const QgsProcessingParameterDefinition *definition, const QVariantMap &parameters, QgsProcessingContext &context );
534534

535+
/**
536+
* Creates a new QgsProcessingParameterDefinition using the configuration from a
537+
* supplied variant \a map.
538+
* The caller takes responsibility for deleting the returned object.
539+
*/
540+
static QgsProcessingParameterDefinition *parameterFromVariantMap( const QVariantMap &map ) SIP_FACTORY;
541+
535542
};
536543

537544

0 commit comments

Comments
 (0)
Please sign in to comment.