Skip to content

Commit

Permalink
Refactor logic from .py drop handler Processing script detection
Browse files Browse the repository at this point in the history
to also allow for retrieving just the class of detected algorithms
instead of always running the algorithm
  • Loading branch information
nyalldawson committed Dec 15, 2021
1 parent f00419c commit dde113d
Showing 1 changed file with 45 additions and 12 deletions.
57 changes: 45 additions & 12 deletions python/utils.py
Expand Up @@ -912,30 +912,63 @@ def _import(name, globals={}, locals={}, fromlist=[], level=None):
__builtin__.__import__ = _import


def run_script_from_file(filepath: str):
def processing_algorithm_from_script(filepath: str):
"""
Runs a Python script from a given file. Supports loading processing scripts.
:param filepath: The .py file to load.
Tries to import a Python processing algorithm from given file, and returns an instance
of the algorithm
"""
import sys
import inspect
from qgis.processing import alg
try:
from qgis.core import QgsApplication, QgsProcessingAlgorithm, QgsProcessingFeatureBasedAlgorithm
from qgis.processing import execAlgorithmDialog
_locals = {}
exec(open(filepath.replace("\\\\", "/").encode(sys.getfilesystemencoding())).read(), _locals)
alginstance = None
with open(filepath.replace("\\\\", "/").encode(sys.getfilesystemencoding())) as input_file:
exec(input_file.read(), _locals)
alg_instance = None
try:
alginstance = alg.instances.pop().createInstance()
alg_instance = alg.instances.pop().createInstance()
except IndexError:
for name, attr in _locals.items():
if inspect.isclass(attr) and issubclass(attr, (QgsProcessingAlgorithm, QgsProcessingFeatureBasedAlgorithm)) and attr.__name__ not in ("QgsProcessingAlgorithm", "QgsProcessingFeatureBasedAlgorithm"):
alginstance = attr()
alg_instance = attr()
break
if alginstance:
alginstance.setProvider(QgsApplication.processingRegistry().providerById("script"))
alginstance.initAlgorithm()
execAlgorithmDialog(alginstance)
if alg_instance:
script_provider = QgsApplication.processingRegistry().providerById("script")
alg_instance.setProvider(script_provider)
alg_instance.initAlgorithm()
return alg_instance
except ImportError:
pass

return None


def import_script_algorithm(filepath: str) -> Optional[str]:
"""
Imports a script algorithm from given file to the processing script provider, and returns the
ID of the imported algorithm
"""
alg_instance = processing_algorithm_from_script(filepath)
if alg_instance:
from qgis.core import QgsApplication
script_provider = QgsApplication.processingRegistry().providerById("script")
script_provider.add_algorithm_class(type(alg_instance))
return alg_instance.id()

return None


def run_script_from_file(filepath: str):
"""
Runs a Python script from a given file. Supports loading processing scripts.
:param filepath: The .py file to load.
"""
try:
from qgis.processing import execAlgorithmDialog
except ImportError:
return

alg_instance = processing_algorithm_from_script(filepath)
if alg_instance:
execAlgorithmDialog(alg_instance)

0 comments on commit dde113d

Please sign in to comment.