Nyall, could we have defineCharacteristicsFromFile method in QgsProcessingAlgorithm ?. the diff with canExecute is more of a working draft.
On Thu, Mar 15, 2018 at 03:27:50PM +0100, Rashad Kanavath wrote: > Hello, > > On Wed, Mar 14, 2018 at 4:38 AM, Nyall Dawson <nyall.daw...@gmail.com> > wrote: > > > On 13 March 2018 at 20:56, Rashad Kanavath <rashad.kanav...@c-s.fr> wrote: > > > if a provier is enabled then qgis reads all algorithm's during > > > startup. This involves reading descriptor files and doing all parsing > > > required to make gui when user actually open algorithm (click on > > > treeitem). > > > So If I have like three provider enabled it takes more time to start > > qgis than > > > usual. Even though, I might open one or two later at some point. > > > > > > It is not necessary here to parse "all" data during startup. name and > > > group name is only needed to fill provider-algorithm tree. This is > > > true for any provider which uses descriptor files (OTB, GRASS, SAGA > > etc..). > > > > Actually it's a bit trickier here -- models make things more complex > > as they self-validate on creation, and need full knowledge of the > > dependent algorithm's parameters and outputs. > > > > Yes. there are different cases like modeler, standard, batch, scripts. > I tried to utilize canExecute() in otb and seems to be working. > You already have a very flexible, strong API in qgis processing such > trickier feature like this one has become too easy!!. > > I had to call alg.canExecute() in two places and that's it. > diff attached below. With this loading time will be hopefully improved for > OTB, SAGA, GRASS GIS. > > index f5bdc40dc5..1cca57769a 100644 > --- a/python/plugins/processing/modeler/ModelerParametersDialog.py > +++ b/python/plugins/processing/modeler/ModelerParametersDialog.py > @@ -70,6 +70,7 @@ class ModelerParametersDialog(QDialog): > QDialog.__init__(self) > self.setModal(True) > # The algorithm to define in this dialog. It is an instance of > QgsProcessingModelAlgorithm > + alg.canExecute() > self._alg = alg > # The model this algorithm is going to be added to > self.model = model > @@ -80,6 +81,9 @@ class ModelerParametersDialog(QDialog): > settings = QgsSettings() > self.restoreGeometry(settings.value("/Processing/ > modelParametersDialogGeometry", QByteArray())) > > + def algorithm(self): > + return self._alg > + > def closeEvent(self, event): > settings = QgsSettings() > settings.setValue("/Processing/modelParametersDialogGeometry", > self.saveGeometry()) > @@ -242,7 +246,6 @@ class ModelerParametersDialog(QDialog): > outTypes = [] > elif not isinstance(outTypes, (tuple, list)): > outTypes = [outTypes] > - > return self.model.availableSourcesForChild(self.childId, > [p.typeName() for p in paramType if > > issubclass(p, QgsProcessingParameterDefinition)], > [o.typeName() for o in > outTypes if > diff --git a/src/core/processing/models/qgsprocessingmodelchildalgorithm.cpp > b/src/core/processing/models/qgsprocessingmodelchildalgorithm.cpp > index f5f8074c88..01906a7f62 100644 > --- a/src/core/processing/models/qgsprocessingmodelchildalgorithm.cpp > +++ b/src/core/processing/models/qgsprocessingmodelchildalgorithm.cpp > @@ -58,7 +58,7 @@ QgsProcessingModelChildAlgorithm & > QgsProcessingModelChildAlgorithm::operator=( c > > const QgsProcessingAlgorithm *QgsProcessingModelChildAlgorithm::algorithm() > const > { > - return mAlgorithm.get(); > + return mAlgorithm && mAlgorithm->canExecute() ? mAlgorithm.get(): > nullptr; > } > > void QgsProcessingModelChildAlgorithm::setModelOutputs( const > QMap<QString, QgsProcessingModelOutput> &modelOutputs ) > > test code for otb provider: > https://gitlab.orfeo-toolbox.org/orfeotoolbox/qgis-otb-plugin > I can add modification to SAGA and GRASS if you are okay to move this to PR. > > > > > Issue is more about calling defineDescriptorFile() in Algorithm's > > > __init__ method. And ofcourse, one cannot avoid init when adding > > > algorithm and tree need to add an instance of algorithm. what can be > > > done? > > > > What I've been thinking/planning is to take advantage of task manager > > here. So basically: > > > > - on processing startup, there's no providers added > > - when the qgis interface is fully loaded then we fire up a background > > task which loads the providers, allowing them to fully build their > > available algorithms and parameters without blocking the startup > > - after the task completes, the tree is populated > > > > this is still loading all algorithm with parsing but things will be in > background to not block ui for users. correct? > In that case, you could include above diff and then add loading in > background task. IMHO that will be best. > > > > I'd like to see more plugins take this approach, so that qgis can load > > nice and quick and the slow stuff happens without annoying users... > > > > Nyall > > _______________________________________________ > > QGIS-Developer mailing list > > QGIS-Developer@lists.osgeo.org > > List info: https://lists.osgeo.org/mailman/listinfo/qgis-developer > > Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-developer > > > > > > -- > Regards, > Rashad -- Take care, Rashad _______________________________________________ QGIS-Developer mailing list QGIS-Developer@lists.osgeo.org List info: https://lists.osgeo.org/mailman/listinfo/qgis-developer Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-developer