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

176 lines
6.6 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$'
2015-05-18 21:04:20 +03:00
import os
2016-04-29 11:39:26 +02:00
from qgis.PyQt import uic
2016-04-22 10:38:48 +02:00
from qgis.PyQt.QtWidgets import QMenu, QAction, QInputDialog
from qgis.PyQt.QtGui import QCursor
from qgis.gui import QgsMessageBar
from qgis.utils import iface
from qgis.core import (QgsProcessingUtils,
2017-05-16 16:36:00 +10:00
QgsProcessingParameterDefinition,
QgsProcessingParameters,
QgsProject,
QgsCoordinateReferenceSystem,
QgsRectangle,
QgsReferencedRectangle)
2013-08-12 20:44:27 +02:00
from processing.gui.RectangleMapTool import RectangleMapTool
from processing.core.ProcessingConfig import ProcessingConfig
2017-06-09 15:31:25 +10:00
from processing.tools.dataobjects import createContext
2012-09-15 18:25:25 +03:00
2015-05-18 21:04:20 +03:00
pluginPath = os.path.split(os.path.dirname(__file__))[0]
WIDGET, BASE = uic.loadUiType(
os.path.join(pluginPath, 'ui', 'widgetBaseSelector.ui'))
2015-05-18 21:04:20 +03:00
class ExtentSelectionPanel(BASE, WIDGET):
2012-09-15 18:25:25 +03:00
def __init__(self, dialog, param):
2015-05-18 21:04:20 +03:00
super(ExtentSelectionPanel, self).__init__(None)
self.setupUi(self)
2012-09-15 18:25:25 +03:00
self.dialog = dialog
self.param = param
self.crs = QgsProject.instance().crs()
2017-05-16 16:36:00 +10:00
if self.param.flags() & QgsProcessingParameterDefinition.FlagOptional:
if hasattr(self.leText, 'setPlaceholderText'):
self.leText.setPlaceholderText(
self.tr('[Leave blank to use min covering extent]'))
self.btnSelect.clicked.connect(self.selectExtent)
if iface is not None:
canvas = iface.mapCanvas()
self.prevMapTool = canvas.mapTool()
self.tool = RectangleMapTool(canvas)
self.tool.rectangleCreated.connect(self.updateExtent)
else:
self.prevMapTool = None
self.tool = None
2012-09-15 18:25:25 +03:00
2017-06-09 15:31:25 +10:00
if param.defaultValue() is not None:
context = createContext()
rect = QgsProcessingParameters.parameterAsExtent(param, {param.name(): param.defaultValue()}, context)
crs = QgsProcessingParameters.parameterAsExtentCrs(param, {param.name(): param.defaultValue()}, context)
2017-06-09 15:31:25 +10:00
if not rect.isNull():
2015-12-23 16:05:39 +01:00
try:
2017-06-09 15:31:25 +10:00
s = '{},{},{},{}'.format(
rect.xMinimum(), rect.xMaximum(), rect.yMinimum(), rect.yMaximum())
if crs.isValid():
s += ' [' + crs.authid() + ']'
self.crs = crs
2017-06-09 15:31:25 +10:00
self.leText.setText(s)
2015-12-23 16:05:39 +01:00
except:
pass
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)
2017-05-16 16:36:00 +10:00
if self.param.flags() & QgsProcessingParameterDefinition.FlagOptional:
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 useLayerExtent(self):
CANVAS_KEY = 'Use canvas extent'
2012-09-15 18:25:25 +03:00
extentsDict = {}
extentsDict[CANVAS_KEY] = {"extent": iface.mapCanvas().extent(),
2016-01-20 16:39:13 +02:00
"authid": iface.mapCanvas().mapSettings().destinationCrs().authid()}
2012-09-15 18:25:25 +03:00
extents = [CANVAS_KEY]
layers = QgsProcessingUtils.compatibleLayers(QgsProject.instance())
2012-09-15 18:25:25 +03:00
for layer in layers:
authid = layer.crs().authid()
if ProcessingConfig.getSetting(ProcessingConfig.SHOW_CRS_DEF) \
and authid is not None:
layerName = u'{} [{}]'.format(layer.name(), authid)
else:
layerName = layer.name()
extents.append(layerName)
extentsDict[layerName] = {"extent": layer.extent(), "authid": authid}
2018-02-21 18:44:04 +10:00
(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(QgsReferencedRectangle(extentsDict[item]["extent"], QgsCoordinateReferenceSystem(extentsDict[item]["authid"])))
2012-09-15 18:25:25 +03:00
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())
try:
self.crs = r.crs()
except:
self.crs = QgsProject.instance().crs()
if self.crs.isValid():
s += ' [' + self.crs.authid() + ']'
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 str(self.leText.text())
else:
2016-09-04 17:58:17 +02:00
return None
def setExtentFromString(self, s):
self.leText.setText(s)