private void EditMouseDown(IPoint pPnt) { try { IPolygon pGeompoly; IPolyline pGeomPolyline; IHitTest pHtTest; IPoint pPtHit; double pDblHitDis = 0; int pLngPrtIdx = 0; int pLngSegIdx = 0; Boolean pBoolHitRt = false; Boolean pBoolHitTest = false; double pDblSrchDis = 0; pPnt.Z = 0; pPtHit = new PointClass(); pDblSrchDis = m_activeView.Extent.Width / 200; //获取编辑目标图层 IFeatureLayer pFeatLyr = m_EngineEditLayers.TargetLayer; if (pFeatLyr == null) { return; } IFeatureCursor pFeatCur = MapManager.GetSelectedFeatures(pFeatLyr); IFeature pTFeature = pFeatCur.NextFeature(); switch (pTFeature.Shape.GeometryType) { //当为单点、点集时直接返回 case esriGeometryType.esriGeometryPoint: case esriGeometryType.esriGeometryMultipoint: return; //线要素 case esriGeometryType.esriGeometryLine: case esriGeometryType.esriGeometryPolyline: m_pHitElem = new LineElementClass(); break; //面要素 case esriGeometryType.esriGeometryPolygon: case esriGeometryType.esriGeometryEnvelope: m_pHitElem = new PolygonElementClass(); break; } //获取选中要素的几何对象 m_pHitElem.Geometry = pTFeature.Shape; if (m_pHitElem != null) { switch (pTFeature.Shape.GeometryType) { case esriGeometryType.esriGeometryLine: case esriGeometryType.esriGeometryPolyline: pGeomPolyline = m_pHitElem.Geometry as IPolyline; pHtTest = pGeomPolyline as IHitTest; pBoolHitTest = pHtTest.HitTest(pPnt, pDblSrchDis, esriGeometryHitPartType.esriGeometryPartVertex, pPtHit, ref pDblHitDis, ref pLngPrtIdx, ref pLngSegIdx, ref pBoolHitRt); if (pBoolHitTest) { EditVertexClass.pHitPnt = pPtHit; m_editDispFeed = new LineMovePointFeedbackClass(); m_editDispFeed.Display = m_activeView.ScreenDisplay; m_polylineMvPtFeed = m_editDispFeed as ILineMovePointFeedback; m_polylineMvPtFeed.Start(pGeomPolyline, pLngSegIdx, pPnt); } break; case esriGeometryType.esriGeometryPolygon: case esriGeometryType.esriGeometryEnvelope: pGeompoly = m_pHitElem.Geometry as IPolygon; pHtTest = pGeompoly as IHitTest; pBoolHitTest = pHtTest.HitTest(pPnt, pDblSrchDis, esriGeometryHitPartType.esriGeometryPartVertex, pPtHit, ref pDblHitDis, ref pLngPrtIdx, ref pLngSegIdx, ref pBoolHitRt); EditVertexClass.pHitPnt = pPtHit; if (pBoolHitTest) { //定义获取到的与传入点的最近所选地物 IFeature pFeature; //定义测量距离用于捕获离点最近的地物 double pTestDist = 0; //用于求点与地物的距离 IProximityOperator pProximity; IGeometry pGeoM; IFeature pTestFeature; //用于最短距离的比较 double pTempDist = 0; IFeatureCursor pSelected; ITopologicalOperator pTopoOpt; //捕捉到的要移动的节点 IPoint pSnapVertex = default(IPoint); //从所选地物中获得离点最近的那个地物 pFeature = null; //用鼠标点进行运算 pTopoOpt = pPnt as ITopologicalOperator; pTopoOpt.Simplify(); pProximity = pPnt as IProximityOperator; pSelected = MapManager.GetSelectedFeatures(pFeatLyr); pTestFeature = pSelected.NextFeature(); pGeoM = pTestFeature.Shape; pTestDist = pProximity.ReturnDistance(pGeoM); pFeature = pTestFeature; //从所选地物中获得离点最近的那个地物 while (pTestFeature != null) { pTestFeature = pSelected.NextFeature(); if (pTestFeature != null) { pGeoM = pTestFeature.Shape; pTempDist = pProximity.ReturnDistance(pGeoM); if (pTempDist < pTestDist) { pTestDist = pTempDist; pFeature = pTestFeature; } } } //检查pSnapPoint是否是所选地物中的某个图斑的一个节点 double pDblHDis = 0; int pLngVertexIdx = 0; int pLngSIdx = 0; bool pBoolHRt = false; bool pBlnGet = false; double pDblDistMin = 0; pDblDistMin = pTempDist; if (pDblDistMin == 0) { pDblDistMin = 3; } //两倍可以保证一般一次找的到 double pDblSearchRadius = pDblDistMin * 2; IHitTest pHT = default(IHitTest); pHT = pFeature.Shape as IHitTest; //如果pSnapPoint不是pTempParcel的节点 if (EditVertexClass.GetVertexIndex(pPnt, pFeature.Shape) == -2) { pSnapVertex = new Point(); while (!pBlnGet) { pBlnGet = pHT.HitTest(pPnt, pDblSearchRadius, esriGeometryHitPartType.esriGeometryPartVertex, pSnapVertex, ref pDblHDis, ref pLngVertexIdx, ref pLngSIdx, ref pBoolHRt); pDblSearchRadius = pDblSearchRadius + pDblDistMin; } EditVertexClass.pHitPnt = pSnapVertex; //如果pSnapVertex仍然不是pTempParcel的节点 if (EditVertexClass.GetVertexIndex(pSnapVertex, pFeature.Shape) == -2) { MessageBox.Show("所想移动的起点不是所选面的节点", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } m_fromPoint = pSnapVertex; } else { pSnapVertex = pPnt; m_fromPoint = pSnapVertex; } //找到包含所要移动的节点的图形,在该过程里面对m_FeatArray进行了赋值 EditVertexClass.SelectByShapeTop(pFeatLyr, pSnapVertex, esriSpatialRelEnum.esriSpatialRelTouches, false, esriSelectionResultEnum.esriSelectionResultNew); m_editDispFeed = new PolygonMovePointFeedbackClass(); m_editDispFeed.Display = m_activeView.ScreenDisplay; m_polyMvPtFeed = m_editDispFeed as IPolygonMovePointFeedback; m_polyMvPtFeed.Start(pGeompoly, pLngSegIdx, pPnt); } break; } } } catch (Exception ex) { //SysLogHelper.WriteOperationLog("节点移动错误", ex.Source, "数据编辑"); } }
public bool EditFeature(int x, int y, IGeometry geometry) { GetFeatureOnMouseDown(x, y); SelectOnMouseDown(); if (MyselectedFeature.Count < 1) { return(false); } if (geometry == null) { return(false); } IPoint pHitPoint = null; double hitDist = 0, tol = 0; int vertexIndex = 0, vertexOffset = 0, numVertices = 0, partIndex = 0; bool vertex = false; IFeature editedFeature = MyselectedFeature[0]; IPoint point = MyMapControl.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y); tol = ConvertPixelsToMapUnits(4); //IGeometry pGeo = editedFeature.Shape; //m_EditingFeature = editedFeature; try { switch (geometry.GeometryType) { case esriGeometryType.esriGeometryPoint: MyfeedBack = new MovePointFeedbackClass(); MyfeedBack.Display = MyMapControl.ActiveView.ScreenDisplay; IMovePointFeedback pointMove = MyfeedBack as IMovePointFeedback; pointMove.Start(geometry as IPoint, point); break; case esriGeometryType.esriGeometryPolyline: if (TestGeometryHit(tol, point, geometry, ref pHitPoint, ref hitDist, ref partIndex, ref vertexOffset, ref vertexIndex, ref vertex)) { if (!vertex) { IGeometryCollection geometryColl = geometry as IGeometryCollection; IPath path = geometryColl.get_Geometry(partIndex) as IPath; IPointCollection pointColl = path as IPointCollection; numVertices = pointColl.PointCount; object missing = Type.Missing; if (vertexIndex == 0) { object start = 1 as object; pointColl.AddPoint(point, ref start, ref missing); } else { object objVertexIndex = vertexIndex as object; pointColl.AddPoint(point, ref missing, ref objVertexIndex); } TestGeometryHit(tol, point, geometry, ref pHitPoint, ref hitDist, ref partIndex, ref vertexOffset, ref vertexIndex, ref vertex); } MyfeedBack = new LineMovePointFeedbackClass(); MyfeedBack.Display = MyMapControl.ActiveView.ScreenDisplay; ILineMovePointFeedback lineMove = MyfeedBack as ILineMovePointFeedback; lineMove.Start(geometry as IPolyline, vertexIndex, point); } else { return(false); } break; case esriGeometryType.esriGeometryPolygon: if (TestGeometryHit(tol, point, geometry, ref pHitPoint, ref hitDist, ref partIndex, ref vertexOffset, ref vertexIndex, ref vertex)) { if (!vertex) { IGeometryCollection geometryColl = geometry as IGeometryCollection; IPath path = geometryColl.get_Geometry(partIndex) as IPath; IPointCollection pointColl = path as IPointCollection; numVertices = pointColl.PointCount; object missing = Type.Missing; if (vertexIndex == 0) { object start = 1 as object; pointColl.AddPoint(point, ref start, ref missing); } else { object objVertexIndex = vertexIndex as object; pointColl.AddPoint(point, ref missing, ref objVertexIndex); } TestGeometryHit(tol, point, geometry, ref pHitPoint, ref hitDist, ref partIndex, ref vertexOffset, ref vertexIndex, ref vertex); } MyfeedBack = new PolygonMovePointFeedbackClass(); MyfeedBack.Display = MyMapControl.ActiveView.ScreenDisplay; IPolygonMovePointFeedback polyMove = MyfeedBack as IPolygonMovePointFeedback; polyMove.Start(geometry as IPolygon, vertexIndex + vertexOffset, point); } else { return(false); } break; default: break; } } catch { return(false); } return(true); }
/// <summary> /// 编辑当前图层中鼠标击中的地图对象(开始编辑), /// 如果为点对象,可进行位置移动,如果为线对象或面对象,可进行节点编辑 /// 建议在Map.MouseDown事件中调用本方法 /// </summary> /// <param name="x">鼠标X坐标,屏幕坐标</param> /// <param name="y">鼠标Y坐标,屏幕坐标</param> /// <returns></returns> public void EditFeatureMouseDown(int x, int y) { IGeometryCollection pGeomColn; IPointCollection pPointColn; IObjectClass pObjectClass; IFeature pFeature; IGeometry pGeom; IPath pPath; IPoint pHitPoint = null; IPoint pPoint = null; Double hitDist = 0.0; double tol; int vertexIndex = 0; int numVertices; int partIndex = 0; bool vertex = false; try { m_pMap.ClearSelection(); // 取得鼠标击中的第一个对象 SelectMouseDown(x, y); IEnumFeature pSelected = (IEnumFeature)m_pMap.FeatureSelection; pFeature = pSelected.Next(); if (pFeature == null) { return; } IActiveView pActiveView = (IActiveView)m_pMap; pPoint = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y); // 节点空间查询容差 tol = ConvertPixelsToMapUnits(pActiveView, 4.0); pGeom = pFeature.Shape; pObjectClass = pFeature.Class; m_pEditFeature = pFeature; object objNull = Missing.Value; object objBefore, objAfter; switch (pGeom.GeometryType) { case esriGeometryType.esriGeometryPoint: m_pFeedback = new MovePointFeedbackClass(); m_pFeedback.Display = pActiveView.ScreenDisplay; IMovePointFeedback pPointMove = (IMovePointFeedback)m_pFeedback; pPointMove.Start((IPoint)pGeom, pPoint); break; case esriGeometryType.esriGeometryPolyline: if (TestGeometryHit(tol, pPoint, pFeature, pHitPoint, hitDist, out partIndex, out vertexIndex, out vertex)) { if (!vertex) { pGeomColn = (IGeometryCollection)pGeom; pPath = (IPath)pGeomColn.get_Geometry(partIndex); pPointColn = (IPointCollection)pPath; numVertices = pPointColn.PointCount; if (vertexIndex == 0) { objBefore = (object)(vertexIndex + 1); pPointColn.AddPoint(pPoint, ref objBefore, ref objNull); } else { objAfter = (object)vertexIndex; pPointColn.AddPoint(pPoint, ref objNull, ref objAfter); } TestGeometryHit(tol, pPoint, pFeature, pHitPoint, hitDist, out partIndex, out vertexIndex, out vertex); } m_pFeedback = new LineMovePointFeedbackClass(); m_pFeedback.Display = pActiveView.ScreenDisplay; ILineMovePointFeedback pLineMove = (ILineMovePointFeedback)m_pFeedback; pLineMove.Start((IPolyline)pGeom, vertexIndex, pPoint); // m_pSelectionTracker = new LineTrackerClass(); // m_pSelectionTracker.Display = pActiveView.ScreenDisplay ; // m_pSelectionTracker.Geometry = pGeom; // m_pSelectionTracker.ShowHandles = true; // m_pSelectionTracker.QueryResizeFeedback(ref m_pFeedback); // m_pSelectionTracker.OnMouseDown(1,0,x,y); } else { return; } break; case esriGeometryType.esriGeometryPolygon: if (TestGeometryHit(tol, pPoint, pFeature, pHitPoint, hitDist, out partIndex, out vertexIndex, out vertex)) { if (!vertex) { pGeomColn = (IGeometryCollection)pGeom; pPath = (IPath)pGeomColn.get_Geometry(partIndex); pPointColn = (IPointCollection)pPath; numVertices = pPointColn.PointCount; if (vertexIndex == 0) { objBefore = (object)(vertexIndex + 1); pPointColn.AddPoint(pPoint, ref objBefore, ref objNull); } else { objAfter = (object)vertexIndex; pPointColn.AddPoint(pPoint, ref objNull, ref objAfter); } TestGeometryHit(tol, pPoint, pFeature, pHitPoint, hitDist, out partIndex, out vertexIndex, out vertex); } m_pFeedback = new PolygonMovePointFeedbackClass(); m_pFeedback.Display = pActiveView.ScreenDisplay; IPolygonMovePointFeedback pPolyMove = (IPolygonMovePointFeedback)m_pFeedback; pPolyMove.Start((IPolygon)pGeom, vertexIndex, pPoint); } else { return; } break; } return; } catch (Exception e) { Console.WriteLine(e.Message.ToString()); return; } }