protected override int ExecuteCore(IRow row, int tableIndex) { using ( SegmentSlopeAngleProvider segmentSlopeAngleProvider = GetSegmentSlopeAngleProvider((IFeature)row)) { var errorCount = 0; var errorSegments = new List <SegmentSlopeAngle>(); double maxAngle = 0; double maxZDifference = 0; SegmentSlopeAngle segmentSlopeAngle; while ((segmentSlopeAngle = segmentSlopeAngleProvider.ReadSegmentSlopeAngle()) != null) { double slopeAngle = segmentSlopeAngle.SlopeAngle; if (slopeAngle > _limitRad) { continue; } if (slopeAngle <= _toleranceRad) { continue; } if (errorSegments.Count > 0 && (errorSegments[0].PartIndex != segmentSlopeAngle.PartIndex || errorSegments[errorSegments.Count - 1].SegmentIndex != segmentSlopeAngle.SegmentIndex - 1)) { errorCount += ReportError(segmentSlopeAngleProvider, errorSegments, maxAngle, maxZDifference, row); errorSegments.Clear(); maxAngle = 0; maxZDifference = 0; } errorSegments.Add(segmentSlopeAngle); maxAngle = Math.Max(slopeAngle, maxAngle); maxZDifference = Math.Max(segmentSlopeAngle.ZDifference, maxZDifference); } if (errorSegments.Count > 0) { errorCount += ReportError(segmentSlopeAngleProvider, errorSegments, maxAngle, maxZDifference, row); } return(errorCount); } }
private int ReportError( [NotNull] SegmentSlopeAngleProvider segmentSlopeAngleProvider, [NotNull] List <SegmentSlopeAngle> errorSegments, double maxAngleRad, double maxZDifference, [NotNull] IRow row) { int part = errorSegments[0].PartIndex; int startSegmentIndex = errorSegments[0].SegmentIndex; int endSegmentIndex = errorSegments[errorSegments.Count - 1].SegmentIndex; IPolyline line = segmentSlopeAngleProvider.GetSubpart(part, startSegmentIndex, endSegmentIndex); return(ReportError(row, line, maxAngleRad, maxZDifference)); }