diff --git a/avaframeConnector_provider.py b/avaframeConnector_provider.py index 063a3c2..69bb771 100644 --- a/avaframeConnector_provider.py +++ b/avaframeConnector_provider.py @@ -91,12 +91,14 @@ def find_python(): from .getVersion_algorithm import getVersionAlgorithm from .runCom1DFA_algorithm import runCom1DFAAlgorithm from .runCom2AB_algorithm import runCom2ABAlgorithm -from .runCom5SnowSlide_algorithm import runCom5SnowSlideAlgorithm -from .runCom6RockAvalanche_algorithm import runCom6RockAvalancheAlgorithm -from .runCom6Scarp_algorithm import runCom6ScarpAlgorithm from .runAna4ProbAna_algorithm import runAna4ProbAnaAlgorithm from .runAna4ProbDirOnly_algorithm import runAna4ProbDirOnlyAlgorithm from .runAna5DFAPathGeneration_algorithm import runAna5DFAPathGenerationAlgorithm +from .runCom5SnowSlide_algorithm import runCom5SnowSlideAlgorithm +from .runCom6RockAvalanche_algorithm import runCom6RockAvalancheAlgorithm +from .runCom7RegionalSplitting_algorithm import runCom7RegionalSplittingAlgorithm +from .runCom7RegionalComputation_algorithm import runCom7RegionalComputationAlgorithm +from .runCom6Scarp_algorithm import runCom6ScarpAlgorithm from .runIn1RelInfo_algorithm import runIn1RelInfoAlgorithm from .update_algorithm import updateAlgorithm @@ -130,6 +132,8 @@ def loadAlgorithms(self): self.addAlgorithm(runCom5SnowSlideAlgorithm()) self.addAlgorithm(runCom6RockAvalancheAlgorithm()) self.addAlgorithm(runCom6ScarpAlgorithm()) + self.addAlgorithm(runCom7RegionalSplittingAlgorithm()) + self.addAlgorithm(runCom7RegionalComputationAlgorithm()) self.addAlgorithm(runAna4ProbAnaAlgorithm()) self.addAlgorithm(runAna4ProbDirOnlyAlgorithm()) self.addAlgorithm(runAna5DFAPathGenerationAlgorithm()) diff --git a/pb_tool.cfg b/pb_tool.cfg index bc149e0..59939d2 100644 --- a/pb_tool.cfg +++ b/pb_tool.cfg @@ -61,6 +61,8 @@ python_files: __init__.py avaframeConnector.py avaframeConnector_provider.py runAna4ProbAna_algorithm.py runAna4ProbDirOnly_algorithm.py runAna5DFAPathGeneration_algorithm.py + runCom7RegionalSplitting_algorithm.py + runCom7RegionalComputation_algorithm.py runIn1RelInfo_algorithm.py avaframeConnector_commonFunc.py diff --git a/runCom7RegionalComputation_algorithm.py b/runCom7RegionalComputation_algorithm.py new file mode 100644 index 0000000..31a5848 --- /dev/null +++ b/runCom7RegionalComputation_algorithm.py @@ -0,0 +1,166 @@ +# -*- coding: utf-8 -*- + +""" +/*************************************************************************** + AvaFrameRunCom1DFA + A QGIS plugin + Connects to AvaFrame + Generated by Plugin Builder: http://g-sherman.github.io/Qgis-Plugin-Builder/ + ------------------- + begin : 2021-08-26 + copyright : (C) 2021 by AvaFrame Team + email : felix@avaframe.org + ***************************************************************************/ + +/*************************************************************************** + * * + * 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__ = "AvaFrame Team" +__date__ = "2025" +__copyright__ = "(C) 2025 by AvaFrame Team" + +# This will get replaced with a git SHA1 when you do a git archive + +__revision__ = "$Format:%H$" + + +import pathlib + + +from qgis.PyQt.QtCore import QCoreApplication +from qgis.core import ( + QgsProcessing, + QgsProcessingAlgorithm, + QgsProcessingParameterFile, + QgsProcessingOutputVectorLayer, +) + + +class runCom7RegionalComputationAlgorithm(QgsProcessingAlgorithm): + """ + Runs com7Regional computation on a single folder + """ + + OUTPUT = "OUTPUT" + SIMFOLDER = "FOLDEST" + + def initAlgorithm(self, config): + """ + Here we define the inputs and output of the algorithm, along + with some other properties. + """ + self.addParameter( + QgsProcessingParameterFile( + self.SIMFOLDER, + self.tr("Avalanche directory"), + behavior=QgsProcessingParameterFile.Folder, + ) + ) + + self.addOutput( + QgsProcessingOutputVectorLayer( + self.OUTPUT, + self.tr("Output layer"), + QgsProcessing.TypeVectorAnyGeometry, + ) + ) + + def flags(self): + return super().flags() + # return super().flags() | QgsProcessingAlgorithm.FlagNoThreading + + def processAlgorithm(self, parameters, context, feedback): + """ + Here is where the processing itself takes place. + """ + + import avaframe.version as gv + from . import avaframeConnector_commonFunc as cF + + feedback.pushInfo("AvaFrame Version: " + gv.getVersion()) + + sourceFOLDEST = self.parameterAsFile(parameters, self.SIMFOLDER, context) + + # create folder structure + targetDir = pathlib.Path(sourceFOLDEST) + + feedback.pushInfo("Starting the simulations") + feedback.pushInfo("This might take a while") + feedback.pushInfo("See console for progress") + + # Generate command and run via subprocess.run + command = [ + "python", + "-m", + "avaframe.runCom7Regional", + str(targetDir), + "--run-computations", + ] + cF.runAndCheck(command, self, feedback) + + feedback.pushInfo("Done, start loading the results") + + feedback.pushInfo("\n---------------------------------") + feedback.pushInfo("Done, find results and logs here:") + feedback.pushInfo(str(targetDir.resolve())) + feedback.pushInfo("---------------------------------\n") + + return {} + + def name(self): + """ + Returns the algorithm name, used for identifying the algorithm. This + string should be fixed for the algorithm, and must not be localised. + The name should be unique within each provider. Names should contain + lowercase alphanumeric characters only and no spaces or other + formatting characters. + """ + return "com7regionalcomputation" + + def displayName(self): + """ + Returns the translated algorithm name, which should be used for any + user-visible display of the algorithm name. + """ + return self.tr("Regional modelling computation (com7)") + + def group(self): + """ + Returns the name of the group this algorithm belongs to. This string + should be localised. + """ + return self.tr(self.groupId()) + + def groupId(self): + """ + Returns the unique ID of the group this algorithm belongs to. This + string should be fixed for the algorithm, and must not be localised. + The group id should be unique within each provider. Group id should + contain lowercase alphanumeric characters only and no spaces or other + formatting characters. + """ + return "Experimental" + + def tr(self, string): + return QCoreApplication.translate("Processing", string) + + def shortHelpString(self) -> str: + hstring = "Runs multiple avalanches as setup via regional input splitting. \n\ + AvaFrame Documentation: https://docs.avaframe.org\n\ + Homepage: https://avaframe.org\n\ + Praxisleitfaden: https://avaframe.org/reports\n" + + return self.tr(hstring) + + def helpUrl(self): + return "https://docs.avaframe.org/en/latest/connector.html" + + def createInstance(self): + return runCom7RegionalComputationAlgorithm() diff --git a/runCom7RegionalSplitting_algorithm.py b/runCom7RegionalSplitting_algorithm.py new file mode 100644 index 0000000..e726244 --- /dev/null +++ b/runCom7RegionalSplitting_algorithm.py @@ -0,0 +1,237 @@ +# -*- coding: utf-8 -*hhhj + +""" +/*************************************************************************** + A QGIS plugin + Connects to AvaFrame + Generated by Plugin Builder: http://g-sherman.github.io/Qgis-Plugin-Builder/ + ------------------- + begin : 2021-08-26 + copyright : (C) 2021 by AvaFrame Team + email : felix@avaframe.org + ***************************************************************************/ + +/*************************************************************************** + * * + * 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__ = "AvaFrame Team" +__date__ = "2025" +__copyright__ = "(C) 2025 by AvaFrame Team" + +# This will get replaced with a git SHA1 when you do a git archive + +__revision__ = "$Format:%H$" + + +import pathlib + +from qgis.PyQt.QtCore import QCoreApplication +from qgis.core import ( + QgsProcessing, + QgsProcessingException, + QgsProcessingAlgorithm, + QgsProcessingParameterFeatureSource, + QgsProcessingParameterRasterLayer, + QgsProcessingParameterFolderDestination, + QgsProcessingOutputVectorLayer, + QgsProcessingOutputMultipleLayers, +) + + +class runCom7RegionalSplittingAlgorithm(QgsProcessingAlgorithm): + """ + This is the AvaFrame Connection, i.e. the part running with QGis. For this + connector to work, more installation is needed. See instructions at docs.avaframe.org + """ + + DEM = "DEM" + REL = "REL" + RES = "RES" + ENT = "ENT" + OUTPUT = "OUTPUT" + OUTPPR = "OUTPPR" + FOLDEST = "FOLDEST" + + def initAlgorithm(self, config): + """ + Here we define the inputs and output of the algorithm, along + with some other properties. + """ + + self.addParameter( + QgsProcessingParameterRasterLayer(self.DEM, self.tr("DEM layer")) + ) + + self.addParameter( + QgsProcessingParameterFeatureSource( + self.REL, + self.tr("Release layer"), + types=[QgsProcessing.TypeVectorAnyGeometry], + ) + ) + + self.addParameter( + QgsProcessingParameterFeatureSource( + self.ENT, + self.tr("Entrainment layer"), + optional=True, + defaultValue="", + types=[QgsProcessing.TypeVectorAnyGeometry], + ) + ) + + self.addParameter( + QgsProcessingParameterFeatureSource( + self.RES, + self.tr("Resistance layer"), + optional=True, + defaultValue="", + types=[QgsProcessing.TypeVectorAnyGeometry], + ) + ) + + self.addParameter( + QgsProcessingParameterFolderDestination( + self.FOLDEST, self.tr("Destination folder") + ) + ) + + self.addOutput( + QgsProcessingOutputVectorLayer( + self.OUTPUT, + self.tr("Output layer"), + QgsProcessing.TypeVectorAnyGeometry, + ) + ) + + self.addOutput( + QgsProcessingOutputMultipleLayers( + self.OUTPPR, + ) + ) + + def flags(self): + return super().flags() + # return super().flags() | QgsProcessingAlgorithm.FlagNoThreading + + def processAlgorithm(self, parameters, context, feedback): + """ + Here is where the processing itself takes place. + """ + + from avaframe.in3Utils import initializeProject as iP + import avaframe.version as gv + from . import avaframeConnector_commonFunc as cF + + feedback.pushInfo("AvaFrame Version: " + gv.getVersion()) + + sourceDEM = self.parameterAsRasterLayer(parameters, self.DEM, context) + if sourceDEM is None: + raise QgsProcessingException(self.invalidSourceError(parameters, self.DEM)) + + # Release files + sourceREL = self.parameterAsVectorLayer(parameters, self.REL, context) + if sourceREL is None: + raise QgsProcessingException(self.invalidSourceError(parameters, self.REL)) + + sourceRES = self.parameterAsVectorLayer(parameters, self.RES, context) + + sourceENT = self.parameterAsVectorLayer(parameters, self.ENT, context) + + sourceFOLDEST = self.parameterAsFile(parameters, self.FOLDEST, context) + + # create folder structure + targetDir = pathlib.Path(sourceFOLDEST) + iP.initializeFolderStruct(targetDir, removeExisting=False) + + feedback.pushInfo(sourceDEM.source()) + + # copy DEM + cF.copyDEM(sourceDEM, targetDir) + + # copy all release shapefile parts + cF.copyShp(sourceREL.source(), targetDir / "Inputs" / "REL") + + # copy all resistance shapefile parts + if sourceRES is not None: + cF.copyShp(sourceRES.source(), targetDir / "Inputs" / "RES") + + # copy all entrainment shapefile parts + if sourceENT is not None: + cF.copyShp(sourceENT.source(), targetDir / "Inputs" / "ENT") + + feedback.pushInfo("Start splitting the input") + + # Generate command and run via subprocess.run + command = [ + "python", + "-m", + "avaframe.runCom7Regional", + str(targetDir), + "--split-inputs", + ] + cF.runAndCheck(command, self, feedback) + + feedback.pushInfo("Done, please check target directory ") + + return {} + + def name(self): + """ + Returns the algorithm name, used for identifying the algorithm. This + string should be fixed for the algorithm, and must not be localised. + The name should be unique within each provider. Names should contain + lowercase alphanumeric characters only and no spaces or other + formatting characters. + """ + return "com7regionalsplitting" + + def displayName(self): + """ + Returns the translated algorithm name, which should be used for any + user-visible display of the algorithm name. + """ + return self.tr("Regional input splitting (com7)") + + def group(self): + """ + Returns the name of the group this algorithm belongs to. This string + should be localised. + """ + return self.tr(self.groupId()) + + def groupId(self): + """ + Returns the unique ID of the group this algorithm belongs to. This + string should be fixed for the algorithm, and must not be localised. + The group id should be unique within each provider. Group id should + contain lowercase alphanumeric characters only and no spaces or other + formatting characters. + """ + return "Experimental" + + def tr(self, string): + return QCoreApplication.translate("Processing", string) + + def shortHelpString(self) -> str: + hstring = "Splits input for regional modelling. \n\ + For more information go to (or use the help button below): \n\ + AvaFrame Documentation: https://docs.avaframe.org\n\ + Homepage: https://avaframe.org\n\ + Praxisleitfaden: https://avaframe.org/reports\n" + + return self.tr(hstring) + # Praxisleitfaden: https://info.bml.gv.at/dam/jcr:edebd872-2a86-4edf-ac5e-635ef11e35fe/Praxisleitfaden%20LawSim%20WLV%202022%20Gr%C3%BCn.pdf\n' + + def helpUrl(self): + return "https://docs.avaframe.org/en/latest/connector.html" + + def createInstance(self): + return runCom7RegionalSplittingAlgorithm()