예제 #1
0
        private SliverAreaProvider GetSliverAreaProvider([NotNull] IFeature feature)
        {
            Assert.ArgumentNotNull(feature, nameof(feature));

            if (_useFields)
            {
                return(new FromFieldsSliverAreaProvider(feature, _areaFieldIndex,
                                                        _lengthFieldIndex));
            }

            if (feature.Shape is IPolygon)
            {
                return(new PolygonRingsSliverAreaProvider((IPolygon)feature.Shape));
            }

            if (feature.Shape is IMultiPatch)
            {
                var indexedMultiPatchFeature = feature as IIndexedMultiPatchFeature;

                IIndexedMultiPatch indexedMultiPatch =
                    indexedMultiPatchFeature != null
                                                ? indexedMultiPatchFeature.IndexedMultiPatch
                                                : QaGeometryUtils.CreateIndexedMultiPatch((IMultiPatch)feature.Shape);

                return(new MultiPatchPartsSliverAreaProvider(indexedMultiPatch));
            }

            throw new InvalidOperationException("feature is unhandled");
        }
예제 #2
0
        private MeanSegmentLengthProvider GetMeanSegmentLengthProvider(IFeature row)
        {
            MeanSegmentLengthProvider provider;

            if (!_is3D && row.Shape is ICurve)
            {
                provider = new CurveMeanSegmentsLengthProvider((ICurve)row.Shape, _perPart);
            }
            else
            {
                var segmentsFeature = row as IIndexedSegmentsFeature;
                if (segmentsFeature != null && segmentsFeature.AreIndexedSegmentsLoaded)
                {
                    provider = new IndexedMeanLengthProvider(row.Shape,
                                                             segmentsFeature.IndexedSegments,
                                                             _perPart, _is3D);
                }
                else if (row.Shape is IMultiPatch)
                {
                    IIndexedSegments indexedSegments =
                        QaGeometryUtils.CreateIndexedMultiPatch((IMultiPatch)row.Shape);
                    provider = new IndexedMeanLengthProvider(row.Shape, indexedSegments, _perPart,
                                                             _is3D);
                }
                else
                {
                    provider = new SegmentCollectionMeanLengthProvider(
                        (ISegmentCollection)row.Shape,
                        _perPart, _is3D);
                }
            }

            return(provider);
        }
예제 #3
0
        private SegmentLengthProvider GetSegmentLengthProvider(IFeature row)
        {
            SegmentLengthProvider provider;

            var segmentsFeature = row as IIndexedSegmentsFeature;

            if (segmentsFeature != null && segmentsFeature.AreIndexedSegmentsLoaded)
            {
                provider = new IndexedSegmentsLengthProvider(segmentsFeature.IndexedSegments,
                                                             _is3D);
            }
            else if (row.Shape is IMultiPatch)
            {
                IIndexedSegments indexedSegments =
                    QaGeometryUtils.CreateIndexedMultiPatch((IMultiPatch)row.Shape);
                provider = new IndexedSegmentsLengthProvider(indexedSegments, _is3D);
            }
            else
            {
                provider = new SegmentCollectionLengthProvider((ISegmentCollection)row.Shape,
                                                               _is3D);
            }

            return(provider);
        }
예제 #4
0
        private static IIndexedMultiPatch GetIndexedMultiPatch([NotNull] IFeature feature)
        {
            var indexedMultiPatchFeature = feature as IIndexedMultiPatchFeature;

            return(indexedMultiPatchFeature != null
                                       ? indexedMultiPatchFeature.IndexedMultiPatch
                                       : QaGeometryUtils.CreateIndexedMultiPatch(
                       (IMultiPatch)feature.Shape));
        }
예제 #5
0
        private static VerticalFaceProvider GetPlaneProvider([NotNull] IFeature feature)
        {
            var indexedMultiPatchFeature = feature as IIndexedMultiPatchFeature;

            IIndexedMultiPatch indexedMultiPatch =
                indexedMultiPatchFeature?.IndexedMultiPatch ??
                QaGeometryUtils.CreateIndexedMultiPatch((IMultiPatch)feature.Shape);

            return(new PartVerticalFaceProvider(indexedMultiPatch));
        }
예제 #6
0
        private HeightSegmentPairProvider GetHeightSegmentPairProvider(
            [NotNull] IFeature feature)
        {
            var indexedFeature            = feature as IIndexedMultiPatchFeature;
            IIndexedMultiPatch multiPatch = indexedFeature?.IndexedMultiPatch ??
                                            QaGeometryUtils.CreateIndexedMultiPatch(
                (IMultiPatch)feature.Shape);

            return(new MultipatchHeightSegmentPairProvider(_nearHeight, multiPatch));
        }
