mirror of
				https://github.com/qgis/QGIS.git
				synced 2025-11-04 00:04:25 -05:00 
			
		
		
		
	Create FieldMappingWrapper
This commit is contained in:
		
							parent
							
								
									affc8f7ca5
								
							
						
					
					
						commit
						a38c13d523
					
				@ -37,8 +37,6 @@ from processing.core.outputs import OutputVector
 | 
			
		||||
from processing.tools import dataobjects, vector
 | 
			
		||||
 | 
			
		||||
from .fieldsmapping import ParameterFieldsMapping
 | 
			
		||||
from .ui.FieldsMapperDialogs import (FieldsMapperParametersDialog,
 | 
			
		||||
                                     FieldsMapperModelerParametersDialog)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class FieldsMapper(GeoAlgorithm):
 | 
			
		||||
@ -151,9 +149,3 @@ class FieldsMapper(GeoAlgorithm):
 | 
			
		||||
            raise GeoAlgorithmExecutionException(
 | 
			
		||||
                self.tr('An error occurred while evaluating the calculation'
 | 
			
		||||
                        ' string:\n') + error)
 | 
			
		||||
 | 
			
		||||
    def getCustomParametersDialog(self):
 | 
			
		||||
        return FieldsMapperParametersDialog(self)
 | 
			
		||||
 | 
			
		||||
    def getCustomModelerParametersDialog(self, modelAlg, algName=None):
 | 
			
		||||
        return FieldsMapperModelerParametersDialog(self, modelAlg, algName)
 | 
			
		||||
 | 
			
		||||
@ -33,6 +33,10 @@ from processing.core.parameters import Parameter
 | 
			
		||||
 | 
			
		||||
