private static void PackReshapeResponseFeatures(
            AdvancedReshapeResponse result,
            [NotNull] IEnumerable <IFeature> storedFeatures,
            [NotNull] IDictionary <IGeometry, NotificationCollection> reshapedGeometries,
            bool openJawReshapeOccurred,
            bool notificationIsWarning)
        {
            foreach (IFeature storedFeature in storedFeatures)
            {
                IFeature  feature     = storedFeature;
                IGeometry newGeometry = storedFeature.Shape;

                var resultFeature = new ResultObjectMsg();

                GdbObjectMsg resultFeatureMsg =
                    ProtobufGdbUtils.ToGdbObjectMsg(feature, newGeometry,
                                                    storedFeature.Class.ObjectClassID);

                resultFeature.Update = resultFeatureMsg;

                if (reshapedGeometries.ContainsKey(newGeometry) &&
                    (reshapedGeometries[newGeometry] != null))
                {
                    foreach (INotification notification in reshapedGeometries[newGeometry])
                    {
                        resultFeature.Notifications.Add(notification.Message);
                        resultFeature.HasWarning = notificationIsWarning;
                    }
                }

                result.ResultFeatures.Add(resultFeature);
            }
        }
Esempio n. 2
0
        private static GdbObjectReference GetOriginalGdbObjectReference(
            [NotNull] ResultObjectMsg resultObjectMsg)
        {
            Assert.ArgumentNotNull(nameof(resultObjectMsg));

            // TODO: long int!
            int classHandle, objectId;

            if (resultObjectMsg.FeatureCase == ResultObjectMsg.FeatureOneofCase.Insert)
            {
                InsertedObjectMsg insert = Assert.NotNull(resultObjectMsg.Insert);

                GdbObjRefMsg originalObjRefMsg = insert.OriginalReference;

                classHandle = originalObjRefMsg.ClassHandle;
                objectId    = originalObjRefMsg.ObjectId;
            }
            else
            {
                GdbObjectMsg updateMsg = Assert.NotNull(resultObjectMsg.Update);

                classHandle = updateMsg.ClassHandle;
                objectId    = updateMsg.ObjectId;
            }

            return(new GdbObjectReference(classHandle, objectId));
        }
Esempio n. 3
0
 public ResultFeature(Feature feature,
                      ResultObjectMsg resultFeatureMsg)
 {
     _resultFeatureMsg = resultFeatureMsg;
     Feature           = feature;
     ChangeType        = ToChangeType(_resultFeatureMsg.FeatureCase);
     HasWarningMessage = _resultFeatureMsg.HasWarning;
 }
Esempio n. 4
0
        private static int GetObjectId(ResultObjectMsg resultObjectMsg)
        {
            switch (resultObjectMsg.FeatureCase)
            {
            case ResultObjectMsg.FeatureOneofCase.Update:
                return(resultObjectMsg.Update.ObjectId);

            case ResultObjectMsg.FeatureOneofCase.Insert:
                return(resultObjectMsg.Insert.InsertedObject.ObjectId);

            case ResultObjectMsg.FeatureOneofCase.Delete:
                return(resultObjectMsg.Delete.ObjectId);

            default:
                return(-1);
            }
        }
        private static void AddNotification(IFeature feature, ResultObjectMsg featureMsg,
                                            Func <IFeature, IEnumerable <string> >
                                            notificationsForFeature,
                                            Func <IFeature, bool> warningForFeature)
        {
            if (notificationsForFeature != null)
            {
                foreach (string notification in notificationsForFeature(feature))
                {
                    featureMsg.Notifications.Add(notification);
                }
            }

            if (warningForFeature != null)
            {
                featureMsg.HasWarning = warningForFeature(feature);
            }
        }
Esempio n. 6
0
        private static IGeometry GetShape(ResultObjectMsg resultObjectMsg)
        {
            ShapeMsg shapeMsg;

            switch (resultObjectMsg.FeatureCase)
            {
            case ResultObjectMsg.FeatureOneofCase.Update:
                shapeMsg = resultObjectMsg.Update.Shape;
                break;

            case ResultObjectMsg.FeatureOneofCase.Insert:
                shapeMsg = resultObjectMsg.Insert.InsertedObject.Shape;
                break;

            default:
                return(null);
            }

            return(shapeMsg == null ? null : ProtobufGeometryUtils.FromShapeMsg(shapeMsg));
        }