예제 #7
0
            protected IIndexedMultiPatch GetIndexedMultipatch(
                [NotNull] IFeature multiPatchFeature)
            {
                Assert.ArgumentNotNull(multiPatchFeature, nameof(multiPatchFeature));

                var indexedMultiPatchFeature =
                    multiPatchFeature as IIndexedMultiPatchFeature;

                IIndexedMultiPatch result =
                    indexedMultiPatchFeature != null && _alternateSpatialReference == null
                                                ? indexedMultiPatchFeature.IndexedMultiPatch
                                                : QaGeometryUtils.CreateIndexedMultiPatch(
                        GetMultiPatch(multiPatchFeature));

                return(result);
            }
예제 #8
0
            protected override IIndexedMultiPatch GetAdaptedMultiPatch()
            {
                IMultiPatch multiPatch       = GetMultiPatch(_multiPatchFeature);
                var         parts            = (IGeometryCollection)multiPatch;
                var         outerRingIndexes = new List <int>();

                int partCount = parts.GeometryCount;

                for (int partIndex = 0; partIndex < partCount; partIndex++)
                {
                    var ring = parts.Geometry[partIndex] as IRing;
                    if (ring == null)
                    {
                        continue;
                    }

                    bool isBeginning = false;
                    multiPatch.GetRingType(ring, ref isBeginning);

                    if (!isBeginning)
                    {
                        continue;
                    }

                    int followingRings = multiPatch.FollowingRingCount[ring];
                    if (followingRings <= 0)
                    {
                        continue;
                    }

                    if (!IsHorizontal(ring))
                    {
                        continue;
                    }

                    outerRingIndexes.Add(partIndex);
                }

                if (outerRingIndexes.Count > 0)
                {
                    IMultiPatch adapted =
                        CopyWithConvertedInnerRings(multiPatch, outerRingIndexes);
                    return(QaGeometryUtils.CreateIndexedMultiPatch(adapted));
                }

                return(GetIndexedMultipatch(_multiPatchFeature));
            }
예제 #9
0
        public void IsPlaneVerticalTest()
        {
            var construction = new MultiPatchConstruction();

            construction.StartRing(0, 0, 0)
            .Add(5, 0, 0)
            .Add(5, 0, 5)
            .Add(0, 0, 5);
            IMultiPatch        multiPatch        = construction.MultiPatch;
            IIndexedMultiPatch indexedMultiPatch =
                QaGeometryUtils.CreateIndexedMultiPatch(multiPatch);

            Plane     plane  = QaGeometryUtils.CreatePlane(indexedMultiPatch.GetSegments());
            WKSPointZ normal = plane.GetNormalVector();

            Assert.AreEqual(0, normal.Z);
        }
예제 #10
0
        public void CanProjectToPlaneTest()
        {
            var construction = new MultiPatchConstruction();

            construction.StartRing(0, 0, 0)
            .Add(5, 0, 0)
            .Add(5, 0, 5)
            .Add(0, 0, 5);
            IMultiPatch        multiPatch        = construction.MultiPatch;
            IIndexedMultiPatch indexedMultiPatch =
                QaGeometryUtils.CreateIndexedMultiPatch(multiPatch);

            IList <Pnt>       points    = QaGeometryUtils.GetPoints(indexedMultiPatch.GetSegments());
            Plane             plane     = QaGeometryUtils.CreatePlane(points);
            IList <WKSPointZ> projected = QaGeometryUtils.ProjectToPlane(plane, points);

            ValidateForm(indexedMultiPatch, projected);
        }
