2010-06-04 00:31:48 +00:00
# -*- coding: utf-8 -*-
from PyQt4 . QtCore import *
from PyQt4 . QtGui import *
from qgis . core import *
from qgis . gui import *
from ui_widgetClipper import Ui_GdalToolsWidget as Ui_Widget
from widgetPluginBase import GdalToolsBasePluginWidget as BasePluginWidget
import GdalTools_utils as Utils
class GdalToolsDialog ( QWidget , Ui_Widget , BasePluginWidget ) :
def __init__ ( self , iface ) :
QWidget . __init__ ( self )
self . iface = iface
self . canvas = self . iface . mapCanvas ( )
self . setupUi ( self )
BasePluginWidget . __init__ ( self , self . iface , " gdal_merge.py " , None , self . iface . mainWindow ( ) )
2010-12-27 16:55:17 +00:00
self . extentSelector . setCanvas ( self . canvas )
2010-06-04 00:31:48 +00:00
self . outputFormat = Utils . fillRasterOutputFormat ( )
self . inputFiles = QStringList ( )
self . warningDialog = QErrorMessage ( self )
self . setParamsStatus (
[
( self . outputFileEdit , SIGNAL ( " textChanged(const QString &) " ) ) ,
( self . noDataSpin , SIGNAL ( " valueChanged(int) " ) , self . noDataCheck ) ,
2010-12-27 16:55:17 +00:00
( self . pctCheck , SIGNAL ( " stateChanged(int) " ) ) ,
( self . extentSelector , [ SIGNAL ( " selectionStarted() " ) , SIGNAL ( " newExtentDefined() " ) ] )
2010-06-04 00:31:48 +00:00
]
)
self . connect ( self . selectOutputFileButton , SIGNAL ( " clicked() " ) , self . fillOutputFileEdit )
2010-12-27 16:55:17 +00:00
self . connect ( self . extentSelector , SIGNAL ( " newExtentDefined() " ) , self . checkRun )
self . connect ( self . extentSelector , SIGNAL ( " selectionStarted() " ) , self . checkRun )
2010-06-04 00:31:48 +00:00
def show_ ( self ) :
self . connect ( self . canvas , SIGNAL ( " layersChanged() " ) , self . fillInputFiles )
2010-12-27 16:55:17 +00:00
self . extentSelector . start ( )
2010-06-04 00:31:48 +00:00
BasePluginWidget . show_ ( self )
self . fillInputFiles ( )
2010-12-27 16:55:17 +00:00
self . checkRun ( )
2010-06-04 00:31:48 +00:00
def onClosing ( self ) :
self . disconnect ( self . canvas , SIGNAL ( " layersChanged() " ) , self . fillInputFiles )
2010-12-27 16:55:17 +00:00
self . extentSelector . stop ( )
2010-06-04 00:31:48 +00:00
BasePluginWidget . onClosing ( self )
def fillInputFiles ( self ) :
self . inputFiles = QStringList ( )
2011-02-03 23:18:42 +00:00
# Reversed list to have the topmost layer as the last one in the list
# because "In areas of overlap, the last image will be copied over
# earlier ones" (see http://www.gdal.org/gdal_merge.html).
for i in range ( self . canvas . layerCount ( ) - 1 , - 1 , - 1 ) :
2010-06-04 00:31:48 +00:00
layer = self . canvas . layer ( i )
# only raster layers, but not WMS ones
2011-03-22 00:04:36 +00:00
if layer . type ( ) != layer . RasterLayer :
continue
if layer . usesProvider ( ) and layer . providerKey ( ) != ' gdal ' :
continue
2011-03-13 23:46:37 +00:00
# do not use the output file as input
if layer . source ( ) == self . outputFileEdit . text ( ) :
continue
self . inputFiles << layer . source ( )
2010-06-04 00:31:48 +00:00
if self . inputFiles . isEmpty ( ) :
2010-12-27 16:55:17 +00:00
self . extentSelector . stop ( )
2010-06-04 00:31:48 +00:00
if self . isVisible ( ) and self . warningDialog . isHidden ( ) :
msg = QString ( self . tr ( " No active raster layers. You must add almost one raster layer to continue. " ) )
self . warningDialog . showMessage ( msg )
2011-02-03 23:18:42 +00:00
# refresh command when there are no active layers
self . someValueChanged ( )
2010-06-04 00:31:48 +00:00
else :
self . warningDialog . hide ( )
2010-12-27 16:55:17 +00:00
self . extentSelector . start ( )
2010-06-04 00:31:48 +00:00
self . checkRun ( )
def checkRun ( self ) :
2010-12-27 16:55:17 +00:00
self . base . enableRun ( not self . inputFiles . isEmpty ( ) and self . extentSelector . getExtent ( ) != None )
2010-06-04 00:31:48 +00:00
def fillOutputFileEdit ( self ) :
lastUsedFilter = Utils . FileFilter . lastUsedRasterFilter ( )
outputFile = Utils . FileDialog . getSaveFileName ( self , self . tr ( " Select the raster file to save the results to " ) , Utils . FileFilter . allRastersFilter ( ) , lastUsedFilter )
if outputFile . isEmpty ( ) :
return
Utils . FileFilter . setLastUsedRasterFilter ( lastUsedFilter )
self . outputFormat = Utils . fillRasterOutputFormat ( lastUsedFilter , outputFile )
# do not use the output file as input
if self . inputFiles . contains ( outputFile ) :
self . inputFiles . removeAt ( self . inputFiles . indexOf ( outputFile ) )
self . outputFileEdit . setText ( outputFile )
def getArguments ( self ) :
arguments = QStringList ( )
if self . noDataCheck . isChecked ( ) :
arguments << " -n "
arguments << str ( self . noDataSpin . value ( ) )
if self . pctCheck . isChecked ( ) :
arguments << " -pct "
2010-12-27 16:55:17 +00:00
if self . extentSelector . isCoordsValid ( ) :
rect = self . extentSelector . getExtent ( )
2010-06-04 00:31:48 +00:00
if rect != None :
arguments << " -ul_lr "
arguments << str ( rect . xMinimum ( ) )
arguments << str ( rect . yMaximum ( ) )
arguments << str ( rect . xMaximum ( ) )
arguments << str ( rect . yMinimum ( ) )
if not self . outputFileEdit . text ( ) . isEmpty ( ) :
arguments << " -of "
arguments << self . outputFormat
if not self . outputFileEdit . text ( ) . isEmpty ( ) :
arguments << " -o "
arguments << self . outputFileEdit . text ( )
2011-02-03 23:18:42 +00:00
if self . pctCheck . isChecked ( ) and len ( self . inputFiles ) > 1 :
# The topmost layer in the TOC is the last one in the list (see above),
# but I want to grab the pseudocolor table from the first image (the
# topmost layer in the TOC).
# Workaround: duplicate the last layer inserting it also as the first
# one to grab the pseudocolor table from it.
arguments << self . inputFiles [ len ( self . inputFiles ) - 1 ]
2010-06-04 00:31:48 +00:00
arguments << self . inputFiles
return arguments
def getOutputFileName ( self ) :
return self . outputFileEdit . text ( )
def addLayerIntoCanvas ( self , fileInfo ) :
self . iface . addRasterLayer ( fileInfo . filePath ( ) )