private static Overlaps SelectOverlaps(Overlaps overlaps, Geometry sketch) { if (overlaps == null) { return(new Overlaps()); } int selectionTolerancePixels = 3; bool singlePick = ToolUtils.IsSingleClickSketch(sketch); if (singlePick) { sketch = ToolUtils.GetSinglePickSelectionArea(sketch, selectionTolerancePixels); } Overlaps result = overlaps.SelectNewOverlaps( o => o.GeometryType == GeometryType.Polyline && IsOverlapSelected(sketch, o, singlePick)); // in case of single pick the line has priority if (!result.HasOverlaps() || !singlePick) { result.AddGeometries(overlaps, g => g.GeometryType == GeometryType.Polygon && IsOverlapSelected(sketch, g, singlePick)); } return(result); }
private Overlaps SelectOverlaps(Overlaps overlaps, Geometry sketch) { if (overlaps == null) { return(new Overlaps()); } sketch = ToolUtils.SketchToSearchGeometry(sketch, GetSelectionTolerancePixels(), out bool singlePick); // in case of single pick the line has priority... Overlaps result = overlaps.SelectNewOverlaps( o => o.GeometryType == GeometryType.Polyline && ToolUtils.IsSelected(sketch, o, singlePick)); // ... over the polygon if (!result.HasOverlaps() || !singlePick) { result.AddGeometries(overlaps, g => g.GeometryType == GeometryType.Polygon && ToolUtils.IsSelected(sketch, g, singlePick)); } return(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> >(); foreach (var resultPerFeature in result.ResultsByFeature) { updates.Add(resultPerFeature.OriginalFeature, resultPerFeature.UpdatedGeometry); if (resultPerFeature.InsertGeometries.Count > 0) { inserts.Add(resultPerFeature.OriginalFeature, resultPerFeature.InsertGeometries); } } bool saved = GdbPersistenceUtils.SaveInOperation("Remove overlaps", updates, inserts); var currentSelection = SelectionUtils.GetSelectedFeatures(MapView.Active).ToList(); CalculateDerivedGeometries(currentSelection, progressor); return(saved); }
protected override bool CanUseDerivedGeometries() { return(_overlaps != null && _overlaps.HasOverlaps()); }
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); }