""" *************************************************************************** BatchAlgorithmDialog.py --------------------- Date : August 2012 Copyright : (C) 2012 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__ = "August 2012" __copyright__ = "(C) 2012, Victor Olaya" import codecs import time from qgis.core import ( QgsProcessingOutputHtml, QgsProcessingOutputNumber, QgsProcessingOutputString, QgsProcessingOutputBoolean, QgsProject, ) from qgis.gui import QgsProcessingBatchAlgorithmDialogBase from qgis.utils import iface from processing.core.ProcessingResults import resultsList from processing.gui.BatchPanel import BatchPanel from processing.gui.Postprocessing import handleAlgorithmResults from processing.tools import dataobjects from processing.tools.system import getTempFilename class BatchAlgorithmDialog(QgsProcessingBatchAlgorithmDialogBase): def __init__(self, alg, parent=None): super().__init__(parent) self.setAlgorithm(alg) self.setWindowTitle( self.tr("Batch Processing - {0}").format(self.algorithm().displayName()) ) self.setMainWidget(BatchPanel(self, self.algorithm())) self.context = None self.hideShortHelp() def runAsSingle(self): self.close() from processing.gui.AlgorithmDialog import AlgorithmDialog dlg = AlgorithmDialog(self.algorithm().create(), parent=iface.mainWindow()) dlg.show() dlg.exec() def processingContext(self): if self.context is None: self.feedback = self.createFeedback() self.context = dataobjects.createContext(self.feedback) self.context.setLogLevel(self.logLevel()) return self.context def createContext(self, feedback): return dataobjects.createContext(feedback) def runAlgorithm(self): alg_parameters = [] load_layers = self.mainWidget().checkLoadLayersOnCompletion.isChecked() project = QgsProject.instance() if load_layers else None for row in range(self.mainWidget().batchRowCount()): parameters, ok = self.mainWidget().parametersForRow( row=row, context=self.processingContext(), destinationProject=project, warnOnInvalid=True, ) if ok: alg_parameters.append(parameters) if not alg_parameters: return self.execute(alg_parameters) def handleAlgorithmResults(self, algorithm, context, feedback, parameters): handleAlgorithmResults(algorithm, context, feedback, parameters) def loadHtmlResults(self, results, num): for out in self.algorithm().outputDefinitions(): if ( isinstance(out, QgsProcessingOutputHtml) and out.name() in results and results[out.name()] ): resultsList.addResult( icon=self.algorithm().icon(), name=f"{out.description()} [{num}]", result=results[out.name()], ) def createSummaryTable(self, algorithm_results, errors): createTable = False for out in self.algorithm().outputDefinitions(): if isinstance( out, ( QgsProcessingOutputNumber, QgsProcessingOutputString, QgsProcessingOutputBoolean, ), ): createTable = True break if not createTable and not errors: return outputFile = getTempFilename("html") with codecs.open(outputFile, "w", encoding="utf-8") as f: if createTable: for i, res in enumerate(algorithm_results): results = res["results"] params = res["parameters"] if i > 0: f.write("
\n") f.write(self.tr("

Parameters

\n")) f.write("\n") for param in self.algorithm().parameterDefinitions(): if not param.isDestination(): if param.name() in params: f.write( "\n".format( param.description(), params[param.name()] ) ) f.write("
{}{}
\n") f.write(self.tr("

Results

\n")) f.write("\n") for out in self.algorithm().outputDefinitions(): if out.name() in results: f.write( f"\n" ) f.write("
{out.description()}{results[out.name()]}
\n") if errors: f.write('

{}

\n'.format(self.tr("Errors"))) for i, res in enumerate(errors): errors = res["errors"] params = res["parameters"] if i > 0: f.write("
\n") f.write(self.tr("

Parameters

\n")) f.write("\n") for param in self.algorithm().parameterDefinitions(): if not param.isDestination(): if param.name() in params: f.write( f"\n" ) f.write("
{param.description()}{params[param.name()]}
\n") f.write("

{}

\n".format(self.tr("Error"))) f.write('

{}

\n'.format("
".join(errors))) resultsList.addResult( icon=self.algorithm().icon(), name=f"{self.algorithm().name()} [summary]", timestamp=time.localtime(), result=outputFile, )