You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
680 lines
31 KiB
680 lines
31 KiB
using ESRI.ArcGIS.ADF; |
|
using ESRI.ArcGIS.esriSystem; |
|
using ESRI.ArcGIS.Geometry; |
|
using System; |
|
using System.Collections.Generic; |
|
using System.Linq; |
|
using System.Text; |
|
using System.Threading.Tasks; |
|
|
|
namespace KGIS.PlatformPlugin.Commands.Tools.TraceTool |
|
{ |
|
public static class PolylineEx |
|
{ |
|
public static IPolygon Buffer(this IPolyline pPolyline, double dLeftRadius, double dRightRadius, int nBufferType) |
|
{ |
|
IBufferConstruction bufferConstruction = new BufferConstructionClass(); |
|
IBufferConstructionProperties2 bufferConstructionProperties = bufferConstruction as IBufferConstructionProperties2; |
|
IDoubleArray doubleArray = new DoubleArrayClass(); |
|
bufferConstructionProperties.EndOption = (esriBufferConstructionEndEnum)nBufferType; |
|
if (dLeftRadius > 0.0 && dRightRadius == 0.0) |
|
{ |
|
bufferConstructionProperties.SideOption = esriBufferConstructionSideEnum.esriBufferLeft; |
|
doubleArray.Add(dLeftRadius); |
|
} |
|
else |
|
{ |
|
if (dLeftRadius == 0.0 && dRightRadius > 0.0) |
|
{ |
|
bufferConstructionProperties.SideOption = esriBufferConstructionSideEnum.esriBufferRight; |
|
doubleArray.Add(dRightRadius); |
|
} |
|
else |
|
{ |
|
bufferConstructionProperties.SideOption = esriBufferConstructionSideEnum.esriBufferFull; |
|
doubleArray.Add(dLeftRadius); |
|
doubleArray.Add(dRightRadius); |
|
} |
|
} |
|
bufferConstructionProperties.UnionOverlappingBuffers = true; |
|
bufferConstructionProperties.GenerateCurves = true; |
|
IGeometryCollection geometryCollection = new GeometryBagClass(); |
|
IGeometryCollection arg_A7_0 = geometryCollection; |
|
object value = System.Reflection.Missing.Value; |
|
object value2 = System.Reflection.Missing.Value; |
|
arg_A7_0.AddGeometry(pPolyline, ref value, ref value2); |
|
IGeometryCollection geometryCollection2 = new GeometryBagClass(); |
|
bufferConstruction.ConstructBuffersByDistances2(geometryCollection as IEnumGeometry, doubleArray, geometryCollection2); |
|
IGeometry geometry = geometryCollection2.get_Geometry(0); |
|
return geometry as IPolygon; |
|
} |
|
public static IPolygon BufferFlat(this IPolyline pPolyline, double dLeftRadius, double dRightRadius) |
|
{ |
|
IConstructCurve constructCurve = new PolylineClass(); |
|
IConstructCurve arg_1C_0 = constructCurve; |
|
double arg_1C_2 = -dLeftRadius; |
|
object value = System.Reflection.Missing.Value; |
|
object value2 = System.Reflection.Missing.Value; |
|
arg_1C_0.ConstructOffset(pPolyline, arg_1C_2, ref value, ref value2); |
|
IConstructCurve constructCurve2 = new PolylineClass(); |
|
IConstructCurve arg_3C_0 = constructCurve2; |
|
object value3 = System.Reflection.Missing.Value; |
|
object value4 = System.Reflection.Missing.Value; |
|
arg_3C_0.ConstructOffset(pPolyline, dRightRadius, ref value3, ref value4); |
|
(constructCurve2 as IPolyline).ReverseOrientation(); |
|
IPointCollection pointCollection = constructCurve as IPointCollection; |
|
IPointCollection newPoints = constructCurve2 as IPointCollection; |
|
pointCollection.AddPointCollection(newPoints); |
|
IPointCollection pointCollection2 = new PolygonClass(); |
|
pointCollection2.AddPointCollection(pointCollection); |
|
IPointCollection arg_8B_0 = pointCollection2; |
|
IPoint arg_8B_1 = pointCollection.get_Point(0); |
|
object value5 = System.Reflection.Missing.Value; |
|
object value6 = System.Reflection.Missing.Value; |
|
arg_8B_0.AddPoint(arg_8B_1, ref value5, ref value6); |
|
IPolygon polygon = pointCollection2 as IPolygon; |
|
polygon.SimplifyPreserveFromTo(); |
|
return polygon; |
|
} |
|
public static IPolyline AddVertex(this IPolyline pPolyline, IPoint iPoint) |
|
{ |
|
if (pPolyline == null) |
|
{ |
|
return null; |
|
} |
|
bool flag = false; |
|
int num = -1; |
|
int num2 = -1; |
|
pPolyline.SplitAtPoint(iPoint, true, false, out flag, out num, out num2); |
|
return pPolyline; |
|
} |
|
public static IPolygon ToPolygon(this IPolyline pPolyline) |
|
{ |
|
if (pPolyline == null || !pPolyline.IsClosed) |
|
{ |
|
return null; |
|
} |
|
ITopologicalOperator topologicalOperator = pPolyline as ITopologicalOperator; |
|
topologicalOperator.Simplify(); |
|
if (!pPolyline.IsClosed) |
|
{ |
|
return null; |
|
} |
|
ISegmentCollection segmentCollection = pPolyline as ISegmentCollection; |
|
if (segmentCollection != null) |
|
{ |
|
ISegmentCollection segmentCollection2 = new PolygonClass(); |
|
segmentCollection2.AddSegmentCollection(segmentCollection); |
|
IPolygon polygon = segmentCollection2 as IPolygon; |
|
polygon.SpatialReference = pPolyline.SpatialReference; |
|
polygon.SimplifyPreserveFromTo(); |
|
ITopologicalOperator topologicalOperator2 = polygon as ITopologicalOperator; |
|
topologicalOperator2.Simplify(); |
|
return polygon; |
|
} |
|
return null; |
|
} |
|
public static IPolyline CloseLine(this IPolyline pPolyline) |
|
{ |
|
if (pPolyline == null || pPolyline.IsEmpty) |
|
{ |
|
return null; |
|
} |
|
if (!pPolyline.IsClosed) |
|
{ |
|
ISegmentCollection segmentCollection = new RingClass(); |
|
segmentCollection.AddSegmentCollection(pPolyline as ISegmentCollection); |
|
IRing ring = segmentCollection as IRing; |
|
ring.Close(); |
|
ISegmentCollection segmentCollection2 = new PolylineClass(); |
|
segmentCollection2.AddSegmentCollection(ring as ISegmentCollection); |
|
return segmentCollection2 as IPolyline; |
|
} |
|
return pPolyline; |
|
} |
|
public static bool IsOnBoundary(this IPolyline pPolyline, System.Collections.Generic.List<IPolygon> listPolygon) |
|
{ |
|
if (pPolyline != null && listPolygon != null && listPolygon.Count >= 1) |
|
{ |
|
int count = listPolygon.Count; |
|
for (int i = 0; i < count; i++) |
|
{ |
|
if (pPolyline.IsOnBoundary(listPolygon[i])) |
|
{ |
|
return true; |
|
} |
|
} |
|
return false; |
|
} |
|
return false; |
|
} |
|
public static Tuple<IPoint, IPoint> GetOffsetPoints(this IPolyline pPolyline, int nCalcType, double dTolerance) |
|
{ |
|
if (pPolyline == null) |
|
{ |
|
return null; |
|
} |
|
IPoint point = new PointClass(); |
|
IPoint point2 = new PointClass(); |
|
IPointCollection pointCollection = pPolyline as IPointCollection; |
|
int longestLineSegmentStartPoint = pointCollection.GetLongestLineSegmentStartPoint(); |
|
if (longestLineSegmentStartPoint < 0) |
|
{ |
|
return null; |
|
} |
|
IPoint point3 = pointCollection.get_Point(longestLineSegmentStartPoint); |
|
IPoint point4 = pointCollection.get_Point(longestLineSegmentStartPoint + 1); |
|
IPoint point5 = new PointClass(); |
|
point5.PutCoords((point3.X + point4.X) / 2.0, (point3.Y + point4.Y) / 2.0); |
|
ILine line = new LineClass(); |
|
line.PutCoords(point3, point4); |
|
double angle = line.Angle; |
|
if (nCalcType == 0) |
|
{ |
|
point.X = point5.X - dTolerance * System.Math.Sin(angle); |
|
point.Y = point5.Y + dTolerance * System.Math.Cos(angle); |
|
point2.X = point5.X + dTolerance * System.Math.Sin(angle); |
|
point2.Y = point5.Y - dTolerance * System.Math.Cos(angle); |
|
} |
|
else |
|
{ |
|
if (nCalcType == 1) |
|
{ |
|
double num = 0.001; |
|
IProximityOperator proximityOperator = point3 as IProximityOperator; |
|
double num2 = proximityOperator.ReturnDistance(point4); |
|
if (num2 > 1E-06) |
|
{ |
|
num2 /= 2.0; |
|
} |
|
else |
|
{ |
|
num2 = dTolerance; |
|
} |
|
point.X = point3.X - num2 * System.Math.Sin(angle + num); |
|
point.Y = point3.Y + num2 * System.Math.Cos(angle + num); |
|
point2.X = point3.X + num2 * System.Math.Sin(angle - num); |
|
point2.Y = point3.Y - num2 * System.Math.Cos(angle - num); |
|
} |
|
} |
|
return new Tuple<IPoint, IPoint>(point, point2); |
|
} |
|
public static bool IsOnBoundary(this IPolyline pPolyline, IPolygon iPolygon) |
|
{ |
|
if (iPolygon != null && pPolyline != null) |
|
{ |
|
bool result = false; |
|
ITopologicalOperator topologicalOperator = iPolygon as ITopologicalOperator; |
|
if (topologicalOperator != null) |
|
{ |
|
IPolyline polyline = topologicalOperator.Boundary as IPolyline; |
|
if (polyline != null) |
|
{ |
|
IRelationalOperator relationalOperator = polyline as IRelationalOperator; |
|
if (relationalOperator != null) |
|
{ |
|
result = relationalOperator.Contains(pPolyline); |
|
} |
|
ComReleaser.ReleaseCOMObject(polyline); |
|
} |
|
} |
|
return result; |
|
} |
|
return false; |
|
} |
|
public static System.Collections.Generic.List<IPolyline> BreakLine(this IPolyline pPolyline, IPolyline pPolylineCutter) |
|
{ |
|
IRelationalOperator relationalOperator = pPolyline as IRelationalOperator; |
|
System.Collections.Generic.List<IPoint> selfIntersectPoints = pPolyline.GetSelfIntersectPoints(); |
|
if (!relationalOperator.Crosses(pPolylineCutter) && selfIntersectPoints.Count == 0) |
|
{ |
|
return null; |
|
} |
|
System.Collections.Generic.List<IPoint> intersectPoints = pPolyline.GetIntersectPoints(pPolylineCutter); |
|
if (intersectPoints.Count > 0) |
|
{ |
|
selfIntersectPoints.AddRange(intersectPoints); |
|
} |
|
int count = selfIntersectPoints.Count; |
|
System.Collections.Generic.List<double> list = new System.Collections.Generic.List<double>(); |
|
IPoint outPoint = new PointClass(); |
|
double item = 0.0; |
|
double num = 0.0; |
|
bool flag = false; |
|
for (int i = 0; i < count; i++) |
|
{ |
|
IPoint inPoint = selfIntersectPoints[i]; |
|
pPolyline.QueryPointAndDistance(esriSegmentExtension.esriExtendAtFrom, inPoint, false, outPoint, ref item, ref num, ref flag); |
|
list.Add(item); |
|
} |
|
list.Sort(); |
|
System.Collections.Generic.List<IPolyline> list2 = new System.Collections.Generic.List<IPolyline>(); |
|
ICurve curve = null; |
|
System.Collections.Generic.List<IPolyline> list3; |
|
for (int j = 0; j < count; j++) |
|
{ |
|
if (j == 0) |
|
{ |
|
pPolyline.GetSubcurve(0.0, list[j], false, out curve); |
|
} |
|
else |
|
{ |
|
pPolyline.GetSubcurve(list[j - 1], list[j], false, out curve); |
|
} |
|
(curve as IPolyline).SimplifyNetwork(); |
|
list3 = (curve as IPolyline).SplitPolyline(selfIntersectPoints); |
|
if (list3 != null && list3.Count != 0) |
|
{ |
|
list2.AddRange(list3); |
|
} |
|
else |
|
{ |
|
list2.Add(curve as IPolyline); |
|
} |
|
} |
|
pPolyline.GetSubcurve(list[count - 1], pPolyline.Length, false, out curve); |
|
list3 = (curve as IPolyline).SplitPolyline(selfIntersectPoints); |
|
if (list3 == null || list3.Count == 0) |
|
{ |
|
list2.Add(curve as IPolyline); |
|
} |
|
else |
|
{ |
|
list2.AddRange(list3); |
|
} |
|
return list2; |
|
} |
|
public static System.Collections.Generic.List<IPolyline> BreakLine(this IPolyline pPolyline, System.Collections.Generic.List<IPolyline> pListPolylineCutter) |
|
{ |
|
IRelationalOperator relationalOperator = pPolyline as IRelationalOperator; |
|
System.Collections.Generic.List<IPoint> selfIntersectPoints = pPolyline.GetSelfIntersectPoints(); |
|
foreach (IPolyline current in pListPolylineCutter) |
|
{ |
|
if (relationalOperator.Crosses(current)) |
|
{ |
|
System.Collections.Generic.List<IPoint> intersectPoints = pPolyline.GetIntersectPoints(current); |
|
if (intersectPoints.Count > 0) |
|
{ |
|
selfIntersectPoints.AddRange(intersectPoints); |
|
} |
|
} |
|
} |
|
int count = selfIntersectPoints.Count; |
|
if (count == 0) |
|
{ |
|
return null; |
|
} |
|
System.Collections.Generic.List<double> list = new System.Collections.Generic.List<double>(); |
|
IPoint outPoint = new PointClass(); |
|
double item = 0.0; |
|
double num = 0.0; |
|
bool flag = false; |
|
for (int i = 0; i < count; i++) |
|
{ |
|
IPoint inPoint = selfIntersectPoints[i]; |
|
pPolyline.QueryPointAndDistance(esriSegmentExtension.esriExtendAtFrom, inPoint, false, outPoint, ref item, ref num, ref flag); |
|
list.Add(item); |
|
} |
|
list.Sort(); |
|
System.Collections.Generic.List<IPolyline> list2 = new System.Collections.Generic.List<IPolyline>(); |
|
ICurve curve = null; |
|
System.Collections.Generic.List<IPolyline> list3; |
|
for (int j = 0; j < count; j++) |
|
{ |
|
if (j == 0) |
|
{ |
|
pPolyline.GetSubcurve(0.0, list[j], false, out curve); |
|
} |
|
else |
|
{ |
|
pPolyline.GetSubcurve(list[j - 1], list[j], false, out curve); |
|
} |
|
(curve as IPolyline).SimplifyNetwork(); |
|
list3 = (curve as IPolyline).SplitPolyline(selfIntersectPoints); |
|
if (list3 != null && list3.Count != 0) |
|
{ |
|
list2.AddRange(list3); |
|
} |
|
else |
|
{ |
|
list2.Add(curve as IPolyline); |
|
} |
|
} |
|
pPolyline.GetSubcurve(list[count - 1], pPolyline.Length, false, out curve); |
|
(curve as IPolyline).SimplifyNetwork(); |
|
list3 = (curve as IPolyline).SplitPolyline(selfIntersectPoints); |
|
if (list3 != null && list3.Count != 0) |
|
{ |
|
list2.AddRange(list3); |
|
} |
|
else |
|
{ |
|
list2.Add(curve as IPolyline); |
|
} |
|
return list2; |
|
} |
|
public static System.Collections.Generic.List<IPolyline> BreakSelfIntersectLine(this IPolyline pPolyline) |
|
{ |
|
ISegmentCollection segmentCollection = pPolyline as ISegmentCollection; |
|
int segmentCount = segmentCollection.SegmentCount; |
|
System.Collections.Generic.List<IPoint> list = new System.Collections.Generic.List<IPoint>(); |
|
for (int i = 0; i < segmentCount; i++) |
|
{ |
|
ISegment pSegment = segmentCollection.get_Segment(i); |
|
for (int j = i + 1; j < segmentCount; j++) |
|
{ |
|
ISegment pSegment2 = segmentCollection.get_Segment(j); |
|
System.Collections.Generic.List<IPoint> interserctPoint = pSegment.GetInterserctPoint(pSegment2); |
|
if (interserctPoint != null && interserctPoint.Count > 0) |
|
{ |
|
list.AddRange(interserctPoint); |
|
} |
|
} |
|
} |
|
System.Collections.Generic.List<IPolyline> list2 = new System.Collections.Generic.List<IPolyline>(); |
|
int count = list.Count; |
|
if (count == 0) |
|
{ |
|
list2.Add(pPolyline); |
|
return list2; |
|
} |
|
System.Collections.Generic.List<double> list3 = new System.Collections.Generic.List<double>(); |
|
IPoint outPoint = new PointClass(); |
|
double item = 0.0; |
|
double num = 0.0; |
|
bool flag = false; |
|
for (int k = 0; k < count; k++) |
|
{ |
|
IPoint inPoint = list[k]; |
|
pPolyline.QueryPointAndDistance(esriSegmentExtension.esriExtendAtFrom, inPoint, false, outPoint, ref item, ref num, ref flag); |
|
list3.Add(item); |
|
} |
|
list3.Sort(); |
|
ICurve curve = null; |
|
System.Collections.Generic.List<IPolyline> list4; |
|
for (int l = 0; l < count; l++) |
|
{ |
|
if (l == 0) |
|
{ |
|
pPolyline.GetSubcurve(0.0, list3[l], false, out curve); |
|
} |
|
else |
|
{ |
|
pPolyline.GetSubcurve(list3[l - 1], list3[l], false, out curve); |
|
} |
|
(curve as IPolyline).SimplifyNetwork(); |
|
list4 = (curve as IPolyline).SplitPolyline(list); |
|
if (list4 != null && list4.Count != 0) |
|
{ |
|
list2.AddRange(list4); |
|
} |
|
else |
|
{ |
|
list2.Add(curve as IPolyline); |
|
} |
|
} |
|
pPolyline.GetSubcurve(list3[count - 1], pPolyline.Length, false, out curve); |
|
(curve as IPolyline).SimplifyNetwork(); |
|
list4 = (curve as IPolyline).SplitPolyline(list); |
|
if (list4 != null && list4.Count != 0) |
|
{ |
|
list2.AddRange(list4); |
|
} |
|
else |
|
{ |
|
list2.Add(curve as IPolyline); |
|
} |
|
return list2; |
|
} |
|
public static System.Collections.Generic.List<IPoint> GetSelfIntersectPoints(this IPolyline pPolyline) |
|
{ |
|
ISegmentCollection segmentCollection = pPolyline as ISegmentCollection; |
|
int segmentCount = segmentCollection.SegmentCount; |
|
System.Collections.Generic.List<IPoint> list = new System.Collections.Generic.List<IPoint>(); |
|
for (int i = 0; i < segmentCount; i++) |
|
{ |
|
ISegment pSegment = segmentCollection.get_Segment(i); |
|
for (int j = i + 1; j < segmentCount; j++) |
|
{ |
|
ISegment pSegment2 = segmentCollection.get_Segment(j); |
|
System.Collections.Generic.List<IPoint> interserctPoint = pSegment.GetInterserctPoint(pSegment2); |
|
if (interserctPoint != null && interserctPoint.Count > 0) |
|
{ |
|
list.AddRange(interserctPoint); |
|
} |
|
} |
|
} |
|
return list; |
|
} |
|
public static System.Collections.Generic.List<IPoint> GetIntersectPoints(this IPolyline pPolyline, IPolyline pPolylineOther) |
|
{ |
|
ITopologicalOperator topologicalOperator = pPolyline as ITopologicalOperator; |
|
IRelationalOperator relationalOperator = pPolyline as IRelationalOperator; |
|
System.Collections.Generic.List<IPoint> list = new System.Collections.Generic.List<IPoint>(); |
|
if (relationalOperator.Crosses(pPolylineOther)) |
|
{ |
|
IGeometry geometry = topologicalOperator.Intersect(pPolylineOther, esriGeometryDimension.esriGeometry0Dimension); |
|
if (geometry != null && !geometry.IsEmpty) |
|
{ |
|
if (geometry is IPoint) |
|
{ |
|
list.Add(geometry as IPoint); |
|
} |
|
if (geometry is IMultipoint) |
|
{ |
|
IPointCollection pointCollection = geometry as IPointCollection; |
|
int pointCount = pointCollection.PointCount; |
|
for (int i = 0; i < pointCount; i++) |
|
{ |
|
IPoint item = pointCollection.get_Point(i); |
|
list.Add(item); |
|
} |
|
} |
|
} |
|
} |
|
return list; |
|
} |
|
public static System.Collections.Generic.List<IPolyline> SplitPolyline(this IPolyline pPolyline, System.Collections.Generic.List<IPoint> plistPoint) |
|
{ |
|
return pPolyline.SplitPolyline(plistPoint, 0.001); |
|
} |
|
public static System.Collections.Generic.List<IPolyline> SplitPolyline(this IPolyline pPolyline, System.Collections.Generic.List<IPoint> plistPoint, double dTolerance) |
|
{ |
|
IRelationalOperator relationalOperator = pPolyline as IRelationalOperator; |
|
System.Collections.Generic.List<double> list = new System.Collections.Generic.List<double>(); |
|
IPoint point = new PointClass(); |
|
double num = 0.0; |
|
double num2 = 0.0; |
|
bool flag = false; |
|
if (dTolerance == 0.0) |
|
{ |
|
dTolerance = 0.001; |
|
} |
|
foreach (IPoint current in plistPoint) |
|
{ |
|
if (!relationalOperator.Touches(current) && !relationalOperator.Disjoint(current)) |
|
{ |
|
pPolyline.QueryPointAndDistance(esriSegmentExtension.esriExtendAtFrom, current, false, point, ref num, ref num2, ref flag); |
|
if (num > dTolerance) |
|
{ |
|
list.Add(num); |
|
} |
|
} |
|
} |
|
list.Sort(); |
|
ComReleaser.ReleaseCOMObject(point); |
|
int count = list.Count; |
|
if (count == 0) |
|
{ |
|
return null; |
|
} |
|
System.Collections.Generic.List<IPolyline> list2 = new System.Collections.Generic.List<IPolyline>(); |
|
ICurve curve = null; |
|
for (int i = 0; i < count; i++) |
|
{ |
|
if (i != 0) |
|
{ |
|
pPolyline.GetSubcurve(list[i - 1], list[i], false, out curve); |
|
} |
|
else |
|
{ |
|
pPolyline.GetSubcurve(0.0, list[i], false, out curve); |
|
} |
|
(curve as IPolyline).SimplifyNetwork(); |
|
list2.Add(curve as IPolyline); |
|
} |
|
pPolyline.GetSubcurve(list[count - 1], pPolyline.Length, false, out curve); |
|
(curve as IPolyline).SimplifyNetwork(); |
|
list2.Add(curve as IPolyline); |
|
return list2; |
|
} |
|
public static IPolyline GetFromClosedPolyline(IPolyline pPolyline, int nPointIndex1, int nPointIndex2, bool bAlongPolyline = true) |
|
{ |
|
if (pPolyline != null && !pPolyline.IsEmpty && nPointIndex1 != nPointIndex2) |
|
{ |
|
IPolyline polyline = new PolylineClass(); |
|
polyline.SpatialReference = pPolyline.SpatialReference; |
|
ISegmentCollection segmentCollection = pPolyline as ISegmentCollection; |
|
ISegmentCollection segmentCollection2 = polyline as ISegmentCollection; |
|
int segmentCount = segmentCollection.SegmentCount; |
|
if (bAlongPolyline) |
|
{ |
|
if (nPointIndex1 >= nPointIndex2) |
|
{ |
|
if (nPointIndex1 > nPointIndex2) |
|
{ |
|
for (int i = nPointIndex1; i < segmentCount; i++) |
|
{ |
|
ISegmentCollection arg_70_0 = segmentCollection2; |
|
ISegment arg_70_1 = segmentCollection.get_Segment(i); |
|
object value = System.Reflection.Missing.Value; |
|
object value2 = System.Reflection.Missing.Value; |
|
arg_70_0.AddSegment(arg_70_1, ref value, ref value2); |
|
} |
|
for (int j = 0; j < nPointIndex2; j++) |
|
{ |
|
ISegmentCollection arg_A0_0 = segmentCollection2; |
|
ISegment arg_A0_1 = segmentCollection.get_Segment(j); |
|
object value3 = System.Reflection.Missing.Value; |
|
object value4 = System.Reflection.Missing.Value; |
|
arg_A0_0.AddSegment(arg_A0_1, ref value3, ref value4); |
|
} |
|
} |
|
} |
|
else |
|
{ |
|
for (int k = nPointIndex1; k < nPointIndex2; k++) |
|
{ |
|
ISegmentCollection arg_D5_0 = segmentCollection2; |
|
ISegment arg_D5_1 = segmentCollection.get_Segment(k); |
|
object value5 = System.Reflection.Missing.Value; |
|
object value6 = System.Reflection.Missing.Value; |
|
arg_D5_0.AddSegment(arg_D5_1, ref value5, ref value6); |
|
} |
|
} |
|
} |
|
else |
|
{ |
|
if (nPointIndex1 >= nPointIndex2) |
|
{ |
|
if (nPointIndex1 > nPointIndex2) |
|
{ |
|
for (int l = nPointIndex1 - 1; l >= nPointIndex2; l--) |
|
{ |
|
ISegment segment = segmentCollection.get_Segment(l); |
|
segment.ReverseOrientation(); |
|
ISegmentCollection arg_125_0 = segmentCollection2; |
|
ISegment arg_125_1 = segment; |
|
object value7 = System.Reflection.Missing.Value; |
|
object value8 = System.Reflection.Missing.Value; |
|
arg_125_0.AddSegment(arg_125_1, ref value7, ref value8); |
|
} |
|
} |
|
} |
|
else |
|
{ |
|
for (int m = nPointIndex1 - 1; m >= 0; m--) |
|
{ |
|
ISegment segment = segmentCollection.get_Segment(m); |
|
segment.ReverseOrientation(); |
|
ISegmentCollection arg_164_0 = segmentCollection2; |
|
ISegment arg_164_1 = segment; |
|
object value9 = System.Reflection.Missing.Value; |
|
object value10 = System.Reflection.Missing.Value; |
|
arg_164_0.AddSegment(arg_164_1, ref value9, ref value10); |
|
} |
|
for (int n = segmentCount - 1; n >= nPointIndex2; n--) |
|
{ |
|
ISegment segment = segmentCollection.get_Segment(n); |
|
segment.ReverseOrientation(); |
|
ISegmentCollection arg_1A1_0 = segmentCollection2; |
|
ISegment arg_1A1_1 = segment; |
|
object value11 = System.Reflection.Missing.Value; |
|
object value12 = System.Reflection.Missing.Value; |
|
arg_1A1_0.AddSegment(arg_1A1_1, ref value11, ref value12); |
|
} |
|
} |
|
} |
|
polyline.SimplifyNetwork(); |
|
return polyline; |
|
} |
|
return null; |
|
} |
|
public static IPolyline[] Explode(this IPolyline iPolyline) |
|
{ |
|
IPolyline[] array = null; |
|
IGeometryCollection geometryCollection = iPolyline as IGeometryCollection; |
|
int geometryCount = geometryCollection.GeometryCount; |
|
if (geometryCount != 1) |
|
{ |
|
if (geometryCount > 1) |
|
{ |
|
array = new IPolyline[geometryCount]; |
|
for (int i = 0; i < geometryCount; i++) |
|
{ |
|
IPolyline polyline = new PolylineClass(); |
|
polyline.SpatialReference = iPolyline.SpatialReference; |
|
IPath path = geometryCollection.get_Geometry(i) as IPath; |
|
(polyline as ISegmentCollection).AddSegmentCollection(path as ISegmentCollection); |
|
polyline.SimplifyNetwork(); |
|
(polyline as ITopologicalOperator).Simplify(); |
|
array[i] = polyline; |
|
} |
|
} |
|
return array; |
|
} |
|
return new IPolyline[] |
|
{ |
|
iPolyline |
|
}; |
|
} |
|
public static bool IsSelfIntersection(this IPolyline pPolyline) |
|
{ |
|
ITopologicalOperator3 topologicalOperator = pPolyline as ITopologicalOperator3; |
|
topologicalOperator.IsKnownSimple_2 = false; |
|
esriNonSimpleReasonEnum esriNonSimpleReasonEnum = esriNonSimpleReasonEnum.esriNonSimpleOK; |
|
return !topologicalOperator.get_IsSimpleEx(out esriNonSimpleReasonEnum) && esriNonSimpleReasonEnum == esriNonSimpleReasonEnum.esriNonSimpleSelfIntersections; |
|
} |
|
public static bool IsSimple(this IPolyline pPolyline) |
|
{ |
|
ITopologicalOperator3 topologicalOperator = pPolyline as ITopologicalOperator3; |
|
topologicalOperator.IsKnownSimple_2 = false; |
|
esriNonSimpleReasonEnum esriNonSimpleReasonEnum = esriNonSimpleReasonEnum.esriNonSimpleOK; |
|
return !topologicalOperator.get_IsSimpleEx(out esriNonSimpleReasonEnum) && esriNonSimpleReasonEnum == esriNonSimpleReasonEnum.esriNonSimpleOK; |
|
} |
|
public static esriNonSimpleReasonEnum GetNonSimpleReason(this IPolyline pPolyline) |
|
{ |
|
ITopologicalOperator3 topologicalOperator = pPolyline as ITopologicalOperator3; |
|
topologicalOperator.IsKnownSimple_2 = false; |
|
esriNonSimpleReasonEnum result = esriNonSimpleReasonEnum.esriNonSimpleOK; |
|
bool arg_18_0 = topologicalOperator.get_IsSimpleEx(out result); |
|
return result; |
|
} |
|
public static void RepairGeometry(this IPolyline pPolyline) |
|
{ |
|
ITopologicalOperator3 topologicalOperator = pPolyline as ITopologicalOperator3; |
|
topologicalOperator.IsKnownSimple_2 = false; |
|
topologicalOperator.Simplify(); |
|
} |
|
} |
|
}
|
|
|