# -*- coding: utf-8 -*- """ *************************************************************************** UnthreadedAlgorithmExecutor.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' # This will get replaced with a git SHA1 when you do a git archive __revision__ = '$Format:%H$' from PyQt4.QtGui import * from PyQt4.QtCore import * from qgis.core import * from processing.core.SilentProgress import SilentProgress from processing.core.ProcessingLog import ProcessingLog from processing.core.GeoAlgorithmExecutionException import \ GeoAlgorithmExecutionException from processing.gui.Postprocessing import handleAlgorithmResults from processing.tools import dataobjects from processing.tools.system import * from processing.tools import vector class UnthreadedAlgorithmExecutor: @staticmethod def runalg(alg, progress): """Executes a given algorithm, showing its progress in the progress object passed along. Return true if everything went OK, false if the algorithm could not be completed. """ try: alg.execute(progress) return True except GeoAlgorithmExecutionException, e: ProcessingLog.addToLog(sys.exc_info()[0], ProcessingLog.LOG_ERROR) progress.error(e.msg) return False except Exception: msg = 'Uncaught error executing ' + str(alg.name) \ + '\nSee log for more information' ProcessingLog.addToLog(sys.exc_info()[0], ProcessingLog.LOG_ERROR) progress.error(msg) return False @staticmethod def runalgIterating(alg, paramToIter, progress): # Generate all single-feature layers settings = QSettings() systemEncoding = settings.value('/UI/encoding', 'System') layerfile = alg.getParameterValue(paramToIter) layer = dataobjects.getObjectFromUri(layerfile, False) feat = QgsFeature() filelist = [] outputs = {} provider = layer.dataProvider() features = vector.features(layer) for feat in features: output = getTempFilename('shp') filelist.append(output) writer = QgsVectorFileWriter(output, systemEncoding, provider.fields(), provider.geometryType(), layer.crs()) writer.addFeature(feat) del writer # store output values to use them later as basenames for all outputs for out in alg.outputs: outputs[out.name] = out.value # now run all the algorithms for i,f in enumerate(filelist): alg.setParameterValue(paramToIter, f) for out in alg.outputs: filename = outputs[out.name] if filename: filename = filename[:filename.rfind('.')] + '_' + str(i) \ + filename[filename.rfind('.'):] out.value = filename progress.setText('Executing iteration ' + str(i) + '/' + str(len(filelist)) + '...') progress.setPercentage(i * 100 / len(filelist)) if UnthreadedAlgorithmExecutor.runalg(alg, SilentProgress()): handleAlgorithmResults(alg, SilentProgress(), False) else: return False return True