/// <summary> /// Provides solve operation. /// </summary> /// <param name="request">Request to solver.</param> /// <param name="cancelTracker">Cancel tracker.</param> /// <returns>Function returning BatchRouteSolveResponse.</returns> /// <exception cref="ESRI.ArcLogistics.Routing.RouteException">If get /// directions operation error occurs.</exception> public Func <SolveOperationResult <BatchRouteSolveRequest> > Solve( BatchRouteSolveRequest request, ICancelTracker cancelTracker) { Debug.Assert(request != null); Debug.Assert(request.Requests != null); try { List <RouteSolveResponse> responses = new List <RouteSolveResponse>(); foreach (RouteSolveRequest req in request.Requests) { responses.Add(_context.RouteService.Solve(req, RouteRequestBuilder.JsonTypes)); } var response = new BatchRouteSolveResponse(responses.ToArray()); return(() => new SolveOperationResult <BatchRouteSolveRequest> { SolveResult = _ProcessSolveResult(response), NextStepOperation = null, }); } catch (RestException e) { throw SolveHelper.ConvertServiceException( Properties.Messages.Error_GetDirections, e); } }
/// <summary> /// Processing results of solve operation. /// </summary> /// <param name="batchResponse">Response from solver.</param> /// <returns>SolveResult.</returns> /// <exception cref="RouteException">In case of invalid GPFeature mapping. /// </exception> private SolveResult _ProcessSolveResult(BatchRouteSolveResponse batchResponse) { Debug.Assert(batchResponse != null); Debug.Assert(batchResponse.Responses != null); List <RouteMessage> messages = new List <RouteMessage>(); foreach (RouteSolveResponse resp in batchResponse.Responses) { if (resp.Directions != null && resp.Directions.Length > 0) { // We use one request per route, so we get first directions element. RouteDirections routeDirs = resp.Directions[0]; // Route id. Guid routeId = new Guid(routeDirs.RouteName); // Find route. Route route = _FindRoute(routeId); if (route == null) { throw new RouteException(Properties.Messages.Error_InvalidGPFeatureMapping); } // Set directions. _SetDirections(route.Stops, routeDirs.Features); } if (resp.Messages != null) { messages.AddRange(resp.Messages); } } return(_CreateSolveResult(messages.ToArray())); }