""" *************************************************************************** general.py --------------------- Date : April 2013 Copyright : (C) 2013 by Victor Olaya Email : volayaf at gmail dot com *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * *************************************************************************** """ __author__ = "Victor Olaya" __date__ = "April 2013" __copyright__ = "(C) 2013, Victor Olaya" from qgis.core import ( QgsApplication, QgsProcessingAlgorithm, QgsProcessingParameterDefinition, QgsProcessingParameterEnum, QgsProcessingParameterFeatureSink, QgsProcessingParameterVectorDestination, QgsProcessingParameterRasterDestination, QgsProcessingOutputLayerDefinition, QgsProject, ) from processing.core.Processing import Processing from processing.gui.Postprocessing import handleAlgorithmResults from processing.gui.AlgorithmDialog import AlgorithmDialog from qgis.utils import iface # changing this signature? make sure you update the signature in # python/processing/__init__.py too! # Docstring for this function is in python/processing/__init__.py def algorithmHelp(id: str) -> None: alg = QgsApplication.processingRegistry().algorithmById(id) if alg is not None: print(f"{alg.displayName()} ({alg.id()})\n") if alg.shortDescription(): print(alg.shortDescription() + "\n") if alg.shortHelpString(): print(alg.shortHelpString() + "\n") print("\n----------------") print("Input parameters") print("----------------") for p in alg.parameterDefinitions(): if p.flags() & QgsProcessingParameterDefinition.Flag.FlagHidden: continue print(f"\n{p.name()}: {p.description()}") if p.help(): print(f"\n\t{p.help()}") print(f"\n\tParameter type:\t{p.__class__.__name__}") if isinstance(p, QgsProcessingParameterEnum): opts = [] for i, o in enumerate(p.options()): opts.append(f"\t\t- {i}: {o}") print("\n\tAvailable values:\n{}".format("\n".join(opts))) parameter_type = QgsApplication.processingRegistry().parameterType(p.type()) accepted_types = ( parameter_type.acceptedPythonTypes() if parameter_type is not None else [] ) if accepted_types: opts = [] for t in accepted_types: opts.append(f"\t\t- {t}") print("\n\tAccepted data types:") print("\n".join(opts)) print("\n----------------") print("Outputs") print("----------------") for o in alg.outputDefinitions(): print(f"\n{o.name()}: <{o.__class__.__name__}>") if o.description(): print("\t" + o.description()) else: print(f'Algorithm "{id}" not found.') # changing this signature? make sure you update the signature in # python/processing/__init__.py too! # Docstring for this function is in python/processing/__init__.py def run( algOrName, parameters, onFinish=None, feedback=None, context=None, is_child_algorithm=False, ): if onFinish or not is_child_algorithm: return Processing.runAlgorithm( algOrName, parameters, onFinish, feedback, context ) else: # for child algorithms, we disable to default post-processing step where layer ownership # is transferred from the context to the caller. In this case, we NEED the ownership to remain # with the context, so that further steps in the algorithm have guaranteed access to the layer. def post_process(_alg, _context, _feedback): return return Processing.runAlgorithm( algOrName, parameters, onFinish=post_process, feedback=feedback, context=context, ) # changing this signature? make sure you update the signature in # python/processing/__init__.py too! # Docstring for this function is in python/processing/__init__.py def runAndLoadResults(algOrName, parameters, feedback=None, context=None): if isinstance(algOrName, QgsProcessingAlgorithm): alg = algOrName else: alg = QgsApplication.processingRegistry().createAlgorithmById(algOrName) # output destination parameters to point to current project for param in alg.parameterDefinitions(): if not param.name() in parameters: continue if isinstance( param, ( QgsProcessingParameterFeatureSink, QgsProcessingParameterVectorDestination, QgsProcessingParameterRasterDestination, ), ): p = parameters[param.name()] if not isinstance(p, QgsProcessingOutputLayerDefinition): parameters[param.name()] = QgsProcessingOutputLayerDefinition( p, QgsProject.instance() ) else: p.destinationProject = QgsProject.instance() parameters[param.name()] = p return Processing.runAlgorithm( alg, parameters=parameters, onFinish=handleAlgorithmResults, feedback=feedback, context=context, ) # changing this signature? make sure you update the signature in # python/processing/__init__.py too! # Docstring for this function is in python/processing/__init__.py def createAlgorithmDialog(algOrName, parameters={}): if isinstance(algOrName, QgsProcessingAlgorithm): alg = algOrName.create() else: alg = QgsApplication.processingRegistry().createAlgorithmById(algOrName) if alg is None: return None dlg = alg.createCustomParametersWidget(iface.mainWindow()) if not dlg: dlg = AlgorithmDialog(alg, parent=iface.mainWindow()) dlg.setParameters(parameters) return dlg # changing this signature? make sure you update the signature in # python/processing/__init__.py too! # Docstring for this function is in python/processing/__init__.py def execAlgorithmDialog(algOrName, parameters={}): dlg = createAlgorithmDialog(algOrName, parameters) if dlg is None: return {} canvas = iface.mapCanvas() prevMapTool = canvas.mapTool() dlg.show() dlg.exec() if canvas.mapTool() != prevMapTool: try: canvas.mapTool().reset() except: pass canvas.setMapTool(prevMapTool) results = dlg.results() # make sure the dialog is destroyed and not only hidden on pressing Esc dlg.close() return results