Пример #1
0
        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();
        }
Пример #2
0
        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();
        }