예제 #11
0
        private ParallelSegmentPairProvider GetParallelSegmentPairProvider(
            [NotNull] IFeature feature)
        {
            var indexedFeature            = feature as IIndexedMultiPatchFeature;
            IIndexedMultiPatch multiPatch = indexedFeature?.IndexedMultiPatch ??
                                            QaGeometryUtils.CreateIndexedMultiPatch(
                (IMultiPatch)feature.Shape);

            if (_perRing)
            {
                return(new RingParallelSegmentPairProvider(_nearAngleRad,
                                                           _horizontalToleranceRad,
                                                           _xyResolution, multiPatch));
            }

            return(new MultipatchParallelSegmentPairProvider(_nearAngleRad,
                                                             _horizontalToleranceRad,
                                                             _xyResolution, multiPatch));
        }
        private static NearFeatureCoincidence CreateCoincidenceChecker(
            [NotNull] IFeature feature)
        {
            var indexedSegmentsFeature = feature as IIndexedSegmentsFeature;

            if (indexedSegmentsFeature != null)
            {
                return(new IndexedSegmentsNearFeatureCoincidence(
                           feature, indexedSegmentsFeature.IndexedSegments));
            }

            IGeometry        shape     = feature.Shape;
            esriGeometryType shapeType = shape.GeometryType;

            if (shapeType == esriGeometryType.esriGeometryPolygon ||
                shapeType == esriGeometryType.esriGeometryPolyline)
            {
                var indexedPolycurve = new IndexedPolycurve((IPointCollection4)shape);
                return(new IndexedSegmentsNearFeatureCoincidence(feature, indexedPolycurve));
            }

            if (shapeType == esriGeometryType.esriGeometryMultiPatch)
            {
                IIndexedMultiPatch indexedMultiPatch =
                    QaGeometryUtils.CreateIndexedMultiPatch((IMultiPatch)shape);
                return(new IndexedSegmentsNearFeatureCoincidence(feature,
                                                                 indexedMultiPatch));
            }

            if (shapeType == esriGeometryType.esriGeometryPoint)
            {
                return(new PointNearFeatureCoincidence(feature, (IPoint)shape));
            }

            if (shapeType == esriGeometryType.esriGeometryMultipoint)
            {
                return(new MultipointNearFeatureCoincidence(feature, (IMultipoint)shape));
            }

            throw new InvalidOperationException("Unhandled geometry type: " +
                                                feature.Shape.GeometryType);
        }
예제 #13
0
        private static SegmentSlopeAngleProvider GetSegmentSlopeAngleProvider(
            [NotNull] IFeature row)
        {
            var segmentsFeature = row as IIndexedSegmentsFeature;

            if (segmentsFeature != null && segmentsFeature.AreIndexedSegmentsLoaded)
            {
                return(new IndexedSegmentsSlopeAngleProvider(segmentsFeature.IndexedSegments));
            }

            var multiPatch = row.Shape as IMultiPatch;

            if (multiPatch != null)
            {
                return(new IndexedSegmentsSlopeAngleProvider(
                           QaGeometryUtils.CreateIndexedMultiPatch(multiPatch)));
            }

            return(new SegmentCollectionSlopeAngleProvider((ISegmentCollection)row.Shape));
        }
        private PerpendicularSegmentsProvider GetPerpendicularSegmentsProvider(
            IFeature feature)
        {
            var indexedFeature            = feature as IIndexedMultiPatchFeature;
            IIndexedMultiPatch multiPatch = indexedFeature?.IndexedMultiPatch ??
                                            QaGeometryUtils.CreateIndexedMultiPatch(
                (IMultiPatch)feature.Shape);

            if (!_connectedOnly)
            {
                return(new AllPerpendicularSegmentsProvider(_nearAngleRad,
                                                            _horizontalToleranceRad,
                                                            _xyResolution, multiPatch));
            }

            return(new ConnectedPerpendicularSegmentsProvider(_nearAngleRad,
                                                              _horizontalToleranceRad,
                                                              _connectedTolerance,
                                                              _xyResolution, multiPatch));
        }
예제 #15
0
        public void CanGetInnerPartIndexesOuterRingRing()
        {
            var construction = new MultiPatchConstruction();

            construction.StartOuterRing(5, 4, 0).Add(-5, 4, 0).Add(-5, -4, 0).Add(5, -4, 0)
            .StartRing(4, 3, 0).Add(-4, 3, 0).Add(-4, -3, 0).Add(4, -3, 0);

            IMultiPatch multiPatch = construction.MultiPatch;

            ((IGeometry)multiPatch).SpatialReference =
                SpatialReferenceUtils.CreateSpatialReference(
                    (int)esriSRProjCS2Type.esriSRProjCS_CH1903Plus_LV95);

            IIndexedMultiPatch indexedMultiPatch =
                QaGeometryUtils.CreateIndexedMultiPatch(multiPatch);

            List <int> innerPartIndexes =
                MultiPatchUtils.GetInnerRingPartIndexes(indexedMultiPatch, 0);

            Assert.AreEqual(0, innerPartIndexes.Count);
        }