# -*- coding: utf-8 -*-
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
from qgis.gui import *
from widgetPluginBase import GdalToolsBasePluginWidget as BasePluginWidget
import GdalTools_utils as Utils
class GdalToolsBaseBatchWidget(BasePluginWidget):
def __init__(self, iface, commandName):
BasePluginWidget.__init__(self, iface, commandName)
def getBatchArguments(self, inFile, outFile = None):
arguments = QStringList()
arguments << self.getArguments()
arguments << inFile
if outFile != None:
arguments << outFile
return arguments
def isBatchEnabled(self):
return False
def isRecursiveScanEnabled(self):
return False
def setProgressRange(self, maximum):
pass
def updateProgress(self, value, maximum):
pass
def getBatchOutputFileName(self, fn):
inDir = self.getInputFileName()
outDir = self.getOutputFileName()
# if overwrites existent files
if outDir == None or outDir == inDir:
return QString( fn ).append( ".tmp" )
return QString( fn ).mid( len(inDir) ).prepend( outDir )
def onRun( self ):
if not self.isBatchEnabled():
BasePluginWidget.onRun(self)
return
self.batchRun()
def batchRun(self):
self.base.enableRun( False )
self.base.setCursor( Qt.WaitCursor )
inDir = self.getInputFileName()
self.inFiles = Utils.getRasterFiles( inDir, self.isRecursiveScanEnabled() )
self.outFiles = []
for f in self.inFiles:
self.outFiles.append( self.getBatchOutputFileName( f ) )
self.errors = QStringList()
self.batchIndex = 0
self.batchTotal = len( self.inFiles )
self.setProgressRange( self.batchTotal )
self.runItem( self.batchIndex, self.batchTotal )
def runItem(self, index, total):
self.updateProgress(index, total)
if index >= total:
self.batchFinished()
return
outFile = None
if len(self.outFiles) > index:
outFile = self.outFiles[ index ]
args = self.getBatchArguments( self.inFiles[index], outFile )
self.base.refreshArgs(args)
BasePluginWidget.onRun(self)
def onFinished(self, exitCode, status):
if not self.isBatchEnabled():
BasePluginWidget.onFinished(self, exitCode, status)
return
msg = QString( self.base.process.readAllStandardError() )
if not msg.isEmpty():
self.errors.append( ">> " + self.inFiles[self.batchIndex] + "
" + msg.replace( "\n", "
" ) )
self.base.process.close()
# overwrite existent files
inDir = self.getInputFileName()
outDir = self.getOutputFileName()
if outDir == None or inDir == outDir:
oldFile = QFile( self.inFiles[self.batchIndex] )
newFile = QFile( self.outFiles[self.batchIndex] )
if oldFile.remove():
newFile.rename(self.inFiles[self.batchIndex])
self.batchIndex += 1
self.runItem( self.batchIndex, self.batchTotal )
def batchFinished( self ):
self.base.stop()
if not self.errors.isEmpty():
msg = QString( "Processing of the following files ended with error:
" ).append( self.errors.join( "
" ) )
QErrorMessage( self ).showMessage( msg )
inDir = self.getInputFileName()
outDir = self.getOutputFileName()
if outDir == None or inDir == outDir:
self.outFiles = self.inFiles
# load layers managing the render flag to avoid waste of time
canvas = self.iface.mapCanvas()
previousRenderFlag = canvas.renderFlag()
canvas.setRenderFlag( False )
notCreatedList = QStringList()
for item in self.outFiles:
fileInfo = QFileInfo( item )
if fileInfo.exists():
if self.base.loadCheckBox.isChecked():
self.addLayerIntoCanvas( fileInfo )
else:
notCreatedList << item
canvas.setRenderFlag( previousRenderFlag )
if notCreatedList.isEmpty():
QMessageBox.information( self, self.tr( "Finished" ), self.tr( "Operation completed." ) )
else:
QMessageBox.warning( self, self.tr( "Warning" ), self.tr( "The following files were not created: \n%1" ).arg( notCreatedList.join( ", " ) ) )