Esempio n. 7
0
        public void CanCutAlong()
        {
            GetOverlappingPolygons(out GdbFeature sourceFeature, out GdbFeature targetFeature);

            CalculateCutLinesRequest calculationRequest =
                CreateCalculateCutLinesRequest(sourceFeature, targetFeature);

            CalculateCutLinesResponse calculateResponse =
                ChangeAlongServiceUtils.CalculateCutLines(calculationRequest, null);

            Assert.AreEqual(ReshapeAlongCurveUsability.CanReshape,
                            (ReshapeAlongCurveUsability)calculateResponse.ReshapeLinesUsability);

            AssertReshapeLineCount(calculateResponse.CutLines, 1, 1);

            IPolyline reshapeLine =
                (IPolyline)ProtobufGeometryUtils.FromShapeMsg(calculateResponse.CutLines[0].Path);

            Assert.NotNull(reshapeLine);
            Assert.AreEqual(1000, (reshapeLine).Length);

            //
            // Cutting
            //
            var applyRequest = new ApplyCutLinesRequest();

            applyRequest.CutLines.Add(calculateResponse.CutLines[0]);
            applyRequest.CalculationRequest     = calculationRequest;
            applyRequest.InsertVerticesInTarget = false;

            ApplyCutLinesResponse applyResponse =
                ChangeAlongServiceUtils.ApplyCutLines(applyRequest, null);

            Assert.AreEqual(2, applyResponse.ResultFeatures.Count);

            List <IGeometry> geometries = applyResponse.ResultFeatures.Select(GetShape).ToList();

            Assert.AreEqual(1000 * 1000, geometries.Sum(g => ((IArea)g).Area));

            ResultObjectMsg updateResultMsg =
                applyResponse.ResultFeatures.First(
                    r => r.FeatureCase == ResultObjectMsg.FeatureOneofCase.Update);

            GdbObjectReference updateObjRef =
                new GdbObjectReference(updateResultMsg.Update.ClassHandle,
                                       updateResultMsg.Update.ObjectId);

            Assert.AreEqual(new GdbObjectReference(sourceFeature), updateObjRef);

            IGeometry firstGeometry =
                ProtobufGeometryUtils.FromShapeMsg(updateResultMsg.Update.Shape);

            Assert.IsNotNull(firstGeometry);
            Assert.AreEqual(1000 * 1000 * 3 / 4, ((IArea)firstGeometry).Area);

            // Check the new reshape line:
            AssertReshapeLineCount(applyResponse.NewCutLines, 0, 0);

            Assert.AreEqual(ReshapeAlongCurveUsability.NoReshapeCurves,
                            (ReshapeAlongCurveUsability)applyResponse.CutLinesUsability);
        }