class ParameterFieldsMapping(Parameter):
 | 
			
		||||
 | 
			
		||||
    default_metadata = {
 | 
			
		||||
        'widget_wrapper': 'processing.algs.qgis.ui.FieldsMappingPanel.FieldsMappingWidgetWrapper'
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    def __init__(self, name='', description='', parent=None):
 | 
			
		||||
        Parameter.__init__(self, name, description)
 | 
			
		||||
        self.parent = parent
 | 
			
		||||
 | 
			
		||||
@ -1,143 +0,0 @@
 | 
			
		||||
# -*- coding: utf-8 -*-
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
***************************************************************************
 | 
			
		||||
    FieldsMapper.py
 | 
			
		||||
    ---------------------
 | 
			
		||||
    Date                 : October 2014
 | 
			
		||||
    Copyright            : (C) 2014 by Arnaud Morvan
 | 
			
		||||
    Email                : arnaud dot morvan at camptocamp 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.                                   *
 | 
			
		||||
*                                                                         *
 | 
			
		||||
***************************************************************************
 | 
			
		||||
"""
 | 
			
		||||
from builtins import str
 | 
			
		||||
 | 
			
		||||
__author__ = 'Arnaud Morvan'
 | 
			
		||||
__date__ = 'October 2014'
 | 
			
		||||
__copyright__ = '(C) 2014, Arnaud Morvan'
 | 
			
		||||
 | 
			
		||||
# This will get replaced with a git SHA1 when you do a git archive
 | 
			
		||||
 | 
			
		||||
__revision__ = '$Format:%H$'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
from qgis.PyQt.QtWidgets import QComboBox, QSpacerItem
 | 
			
		||||
 | 
			
		||||
from processing.core.parameters import ParameterVector
 | 
			
		||||
from processing.tools import dataobjects
 | 
			
		||||
from processing.gui.ParametersPanel import ParametersPanel
 | 
			
		||||
from processing.gui.AlgorithmDialog import AlgorithmDialog, AlgorithmDialogBase
 | 
			
		||||
from processing.modeler.ModelerParametersDialog import ModelerParametersDialog
 | 
			
		||||
 | 
			
		||||
from processing.algs.qgis.fieldsmapping import ParameterFieldsMapping
 | 
			
		||||
from .FieldsMappingPanel import FieldsMappingPanel
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class FieldsMapperParametersPanel(ParametersPanel):
 | 
			
		||||
 | 
			
		||||
    def __init__(self, parent, alg):
 | 
			
		||||
        ParametersPanel.__init__(self, parent, alg)
 | 
			
		||||
 | 
			
		||||
        item = self.layoutMain.itemAt(self.layoutMain.count() - 1)
 | 
			
		||||
        if isinstance(item, QSpacerItem):
 | 
			
		||||
            self.layoutMain.removeItem(item)
 | 
			
		||||
            item = None
 | 
			
		||||
 | 
			
		||||
    def getWidgetFromParameter(self, param):
 | 
			
		||||
        if isinstance(param, ParameterFieldsMapping):
 | 
			
		||||
            item = FieldsMappingPanel()
 | 
			
		||||
            if param.parent in self.dependentItems:
 | 
			
		||||
                items = self.dependentItems[param.parent]
 | 
			
		||||
            else:
 | 
			
		||||
                items = []
 | 
			
		||||
                self.dependentItems[param.parent] = items
 | 
			
		||||
            items.append(param)
 | 
			
		||||
 | 
			
		||||
            parent = self.alg.getParameterFromName(param.parent)
 | 
			
		||||
            if isinstance(parent, ParameterVector):
 | 
			
		||||
                layers = dataobjects.getVectorLayers(parent.shapetype)
 | 
			
		||||
            else:
 | 
			
		||||
                layers = dataobjects.getTables()
 | 
			
		||||
            if len(layers) > 0:
 | 
			
		||||
                item.setLayer(layers[0])
 | 
			
		||||
            return item
 | 
			
		||||
        return ParametersPanel.getWidgetFromParameter(self, param)
 | 
			
		||||
 | 
			
		||||
    def updateDependentFields(self):
 | 
			
		||||
        sender = self.sender()
 | 
			
		||||
        if not isinstance(sender, QComboBox):
 | 
			
		||||
            return
 | 
			
		||||
        if sender.name not in self.dependentItems:
 | 
			
		||||
            return
 | 
			
		||||
        layer = sender.itemData(sender.currentIndex())
 | 
			
		||||
        children = self.dependentItems[sender.name]
 | 
			
		||||
        for child in children:
 | 
			
		||||
            widget = self.valueItems[child.name]
 | 
			
		||||
            if isinstance(widget, FieldsMappingPanel):
 | 
			
		||||
                widget.setLayer(layer)
 | 
			
		||||
        ParametersPanel.updateDependentFields(self)
 | 
			
		||||
 | 
			
		||||
    def somethingDependsOnThisParameter(self, parent):
 | 
			
		||||
        for param in self.alg.parameters:
 | 
			
		||||
            if isinstance(param, ParameterFieldsMapping):
 | 
			
		||||
                if param.parent == parent.name:
 | 
			
		||||
                    return True
 | 
			
		||||
        return ParametersPanel.somethingDependsOnThisParameter(self, parent)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class FieldsMapperParametersDialog(AlgorithmDialog):
 | 
			
		||||
 | 
			
		||||
    def __init__(self, alg):
 | 
			
		||||
        AlgorithmDialogBase.__init__(self, alg)
 | 
			
		||||
 | 
			
		||||
        self.alg = alg
 | 
			
		||||
 | 
			
		||||
        self.setMainWidget(FieldsMapperParametersPanel(self, alg))
 | 
			
		||||
 | 
			
		||||
    def setParamValue(self, param, widget, alg=None):
 | 
			
		||||
        if isinstance(param, ParameterFieldsMapping):
 | 
			
		||||
            return param.setValue(widget.value())
 | 
			
		||||
        return AlgorithmDialog.setParamValue(self, param, widget, alg)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class FieldsMapperModelerParametersDialog(ModelerParametersDialog):
 | 
			
		||||
 | 
			
		||||
    def __init__(self, alg, model, algName=None):
 | 
			
		||||
        ModelerParametersDialog.__init__(self, alg, model, algName)
 | 
			
		||||
 | 
			
		||||
        paramsLayout = self.paramPanel.layout()
 | 
			
		||||
        item = paramsLayout.itemAt(paramsLayout.count() - 1)
 | 
			
		||||
        if isinstance(item, QSpacerItem):
 | 
			
		||||
            paramsLayout.removeItem(item)
 | 
			
		||||
            item = None
 | 
			
		||||
 | 
			
		||||
    def getWidgetFromParameter(self, param):
 | 
			
		||||
        if isinstance(param, ParameterFieldsMapping):
 | 
			
		||||
            return FieldsMappingPanel()
 | 
			
		||||
        return ModelerParametersDialog.getWidgetFromParameter(self, param)
 | 
			
		||||
 | 
			
		||||
    def setPreviousValues(self):
 | 
			
		||||
        ModelerParametersDialog.setPreviousValues(self)
 | 
			
		||||
        if self._algName is not None:
 | 
			
		||||
            alg = self.model.algs[self._algName]
 | 
			
		||||
            for param in alg.algorithm.parameters:
 | 
			
		||||
                if isinstance(param, ParameterFieldsMapping):
 | 
			
		||||
                    widget = self.valueItems[param.name]
 | 
			
		||||
                    value = alg.params[param.name]
 | 
			
		||||
                    if isinstance(value, str):
 | 
			
		||||
                        # convert to list because of ModelerAlgorithme.resolveValue behavior with lists
 | 
			
		||||
                        value = eval(value)
 | 
			
		||||
                    widget.setValue(value)
 | 
			
		||||
 | 
			
		||||
    def setParamValue(self, alg, param, widget):
 | 
			
		||||
        if isinstance(param, ParameterFieldsMapping):
 | 
			
		||||
            # convert to unicode because of ModelerAlgorithme.resolveValue behavior with lists
 | 
			
		||||
            alg.params[param.name] = str(widget.value())
 | 
			
		||||
            return True
 | 
			
		||||
        return ModelerParametersDialog.setParamValue(self, alg, param, widget)
 | 
			
		||||
@ -31,13 +31,14 @@ import os
 | 
			
		||||
from collections import OrderedDict
 | 
			
		||||
 | 
			
		||||
from qgis.PyQt import uic
 | 
			
		||||
from qgis.PyQt.QtGui import QBrush, QIcon
 | 
			
		||||
from qgis.PyQt.QtGui import QBrush, QIcon, QSpacerItem
 | 
			
		||||
from qgis.PyQt.QtWidgets import QComboBox, QHeaderView, QLineEdit, QMessageBox, QSpinBox, QStyledItemDelegate
 | 
			
		||||
from qgis.PyQt.QtCore import QItemSelectionModel, QAbstractTableModel, QModelIndex, QVariant, Qt, pyqtSlot
 | 
			
		||||
 | 
			
		||||
from qgis.core import QgsExpression, QgsExpressionContextUtils, QgsApplication
 | 
			
		||||
from qgis.core import QgsExpression, QgsExpressionContextUtils, QgsApplication, QgsFeature
 | 
			
		||||
from qgis.gui import QgsFieldExpressionWidget
 | 
			
		||||
 | 
			
		||||
from processing.gui.wrappers import WidgetWrapper, DIALOG_STANDARD, DIALOG_MODELER
 | 
			
		||||
from processing.tools import dataobjects
 | 
			
		||||
 | 
			
		||||
pluginPath = os.path.dirname(__file__)
 | 
			
		||||
@ -93,7 +94,7 @@ class FieldsMappingModel(QAbstractTableModel):
 | 
			
		||||
        if self._layer is None:
 | 
			
		||||
            return
 | 
			
		||||
        context = QgsExpressionContextUtils.createFeatureBasedContext(QgsFeature(), self._layer.fields())
 | 
			
		||||
        for feature in dp.getFeatures():
 | 
			
		||||
        for feature in self._layer.getFeatures():
 | 
			
		||||
            context.setFeature(feature)
 | 
			
		||||
            expression.evaluate(context)
 | 
			
		||||
            if expression.hasEvalError():
 | 
			
		||||
@ -473,3 +474,35 @@ class FieldsMappingPanel(BASE, WIDGET):
 | 
			
		||||
        if layer is None:
 | 
			
		||||
            return
 | 
			
		||||
        self.model.loadLayerFields(layer)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class FieldsMappingWidgetWrapper(WidgetWrapper):
 | 
			
		||||
 | 
			
		||||
    def createWidget(self):
 | 
			
		||||
        return FieldsMappingPanel()
 | 
			
		||||
 | 
			
		||||
    def postInitialize(self, wrappers):
 | 
			
		||||
        for wrapper in wrappers:
 | 
			
		||||
            if wrapper.param.name == self.param.parent:
 | 
			
		||||
                wrapper.widgetValueHasChanged.connect(self.parentLayerChanged)
 | 
			
		||||
                break
 | 
			
		||||
        layers = dataobjects.getTables()
 | 
			
		||||
        if len(layers) > 0:
 | 
			
		||||
            # as first item in combobox is already selected
 | 
			
		||||
            self.widget.setLayer(layers[0])
 | 
			
		||||
 | 
			
		||||
        # remove exiting spacers to get FieldsMappingPanel fully expanded
 | 
			
		||||
        if self.dialogType in (DIALOG_STANDARD, DIALOG_MODELER):
 | 
			
		||||
            layout = self.widget.parent().layout()
 | 
			
		||||
            spacer = layout.itemAt(layout.count() - 1)
 | 
			
		||||
            if isinstance(spacer, QSpacerItem):
 | 
			
		||||
                layout.removeItem(spacer)
 | 
			
		||||
 | 
			
		||||
    def parentLayerChanged(self):
 | 
			
		||||
        self.widget.setLayer(self.sender().value())
 | 
			
		||||
 | 
			
		||||
    def setValue(self, value):
 | 
			
		||||
        self.widget.setValue(value)
 | 
			
		||||
 | 
			
		||||
    def value(self):
 | 
			
		||||
        return self.widget.value()
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user