mirror of
https://github.com/qgis/QGIS.git
synced 2025-02-27 00:33:48 -05:00
80 lines
3.2 KiB
Python
80 lines
3.2 KiB
Python
|
# -*- coding: utf-8 -*-
|
|||
|
|
|||
|
"""
|
|||
|
***************************************************************************
|
|||
|
SelectByExpression.py
|
|||
|
---------------------
|
|||
|
Date : July 2014
|
|||
|
Copyright : (C) 2014 by Micha<EFBFBD>l Douchin
|
|||
|
***************************************************************************
|
|||
|
* *
|
|||
|
* 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__ = 'Michael Douchin'
|
|||
|
__date__ = 'July 2014'
|
|||
|
__copyright__ = '(C) 2014, Michael Douchin'
|
|||
|
|
|||
|
# This will get replaced with a git SHA1 when you do a git archive
|
|||
|
|
|||
|
__revision__ = '$Format:%H$'
|
|||
|
|
|||
|
import processing
|
|||
|
from qgis.core import *
|
|||
|
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
|
|||
|
from processing.parameters.ParameterVector import ParameterVector
|
|||
|
from processing.parameters.ParameterSelection import ParameterSelection
|
|||
|
from processing.outputs.OutputVector import OutputVector
|
|||
|
from processing.core.GeoAlgorithm import GeoAlgorithm
|
|||
|
from processing.parameters.ParameterString import ParameterString
|
|||
|
|
|||
|
class SelectByExpression(GeoAlgorithm):
|
|||
|
|
|||
|
LAYERNAME = 'LAYERNAME'
|
|||
|
EXPRESSION= 'EXPRESSION'
|
|||
|
RESULT = 'RESULT'
|
|||
|
METHOD = 'METHOD'
|
|||
|
METHODS = ['creating new selection', 'adding to current selection',
|
|||
|
'removing from current selection']
|
|||
|
|
|||
|
def defineCharacteristics(self):
|
|||
|
self.name = 'Select by expression'
|
|||
|
self.group = 'Vector selection tools'
|
|||
|
|
|||
|
self.addParameter(ParameterVector(self.LAYERNAME, 'Input Layer',
|
|||
|
[ParameterVector.VECTOR_TYPE_ANY]))
|
|||
|
self.addParameter(ParameterString(self.EXPRESSION, "Expression"))
|
|||
|
self.addParameter(ParameterSelection(self.METHOD,
|
|||
|
'Modify current selection by', self.METHODS, 0))
|
|||
|
self.addOutput(OutputVector(self.RESULT, 'Output', True))
|
|||
|
|
|||
|
def processAlgorithm(self, progress):
|
|||
|
|
|||
|
filename = self.getParameterValue(self.LAYERNAME)
|
|||
|
layer = processing.getObject(filename)
|
|||
|
oldSelection = set(layer.selectedFeaturesIds())
|
|||
|
method = self.getParameterValue(self.METHOD)
|
|||
|
|
|||
|
# Build QGIS request with expression
|
|||
|
expression = self.getParameterValue(self.EXPRESSION)
|
|||
|
qExp = QgsExpression(expression)
|
|||
|
if not qExp.hasParserError():
|
|||
|
qReq = QgsFeatureRequest(qExp)
|
|||
|
else:
|
|||
|
raise GeoAlgorithmExecutionException(qExp.parserErrorString())
|
|||
|
selected = [f.id() for f in layer.getFeatures(qReq)]
|
|||
|
|
|||
|
if method == 1:
|
|||
|
selected = list(oldSelection.union(selected))
|
|||
|
elif method == 2:
|
|||
|
selected = list(oldSelection.difference(selected))
|
|||
|
|
|||
|
# Set the selection
|
|||
|
layer.setSelectedFeatures(selected)
|
|||
|
|
|||
|
self.setOutputValue(self.RESULT, filename)
|