def finish(self, result, context, feedback): keepOpen = ProcessingConfig.getSetting(ProcessingConfig.KEEP_DIALOG_OPEN) if self.iterateParam is None: # add html results to results dock for out in self.alg.outputDefinitions(): if isinstance(out, QgsProcessingOutputHtml) and out.name() in result and result[out.name()]: resultsList.addResult(icon=self.alg.icon(), name=out.description(), result=result[out.name()]) if not handleAlgorithmResults(self.alg, context, feedback, not keepOpen): self.resetGUI() return self.executed = True self.setInfo(self.tr('Algorithm \'{0}\' finished').format(self.alg.displayName()), escape_html=False) QApplication.restoreOverrideCursor() if not keepOpen: self.close() else: self.resetGUI() if self.alg.hasHtmlOutputs(): self.setInfo( self.tr('HTML output has been generated by this algorithm.' '\nOpen the results dialog to check it.'), escape_html=False)
def finish(self, successful, result, context, feedback): keepOpen = not successful or ProcessingConfig.getSetting(ProcessingConfig.KEEP_DIALOG_OPEN) if self.iterateParam is None: # add html results to results dock for out in self.algorithm().outputDefinitions(): if isinstance(out, QgsProcessingOutputHtml) and out.name() in result and result[out.name()]: resultsList.addResult(icon=self.algorithm().icon(), name=out.description(), timestamp=time.localtime(), result=result[out.name()]) if not handleAlgorithmResults(self.algorithm(), context, feedback, not keepOpen, result): self.resetGui() return self.setExecuted(True) self.setResults(result) self.setInfo(self.tr('Algorithm \'{0}\' finished').format(self.algorithm().displayName()), escapeHtml=False) if not keepOpen: self.close() else: self.resetGui() if self.algorithm().hasHtmlOutputs(): self.setInfo( self.tr('HTML output has been generated by this algorithm.' '\nOpen the results dialog to check it.'), escapeHtml=False)
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='{} [{}]'.format( 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('<tr><th>{}</th><td>{}</td></tr>\n'.format(out.description(), results[out.name()])) 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( '<tr><th>{}</th><td>{}</td></tr>\n'.format(param.description(), params[param.name()])) 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='{} [summary]'.format(self.algorithm().name()), timestamp=time.localtime(), result=outputFile)
def handleAlgorithmResults(alg, context, feedback=None, showResults=True): wrongLayers = [] if feedback is None: feedback = QgsProcessingFeedback() feedback.setProgressText( QCoreApplication.translate('Postprocessing', 'Loading resulting layers')) i = 0 for out in alg.outputs: feedback.setProgress(100 * i / float(len(alg.outputs))) if out.hidden or not out.open: continue if isinstance(out, (OutputRaster, OutputVector, OutputTable)): try: layer = QgsProcessingUtils.mapLayerFromString( out.value, context) if layer: layer.setName(out.description) QgsProject.instance().addMapLayer( context.temporaryLayerStore().takeMapLayer(layer)) else: if ProcessingConfig.getSetting( ProcessingConfig.USE_FILENAME_AS_LAYER_NAME): name = os.path.basename(out.value) else: name = out.description isRaster = True if isinstance(out, OutputRaster) else False dataobjects.load( out.value, name, alg.crs, RenderingStyles.getStyle(alg.id(), out.name), isRaster) except Exception: QgsMessageLog.logMessage( "Error loading result layer:\n" + traceback.format_exc(), 'Processing', QgsMessageLog.CRITICAL) wrongLayers.append(out.description) elif isinstance(out, OutputHTML): resultsList.addResult(alg.icon(), out.description, out.value) i += 1 QApplication.restoreOverrideCursor() if wrongLayers: msg = "The following layers were not correctly generated.<ul>" msg += "".join(["<li>%s</li>" % lay for lay in wrongLayers]) + "</ul>" msg += "You can check the log messages to find more information about the execution of the algorithm" feedback.reportError(msg) return len(wrongLayers) == 0
def handleAlgorithmResults(alg, feedback=None, showResults=True): wrongLayers = [] htmlResults = False if feedback is None: feedback = QgsProcessingFeedback() feedback.setProgressText( QCoreApplication.translate('Postprocessing', 'Loading resulting layers')) i = 0 for out in alg.outputs: feedback.setProgress(100 * i / float(len(alg.outputs))) if out.hidden or not out.open: continue if isinstance(out, (OutputRaster, OutputVector, OutputTable)): try: if hasattr(out, "layer") and out.layer is not None: out.layer.setName(out.description) QgsProject.instance().addMapLayers([out.layer]) else: if ProcessingConfig.getSetting( ProcessingConfig.USE_FILENAME_AS_LAYER_NAME): name = os.path.basename(out.value) else: name = out.description dataobjects.load( out.value, name, alg.crs, RenderingStyles.getStyle(alg.commandLineName(), out.name)) except Exception: ProcessingLog.addToLog( ProcessingLog.LOG_ERROR, "Error loading result layer:\n" + traceback.format_exc()) wrongLayers.append(out.description) elif isinstance(out, OutputHTML): resultsList.addResult(alg.getIcon(), out.description, out.value) htmlResults = True i += 1 QApplication.restoreOverrideCursor() if wrongLayers: msg = "The following layers were not correctly generated.<ul>" msg += "".join(["<li>%s</li>" % lay for lay in wrongLayers]) + "</ul>" msg += "You can check the log messages to find more information about the execution of the algorithm" feedback.reportError(msg) return len(wrongLayers) == 0
def handleAlgorithmResults(alg, feedback=None, showResults=True): wrongLayers = [] htmlResults = False if feedback is None: feedback = QgsProcessingFeedback() feedback.setProgressText(QCoreApplication.translate('Postprocessing', 'Loading resulting layers')) i = 0 for out in alg.outputs: feedback.setProgress(100 * i / float(len(alg.outputs))) if out.hidden or not out.open: continue if isinstance(out, (OutputRaster, OutputVector, OutputTable)): try: if hasattr(out, "layer") and out.layer is not None: out.layer.setName(out.description) QgsProject.instance().addMapLayers([out.layer]) else: if ProcessingConfig.getSetting( ProcessingConfig.USE_FILENAME_AS_LAYER_NAME): name = os.path.basename(out.value) else: name = out.description dataobjects.load(out.value, name, alg.crs, RenderingStyles.getStyle(alg.commandLineName(), out.name)) except Exception: ProcessingLog.addToLog(ProcessingLog.LOG_ERROR, "Error loading result layer:\n" + traceback.format_exc()) wrongLayers.append(out.description) elif isinstance(out, OutputHTML): resultsList.addResult(alg.getIcon(), out.description, out.value) htmlResults = True i += 1 QApplication.restoreOverrideCursor() if wrongLayers: msg = "The following layers were not correctly generated.<ul>" msg += "".join(["<li>%s</li>" % lay for lay in wrongLayers]) + "</ul>" msg += "You can check the log messages to find more information about the execution of the algorithm" feedback.reportError(msg) return len(wrongLayers) == 0
def createSummaryTable(self, algorithm_results): createTable = False for out in self.algorithm().outputDefinitions(): if isinstance(out, (QgsProcessingOutputNumber, QgsProcessingOutputString)): createTable = True break if not createTable: return outputFile = getTempFilename('html') with codecs.open(outputFile, 'w', encoding='utf-8') as f: for res in algorithm_results: f.write('<hr>\n') for out in self.algorithm().outputDefinitions(): if isinstance(out, (QgsProcessingOutputNumber, QgsProcessingOutputString)) and out.name() in res: f.write('<p>{}: {}</p>\n'.format(out.description(), res[out.name()])) f.write('<hr>\n') resultsList.addResult(self.algorithm().icon(), '{} [summary]'.format(self.algorithm().name()), outputFile)
def createSummaryTable(self, algorithm_results): createTable = False for out in self.algorithm().outputDefinitions(): if isinstance(out, (QgsProcessingOutputNumber, QgsProcessingOutputString)): createTable = True break if not createTable: return outputFile = getTempFilename('html') with codecs.open(outputFile, 'w', encoding='utf-8') as f: for res in algorithm_results: f.write('<hr>\n') for out in self.algorithm().outputDefinitions(): if isinstance(out, (QgsProcessingOutputNumber, QgsProcessingOutputString)) and out.name() in res: f.write('<p>{}: {}</p>\n'.format(out.description(), res[out.name()])) f.write('<hr>\n') resultsList.addResult(self.algorithm().icon(), '{} [summary]'.format(self.algorithm().name()), outputFile)
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='{} [{}]'.format(out.description(), num), result=results[out.name()])