mirror of
https://github.com/qgis/QGIS.git
synced 2025-11-01 00:09:14 -04: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 processing.tools import dataobjects, vector
|
||||||
|
|
||||||
from .fieldsmapping import ParameterFieldsMapping
|
from .fieldsmapping import ParameterFieldsMapping
|
||||||
from .ui.FieldsMapperDialogs import (FieldsMapperParametersDialog,
|
|
||||||
FieldsMapperModelerParametersDialog)
|
|
||||||
|
|
||||||
|
|
||||||
class FieldsMapper(GeoAlgorithm):
|
class FieldsMapper(GeoAlgorithm):
|
||||||
@ -151,9 +149,3 @@ class FieldsMapper(GeoAlgorithm):
|
|||||||
raise GeoAlgorithmExecutionException(
|
raise GeoAlgorithmExecutionException(
|
||||||
self.tr('An error occurred while evaluating the calculation'
|
self.tr('An error occurred while evaluating the calculation'
|
||||||
' string:\n') + error)
|
' 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):
|
class ParameterFieldsMapping(Parameter):
|
||||||
|
|
||||||
|
default_metadata = {
|
||||||
|
'widget_wrapper': 'processing.algs.qgis.ui.FieldsMappingPanel.FieldsMappingWidgetWrapper'
|
||||||
|
}
|
||||||
|
|
||||||
def __init__(self, name='', description='', parent=None):
|
def __init__(self, name='', description='', parent=None):
|
||||||
Parameter.__init__(self, name, description)
|
Parameter.__init__(self, name, description)
|
||||||
self.parent = parent
|
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 collections import OrderedDict
|
||||||
|
|
||||||
from qgis.PyQt import uic
|
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.QtWidgets import QComboBox, QHeaderView, QLineEdit, QMessageBox, QSpinBox, QStyledItemDelegate
|
||||||
from qgis.PyQt.QtCore import QItemSelectionModel, QAbstractTableModel, QModelIndex, QVariant, Qt, pyqtSlot
|
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 qgis.gui import QgsFieldExpressionWidget
|
||||||
|
|
||||||
|
from processing.gui.wrappers import WidgetWrapper, DIALOG_STANDARD, DIALOG_MODELER
|
||||||
from processing.tools import dataobjects
|
from processing.tools import dataobjects
|
||||||
|
|
||||||
pluginPath = os.path.dirname(__file__)
|
pluginPath = os.path.dirname(__file__)
|
||||||
@ -93,7 +94,7 @@ class FieldsMappingModel(QAbstractTableModel):
|
|||||||
if self._layer is None:
|
if self._layer is None:
|
||||||
return
|
return
|
||||||
context = QgsExpressionContextUtils.createFeatureBasedContext(QgsFeature(), self._layer.fields())
|
context = QgsExpressionContextUtils.createFeatureBasedContext(QgsFeature(), self._layer.fields())
|
||||||
for feature in dp.getFeatures():
|
for feature in self._layer.getFeatures():
|
||||||
context.setFeature(feature)
|
context.setFeature(feature)
|
||||||
expression.evaluate(context)
|
expression.evaluate(context)
|
||||||
if expression.hasEvalError():
|
if expression.hasEvalError():
|
||||||
@ -473,3 +474,35 @@ class FieldsMappingPanel(BASE, WIDGET):
|
|||||||
if layer is None:
|
if layer is None:
|
||||||
return
|
return
|
||||||
self.model.loadLayerFields(layer)
|
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