private void TrimPolyline(IFeature trimFeature, IFeature targetFeature, IPoint secondPoint) { IGeometry preservedGeom = null; IGeometry leftGeom = null; IGeometry rightGeom = null; double distanceOnCurve = 0; double nearestDistance = 0; bool isRightSide = false; IPoint outPoint = new PointClass(); IFeatureClass featureClass = trimFeature.Class as IFeatureClass; IDataset dataset = featureClass as IDataset; IWorkspaceEdit workspaceEdit = dataset.Workspace as IWorkspaceEdit; if (!(workspaceEdit.IsBeingEdited())) { return; } try { IGeometry targetGeometry = targetFeature.ShapeCopy; IGeometry trimGeometry = trimFeature.ShapeCopy; ITopologicalOperator2 topo = trimGeometry as ITopologicalOperator2; topo.IsKnownSimple_2 = false; topo.Simplify(); ITopologicalOperator2 topo2 = targetGeometry as ITopologicalOperator2; topo2.IsKnownSimple_2 = false; topo2.Simplify(); topo.Cut(targetGeometry as IPolyline, out leftGeom, out rightGeom); ICurve curve = targetGeometry as ICurve; curve.QueryPointAndDistance(esriSegmentExtension.esriNoExtension, secondPoint, false, outPoint, ref distanceOnCurve, ref nearestDistance, ref isRightSide); if (isRightSide) { preservedGeom = leftGeom; } else { preservedGeom = rightGeom; } workspaceEdit.StartEditOperation(); trimFeature.Shape = preservedGeom; trimFeature.Store(); workspaceEdit.StopEditOperation(); FlashGeometry(trimGeometry as IGeometry, 3, 10); } catch (Exception ex) { workspaceEdit.AbortEditOperation(); MessageBox.Show("线要素延伸失败!!" + ex.Message, "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } }
public void OnDblClick() { if (this._isLineStarted) { this._snapPoint = null; try { this._isLineStarted = false; this._linePoints.RemoveAll(); IPolyline other = this._feedback.Stop(); IFeatureSelection targetLayer = Editor.UniqueInstance.TargetLayer as IFeatureSelection; IEnumIDs iDs = targetLayer.SelectionSet.IDs; iDs.Reset(); IFeature srcFeature = Editor.UniqueInstance.TargetLayer.FeatureClass.GetFeature(iDs.Next()); if (other.SpatialReference != srcFeature.Shape.SpatialReference) { other.Project(srcFeature.Shape.SpatialReference); other.SpatialReference = srcFeature.Shape.SpatialReference; } ITopologicalOperator2 shape = srcFeature.Shape as ITopologicalOperator2; if (shape != null) { shape.IsKnownSimple_2 = false; shape.Simplify(); ITopologicalOperator2 operator2 = other as ITopologicalOperator2; operator2.IsKnownSimple_2 = false; operator2.Simplify(); IGeometry geometry = null; if (srcFeature.Shape.GeometryType == esriGeometryType.esriGeometryPolyline) { geometry = shape.Intersect(other, esriGeometryDimension.esriGeometry0Dimension); } else { geometry = shape.Intersect(other, esriGeometryDimension.esriGeometry1Dimension); } if (!geometry.IsEmpty) { IGeometry geometry2; IGeometry geometry3; shape.Cut(other, out geometry3, out geometry2); if ((geometry3 != null) && (geometry2 != null)) { (geometry3 as ITopologicalOperator).Simplify(); (geometry2 as ITopologicalOperator).Simplify(); IFeatureClass featureClass = Editor.UniqueInstance.TargetLayer.FeatureClass; IFeature feature = featureClass.CreateFeature(); IFeature feature3 = featureClass.CreateFeature(); feature.Shape = geometry3; feature3.Shape = geometry2; IAttributeSplit attributeSplitHandleClass = AttributeManager.AttributeSplitHandleClass; if (attributeSplitHandleClass != null) { try { Editor.UniqueInstance.StartEditOperation(); Editor.UniqueInstance.AddAttribute = false; List <IFeature> pFeatureList = null; pFeatureList = new List <IFeature> { feature, feature3 }; attributeSplitHandleClass.AttributeSplit(srcFeature, ref pFeatureList); feature = pFeatureList[0]; feature3 = pFeatureList[1]; feature.Store(); feature3.Store(); srcFeature.Delete(); Editor.UniqueInstance.StopEditOperation("split"); targetLayer.Clear(); targetLayer.Add(feature); this._hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection | esriViewDrawPhase.esriViewGeography, null, null); } catch (Exception exception) { Editor.UniqueInstance.AbortEditOperation(); this._mErrOpt.ErrorOperate(this._mSubSysName, "ShapeEdit.Split", "OnDblClick", exception.GetHashCode().ToString(), exception.Source, exception.Message, "", "", ""); } } } } } } catch (Exception exception2) { this._mErrOpt.ErrorOperate(this._mSubSysName, "ShapeEdit.Split", "OnDblClick", exception2.GetHashCode().ToString(), exception2.Source, exception2.Message, "", "", ""); } } }