Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
 private static async Task <bool> SaveAsync(IDictionary <Feature, Geometry> resultFeatures)
 {
     return(await GdbPersistenceUtils.SaveInOperationAsync(
                "Advanced reshape", resultFeatures));
 }
Ejemplo n.º 4
0
        //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;
        }
Ejemplo n.º 5
0
        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);
        }