public void CanGetPathSegmentsBetweenPoints() { const string xmlPath = @"<Path xsi:type='typens:Path' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:typens='http://www.esri.com/schemas/ArcGIS/10.1'><PointArray xsi:type='typens:ArrayOfPoint'><Point xsi:type='typens:PointN'><X>2744261.7537500001</X><Y>1201884.120000001</Y><SpatialReference xsi:type='typens:ProjectedCoordinateSystem'><WKT>PROJCS["CH1903+_LV95",GEOGCS["GCS_CH1903+",DATUM["D_CH1903+",SPHEROID["Bessel_1841",6377397.155,299.1528128]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Hotine_Oblique_Mercator_Azimuth_Center"],PARAMETER["False_Easting",2600000.0],PARAMETER["False_Northing",1200000.0],PARAMETER["Scale_Factor",1.0],PARAMETER["Azimuth",90.0],PARAMETER["Longitude_Of_Center",7.439583333333333],PARAMETER["Latitude_Of_Center",46.95240555555556],UNIT["Meter",1.0],AUTHORITY["EPSG",2056]]</WKT><XOrigin>-27386400</XOrigin><YOrigin>-32067900</YOrigin><XYScale>140996569.55187955</XYScale><ZOrigin>-100000</ZOrigin><ZScale>800</ZScale><MOrigin>-100000</MOrigin><MScale>10000</MScale><XYTolerance>0.0025000000000000001</XYTolerance><ZTolerance>0.012500000000000001</ZTolerance><MTolerance>0.001</MTolerance><HighPrecision>true</HighPrecision><WKID>2056</WKID><LatestWKID>2056</LatestWKID></SpatialReference></Point><Point xsi:type='typens:PointN'><X>2744255.8000000007</X><Y>1201848.4012500048</Y><SpatialReference xsi:type='typens:ProjectedCoordinateSystem'><WKT>PROJCS["CH1903+_LV95",GEOGCS["GCS_CH1903+",DATUM["D_CH1903+",SPHEROID["Bessel_1841",6377397.155,299.1528128]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Hotine_Oblique_Mercator_Azimuth_Center"],PARAMETER["False_Easting",2600000.0],PARAMETER["False_Northing",1200000.0],PARAMETER["Scale_Factor",1.0],PARAMETER["Azimuth",90.0],PARAMETER["Longitude_Of_Center",7.439583333333333],PARAMETER["Latitude_Of_Center",46.95240555555556],UNIT["Meter",1.0],AUTHORITY["EPSG",2056]]</WKT><XOrigin>-27386400</XOrigin><YOrigin>-32067900</YOrigin><XYScale>140996569.55187955</XYScale><ZOrigin>-100000</ZOrigin><ZScale>800</ZScale><MOrigin>-100000</MOrigin><MScale>10000</MScale><XYTolerance>0.0025000000000000001</XYTolerance><ZTolerance>0.012500000000000001</ZTolerance><MTolerance>0.001</MTolerance><HighPrecision>true</HighPrecision><WKID>2056</WKID><LatestWKID>2056</LatestWKID></SpatialReference></Point></PointArray></Path>"; var path = (IPath)GeometryUtils.FromXmlString(xmlPath); IPoint startPoint = path.FromPoint; IPoint endPoint = new PointClass(); path.QueryPoint(esriSegmentExtension.esriNoExtension, 2.1881204836952222, false, endPoint); // Not Z aware: Assert.IsFalse(GeometryUtils.IsZAware(path)); ICurve result = SegmentReplacementUtils.GetCurveBetween(startPoint, endPoint, path); Assert.IsFalse(GeometryUtils.IsZAware(result)); // Z-aware but not simple: // The input must be Z-aware and Z-simple GeometryUtils.MakeZAware(path); Assert.IsTrue(((IZAware)path).ZAware); Assert.IsFalse(((IZAware)path).ZSimple); result = SegmentReplacementUtils.GetCurveBetween(startPoint, endPoint, path); // result is also Z-aware and not Z-simple: Assert.IsTrue(GeometryUtils.IsZAware(result)); Assert.IsFalse(((IZAware)result).ZSimple); // Z aware and simple: GeometryUtils.SimplifyZ(path); Assert.IsTrue(((IZAware)path).ZAware); Assert.IsTrue(((IZAware)path).ZSimple); result = SegmentReplacementUtils.GetCurveBetween(startPoint, endPoint, path); // result is also Z-aware and Z-simple: Assert.IsTrue(GeometryUtils.IsZAware(result)); Assert.IsTrue(((IZAware)result).ZSimple); }