diff --git a/src/sextante/ftools/Clip.py b/src/sextante/ftools/Clip.py index 14b0569e782..86915060a61 100644 --- a/src/sextante/ftools/Clip.py +++ b/src/sextante/ftools/Clip.py @@ -6,7 +6,6 @@ from PyQt4.QtGui import * from qgis.core import * from sextante.parameters.ParameterVector import ParameterVector from sextante.core.QGisLayers import QGisLayers -from sextante.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException from sextante.outputs.OutputVector import OutputVector from sextante.ftools import ftools_utils from sextante.core.SextanteLog import SextanteLog @@ -33,10 +32,10 @@ class Clip(GeoAlgorithm): vlayerB = QGisLayers.getObjectFromUri(self.getParameterValue(Clip.INPUT2)) GEOS_EXCEPT = True FEATURE_EXCEPT = True - vproviderA = self.vlayerA.dataProvider() + vproviderA = vlayerA.dataProvider() allAttrsA = vproviderA.attributeIndexes() vproviderA.select( allAttrsA ) - vproviderB = self.vlayerB.dataProvider() + vproviderB = vlayerB.dataProvider() allAttrsB = vproviderB.attributeIndexes() vproviderB.select( allAttrsB ) # check for crs compatibility @@ -59,10 +58,10 @@ class Clip(GeoAlgorithm): # there is selection in input layer if useSelection: nFeat = vlayerA.selectedFeatureCount() - selectionA = self.vlayerA.selectedFeatures() + selectionA = vlayerA.selectedFeatures() # we have selection in overlay layer if useSelection2: - selectionB = self.vlayerB.selectedFeaturesIds() + selectionB = vlayerB.selectedFeaturesIds() for inFeatA in selectionA: nElement += 1 progress.setPercentage(int(nElement/nFeat * 100)) @@ -156,7 +155,7 @@ class Clip(GeoAlgorithm): nFeat = vproviderA.featureCount() # we have selection in overlay layer if useSelection2: - selectionB = self.vlayerB.selectedFeaturesIds() + selectionB = vlayerB.selectedFeaturesIds() while vproviderA.nextFeature( inFeatA ): nElement += 1 progress.setPercentage(int(nElement/nFeat * 100)) diff --git a/src/sextante/gui/ParametersPanel.py b/src/sextante/gui/ParametersPanel.py index bc3ad01495e..849f40713cd 100644 --- a/src/sextante/gui/ParametersPanel.py +++ b/src/sextante/gui/ParametersPanel.py @@ -1,4 +1,5 @@ import os +import locale from PyQt4 import QtCore, QtGui from sextante.gui.OutputSelectionPanel import OutputSelectionPanel from sextante.core.QGisLayers import QGisLayers @@ -219,9 +220,7 @@ class ParametersPanel(QtGui.QWidget): else: layers = QGisLayers.getTables() if len(layers)>0: - fields = self.getFields(layers[0]) - for i in fields: - item.addItem(fields[i].name()) + item.addItems(self.getFields(layers[0], param.datatype)) elif isinstance(param, ParameterSelection): item = QtGui.QComboBox() item.addItems(param.options) @@ -266,12 +265,26 @@ class ParametersPanel(QtGui.QWidget): for child in children: widget = self.valueItems[child] widget.clear() - fields = self.getFields(layer) - for i in fields: - widget.addItem(fields[i].name()) + widget.addItems(self.getFields(layer, self.alg.getParameterFromName(child).datatype)) - def getFields(self, layer): - return layer.dataProvider().fields() + def getFields(self, layer, datatype): + fieldTypes = [] + if datatype == ParameterTableField.DATA_TYPE_STRING: + fieldTypes = [QVariant.String] + elif datatype == ParameterTableField.DATA_TYPE_NUMBER: + fieldTypes = [QVariant.Int, QVariant.Double] + + fieldNames = [] + fieldMap = layer.pendingFields() + if len(fieldTypes) == 0: + for idx, field in fieldMap.iteritems(): + if not field.name() in fieldNames: + fieldNames.append( unicode( field.name() ) ) + else: + for idx, field in fieldMap.iteritems(): + if field.type() in fieldTypes and not field.name() in fieldNames: + fieldNames.append( unicode( field.name() ) ) + return sorted( fieldNames, cmp=locale.strcoll ) def somethingDependsOnThisParameter(self, parent): for param in self.alg.parameters: diff --git a/src/sextante/parameters/ParameterTableField.py b/src/sextante/parameters/ParameterTableField.py index e1294332f76..cc77e25549d 100644 --- a/src/sextante/parameters/ParameterTableField.py +++ b/src/sextante/parameters/ParameterTableField.py @@ -2,10 +2,15 @@ from sextante.parameters.Parameter import Parameter class ParameterTableField(Parameter): - def __init__(self, name="", description="", parent=None): + DATA_TYPE_NUMBER = 0 + DATA_TYPE_STRING = 1 + DATA_TYPE_ANY = -1 + + def __init__(self, name="", description="", parent=None, datatype=-1): Parameter.__init__(self, name, description) self.parent = parent self.value = None + self.datatype = datatype def getValueAsCommandLineParameter(self): return "\"" + str(self.value) + "\"" @@ -15,11 +20,15 @@ class ParameterTableField(Parameter): def serialize(self): return self.__module__.split(".")[-1] + "|" + self.name + "|" + self.description +\ - "|" + str(self.parent) + "|" + str(self.parent) + "|" + str(self.datatype) + def deserialize(self, s): tokens = s.split("|") - return ParameterTableField(tokens[0], tokens[1], tokens[2]) + if len(tokens) == 4: + return ParameterTableField(tokens[0], tokens[1], tokens[2], int(tokens[3])) + else: + return ParameterTableField(tokens[0], tokens[1], tokens[2]) def __str__(self): return self.name + " <" + self.__module__.split(".")[-1] +" from " + self.value + ">"