public static ReshapeResult TryReshape( [NotNull] ReshapeGrpc.ReshapeGrpcClient rpcClient, [NotNull] IList <Feature> selectedFeatures, [NotNull] Polyline reshapeLine, [CanBeNull] IList <Feature> adjacentFeatures, bool allowOpenJawReshape, bool multiReshapeAsUnion, bool tryReshapeNonDefault, CancellationToken cancellationToken) { var allInputFeatures = new Dictionary <GdbObjectReference, Feature>(); AddInputFeatures(selectedFeatures, allInputFeatures); var request = CreateReshapeRequest( selectedFeatures, reshapeLine, adjacentFeatures, allowOpenJawReshape, multiReshapeAsUnion, tryReshapeNonDefault); request.AllowOpenJawReshape = true; // TODO: If the server is overwhelmed by requests, the calls block (and cannot even be cancelled) // Add a task scheduler mode that throws if no free thread is available immediately const int deadline = 2000; AdvancedReshapeResponse reshapeResultMsg = RpcCallUtils.Try( o => rpcClient.AdvancedReshape(request, o), cancellationToken, deadline, true); if (reshapeResultMsg == null) { return(null); } var result = new ReshapeResult { OpenJawReshapeHappened = reshapeResultMsg.OpenJawReshapeHappened, OpenJawIntersectionCount = reshapeResultMsg.OpenJawIntersectionCount, FailureMessage = reshapeResultMsg.WarningMessage }; if (reshapeResultMsg.ResultFeatures.Count == 0) { return(result); } foreach (ResultFeatureMsg resultFeatureMsg in reshapeResultMsg.ResultFeatures) { GdbObjectReference objRef = new GdbObjectReference( resultFeatureMsg.UpdatedFeature.ClassHandle, resultFeatureMsg.UpdatedFeature.ObjectId); Feature inputFeature = allInputFeatures[objRef]; var reshapeResultFeature = new ReshapeResultFeature(inputFeature, resultFeatureMsg); result.ResultFeatures.Add(reshapeResultFeature); } return(result); }
public static async Task <MapPoint> GetOpenJawReplacementPointAsync( [NotNull] ReshapeGrpc.ReshapeGrpcClient rpcClient, [NotNull] Feature polylineFeature, [NotNull] Polyline reshapeLine, bool useNonDefaultReshapeSide) { var request = new OpenJawReshapeLineReplacementRequest() { UseNonDefaultReshapeSide = useNonDefaultReshapeSide }; SpatialReference sr = await QueuedTaskUtils.Run( () => { Geometry geometryToReshape = polylineFeature.GetShape(); request.Feature = ProtobufConversionUtils.ToGdbObjectMsg( polylineFeature, geometryToReshape, true); request.ReshapePath = ProtobufConversionUtils.ToShapeMsg(reshapeLine); return(geometryToReshape.SpatialReference); }); // Not in a queued task (but it is still called multiple times because...) ShapeMsg pointMsg = rpcClient.GetOpenJawReshapeLineReplaceEndPoint(request); return(await QueuedTaskUtils.Run( () => (MapPoint)ProtobufConversionUtils.FromShapeMsg(pointMsg, sr))); }
public static ReshapeResult Reshape( [NotNull] ReshapeGrpc.ReshapeGrpcClient rpcClient, [NotNull] IList <Feature> selectedFeatures, [NotNull] Polyline reshapeLine, [CanBeNull] IList <Feature> adjacentFeatures, bool allowOpenJawReshape, bool multiReshapeAsUnion, bool tryReshapeNonDefault, CancellationToken cancellationToken) { var allInputFeatures = new Dictionary <GdbObjectReference, Feature>(); AddInputFeatures(selectedFeatures, allInputFeatures); if (adjacentFeatures != null) { AddInputFeatures(adjacentFeatures, allInputFeatures); } AdvancedReshapeRequest request = CreateReshapeRequest( selectedFeatures, reshapeLine, adjacentFeatures, allowOpenJawReshape, multiReshapeAsUnion, tryReshapeNonDefault); return(Reshape(rpcClient, request, allInputFeatures, cancellationToken)); }
private static ReshapeResult Reshape( [NotNull] ReshapeGrpc.ReshapeGrpcClient rpcClient, [NotNull] AdvancedReshapeRequest request, [NotNull] IReadOnlyDictionary <GdbObjectReference, Feature> allInputFeatures, CancellationToken cancellationToken) { request.AllowOpenJawReshape = true; const int deadlinePerFeature = 5000; AdvancedReshapeResponse reshapeResultMsg = RpcCallUtils.Try( o => rpcClient.AdvancedReshape(request, o), cancellationToken, deadlinePerFeature * request.Features.Count); if (reshapeResultMsg == null) { return(null); } var result = new ReshapeResult { OpenJawReshapeHappened = reshapeResultMsg.OpenJawReshapeHappened, OpenJawIntersectionCount = reshapeResultMsg.OpenJawIntersectionCount, FailureMessage = reshapeResultMsg.WarningMessage }; if (reshapeResultMsg.ResultFeatures.Count == 0) { return(result); } foreach (ResultFeatureMsg resultFeatureMsg in reshapeResultMsg.ResultFeatures) { GdbObjectReference objRef = new GdbObjectReference( resultFeatureMsg.UpdatedFeature.ClassHandle, resultFeatureMsg.UpdatedFeature.ObjectId); Feature inputFeature = allInputFeatures[objRef]; var reshapeResultFeature = new ReshapeResultFeature(inputFeature, resultFeatureMsg); result.ResultFeatures.Add(reshapeResultFeature); } return(result); }
protected override void ChannelOpenedCore(Channel channel) { RemoveOverlapsClient = new RemoveOverlapsGrpc.RemoveOverlapsGrpcClient(channel); ChangeAlongClient = new ChangeAlongGrpc.ChangeAlongGrpcClient(channel); ReshapeClient = new ReshapeGrpc.ReshapeGrpcClient(channel); }