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"); }
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); }
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); }
private static IIndexedMultiPatch GetIndexedMultiPatch([NotNull] IFeature feature) { var indexedMultiPatchFeature = feature as IIndexedMultiPatchFeature; return(indexedMultiPatchFeature != null ? indexedMultiPatchFeature.IndexedMultiPatch : QaGeometryUtils.CreateIndexedMultiPatch( (IMultiPatch)feature.Shape)); }
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)); }
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)); }
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); }
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)); }
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); }
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); }
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); }
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)); }
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); }