Skip to content
Permalink
Browse files

[processing] Consist helpful error messages when sinks cannot be created

And throw exceptions always when sinks are not created to avoid
generic errors
  • Loading branch information
nyalldawson committed Apr 27, 2018
1 parent 5339d62 commit 249dca78307bac474d7feb16a7f0a196e95c6746
Showing with 148 additions and 20 deletions.
  1. +2 −0 python/plugins/processing/algs/qgis/Aggregate.py
  2. +2 −0 python/plugins/processing/algs/qgis/ConcaveHull.py
  3. +2 −0 python/plugins/processing/algs/qgis/Delaunay.py
  4. +2 −0 python/plugins/processing/algs/qgis/DeleteDuplicateGeometries.py
  5. +2 −0 python/plugins/processing/algs/qgis/EliminateSelection.py
  6. +2 −0 python/plugins/processing/algs/qgis/ExecuteSQL.py
  7. +2 −0 python/plugins/processing/algs/qgis/ExportGeometryInfo.py
  8. +3 −0 python/plugins/processing/algs/qgis/ExtentFromLayer.py
  9. +2 −0 python/plugins/processing/algs/qgis/ExtractSpecificVertices.py
  10. +2 −0 python/plugins/processing/algs/qgis/FieldPyculator.py
  11. +2 −0 python/plugins/processing/algs/qgis/FieldsCalculator.py
  12. +2 −0 python/plugins/processing/algs/qgis/FindProjection.py
  13. +2 −0 python/plugins/processing/algs/qgis/GeometryConvert.py
  14. +2 −0 python/plugins/processing/algs/qgis/Grid.py
  15. +2 −0 python/plugins/processing/algs/qgis/HubDistanceLines.py
  16. +2 −0 python/plugins/processing/algs/qgis/HubDistancePoints.py
  17. +2 −0 python/plugins/processing/algs/qgis/KeepNBiggestParts.py
  18. +2 −0 python/plugins/processing/algs/qgis/MinimumBoundingGeometry.py
  19. +4 −0 python/plugins/processing/algs/qgis/PointDistance.py
  20. +2 −0 python/plugins/processing/algs/qgis/PointsAlongGeometry.py
  21. +2 −0 python/plugins/processing/algs/qgis/PointsDisplacement.py
  22. +2 −0 python/plugins/processing/algs/qgis/PointsFromLines.py
  23. +2 −0 python/plugins/processing/algs/qgis/PointsFromPolygons.py
  24. +2 −0 python/plugins/processing/algs/qgis/PointsInPolygon.py
  25. +2 −0 python/plugins/processing/algs/qgis/PointsLayerFromTable.py
  26. +2 −0 python/plugins/processing/algs/qgis/PointsToPaths.py
  27. +2 −0 python/plugins/processing/algs/qgis/PoleOfInaccessibility.py
  28. +2 −0 python/plugins/processing/algs/qgis/Polygonize.py
  29. +2 −0 python/plugins/processing/algs/qgis/RandomExtract.py
  30. +2 −0 python/plugins/processing/algs/qgis/RandomExtractWithinSubsets.py
  31. +2 −0 python/plugins/processing/algs/qgis/RandomPointsAlongLines.py
  32. +2 −0 python/plugins/processing/algs/qgis/RandomPointsExtent.py
  33. +2 −0 python/plugins/processing/algs/qgis/RandomPointsLayer.py
  34. +2 −0 python/plugins/processing/algs/qgis/RandomPointsPolygons.py
  35. +2 −0 python/plugins/processing/algs/qgis/RectanglesOvalsDiamondsFixed.py
  36. +2 −0 python/plugins/processing/algs/qgis/RectanglesOvalsDiamondsVariable.py
  37. +3 −0 python/plugins/processing/algs/qgis/RegularPoints.py
  38. +2 −0 python/plugins/processing/algs/qgis/ShortestPathLayerToPoint.py
  39. +2 −0 python/plugins/processing/algs/qgis/ShortestPathPointToLayer.py
  40. +2 −0 python/plugins/processing/algs/qgis/ShortestPathPointToPoint.py
  41. +2 −0 python/plugins/processing/algs/qgis/SnapGeometries.py
  42. +2 −0 python/plugins/processing/algs/qgis/SpatialJoin.py
  43. +2 −0 python/plugins/processing/algs/qgis/SpatialJoinSummary.py
  44. +2 −0 python/plugins/processing/algs/qgis/StatisticsByCategories.py
  45. +2 −0 python/plugins/processing/algs/qgis/SumLines.py
  46. +2 −0 python/plugins/processing/algs/qgis/TopoColors.py
  47. +2 −0 python/plugins/processing/algs/qgis/VariableDistanceBuffer.py
  48. +2 −0 python/plugins/processing/algs/qgis/VoronoiPolygons.py
  49. +7 −0 python/plugins/processing/script/ScriptTemplate.py
  50. +1 −1 src/analysis/processing/qgsalgorithmclip.cpp
  51. +2 −0 src/analysis/processing/qgsalgorithmdifference.cpp
  52. +1 −1 src/analysis/processing/qgsalgorithmdissolve.cpp
  53. +1 −1 src/analysis/processing/qgsalgorithmextenttolayer.cpp
  54. +2 −2 src/analysis/processing/qgsalgorithmextractbyattribute.cpp
  55. +2 −2 src/analysis/processing/qgsalgorithmextractbyexpression.cpp
  56. +1 −1 src/analysis/processing/qgsalgorithmextractbyextent.cpp
  57. +1 −1 src/analysis/processing/qgsalgorithmextractbylocation.cpp
  58. +1 −1 src/analysis/processing/qgsalgorithmextractvertices.cpp
  59. +1 −1 src/analysis/processing/qgsalgorithmfilter.cpp
  60. +2 −0 src/analysis/processing/qgsalgorithmintersection.cpp
  61. +1 −1 src/analysis/processing/qgsalgorithmjoinbyattribute.cpp
  62. +1 −1 src/analysis/processing/qgsalgorithmjoinwithlines.cpp
  63. +1 −1 src/analysis/processing/qgsalgorithmlineintersection.cpp
  64. +1 −1 src/analysis/processing/qgsalgorithmmeancoordinates.cpp
  65. +2 −0 src/analysis/processing/qgsalgorithmmergevector.cpp
  66. +1 −1 src/analysis/processing/qgsalgorithmorderbyexpression.cpp
  67. +1 −1 src/analysis/processing/qgsalgorithmsaveselectedfeatures.cpp
  68. +1 −1 src/analysis/processing/qgsalgorithmsplitwithlines.cpp
  69. +2 −0 src/analysis/processing/qgsalgorithmsymmetricaldifference.cpp
  70. +1 −1 src/analysis/processing/qgsalgorithmtransect.cpp
  71. +2 −0 src/analysis/processing/qgsalgorithmunion.cpp
  72. +1 −1 src/core/processing/qgsprocessingalgorithm.cpp
  73. +11 −0 tests/src/analysis/testqgsprocessing.cpp
