mirror of
				https://github.com/qgis/QGIS.git
				synced 2025-11-04 00:04:25 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			122 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# -*- coding: utf-8 -*-
 | 
						|
 | 
						|
"""
 | 
						|
***************************************************************************
 | 
						|
    PredicatePanel.py
 | 
						|
    ---------------------
 | 
						|
    Date                 : January 2015
 | 
						|
    Copyright            : (C) 2015 by Arnaud Morvan
 | 
						|
    Email                : arnaud dot morvan at camptocamp dot com
 | 
						|
    Contributors         : Arnaud Morvan
 | 
						|
***************************************************************************
 | 
						|
*                                                                         *
 | 
						|
*   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__ = 'Arnaud Morvan'
 | 
						|
__date__ = 'January 2015'
 | 
						|
__copyright__ = '(C) 2015, Arnaud Morvan'
 | 
						|
 | 
						|
# This will get replaced with a git SHA1 when you do a git archive
 | 
						|
__revision__ = '$Format:%H$'
 | 
						|
 | 
						|
import os
 | 
						|
 | 
						|
from PyQt4 import uic
 | 
						|
from PyQt4.QtGui import QCheckBox
 | 
						|
from qgis.core import QGis, QgsVectorLayer
 | 
						|
 | 
						|
from processing.core.parameters import ParameterGeometryPredicate
 | 
						|
 | 
						|
pluginPath = os.path.split(os.path.dirname(__file__))[0]
 | 
						|
WIDGET, BASE = uic.loadUiType(
 | 
						|
    os.path.join(pluginPath, 'ui', 'widgetGeometryPredicateSelector.ui'))
 | 
						|
 | 
						|
 | 
						|
class GeometryPredicateSelectionPanel(BASE, WIDGET):
 | 
						|
 | 
						|
    unusablePredicates = {
 | 
						|
        QGis.Point: {
 | 
						|
            QGis.Point: ('touches', 'crosses'),
 | 
						|
            QGis.Line: ('equals', 'contains', 'overlaps'),
 | 
						|
            QGis.Polygon: ('equals', 'contains', 'overlaps')
 | 
						|
        },
 | 
						|
        QGis.Line: {
 | 
						|
            QGis.Point: ('equals', 'within', 'overlaps'),
 | 
						|
            QGis.Line: [],
 | 
						|
            QGis.Polygon: ('equals', 'contains', 'overlaps')
 | 
						|
        },
 | 
						|
        QGis.Polygon: {
 | 
						|
            QGis.Point: ('equals', 'within', 'overlaps'),
 | 
						|
            QGis.Line: ('equals', 'within', 'overlaps'),
 | 
						|
            QGis.Polygon: ('crosses')
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    def __init__(self,
 | 
						|
                 enabledPredicated=ParameterGeometryPredicate.predicates,
 | 
						|
                 rows=4):
 | 
						|
        super(GeometryPredicateSelectionPanel, self).__init__(None)
 | 
						|
        self.setupUi(self)
 | 
						|
 | 
						|
        self.enabledPredicated = enabledPredicated
 | 
						|
        self.leftLayer = None
 | 
						|
        self.rightLayer = None
 | 
						|
        self.setRows(rows)
 | 
						|
        self.updatePredicates()
 | 
						|
 | 
						|
    def onLeftLayerChange(self):
 | 
						|
        sender = self.sender()
 | 
						|
        self.leftLayer = sender.itemData(sender.currentIndex())
 | 
						|
        self.updatePredicates()
 | 
						|
 | 
						|
    def onRightLayerChange(self):
 | 
						|
        sender = self.sender()
 | 
						|
        self.rightLayer = sender.itemData(sender.currentIndex())
 | 
						|
        self.updatePredicates()
 | 
						|
 | 
						|
    def updatePredicates(self):
 | 
						|
        if (isinstance(self.leftLayer, QgsVectorLayer)
 | 
						|
           and isinstance(self.rightLayer, QgsVectorLayer)):
 | 
						|
            leftType = self.leftLayer.geometryType()
 | 
						|
            rightType = self.rightLayer.geometryType()
 | 
						|
            unusablePredicates = self.unusablePredicates[leftType][rightType]
 | 
						|
        else:
 | 
						|
            unusablePredicates = []
 | 
						|
        for predicate in ParameterGeometryPredicate.predicates:
 | 
						|
            widget = self.getWidget(predicate)
 | 
						|
            widget.setEnabled(predicate in self.enabledPredicated
 | 
						|
                              and predicate not in unusablePredicates)
 | 
						|
 | 
						|
    def setRows(self, rows):
 | 
						|
        widgets = []
 | 
						|
        for predicate in ParameterGeometryPredicate.predicates:
 | 
						|
            widget = self.getWidget(predicate)
 | 
						|
            self.gridLayout.removeWidget(widget)
 | 
						|
            widgets.append(widget)
 | 
						|
        for i in xrange(0, len(widgets)):
 | 
						|
            widget = widgets[i]
 | 
						|
            self.gridLayout.addWidget(widget, i % rows, i / rows)
 | 
						|
 | 
						|
    def getWidget(self, predicate):
 | 
						|
        return self.findChild(QCheckBox, predicate + 'Box')
 | 
						|
 | 
						|
    def value(self):
 | 
						|
        values = []
 | 
						|
        for predicate in ParameterGeometryPredicate.predicates:
 | 
						|
            widget = self.getWidget(predicate)
 | 
						|
            if widget.isEnabled() and widget.isChecked():
 | 
						|
                values.append(predicate)
 | 
						|
        return values
 | 
						|
 | 
						|
    def setValue(self, values):
 | 
						|
        for predicate in ParameterGeometryPredicate.predicates:
 | 
						|
            widget = self.getWidget(predicate)
 | 
						|
            widget.setChecked(predicate in values)
 | 
						|
        return True
 |