Esempio n. 8
0
        public void CanReshapeAlongInsertTargetVertices()
        {
            GetOverlappingPolygons(out GdbFeature sourceFeature, out GdbFeature targetFeature);

            CalculateReshapeLinesRequest calculationRequest =
                CreateCalculateReshapeLinesRequest(sourceFeature, targetFeature);

            CalculateReshapeLinesResponse calculateResponse =
                ChangeAlongServiceUtils.CalculateReshapeLines(calculationRequest, null);

            Assert.AreEqual((int)ReshapeAlongCurveUsability.CanReshape,
                            calculateResponse.ReshapeLinesUsability);
            AssertReshapeLineCount(calculateResponse.ReshapeLines, 2, 2);

            int insideLineIndex =
                GetInsideReshapeLineIndex(calculateResponse.ReshapeLines, sourceFeature.Shape);

            IPolyline insideLine =
                (IPolyline)ProtobufGeometryUtils.FromShapeMsg(
                    calculateResponse.ReshapeLines[insideLineIndex].Path);

            Assert.NotNull(insideLine);
            Assert.AreEqual(1000.0, insideLine.Length);

            //
            // Reshape the default side:
            //
            ApplyReshapeLinesRequest applyRequest = new ApplyReshapeLinesRequest();

            applyRequest.ReshapeLines.Add(calculateResponse.ReshapeLines[insideLineIndex]);
            applyRequest.CalculationRequest       = calculationRequest;
            applyRequest.InsertVerticesInTarget   = true;
            applyRequest.UseNonDefaultReshapeSide = false;

            ApplyReshapeLinesResponse applyResponse =
                ChangeAlongServiceUtils.ApplyReshapeLines(applyRequest, null);

            Assert.AreEqual(2, applyResponse.ResultFeatures.Count);

            ResultObjectMsg sourceResultMsg =
                applyResponse.ResultFeatures.First(
                    f => f.Update.ObjectId == sourceFeature.OID);

            IGeometry updatedSourceGeometry =
                ProtobufGeometryUtils.FromShapeMsg(sourceResultMsg.Update.Shape);

            Assert.IsNotNull(updatedSourceGeometry);
            Assert.AreEqual(1000 * 1000 * 3 / 4, ((IArea)updatedSourceGeometry).Area);

            ResultObjectMsg targetResultMsg =
                applyResponse.ResultFeatures.First(
                    f => f.Update.ObjectId == targetFeature.OID);

            IGeometry updatedTargetGeometry =
                ProtobufGeometryUtils.FromShapeMsg(targetResultMsg.Update.Shape);

            Assert.AreEqual(GeometryUtils.GetPointCount(targetFeature.Shape) + 2,
                            GeometryUtils.GetPointCount(updatedTargetGeometry));

            // Check the new reshape line:
            AssertReshapeLineCount(applyResponse.NewReshapeLines, 1, 1);
            Assert.AreEqual((int)ReshapeAlongCurveUsability.CanReshape,
                            applyResponse.ReshapeLinesUsability);
        }
        private static IList <ResultObjectMsg> GetResultFeatureMessages(
            [CanBeNull] ICollection <KeyValuePair <IFeature, IList <IFeature> > > insertsByOriginal,
            [CanBeNull] IEnumerable <IFeature> allResultFeatures,
            [CanBeNull] Func <IFeature, IEnumerable <string> > notificationsForFeature = null,
            [CanBeNull] Func <IFeature, bool> warningForFeature = null)
        {
            IList <ResultObjectMsg> ResultObjectMsgs = new List <ResultObjectMsg>();

            HashSet <IFeature> allInserts = new HashSet <IFeature>();

            if (insertsByOriginal != null)
            {
                foreach (KeyValuePair <IFeature, IList <IFeature> > kvp in insertsByOriginal)
                {
                    IList <IFeature> inserts  = kvp.Value;
                    IFeature         original = kvp.Key;

                    var originalRef = new GdbObjRefMsg
                    {
                        ClassHandle = original.Class.ObjectClassID,
                        ObjectId    = original.OID
                    };

                    foreach (IFeature insert in inserts)
                    {
                        allInserts.Add(insert);

                        var insertMsg =
                            new InsertedObjectMsg
                        {
                            InsertedObject    = ProtobufGdbUtils.ToGdbObjectMsg(insert),
                            OriginalReference = originalRef
                        };

                        var featureMsg = new ResultObjectMsg
                        {
                            Insert = insertMsg
                        };

                        AddNotification(insert, featureMsg, notificationsForFeature,
                                        warningForFeature);

                        ResultObjectMsgs.Add(featureMsg);
                    }
                }
            }

            if (allResultFeatures != null)
            {
                foreach (IFeature resultFeature in allResultFeatures)
                {
                    if (allInserts.Contains(resultFeature))
                    {
                        continue;
                    }

                    ResultObjectMsg updateMsg =
                        new ResultObjectMsg
                    {
                        Update = ProtobufGdbUtils.ToGdbObjectMsg(resultFeature)
                    };

                    AddNotification(resultFeature, updateMsg, notificationsForFeature,
                                    warningForFeature);

                    ResultObjectMsgs.Add(updateMsg);
                }
            }

            return(ResultObjectMsgs);
        }