private async Task <bool> UpdateFeatures(List <Feature> selectedFeatures, List <CutSubcurve> cutSubcurves, CancelableProgressor progressor) { CancellationToken cancellationToken = progressor?.CancellationToken ?? new CancellationTokenSource().Token; ChangeAlongCurves newChangeAlongCurves; IList <Feature> targetFeatures = Assert.NotNull(_changeAlongCurves.TargetFeatures); List <ResultFeature> updatedFeatures = ChangeFeaturesAlong( selectedFeatures, targetFeatures, cutSubcurves, cancellationToken, out newChangeAlongCurves); _changeAlongCurves = newChangeAlongCurves; _feedback.Update(_changeAlongCurves); HashSet <long> editableClassHandles = MapUtils.GetLayers <BasicFeatureLayer>(MapView.Active, bfl => bfl.IsEditable) .Select(l => l.GetTable().Handle.ToInt64()).ToHashSet(); // Updates: Dictionary <Feature, Geometry> resultFeatures = updatedFeatures .Where(f => GdbPersistenceUtils.CanChange( f, editableClassHandles, RowChangeType.Update)) .ToDictionary(r => r.Feature, r => r.NewGeometry); // Inserts (in case of cut), grouped by original feature: Dictionary <Feature, IList <Geometry> > insertsByOriginal = updatedFeatures .Where(f => GdbPersistenceUtils.CanChange( f, editableClassHandles, RowChangeType.Insert)) .GroupBy(f => f.Feature, f => f.NewGeometry) .ToDictionary(g => g.Key, g => (IList <Geometry>)g.ToList()); // TODO //LogReshapeResults(result, selection.Count); var success = await GdbPersistenceUtils.SaveInOperationAsync( EditOperationDescription, resultFeatures, insertsByOriginal); return(success); }
//protected override void OnKeyUpCore(MapViewKeyEventArgs k) //{ // _msg.VerboseDebug("OnKeyUpCore"); // if (k.Key == _keyToggleNonDefaultSide) // { // _nonDefaultSideMode = ! _nonDefaultSideMode; // k.Handled = true; // } // else if (k.Key == Key.Space) // { // k.Handled = true; // } // base.OnKeyUpCore(k); //} //protected override async Task HandleKeyUpAsync(MapViewKeyEventArgs k) //{ // // At 2.5 this is never called (despite setting k.Handled = true above). // TODO: Test in 2.6/2.7 // try // { // if (k.Key == _keyToggleNonDefaultSide || // k.Key == Key.Space) // { // _updateFeedbackTask = UpdateFeedbackAsync(_nonDefaultSideMode); // await _updateFeedbackTask; // } // } // catch (Exception e) // { // _msg.Warn("Error generating preview", e); // } // finally // { // _updateFeedbackTask = null; // } //} protected override async Task <bool> OnEditSketchCompleteCoreAsync( Geometry sketchGeometry, EditingTemplate editTemplate, MapView activeView, CancelableProgressor cancelableProgressor = null) { _feedback.Clear(); // TODO: cancel all running background tasks... var polyline = (Polyline)sketchGeometry; List <Feature> selection; // Or allow selecting next feature already? SetCursor(Cursors.Wait); bool success = await QueuedTaskUtils.Run(async() => { selection = GetApplicableSelectedFeatures(activeView).ToList(); var potentiallyAffectedFeatures = GetAdjacentFeatures(selection, cancelableProgressor); // This timout should be enough even in extreme circumstances: int timeout = selection.Count * 10000; _cancellationTokenSource = new CancellationTokenSource(timeout); ReshapeResult result = MicroserviceClient.Reshape( selection, polyline, potentiallyAffectedFeatures, true, true, _nonDefaultSideMode, _cancellationTokenSource.Token); if (result == null) { return(false); } HashSet <long> editableClassHandles = MapUtils.GetLayers <BasicFeatureLayer>(MapView.Active, bfl => bfl.IsEditable) .Select(l => l.GetTable().Handle.ToInt64()).ToHashSet(); Dictionary <Feature, Geometry> resultFeatures = result.ResultFeatures .Where(r => GdbPersistenceUtils.CanChange( r, editableClassHandles, RowChangeType.Update)) .ToDictionary(r => r.Feature, r => r.NewGeometry); LogReshapeResults(result, selection.Count); success = await SaveAsync(resultFeatures); // At some point, hopefully, read-only operations on the CIM model can run in parallel await ToolUtils.FlashResultPolygonsAsync(activeView, resultFeatures); return(success); }); _nonDefaultSideMode = false; //if (!_advancedReshapeOptions.RemainInSketchMode) { StartSelectionPhase(); } return(success); // taskSave.Result; }
protected override bool SelectAndProcessDerivedGeometry( Dictionary <MapMember, List <long> > selection, Geometry sketch, CancelableProgressor progressor) { Assert.NotNull(_overlaps); Overlaps overlapsToRemove = SelectOverlaps(_overlaps, sketch); if (!overlapsToRemove.HasOverlaps()) { return(false); } IEnumerable <Feature> selectedFeatures = MapUtils.GetFeatures(selection); RemoveOverlapsResult result = MicroserviceClient.RemoveOverlaps( selectedFeatures, overlapsToRemove, _overlappingFeatures, progressor?.CancellationToken ?? new CancellationTokenSource().Token); var updates = new Dictionary <Feature, Geometry>(); var inserts = new Dictionary <Feature, IList <Geometry> >(); HashSet <long> editableClassHandles = MapUtils.GetLayers <BasicFeatureLayer>(MapView.Active, bfl => bfl.IsEditable) .Select(l => l.GetTable().Handle.ToInt64()).ToHashSet(); foreach (OverlapResultGeometries resultPerFeature in result.ResultsByFeature) { if (!GdbPersistenceUtils.CanChange(resultPerFeature.OriginalFeature, editableClassHandles, out string warning)) { _msg.WarnFormat("{0}: {1}", GdbObjectUtils.ToString(resultPerFeature.OriginalFeature), warning); continue; } updates.Add(resultPerFeature.OriginalFeature, resultPerFeature.UpdatedGeometry); if (resultPerFeature.InsertGeometries.Count > 0) { inserts.Add(resultPerFeature.OriginalFeature, resultPerFeature.InsertGeometries); } } if (result.TargetFeaturesToUpdate != null) { foreach (KeyValuePair <Feature, Geometry> kvp in result.TargetFeaturesToUpdate) { if (!GdbPersistenceUtils.CanChange(kvp.Key, editableClassHandles, out string warning)) { _msg.WarnFormat("{0}: {1}", GdbObjectUtils.ToString(kvp.Key), warning); continue; } updates.Add(kvp.Key, kvp.Value); } } bool saved = GdbPersistenceUtils.SaveInOperation("Remove overlaps", updates, inserts); var currentSelection = GetApplicableSelectedFeatures(MapView.Active).ToList(); CalculateDerivedGeometries(currentSelection, progressor); return(saved); }