public void OnClick() { m_Map = m_hookHelper.FocusMap; m_activeView = m_Map as IActiveView; m_EngineEditor = MapManager.EngineEditor; m_EngineEditLayers = MapManager.EngineEditor as IEngineEditLayers; EditVertexClass.m_activeView = m_activeView; EditVertexClass.m_Map = m_Map; EditVertexClass.ClearResource(); if (m_EngineEditor == null) { return; } if (m_EngineEditor.EditState != esriEngineEditState.esriEngineStateEditing) { return; } if (m_EngineEditLayers == null) { return; } IFeatureLayer pFeatLyr = m_EngineEditLayers.TargetLayer; if (pFeatLyr == null) { return; } IFeatureCursor pFeatCur = MapManager.GetSelectedFeatures(pFeatLyr); if (pFeatCur == null) { MessageBox.Show("请选择要删除节点的要素!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } EditVertexClass.ShowAllVertex(pFeatLyr); ((IActiveViewEvents_Event)m_Map).AfterDraw += new IActiveViewEvents_AfterDrawEventHandler(map_AfterDraw); }
private void AddVertexNode(IPoint pPnt) { try { IFeatureLayer pFeaturelayer = m_EngineEditLayers.TargetLayer; IActiveView pActiveView = m_activeView; IPoint pPoint = pPnt; if (pFeaturelayer.FeatureClass == null) { return; } //如果不是面状地物则退出 if (pFeaturelayer.FeatureClass.ShapeType != esriGeometryType.esriGeometryEnvelope && pFeaturelayer.FeatureClass.ShapeType != esriGeometryType.esriGeometryPolygon && pFeaturelayer.FeatureClass.ShapeType != esriGeometryType.esriGeometryLine && pFeaturelayer.FeatureClass.ShapeType != esriGeometryType.esriGeometryPolyline) { return; } IGeometry pGeo = null; IFeature pSelFeature = null; pSelFeature = EditVertexClass.GetSelectedFeature(pFeaturelayer); //是否有选中的几何体 if (pSelFeature == null) { return; } //解决不带Z值的要素的编辑和Z值为空的要素的编辑问题 IZAware pZAware = pPoint as IZAware; pZAware.ZAware = true; pPoint.Z = 0; bool pInLine = false; ITopologicalOperator pTopoOpt = default(ITopologicalOperator); IPolyline pBoundaryLine = default(IPolyline); //最小的距离 double pMindis = 0; IProximityOperator pProxOpt = default(IProximityOperator); //得到多边形的边界 if (pFeaturelayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolygon || pFeaturelayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryEnvelope) { //获取边界线 pBoundaryLine = EditVertexClass.GetBoundary(pFeaturelayer); } else if (pFeaturelayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolyline || pFeaturelayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryLine) { pBoundaryLine = pSelFeature.ShapeCopy as IPolyline; } pTopoOpt = pPoint as ITopologicalOperator; IRelationalOperator pRelationalOperator = default(IRelationalOperator); pRelationalOperator = pPoint as IRelationalOperator; //判断点是否在边界上 pInLine = pRelationalOperator.Within(pBoundaryLine); //如果不在边界上,判断是否小于容忍距离,如果大于容忍距离则退出程序 if (pInLine == false) { pProxOpt = pPoint as IProximityOperator; pMindis = pProxOpt.ReturnDistance(pBoundaryLine); if (pMindis > THE_POINT_TO_POINT_TOLERANCE) { return; } } //判断是否增加的点刚好为节点 IPointCollection pPolylinePointCol = pBoundaryLine as IPointCollection; IHitTest pHitTest = default(IHitTest); double pHitDis = 0; int pSegIndex = 0; int pVerIndex = 0; IPoint pHitPoint = null; bool bRightSide = true; pHitTest = pBoundaryLine as IHitTest; //增加的点为已有的节点则退出程序 if (pHitTest.HitTest(pPoint, THE_POINT_TO_POINT_TOLERANCE * 10, esriGeometryHitPartType.esriGeometryPartVertex, pHitPoint, ref pHitDis, ref pSegIndex, ref pVerIndex, ref bRightSide) == true) { if (pHitDis < THE_POINT_TO_POINT_TOLERANCE) { return; } } EditVertexClass.pHitPnt = pHitPoint; //为多边形增加节点 ISegmentCollection pSegmentCollection = pBoundaryLine as ISegmentCollection; IPolyline pSegPolyline = null; int pPointIndex = 0; ILine pLine = default(ILine); double pDis1 = 0; double pDis2 = 0; IPoint pVerTex = default(IPoint); pMindis = 100; pProxOpt = pPoint as IProximityOperator; for (int i = 0; i <= pSegmentCollection.SegmentCount - 1; i++) { //判断选中点是否在这个Segment上 pLine = pSegmentCollection.get_Segment(i) as ILine; pDis1 = pProxOpt.ReturnDistance(pLine.FromPoint); pDis2 = pProxOpt.ReturnDistance(pLine.ToPoint); if (Math.Abs(pDis1 + pDis2 - pLine.Length) <= pMindis) { pMindis = Math.Abs(pDis1 + pDis2 - pLine.Length); pVerTex = pLine.ToPoint; } } //获取选中的几何特征 pGeo = pSelFeature.Shape; //得到索引 pPointIndex = EditVertexClass.GetVertexIndex(pVerTex, pGeo); //如果是首点,则设置为最后一个点 if (pPointIndex == 0) { pPointIndex = pSegmentCollection.SegmentCount; } IPointCollection pPolygonPointCol = null; pPolygonPointCol = pSelFeature.ShapeCopy as IPointCollection; pPolygonPointCol.InsertPoints(pPointIndex, 1, ref pPoint); m_EngineEditor.StartOperation(); //拓扑操作 IPolygon pPolygon = null; IPolyline pPlyline = null; if (pFeaturelayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolygon || pFeaturelayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryEnvelope) { pPolygon = pPolygonPointCol as IPolygon; pPolygon.Close(); pTopoOpt = pPolygon as ITopologicalOperator; pTopoOpt.Simplify(); pSelFeature.Shape = pPolygon; pSelFeature.Store(); } else if (pFeaturelayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolyline || pFeaturelayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryLine) { pPlyline = pPolygonPointCol as IPolyline; pTopoOpt = pPlyline as ITopologicalOperator; pTopoOpt.Simplify(); pSelFeature.Shape = pPlyline; pSelFeature.Store(); } //停止编辑 m_EngineEditor.StopOperation("AddVertexTool"); //显示顶点 EditVertexClass.ShowAllVertex(pFeaturelayer); } catch (Exception ex) { } }
private void DelVertexNode(IPoint pPnt) { try { IFeatureLayer pFeaturelayer = m_EngineEditLayers.TargetLayer; IActiveView pActiveView = m_activeView; IPoint pPoint = pPnt; if (pFeaturelayer.FeatureClass == null) { return; } //如果不是面状地物则退出 if (pFeaturelayer.FeatureClass.ShapeType != esriGeometryType.esriGeometryEnvelope && pFeaturelayer.FeatureClass.ShapeType != esriGeometryType.esriGeometryPolygon && pFeaturelayer.FeatureClass.ShapeType != esriGeometryType.esriGeometryLine && pFeaturelayer.FeatureClass.ShapeType != esriGeometryType.esriGeometryPolyline) { return; } IGeometry pGeo = null; IFeature pSelFeature = null; pSelFeature = EditVertexClass.GetSelectedFeature(pFeaturelayer); //是否有选中的几何体 if (pSelFeature == null) { return; } pGeo = pSelFeature.ShapeCopy; double pSrchDis = 0; double pHitDis = 0; pSrchDis = pActiveView.Extent.Width / 200; pPoint.Z = 0; int pIndex = 0; IElement pElement = null; IHitTest pHtTest = null; bool pBoolHitTest = false; IPoint pPtHit = null; IPointCollection pPointCol = null; IPolygon pPolygon = null; IPolyline pPyline = null; bool bRightZSide = true; int pInt = 0; m_EngineEditor.StartOperation(); //删除面状要素的节点 if (pFeaturelayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolygon || pFeaturelayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryEnvelope) { pElement = new PolygonElement(); pElement.Geometry = pSelFeature.Shape; IPolygon pPoly = null; pPoly = pElement.Geometry as IPolygon; pHtTest = pPoly as IHitTest; pBoolHitTest = pHtTest.HitTest(pPoint, pSrchDis, esriGeometryHitPartType.esriGeometryPartVertex, pPtHit, ref pHitDis, ref pInt, ref pIndex, ref bRightZSide); if (pBoolHitTest == false) { return; } EditVertexClass.pHitPnt = pPtHit; pPointCol = pSelFeature.ShapeCopy as IPointCollection; //如果多边形的节点只有3个则不能再删除了 if (pPointCol.PointCount <= 4) { MessageBox.Show("多边形的节点至少需要3个!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } //顶点删除 pPointCol.RemovePoints(pIndex, 1); pPolygon = pPointCol as IPolygon; pPolygon.Close(); pSelFeature.Shape = pPolygon; pSelFeature.Store(); } //删除线状要素的节点 else if (pFeaturelayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolyline || pFeaturelayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryLine) { pElement = new LineElement(); pElement.Geometry = pSelFeature.Shape; IPolyline pPolyLine = default(IPolyline); pPolyLine = pElement.Geometry as IPolyline; pHtTest = pPolyLine as IHitTest; pBoolHitTest = pHtTest.HitTest(pPoint, pSrchDis, esriGeometryHitPartType.esriGeometryPartVertex, pPtHit, ref pHitDis, ref pInt, ref pIndex, ref bRightZSide); if (pBoolHitTest == false) { return; } EditVertexClass.pHitPnt = pPtHit; pPointCol = pSelFeature.ShapeCopy as IPointCollection; //如果Polyline节点只有2个则不能再删除了 if (pPointCol.PointCount <= 2) { MessageBox.Show("线的节点至少需要2个!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } //顶点删除 pPointCol.RemovePoints(pIndex, 1); pPyline = pPointCol as IPolyline; pSelFeature.Shape = pPyline; pSelFeature.Store(); } //与选中点坐标相同的节点都删除 for (int i = 0; i <= pPointCol.PointCount - 1; i++) { if (i > pPointCol.PointCount - 1) { break; } if (pPointCol.get_Point(i).X == pPoint.X & pPointCol.get_Point(i).Y == pPoint.Y) { pPointCol.RemovePoints(i, 1); i = i - 1; } } //停止编辑 m_EngineEditor.StopOperation("DelVertexTool"); //显示顶点 EditVertexClass.ShowAllVertex(pFeaturelayer); m_activeView.Refresh(); } catch (Exception ex) { m_activeView.Refresh(); } }
private void EditMouseUp(IPoint pPnt) { IPolygon pPolyResult; IPolyline pPolylineResult; IFeatureCursor pFeatureCursor; IFeature pFeature; IFeatureLayer pFeatLyr = m_EngineEditLayers.TargetLayer; //检查编辑的地物 if (m_editDispFeed != null) { switch (m_pHitElem.Geometry.GeometryType) { case esriGeometryType.esriGeometryLine: case esriGeometryType.esriGeometryPolyline: pPolylineResult = m_polylineMvPtFeed.Stop(); //作有效性检查 if ((pPolylineResult != null)) { //更新元素 m_pHitElem.Geometry = pPolylineResult; //获取选中的地物 pFeatureCursor = MapManager.GetSelectedFeatures(pFeatLyr); if (pFeatureCursor == null) { return; } pFeature = pFeatureCursor.NextFeature(); m_EngineEditor.StartOperation(); //更新要素形状 pFeature.Shape = pPolylineResult; pFeature.Store(); //停止编辑 m_EngineEditor.StopOperation("MoveVertex"); EditVertexClass.ShowAllVertex(pFeatLyr); } break; case esriGeometryType.esriGeometryPolygon: case esriGeometryType.esriGeometryEnvelope: //得到反馈的结果 pPolyResult = m_polyMvPtFeed.Stop(); //作有效性检查 if (pPolyResult != null) { //更新元素 m_pHitElem.Geometry = pPolyResult; //获取选中的地物 pFeatureCursor = MapManager.GetSelectedFeatures(pFeatLyr); if (pFeatureCursor == null) { return; } pFeature = pFeatureCursor.NextFeature(); m_EngineEditor.StartOperation(); //更新要素形状 pFeature.Shape = pPolyResult; pFeature.Store(); //停止编辑 m_EngineEditor.StopOperation("MoveVertex"); if (pFeature.Shape.GeometryType == esriGeometryType.esriGeometryPolygon || pFeature.Shape.GeometryType == esriGeometryType.esriGeometryPolyline) { EditVertexClass.ShowAllVertex(pFeatLyr); } } IFeature pTempParcel; //定义存储多边形要素的局部变量 IPoint pDestPoint; //定义节点移动的目标位置 pDestPoint = pPnt; IZAware pZAware = pDestPoint as IZAware; pZAware.ZAware = true; pDestPoint.Z = 0; //所有包含该节点的多边形都进行操作 for (int i = 0; i <= EditVertexClass.m_featArray.Count - 1; i++) { pTempParcel = EditVertexClass.m_featArray.get_Element(i) as IFeature; //记录节点序号 int pIndex = 0; pIndex = EditVertexClass.GetVertexIndex(m_fromPoint, pTempParcel.Shape); if (!(pIndex == -2)) { ITopologicalOperator pTopoOpt = default(ITopologicalOperator); IPolygon pPolygon = default(IPolygon); IPointCollection pPolygonPointCol = default(IPointCollection); pPolygonPointCol = pTempParcel.ShapeCopy as IPointCollection; pPolygonPointCol.UpdatePoint(pIndex, pDestPoint); pPolygon = pPolygonPointCol as IPolygon; pPolygon.Close(); pTopoOpt = pPolygon as ITopologicalOperator; pTopoOpt.Simplify(); pTempParcel.Shape = pPolygon; pTempParcel.Store(); } } EditVertexClass.m_featArray.RemoveAll(); break; } //释放内存 m_polyMvPtFeed = null; m_polylineMvPtFeed = null; m_editDispFeed = null; m_pHitElem = null; //刷新地图 m_activeView.Refresh(); } }