@@ -224,6 +224,8 @@ def processAlgorithm(self, parameters, context, feedback):
self.fields,
QgsWkbTypes.multiType(source.wkbType()),
source.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

# Calculate aggregates on memory layers
if len(keys):
@@ -144,6 +144,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
layer.fields(), QgsWkbTypes.Polygon, layer.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

geom = feat.geometry()
if no_multigeom and geom.isMultipart():
@@ -89,6 +89,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, QgsWkbTypes.Polygon, source.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

pts = []
ptDict = {}
@@ -65,6 +65,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
source.fields(), source.wkbType(), source.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

features = source.getFeatures(QgsFeatureRequest().setSubsetOfAttributes([]))
total = 100.0 / source.featureCount() if source.featureCount() else 0
@@ -103,6 +103,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
inLayer.fields(), inLayer.wkbType(), inLayer.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

for aFeat in inLayer.getFeatures():
if feedback.isCanceled():
@@ -158,6 +158,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
vLayer.fields(), vLayer.wkbType() if geometry_type != 1 else 1, vLayer.crs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

features = vLayer.getFeatures()
total = 100.0 / vLayer.featureCount() if vLayer.featureCount() else 0
@@ -123,6 +123,8 @@ def processAlgorithm(self, parameters, context, feedback):
fields = QgsProcessingUtils.combineFields(fields, new_fields)
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, wkb_type, source.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

