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);
        }