I am trying to modify Z or M values of a polyline that has nonlinear segments, such as circular arcs, eliptical arcs, and bezier curves, without converting the line to linear segments. Densifying the curve into line segments is not an option. My code below seems to work until I try to update the feature shape with the modified geometry. At that point ArcMap crashes (I know bad error handling, but an error clearly is occurring the first time that code section runs and I need to overcome it). The feature I am trying to modify is an ellipse with one part and one segment, just to see if I can get this to work at all. I'll worry about multiple parts and segments later. Any ideas on how to properly use the ISegmentCollection or possibly the IGeometryCollection objects to achieve what I want? There is very little documentation of these objects.
' Assume I already have a valid Polyline Featurelayer that is Z and M Aware called pFLayer Dim pFC As ESRI.ArcGIS.geodatabase.IFeatureClass pFC = pFLayer.FeatureClass ' Get FeatureClass of FeatureLayer Dim pFCursor As ESRI.ArcGIS.Geodatabase.IFeatureCursor pFCursor = pFC.Update(Nothing, False) ' Create an UpdateCursor on FeatureClass Dim pFeat As ESRI.ArcGIS.Geodatabase.IFeature pFeat = pFCursor.NextFeature ' Get First Feature Dim pPolyline As IPolyline = pFeat.ShapeCopy Dim pSegColl As ESRI.ArcGIS.Geometry.ISegmentCollection Dim Nonlinear As Boolean = False Dim SegCount As Long = 0 Dim pInPoint As IPoint ' Current Point to process Dim distAlong As Double ' 3D Distance along the curve Dim j As Long = 0 Dim pSegment As ISegment Dim NewSegments As ESRI.ArcGIS.Geometry.ISegmentCollection = New Polyline Do While Not pFeat Is Nothing pPolyline = New Polyline pPolyline.SpatialReference = pFeat.Shape.SpatialReference ' Make sure Polyline has Spatial Reference pPolyline = pFeat.Shape ' Assign geometry to Polyline pSegColl = pPolyline pSegColl.HasNonLinearSegments(Nonlinear) If Not Nonlinear Then ' All Segments are linear and code works without a problem so it is not included Else ' One or more segments of the polyline is Nonlinear SegCount = pSegColl.SegmentCount NewSegments = New Polyline distAlong = 0 For j = 0 To SegCount - 1 ' read all segments pSegment = pSegColl.Segment(j) pInPoint = New Point pInPoint.SpatialReference = pFeat.Shape.SpatialReference pInPoint = pSegment.FromPoint pInPoint.M = distAlong pSegment.FromPoint = pInPoint distAlong = Math.Sqrt(pSegment.Length ^ 2 + (pSegment.FromPoint.Z - pSegment.ToPoint.Z) ^ 2) + distAlong pInPoint = New Point pInPoint.SpatialReference = pFeat.Shape.SpatialReference pInPoint = pSegment.ToPoint pInPoint.M = distAlong pSegment.ToPoint = pInPoint ' Modify ToPoint to add M value MsgBox("Segment To Point M Value is " & pSegment.ToPoint.M & " pInPoint M Value is " & pInPoint.M & " and Distance Along is " & distAlong) ' Verify everything updated NewSegments.AddSegment(pSegment) ' Append segment to another segmentCollection Next j pPolyline.SpatialReference = pFeat.Shape.SpatialReference pPolyline = CType(NewSegments, ESRI.ArcGIS.Geometry.Polyline) If pPolyline Is Nothing Then MsgBox("Bad Segments to Polyline") Else MsgBox("To Point M Value is " & NewSegments.Segment(0).ToPoint.M & " Geometrytype is " & NewSegments.Segment(0).GeometryType) ' Verify that NewSegment is a curve GeometryType still. It says it is an Ellipse Geometry with updated M values and everything seems to be working. End If pFeat.Shape = NewSegments ' Code causes ArcMap to crash here on the first nonlinear feature. Also tried "pFeat.Shape = pPolyline" with same result pFCursor.UpdateFeature(pFeat) ' Update the cursor End If pFeat = pFCursor.NextFeature pPolyline = Nothing Loop