QgsUnitTypes)
import processing
import re
-
+from operator import itemgetter
class SpanCoordinatesAlgorithm(QgsProcessingAlgorithm):
"""
if not ('Length' in sourceNames): outputFields.append(QgsField('Length', QVariant.Double))
if not ('LineString' in sourceNames): outputFields.append(QgsField('LineString', QVariant.String))
if not ('DimensionDN' in sourceNames): outputFields.append(QgsField('DimensionDN', QVariant.Int))
+ if not ('PipeStruct' in sourceNames): outputFields.append(QgsField('PipeStruct', QVariant.String))
(output, outputId) = self.parameterAsSink(
parameters,
# Dictionary from span feature ids to lists of lists of QgsPoint objects
strings = dict()
+ # Dictionary for the PipeStruct field values
+ types = dict()
+
spanFeatures = span.getFeatures()
pipeFeatures = pipe.getFeatures()
fatherID = feature[self.FATHER_ID]
# Length
- myLength = geometry.length()
+ myLength = feature['Length']
+ if myLength == None:
+ myLength = geometry.length()
oldLength = lengths.get(fatherID, 0.0)
lengths[fatherID] = oldLength + myLength
pointList.append(mylist)
strings[fatherID] = pointList
+ # Store the value of PipeStruct
+ t = feature['PipeStruct']
+ tt = types.get(fatherID, {})
+ types[fatherID] = tt
+ c = tt.get(t, 0)
+ c += myLength
+ tt[t] = c
+
# Update the progress bar
feedback.setProgress(int(counter * total))
outputFeature['Length'] = feature['Length'] # myLength
outputFeature['LineString'] = result
+ # Handle pipe type codes
+ mytypes = list(types.get(id, {}).items())
+ if len(mytypes) == 0:
+ feedback.pushInfo('No type codes for feature {}'.format(id))
+ else:
+ if len(mytypes) > 1:
+ mytypes.sort(key = itemgetter(1))
+ feedback.pushInfo('No unique type code for feature {}: {}'.format(id, mytypes))
+ outputFeature['PipeStruct'] = mytypes[-1][0]
+
label = feature['Label']
m = self.DN_PATTERN.fullmatch(label)
if m: