[BUG] run eliminate with non-editable input layer

This commit is contained in:
Bernhard Ströbl 2016-03-16 12:48:38 +01:00
parent 082b5757dc
commit 62a4db8c40

View File

@ -41,7 +41,7 @@ from processing.core.parameters import ParameterTableField
from processing.core.parameters import ParameterString from processing.core.parameters import ParameterString
from processing.core.parameters import ParameterSelection from processing.core.parameters import ParameterSelection
from processing.core.outputs import OutputVector from processing.core.outputs import OutputVector
from processing.tools import dataobjects from processing.tools import dataobjects, vector
pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0] pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0]
@ -101,6 +101,7 @@ class Eliminate(GeoAlgorithm):
boundary = self.getParameterValue(self.MODE) == self.MODE_BOUNDARY boundary = self.getParameterValue(self.MODE) == self.MODE_BOUNDARY
smallestArea = self.getParameterValue(self.MODE) == self.MODE_SMALLEST_AREA smallestArea = self.getParameterValue(self.MODE) == self.MODE_SMALLEST_AREA
keepSelection = self.getParameterValue(self.KEEPSELECTION) keepSelection = self.getParameterValue(self.KEEPSELECTION)
processLayer = vector.duplicateInMemory(inLayer)
if not keepSelection: if not keepSelection:
# Make a selection with the values provided # Make a selection with the values provided
@ -108,8 +109,8 @@ class Eliminate(GeoAlgorithm):
comparison = self.comparisons[self.getParameterValue(self.COMPARISON)] comparison = self.comparisons[self.getParameterValue(self.COMPARISON)]
comparisonvalue = self.getParameterValue(self.COMPARISONVALUE) comparisonvalue = self.getParameterValue(self.COMPARISONVALUE)
selectindex = inLayer.dataProvider().fieldNameIndex(attribute) selectindex = vector.resolveFieldIndex(processLayer, attribute)
selectType = inLayer.dataProvider().fields()[selectindex].type() selectType = processLayer.dataProvider().fields()[selectindex].type()
selectionError = False selectionError = False
if selectType == 2: if selectType == 2:
@ -166,7 +167,7 @@ class Eliminate(GeoAlgorithm):
raise GeoAlgorithmExecutionException( raise GeoAlgorithmExecutionException(
self.tr('Error in selection input: %s' % msg)) self.tr('Error in selection input: %s' % msg))
else: else:
for feature in inLayer.getFeatures(): for feature in processLayer.getFeatures():
aValue = feature.attributes()[selectindex] aValue = feature.attributes()[selectindex]
if aValue is None: if aValue is None:
@ -205,20 +206,20 @@ class Eliminate(GeoAlgorithm):
if match: if match:
selected.append(feature.id()) selected.append(feature.id())
inLayer.setSelectedFeatures(selected) processLayer.setSelectedFeatures(selected)
if inLayer.selectedFeatureCount() == 0: if processLayer.selectedFeatureCount() == 0:
ProcessingLog.addToLog(ProcessingLog.LOG_WARNING, ProcessingLog.addToLog(ProcessingLog.LOG_WARNING,
self.tr('%s: (No selection in input layer "%s")' % (self.commandLineName(), self.getParameterValue(self.INPUT)))) self.tr('%s: (No selection in input layer "%s")' % (self.commandLineName(), self.getParameterValue(self.INPUT))))
# Keep references to the features to eliminate # Keep references to the features to eliminate
featToEliminate = [] featToEliminate = []
for aFeat in inLayer.selectedFeatures(): for aFeat in processLayer.selectedFeatures():
featToEliminate.append(aFeat) featToEliminate.append(aFeat)
# Delete all features to eliminate in inLayer (we won't save this) # Delete all features to eliminate in processLayer (we won't save this)
inLayer.startEditing() processLayer.startEditing()
inLayer.deleteSelectedFeatures() processLayer.deleteSelectedFeatures()
# ANALYZE # ANALYZE
if len(featToEliminate) > 0: # Prevent zero division if len(featToEliminate) > 0: # Prevent zero division
@ -242,7 +243,7 @@ class Eliminate(GeoAlgorithm):
feat = featToEliminate.pop() feat = featToEliminate.pop()
geom2Eliminate = QgsGeometry(feat.geometry()) geom2Eliminate = QgsGeometry(feat.geometry())
bbox = geom2Eliminate.boundingBox() bbox = geom2Eliminate.boundingBox()
fit = inLayer.getFeatures( fit = processLayer.getFeatures(
QgsFeatureRequest().setFilterRect(bbox)) QgsFeatureRequest().setFilterRect(bbox))
mergeWithFid = None mergeWithFid = None
mergeWithGeom = None mergeWithGeom = None
@ -296,7 +297,7 @@ class Eliminate(GeoAlgorithm):
# A successful candidate # A successful candidate
newGeom = mergeWithGeom.combine(geom2Eliminate) newGeom = mergeWithGeom.combine(geom2Eliminate)
if inLayer.changeGeometry(mergeWithFid, newGeom): if processLayer.changeGeometry(mergeWithFid, newGeom):
madeProgress = True madeProgress = True
else: else:
raise GeoAlgorithmExecutionException( raise GeoAlgorithmExecutionException(
@ -314,18 +315,18 @@ class Eliminate(GeoAlgorithm):
# End while # End while
# Create output # Create output
provider = inLayer.dataProvider() provider = processLayer.dataProvider()
output = self.getOutputFromName(self.OUTPUT) output = self.getOutputFromName(self.OUTPUT)
writer = output.getVectorWriter(provider.fields(), writer = output.getVectorWriter(provider.fields(),
provider.geometryType(), inLayer.crs()) provider.geometryType(), processLayer.crs())
# Write all features that are left over to output layer # Write all features that are left over to output layer
iterator = inLayer.getFeatures() iterator = processLayer.getFeatures()
for feature in iterator: for feature in iterator:
writer.addFeature(feature) writer.addFeature(feature)
# Leave inLayer untouched # Leave processLayer untouched
inLayer.rollBack() processLayer.rollBack()
for feature in featNotEliminated: for feature in featNotEliminated:
writer.addFeature(feature) writer.addFeature(feature)