From d7811a1120e8893ec795b80ac4bd19208f0c4066 Mon Sep 17 00:00:00 2001 From: Giuseppe Sucameli Date: Sat, 11 Feb 2012 19:07:56 +0100 Subject: [PATCH] allow to choose input directory in GdalTools Merge tool (fix #4930) --- python/plugins/GdalTools/tools/doMerge.py | 79 ++++++++++++++----- python/plugins/GdalTools/tools/widgetMerge.ui | 30 +++++-- 2 files changed, 80 insertions(+), 29 deletions(-) diff --git a/python/plugins/GdalTools/tools/doMerge.py b/python/plugins/GdalTools/tools/doMerge.py index 94954d65185..dff25aff319 100644 --- a/python/plugins/GdalTools/tools/doMerge.py +++ b/python/plugins/GdalTools/tools/doMerge.py @@ -19,6 +19,7 @@ class GdalToolsDialog(QWidget, Ui_Widget, BasePluginWidget): self.inSelector.setType( self.inSelector.FILE ) self.outSelector.setType( self.outSelector.FILE ) + self.recurseCheck.hide() self.outputFormat = Utils.fillRasterOutputFormat() self.extent = None @@ -28,7 +29,9 @@ class GdalToolsDialog(QWidget, Ui_Widget, BasePluginWidget): (self.inSelector, SIGNAL("filenameChanged()")), (self.outSelector, SIGNAL("filenameChanged()")), (self.noDataSpin, SIGNAL("valueChanged(int)"), self.noDataCheck), - ( self.separateCheck, SIGNAL( "stateChanged( int )" ) ), + (self.inputDirCheck, SIGNAL("stateChanged(int)")), + (self.recurseCheck, SIGNAL("stateChanged(int)"), self.inputDirCheck), + ( self.separateCheck, SIGNAL( "stateChanged( int )" ) ), ( self.pctCheck, SIGNAL( "stateChanged( int )" ) ), ( self.intersectCheck, SIGNAL( "stateChanged( int )" ) ), (self.creationOptionsTable, [SIGNAL("cellValueChanged(int, int)"), SIGNAL("rowRemoved()")], self.creationGroupBox) @@ -37,7 +40,25 @@ class GdalToolsDialog(QWidget, Ui_Widget, BasePluginWidget): self.connect(self.inSelector, SIGNAL("selectClicked()"), self.fillInputFilesEdit) self.connect(self.outSelector, SIGNAL("selectClicked()"), self.fillOutputFileEdit) - self.connect(self.intersectCheck, SIGNAL("stateChanged(int)"), self.refreshExtent) + self.connect(self.intersectCheck, SIGNAL("toggled(bool)"), self.refreshExtent) + self.connect(self.inputDirCheck, SIGNAL("stateChanged( int )"), self.switchToolMode) + self.connect(self.inSelector, SIGNAL("filenameChanged()"), self.refreshExtent) + + def switchToolMode(self): + self.recurseCheck.setVisible( self.inputDirCheck.isChecked() ) + self.inSelector.clear() + + if self.inputDirCheck.isChecked(): + self.inFileLabel = self.label.text() + self.label.setText( QCoreApplication.translate( "GdalTools", "&Input directory" ) ) + + QObject.disconnect(self.inSelector, SIGNAL("selectClicked()"), self.fillInputFilesEdit) + QObject.connect(self.inSelector, SIGNAL("selectClicked()"), self.fillInputDir) + else: + self.label.setText( self.inFileLabel ) + + QObject.connect(self.inSelector, SIGNAL("selectClicked()"), self.fillInputFilesEdit) + QObject.disconnect(self.inSelector, SIGNAL("selectClicked()"), self.fillInputDir) def fillInputFilesEdit(self): lastUsedFilter = Utils.FileFilter.lastUsedRasterFilter() @@ -45,29 +66,31 @@ class GdalToolsDialog(QWidget, Ui_Widget, BasePluginWidget): if files.isEmpty(): return Utils.FileFilter.setLastUsedRasterFilter(lastUsedFilter) - - self.inSelector.setFilename(files.join(",")) - self.intersectCheck.setEnabled( files.count() > 1 ) - self.refreshExtent() + self.inSelector.setFilename(files) def refreshExtent(self): - files = self.getInputFileName() - if files.count() < 2: - self.intersectCheck.setChecked( False ) - self.extent = None - return - - self.extent = self.getExtent() - self.someValueChanged() + files = self.getInputFileNames() + self.intersectCheck.setEnabled( files.count() > 1 ) if not self.intersectCheck.isChecked(): + self.someValueChanged() return + if files.count() < 2: + self.intersectCheck.setChecked( False ) + return + + self.extent = self.getIntersectedExtent( files ) + if self.extent == None: QMessageBox.warning( self, self.tr( "Error retrieving the extent" ), self.tr( 'GDAL was unable to retrieve the extent from any file. \nThe "Use intersected extent" option will be unchecked.' ) ) self.intersectCheck.setChecked( False ) + return + elif self.extent.isEmpty(): QMessageBox.warning( self, self.tr( "Empty extent" ), self.tr( 'The computed extent is empty. \nDisable the "Use intersected extent" option to have a nonempty output.' ) ) + + self.someValueChanged() def fillOutputFileEdit(self): lastUsedFilter = Utils.FileFilter.lastUsedRasterFilter() @@ -79,6 +102,12 @@ class GdalToolsDialog(QWidget, Ui_Widget, BasePluginWidget): self.outputFormat = Utils.fillRasterOutputFormat( lastUsedFilter, outputFile ) self.outSelector.setFilename( outputFile ) + def fillInputDir( self ): + inputDir = Utils.FileDialog.getExistingDirectory( self, self.tr( "Select the input directory with files to Merge" )) + if inputDir.isEmpty(): + return + self.inSelector.setFilename( inputDir ) + def getArguments(self): arguments = QStringList() if self.intersectCheck.isChecked(): @@ -105,31 +134,39 @@ class GdalToolsDialog(QWidget, Ui_Widget, BasePluginWidget): arguments << self.outputFormat arguments << "-o" arguments << outputFn - arguments << self.getInputFileName() + arguments << self.getInputFileNames() return arguments def getOutputFileName(self): return self.outSelector.filename() def getInputFileName(self): - return self.inSelector.filename().split( "," ) + if self.inputDirCheck.isChecked(): + return self.inSelector.filename() + return self.inSelector.filename().split(",", QString.SkipEmptyParts) + + def getInputFileNames(self): + if self.inputDirCheck.isChecked(): + return Utils.getRasterFiles( self.inSelector.filename(), self.recurseCheck.isChecked() ) + return self.inSelector.filename().split(",", QString.SkipEmptyParts) def addLayerIntoCanvas(self, fileInfo): self.iface.addRasterLayer(fileInfo.filePath()) - def getExtent( self ): - files = self.getInputFileName() - - i = 0 - res = rect2 = None + def getIntersectedExtent(self, files): + res = None for fileName in files: if res == None: res = Utils.getRasterExtent( self, fileName ) continue + rect2 = Utils.getRasterExtent( self, fileName ) if rect2 == None: continue + res = res.intersect( rect2 ) + if res.isEmpty(): + break return res diff --git a/python/plugins/GdalTools/tools/widgetMerge.ui b/python/plugins/GdalTools/tools/widgetMerge.ui index 852dfb9e056..0961be93f87 100644 --- a/python/plugins/GdalTools/tools/widgetMerge.ui +++ b/python/plugins/GdalTools/tools/widgetMerge.ui @@ -6,8 +6,8 @@ 0 0 - 342 - 226 + 345 + 276 @@ -22,7 +22,7 @@ - + &Input files @@ -32,7 +32,7 @@ - + &Output file @@ -42,14 +42,14 @@ - + &No data value - + -100000 @@ -59,12 +59,26 @@ - + - + + + + + Choose input directory instead of files + + + + + + + Recurse subdirectories + + +