coordTransform = None

@@ -36,6 +36,7 @@
QgsFeature,
QgsWkbTypes,
QgsProcessing,
QgsProcessingException,
QgsProcessingParameterMapLayer,
QgsProcessingParameterFeatureSink,
QgsFields)
@@ -94,6 +95,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, QgsWkbTypes.Polygon, layer.crs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

try:
# may not be possible
@@ -98,6 +98,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, wkb_type, source.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

vertex_indices_string = self.parameterAsString(parameters, self.VERTICES, context)
indices = []
@@ -108,6 +108,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, source.wkbType(), source.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

# Run global code
if globalExpression.strip() != '':
@@ -121,6 +121,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, source.wkbType(), source.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

exp_context = self.createExpressionContext(parameters, context)
if layer is not None:
@@ -100,6 +100,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, QgsWkbTypes.NoGeometry, QgsCoordinateReferenceSystem())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

# make intersection tests nice and fast
engine = QgsGeometry.createGeometryEngine(target_geom.constGet())
@@ -111,6 +111,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
source.fields(), newType, source.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

features = source.getFeatures()
total = 100.0 / source.featureCount() if source.featureCount() else 0
@@ -156,6 +156,8 @@ def processAlgorithm(self, parameters, context, feedback):
outputWkb = QgsWkbTypes.Polygon
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, outputWkb, crs)
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

