QGIS/python/plugins/processing/gui/ExtentSelectionPanel.py

180 lines
6.5 KiB
Python
Raw Normal View History

2012-10-05 23:28:47 +02:00
# -*- coding: utf-8 -*-
"""
***************************************************************************
ExtentSelectionPanel.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'
2012-10-05 23:28:47 +02:00
# This will get replaced with a git SHA1 when you do a git archive
2012-10-05 23:28:47 +02:00
__revision__ = '$Format:%H$'
2012-09-15 18:25:25 +03:00
from PyQt4.QtGui import *
from qgis.core import *
from qgis.utils import iface
2013-08-12 20:44:27 +02:00
from processing.gui.RectangleMapTool import RectangleMapTool
from processing.core.parameters import ParameterRaster
from processing.core.parameters import ParameterVector
from processing.core.parameters import ParameterMultipleInput
from processing.tools import dataobjects
2012-09-15 18:25:25 +03:00
from processing.ui.ui_widgetBaseSelector import Ui_Form
class ExtentSelectionPanel(QWidget, Ui_Form):
2012-09-15 18:25:25 +03:00
def __init__(self, dialog, alg, default):
QWidget.__init__(self)
self.setupUi(self)
2012-09-15 18:25:25 +03:00
self.dialog = dialog
self.params = alg.parameters
if self.canUseAutoExtent():
if hasattr(self.leText, 'setPlaceholderText'):
self.leText.setPlaceholderText(
self.tr('[Leave blank to use min covering extent]'))
self.btnSelect.clicked.connect(self.selectExtent)
canvas = iface.mapCanvas()
2012-09-15 18:25:25 +03:00
self.prevMapTool = canvas.mapTool()
self.tool = RectangleMapTool(canvas)
self.tool.rectangleCreated.connect(self.updateExtent)
2012-09-15 18:25:25 +03:00
def canUseAutoExtent(self):
for param in self.params:
if isinstance(param, (ParameterRaster, ParameterVector)):
return True
if isinstance(param, ParameterMultipleInput):
return True
return False
def selectExtent(self):
2012-09-15 18:25:25 +03:00
popupmenu = QMenu()
useLayerExtentAction = QAction(
self.tr('Use layer/canvas extent'), self.btnSelect)
selectOnCanvasAction = QAction(
self.tr('Select extent on canvas'), self.btnSelect)
2012-09-15 18:25:25 +03:00
popupmenu.addAction(useLayerExtentAction)
popupmenu.addAction(selectOnCanvasAction)
selectOnCanvasAction.triggered.connect(self.selectOnCanvas)
useLayerExtentAction.triggered.connect(self.useLayerExtent)
2012-09-15 18:25:25 +03:00
if self.canUseAutoExtent():
useMincoveringExtentAction = QAction(
self.tr('Use min covering extent from input layers'),
self.btnSelect)
useMincoveringExtentAction.triggered.connect(
self.useMinCoveringExtent)
2012-09-15 18:25:25 +03:00
popupmenu.addAction(useMincoveringExtentAction)
popupmenu.exec_(QCursor.pos())
2012-09-15 18:25:25 +03:00
def useMinCoveringExtent(self):
self.leText.setText('')
2012-09-15 18:25:25 +03:00
def getMinCoveringExtent(self):
first = True
found = False
for param in self.params:
if param.value:
if isinstance(param, (ParameterRaster, ParameterVector)):
if isinstance(param.value, (QgsRasterLayer,
QgsVectorLayer)):
2012-09-15 18:25:25 +03:00
layer = param.value
else:
layer = dataobjects.getObjectFromUri(param.value)
if layer:
found = True
self.addToRegion(layer, first)
first = False
2012-09-15 18:25:25 +03:00
elif isinstance(param, ParameterMultipleInput):
layers = param.value.split(';')
2012-09-15 18:25:25 +03:00
for layername in layers:
layer = dataobjects.getObjectFromUri(layername, first)
if layer:
found = True
self.addToRegion(layer, first)
first = False
2012-09-15 18:25:25 +03:00
if found:
return '{},{},{},{}'.format(
self.xmin, self.xmax, self.ymin, self.ymax)
2012-09-15 18:25:25 +03:00
else:
return None
def useNewAlg(self, alg):
2012-12-10 00:12:07 +01:00
self.params = alg.parameters
2012-09-15 18:25:25 +03:00
def addToRegion(self, layer, first):
if first:
self.xmin = layer.extent().xMinimum()
self.xmax = layer.extent().xMaximum()
self.ymin = layer.extent().yMinimum()
self.ymax = layer.extent().yMaximum()
else:
self.xmin = min(self.xmin, layer.extent().xMinimum())
self.xmax = max(self.xmax, layer.extent().xMaximum())
self.ymin = min(self.ymin, layer.extent().yMinimum())
self.ymax = max(self.ymax, layer.extent().yMaximum())
def useLayerExtent(self):
CANVAS_KEY = 'Use canvas extent'
2012-09-15 18:25:25 +03:00
extentsDict = {}
extentsDict[CANVAS_KEY] = iface.mapCanvas().extent()
2012-09-15 18:25:25 +03:00
extents = [CANVAS_KEY]
layers = dataobjects.getAllLayers()
2012-09-15 18:25:25 +03:00
for layer in layers:
extents.append(layer.name())
extentsDict[layer.name()] = layer.extent()
(item, ok) = QInputDialog.getItem(self, self.tr('Select extent'),
self.tr('Use extent from'), extents, False)
2012-09-15 18:25:25 +03:00
if ok:
self.setValueFromRect(extentsDict[item])
def selectOnCanvas(self):
canvas = iface.mapCanvas()
2012-09-15 18:25:25 +03:00
canvas.setMapTool(self.tool)
self.dialog.showMinimized()
def updateExtent(self):
2012-09-15 18:25:25 +03:00
r = self.tool.rectangle()
self.setValueFromRect(r)
def setValueFromRect(self, r):
s = '{},{},{},{}'.format(
r.xMinimum(), r.xMaximum(), r.yMinimum(), r.yMaximum())
self.leText.setText(s)
2012-09-15 18:25:25 +03:00
self.tool.reset()
canvas = iface.mapCanvas()
2012-09-15 18:25:25 +03:00
canvas.setMapTool(self.prevMapTool)
self.dialog.showNormal()
self.dialog.raise_()
self.dialog.activateWindow()
def getValue(self):
if str(self.leText.text()).strip() != '':
return unicode(self.leText.text())
2012-09-15 18:25:25 +03:00
else:
return self.getMinCoveringExtent()