예제 #1
0
        private static ChangeAlongCurves PopulateReshapeAlongCurves(
            [NotNull] IList <Feature> sourceFeatures,
            [NotNull] IList <Feature> targetFeatures,
            IEnumerable <ReshapeLineMsg> reshapeLineMsgs,
            ReshapeAlongCurveUsability cutSubcurveUsability)
        {
            IList <CutSubcurve> resultSubcurves = new List <CutSubcurve>();

            foreach (var reshapeLineMsg in reshapeLineMsgs)
            {
                CutSubcurve cutSubcurve = FromReshapeLineMsg(reshapeLineMsg);

                Assert.NotNull(cutSubcurve);

                if (reshapeLineMsg.Source != null)
                {
                    var sourceRef = new GdbObjectReference(reshapeLineMsg.Source.ClassHandle,
                                                           reshapeLineMsg.Source.ObjectId);

                    cutSubcurve.Source = sourceFeatures.First(f => sourceRef.References(f));
                }

                resultSubcurves.Add(cutSubcurve);
            }

            return(new ChangeAlongCurves(resultSubcurves, cutSubcurveUsability)
            {
                TargetFeatures = targetFeatures
            });
        }
예제 #2
0
        private static IList <CutSubcurve> CalculateReshapeLines(
            [NotNull] IList <IFeature> sourceFeatures,
            [NotNull] IList <IFeature> targetFeatures,
            [NotNull] CalculateReshapeLinesRequest request,
            [CanBeNull] ITrackCancel trackCancel,
            out ReshapeAlongCurveUsability usability)
        {
            Stopwatch watch = Stopwatch.StartNew();

            IEnvelope visibleExtent;
            ReshapeCurveFilterOptions filterOptions =
                GetLineFilterOptions(request.FilterOptions, out visibleExtent);

            TargetBufferOptions targetBufferOptions =
                GetTargetBufferOptions(request.TargetBufferOptions);

            IList <CutSubcurve> resultLines = new List <CutSubcurve>();

            usability = ChangeGeometryAlongUtils.CalculateReshapeCurves(
                sourceFeatures, targetFeatures, visibleExtent,
                request.Tolerance, targetBufferOptions, filterOptions,
                resultLines, trackCancel);

            _msg.DebugStopTiming(watch, "Calculated {0} reshape lines", resultLines.Count);

            return(resultLines);
        }
예제 #3
0
        public void Update([NotNull] ChangeAlongCurves newState)
        {
            _curveUsability = newState._curveUsability;

            _reshapeSubcurves.Clear();
            _reshapeSubcurves.AddRange(newState.ReshapeCutSubcurves);

            TargetFeatures = newState.TargetFeatures;
        }
예제 #4
0
        private static CalculateReshapeLinesResponse PackCalculateReshapeLinesResponse(
            ReshapeAlongCurveUsability usability,
            [NotNull] IList <CutSubcurve> resultLines)
        {
            Stopwatch watch = Stopwatch.StartNew();

            var result = new CalculateReshapeLinesResponse
            {
                ReshapeLinesUsability = (int)usability
            };

            foreach (CutSubcurve resultCurve in resultLines)
            {
                result.ReshapeLines.Add(ToReshapeLineMsg(resultCurve));
            }

            _msg.DebugStopTiming(
                watch, "Packed {0} reshape along calculation results into response",
                resultLines.Count);

            return(result);
        }
예제 #5
0
        private static IEnumerable <CutSubcurve> GetIndividualGeometriesReshapeCurves(
            [NotNull] IList <IFeature> sourceFeatures,
            [NotNull] IPolyline targetPolyline,
            [NotNull] ISubcurveCalculator subcurveCalculator)
        {
            var result = new List <CutSubcurve>();

            _msg.DebugFormat(
                "GetIndividualGeometriesReshapeCurves: calculating curves for {0} geometries..",
                sourceFeatures.Count);

            foreach (IFeature sourceFeature in sourceFeatures)
            {
                IGeometry sourceGeometry = sourceFeature.Shape;

                var individualResultList = new List <CutSubcurve>();
                ReshapeAlongCurveUsability individualResult =
                    subcurveCalculator.CalculateSubcurves(
                        sourceGeometry, targetPolyline, individualResultList, null);

                foreach (CutSubcurve subcurve in individualResultList)
                {
                    subcurve.Source = new GdbObjectReference(sourceFeature);
                }

                result.AddRange(individualResultList);

                _msg.VerboseDebugFormat(
                    "Individual geometry's subcurve calculation result: {0}",
                    individualResult);

                Marshal.ReleaseComObject(sourceGeometry);
            }

            return(result);
        }
예제 #6
0
 public ChangeAlongCurves([NotNull] IEnumerable <CutSubcurve> subcurves,
                          ReshapeAlongCurveUsability curveUsability)
 {
     _curveUsability   = curveUsability;
     _reshapeSubcurves = new List <CutSubcurve>(subcurves);
 }