if idx == 0:
self._pointGrid(
@@ -119,6 +119,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, QgsWkbTypes.LineString, point_source.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

index = QgsSpatialIndex(hub_source.getFeatures(QgsFeatureRequest().setSubsetOfAttributes([]).setDestinationCrs(point_source.sourceCrs(), context.transformContext())))

@@ -115,6 +115,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, QgsWkbTypes.Point, point_source.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

index = QgsSpatialIndex(hub_source.getFeatures(QgsFeatureRequest().setSubsetOfAttributes([]).setDestinationCrs(point_source.sourceCrs(), context.transformContext())))

@@ -81,6 +81,8 @@ def processAlgorithm(self, parameters, context, feedback):
fields = source.fields()
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
source.fields(), source.wkbType(), source.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

features = source.getFeatures()
total = 100.0 / source.featureCount() if source.featureCount() else 0
@@ -141,6 +141,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, QgsWkbTypes.Polygon, source.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

if field_index >= 0:
geometry_dict = {}
@@ -167,6 +167,8 @@ def linearMatrix(self, parameters, context, source, inField, target_source, targ
out_wkb = QgsWkbTypes.multiType(source.wkbType()) if matType == 0 else source.wkbType()
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, out_wkb, source.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

index = QgsSpatialIndex(target_source.getFeatures(QgsFeatureRequest().setSubsetOfAttributes([]).setDestinationCrs(source.sourceCrs(), context.transformContext())), feedback)

@@ -256,6 +258,8 @@ def regularMatrix(self, parameters, context, source, inField, target_source, tar

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, source.wkbType(), source.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

data = [inFeat[inField]]
for target in target_source.getFeatures(QgsFeatureRequest().setSubsetOfAttributes([]).setFilterFids(featList).setDestinationCrs(source.sourceCrs(), context.transformContext())):
@@ -104,6 +104,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, QgsWkbTypes.Point, source.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

features = source.getFeatures()
total = 100.0 / source.featureCount() if source.featureCount() else 0
@@ -88,6 +88,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
source.fields(), source.wkbType(), source.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

features = source.getFeatures()

@@ -92,6 +92,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, QgsWkbTypes.Point, raster_layer.crs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

outFeature = QgsFeature()
outFeature.setFields(fields)
@@ -91,6 +91,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, QgsWkbTypes.Point, raster_layer.crs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

outFeature = QgsFeature()
outFeature.setFields(fields)
@@ -118,6 +118,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, poly_source.wkbType(), poly_source.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

spatialIndex = QgsSpatialIndex(point_source.getFeatures(
QgsFeatureRequest().setSubsetOfAttributes([]).setDestinationCrs(poly_source.sourceCrs(), context.transformContext())), feedback)
@@ -110,6 +110,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, wkb_type, target_crs)
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

request = QgsFeatureRequest().setFlags(QgsFeatureRequest.NoGeometry)
features = source.getFeatures(QgsFeatureRequest(), QgsProcessingFeatureSource.FlagSkipGeometryValidityChecks)
@@ -129,6 +129,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, output_wkb, source.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

points = dict()
features = source.getFeatures(QgsFeatureRequest().setSubsetOfAttributes([group_field_index, order_field_index]), QgsProcessingFeatureSource.FlagSkipGeometryValidityChecks)
@@ -95,6 +95,8 @@ def processAlgorithm(self, parameters, context, feedback):
fields.append(QgsField('dist_pole', QVariant.Double))
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, QgsWkbTypes.Point, source.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

features = source.getFeatures()
total = 100.0 / source.featureCount() if source.featureCount() else 0
@@ -83,6 +83,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, QgsWkbTypes.Polygon, source.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

allLinesList = []
features = source.getFeatures(QgsFeatureRequest().setSubsetOfAttributes([]))
@@ -103,6 +103,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
source.fields(), source.wkbType(), source.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

total = 100.0 / featureCount if featureCount else 1
for i, feat in enumerate(features):
@@ -111,6 +111,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
source.fields(), source.wkbType(), source.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

selran = []
total = 100.0 / (featureCount * len(unique)) if featureCount else 1
@@ -101,6 +101,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, QgsWkbTypes.Point, source.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

nPoints = 0
nIterations = 0
@@ -108,6 +108,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, QgsWkbTypes.Point, crs)
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

nPoints = 0
nIterations = 0
@@ -109,6 +109,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, QgsWkbTypes.Point, source.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

nPoints = 0
nIterations = 0
@@ -126,6 +126,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, QgsWkbTypes.Point, source.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

da = QgsDistanceArea()
da.setSourceCrs(source.sourceCrs(), context.transformContext())
@@ -105,6 +105,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
source.fields(), QgsWkbTypes.Polygon, source.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

if shape == 0:
self.rectangles(sink, source, width, height, rotation, feedback)
@@ -115,6 +115,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
source.fields(), QgsWkbTypes.Polygon, source.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

width = source.fields().lookupField(width_field)
height = source.fields().lookupField(height_field)
@@ -39,6 +39,7 @@
QgsGeometry,
QgsPointXY,
QgsProcessing,
QgsProcessingException,
QgsProcessingParameterDistance,
QgsProcessingParameterExtent,
QgsProcessingParameterNumber,
@@ -108,6 +109,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, QgsWkbTypes.Point, crs)
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

if randomize:
seed()
@@ -190,6 +190,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, QgsWkbTypes.LineString, network.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

directionField = -1
if directionFieldName:
@@ -191,6 +191,8 @@ def processAlgorithm(self, parameters, context, feedback):

(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
fields, QgsWkbTypes.LineString, network.sourceCrs())
if sink is None:
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

directionField = -1
if directionFieldName:

0 comments on commit 249dca7

Please sign in to comment.
You can’t perform that action at this time.