""" *************************************************************************** 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)