"""
***************************************************************************
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"{out.description()} | {results[out.name()]} |
\n"
)
f.write("
\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"{param.description()} | {params[param.name()]} |
\n"
)
f.write("
\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,
)