| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 | """***************************************************************************    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 codecsimport timefrom qgis.core import (QgsProcessingOutputHtml,                       QgsProcessingOutputNumber,                       QgsProcessingOutputString,                       QgsProcessingOutputBoolean,                       QgsProject)from qgis.gui import QgsProcessingBatchAlgorithmDialogBasefrom qgis.utils import ifacefrom processing.core.ProcessingResults import resultsListfrom processing.gui.BatchPanel import BatchPanelfrom processing.gui.Postprocessing import handleAlgorithmResultsfrom processing.tools import dataobjectsfrom processing.tools.system import getTempFilenameclass 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('<hr>\n')                    f.write(self.tr('<h3>Parameters</h3>\n'))                    f.write('<table>\n')                    for param in self.algorithm().parameterDefinitions():                        if not param.isDestination():                            if param.name() in params:                                f.write('<tr><th>{}</th><td>{}</td></tr>\n'.format(param.description(),                                                                                   params[param.name()]))                    f.write('</table>\n')                    f.write(self.tr('<h3>Results</h3>\n'))                    f.write('<table>\n')                    for out in self.algorithm().outputDefinitions():                        if out.name() in results:                            f.write(f'<tr><th>{out.description()}</th><td>{results[out.name()]}</td></tr>\n')                    f.write('</table>\n')            if errors:                f.write('<h2 style="color: red">{}</h2>\n'.format(self.tr('Errors')))            for i, res in enumerate(errors):                errors = res['errors']                params = res['parameters']                if i > 0:                    f.write('<hr>\n')                f.write(self.tr('<h3>Parameters</h3>\n'))                f.write('<table>\n')                for param in self.algorithm().parameterDefinitions():                    if not param.isDestination():                        if param.name() in params:                            f.write(                                f'<tr><th>{param.description()}</th><td>{params[param.name()]}</td></tr>\n')                f.write('</table>\n')                f.write('<h3>{}</h3>\n'.format(self.tr('Error')))                f.write('<p style="color: red">{}</p>\n'.format('<br>'.join(errors)))        resultsList.addResult(icon=self.algorithm().icon(),                              name=f'{self.algorithm().name()} [summary]', timestamp=time.localtime(),                              result=outputFile)
 |