public void SplitPolylines() //分割线 { m_pLineFeed = (INewLineFeedback)m_pFeedback; IPolyline pFeatureScissors = (IPolyline)m_pLineFeed.Stop(); //结束绘制切割线 if (pFeatureScissors.Length == 0) { Reset(); return; } ITopologicalOperator pTopologim_CalOperator = (ITopologicalOperator)pFeatureScissors; ILayer pFeatureLayer; pFeatureLayer = m_App.CurrentEditLayer; IGeometry pOldGeometry; IFeature pOldFeature; IWorkspaceEdit pWorkspaceEdit; pWorkspaceEdit = (IWorkspaceEdit)CommonFunction.GetLayerWorkspace(pFeatureLayer); if (pWorkspaceEdit == null) { return; } if (!pWorkspaceEdit.IsBeingEdited()) { return; } pWorkspaceEdit.StartEditOperation(); for (int i = 0; i < m_OriginFeatureArray.Count; i++) //遍历每个选中的要素 { pOldFeature = (IFeature)m_OriginFeatureArray.get_Element(i); pOldGeometry = (IGeometry)pOldFeature.Shape; IArray pArray = new ArrayClass(); //将地理要素的坐标信息添加到点数组中 pArray = CommonFunction.GeometryToArray(pOldGeometry); //跳转到拓扑操作接口,求“剪刀”与选中要素的交点 IGeometry pIntersectGeo = pTopologim_CalOperator.Intersect(pOldGeometry, esriGeometryDimension.esriGeometry0Dimension); if (pIntersectGeo == null) { return; //无交点,则返回 } ITopologicalOperator pTopOp = (ITopologicalOperator)pIntersectGeo; pTopOp.Simplify(); IPointCollection pPointCol = (IPointCollection)pIntersectGeo; //交点的集合 //用相交的点集合打断该线 IPointCollection pTmpPointCol = new MultipointClass(); pTmpPointCol.AddPointCollection(pPointCol); //临时点集 IPolycurve2 pPolyCurve; pPolyCurve = (IPolycurve2)pOldGeometry; //被剪切的线要素 ((ITopologicalOperator)pPolyCurve).Simplify(); IGeometryCollection pGeoCollection; IGeometryCollection pTmpGeoCollection; //保存每次打断产生的线段 pTmpGeoCollection = (IGeometryCollection)pPolyCurve; pGeoCollection = (IGeometryCollection)pPolyCurve; for (int j = 0; j < pPointCol.PointCount; j++) //遍历每个交点 { IPoint pSplitPoint = pPointCol.get_Point(j); int GeoCount = 0; int pGeoCollectionCount = pGeoCollection.GeometryCount; while (GeoCount < pGeoCollectionCount) //遍历每个几何形体 { IPolycurve2 pTmpPolycurve2; pTmpPolycurve2 = CommonFunction.BuildPolyLineFromSegmentCollection((ISegmentCollection)pGeoCollection.get_Geometry(GeoCount)); bool bProject; //是否投影 bool bCreatePart; //是否创建新的附件 bool bSplitted; //分裂是否成功 int lNewPart; int lNewSeg; bProject = true; bCreatePart = true; ((ITopologicalOperator)pTmpPolycurve2).Simplify(); pTmpPolycurve2.SplitAtPoint(pSplitPoint, bProject, bCreatePart, out bSplitted, out lNewPart, out lNewSeg); if (bSplitted) //更新pGeoCollection { pGeoCollection.RemoveGeometries(GeoCount, 1); pTmpGeoCollection = (IGeometryCollection)pTmpPolycurve2; pGeoCollection.AddGeometryCollection(pTmpGeoCollection); } GeoCount++; } } IGeometryCollection pGeometryCol = pGeoCollection; //被打断后的线的集合 for (int intCount = 0; intCount < pGeometryCol.GeometryCount; intCount++) { IPolycurve2 pPolyline = CommonFunction.BuildPolyLineFromSegmentCollection((ISegmentCollection)pGeometryCol.get_Geometry(intCount)); CommonFunction.AddFeature(m_MapControl, (IGeometry)pPolyline, m_App.CurrentEditLayer, pOldFeature, pArray); } pOldFeature.Delete(); } m_App.Workbench.CommandBarManager.Tools["2dmap.DFEditorTool.Undo"].SharedProps.Enabled = true; pWorkspaceEdit.StopEditOperation(); Reset(); }
public void DoUnion() //联合操作 { if (m_FeatureArray.Count < 2) { Reset(); return; } ILayer pFeatureLayer; pFeatureLayer = m_App.CurrentEditLayer; IGeometry pOldGeometry; IFeature pOldFeature; IGeometry pOtherGeo; IWorkspaceEdit pWorkspaceEdit; pWorkspaceEdit = (IWorkspaceEdit)CommonFunction.GetLayerWorkspace(pFeatureLayer); if (pWorkspaceEdit == null) { return; } if (!pWorkspaceEdit.IsBeingEdited()) { return; } pWorkspaceEdit.StartEditOperation(); pOldFeature = (IFeature)m_FeatureArray.get_Element(0); pOldGeometry = (IGeometry)pOldFeature.Shape; IArray pArrayPoint = new ArrayClass(); //将坐标信息存储到点数组中 pArrayPoint = CommonFunction.GeometryToArray(pOldFeature.ShapeCopy); for (int i = 1; i < m_FeatureArray.Count; i++) //遍历每个选中的要素 { pOtherGeo = (IGeometry)((IFeature)m_FeatureArray.get_Element(i)).Shape; IArray pTempArrayPoint = new ArrayClass(); //将坐标信息存储到点数组中 pTempArrayPoint = CommonFunction.GeometryToArray(((IFeature)m_FeatureArray.get_Element(i)).ShapeCopy); for (int j = 0; j < pTempArrayPoint.Count; j++) { pArrayPoint.Add(pTempArrayPoint.get_Element(j) as Point); } pOldGeometry = CommonFunction.UnionGeometry(pOldGeometry, pOtherGeo); } CommonFunction.AddFeature(m_MapControl, pOldGeometry, m_App.CurrentEditLayer, pOldFeature, pArrayPoint); //可以删除选中的要素了 for (int i = 0; i < m_FeatureArray.Count; i++) //遍历每个选中的要素 { ((IFeature)m_FeatureArray.get_Element(i)).Delete(); } m_App.Workbench.CommandBarManager.Tools["2dmap.DFEditorTool.Undo"].SharedProps.Enabled = true; pWorkspaceEdit.StopEditOperation(); Reset(); }