zoukankan      html  css  js  c++  java
  • AE 线编辑

    转自原文 AE 线编辑

    1、高亮显示节点

    //高亮显示节点和端点  
    public void HighLightNode()  
    {  
        //清空  
        _mapCtrl.Map.ClearSelection();  
        _mapCtrl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, _mapCtrl.ActiveView.Extent);  
        var pGraphicsContainer = _mapCtrl.Map as IGraphicsContainer;  
        pGraphicsContainer.DeleteAllElements();  
        _mapCtrl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, _mapCtrl.ActiveView.Extent);  
           
        //增加  
        ISimpleFillSymbol simpleFillSymbol = new SimpleFillSymbolClass();  
        ISimpleLineSymbol simpleLineSymbol = new SimpleLineSymbolClass  
        {  
            Color = new RgbColorClass { Red = 255, Green = 0, Blue = 0 },  
            Width = 2,  
            Style = esriSimpleLineStyle.esriSLSSolid  
        };  
           
        ISimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbolClass  
        {  
            Color =  
                new RgbColorClass { Red = 255, Green = 0, Blue = 0 },  
            Style = esriSimpleMarkerStyle.esriSMSCircle,  
            Size = 5  
        };  
        switch (currentFeature.Shape.GeometryType)  
        {  
            case esriGeometryType.esriGeometryPoint:  
                //IMarkerElement pMarkerElement = new MarkerElementClass();  
                //pMarkerElement.Symbol = simpleMarkerSymbol;  
                //var pEla = pMarkerElement as IElement;  
                //pEla.Geometry = currentFeature.Shape;  
                //var pActiveView = _mapCtrl.ActiveView;  
                //var pGraphicsContainer = _mapCtrl.Map as IGraphicsContainer;  
                //pGraphicsContainer.AddElement(pEla, 0);  
                //pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, _mapCtrl.ActiveView.Extent);  
                break;  
            case esriGeometryType.esriGeometryPolyline:  
                ILineElement pLineElement = new LineElementClass();  
                pLineElement.Symbol = simpleLineSymbol;  
                var pEla1 = pLineElement as IElement;  
                pEla1.Geometry = currentFeature.Shape;  
                var pActiveView1 = _mapCtrl.ActiveView;  
                var pGraphicsContainer1 = _mapCtrl.Map as IGraphicsContainer;  
                pGraphicsContainer1.AddElement(pEla1, 0);  
                pActiveView1.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, _mapCtrl.ActiveView.Extent);  
                break;  
            case esriGeometryType.esriGeometryPolygon:  
                IPolygonElement pPolygonElement = new PolygonElementClass { Symbol = simpleFillSymbol };  
                var pEla2 = pPolygonElement as IElement;  
                pEla2.Geometry = currentFeature.Shape;  
                var pActiveView2 = _mapCtrl.ActiveView;  
                var pGraphicsContainer2 = _mapCtrl.Map as IGraphicsContainer;  
                pGraphicsContainer2.AddElement(pEla2, 0);  
                pActiveView2.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, _mapCtrl.ActiveView.Extent);  
                break;  
        }  
        //显示节点  
        //step1:创建节点符号  
        ISimpleMarkerSymbol pVertexMarkerSymbol = new SimpleMarkerSymbolClass();  
        pVertexMarkerSymbol.Style = esriSimpleMarkerStyle.esriSMSSquare;  
        pVertexMarkerSymbol.Size = 3;  
        pVertexMarkerSymbol.Angle = 0;  
        IRgbColor rgbVertex = new RgbColorClass();  
        rgbVertex.Green = 255;  
        pVertexMarkerSymbol.Color = rgbVertex;  
        ISimpleMarkerSymbol pEndPointMarkerSymbol = new SimpleMarkerSymbol();  
        pEndPointMarkerSymbol.Style = esriSimpleMarkerStyle.esriSMSSquare;  
        pEndPointMarkerSymbol.Size = 4;  
        pEndPointMarkerSymbol.Angle = 0;  
        IRgbColor rgbEndPoint = new RgbColorClass();  
        rgbEndPoint.Red = 255;  
        pEndPointMarkerSymbol.Color = rgbEndPoint;  
           
        //判D断要素的类型  
        if (currentFeature.Shape.GeometryType == esriGeometryType.esriGeometryPolyline)  
        {  
            IGeometryCollection pGeoColl;  
            ISegmentCollection pSegColl;  
            ISegment pSegment;  
            IPath path;  
            IPointCollection pEndPointCol;  
            IMultipoint pEndPoints;  
            IPoint pEndPoint;  
            pEndPoints = new MultipointClass();  
            pEndPointCol = pEndPoints as IPointCollection;  
            pGeoColl = currentFeature.Shape as IGeometryCollection;  
            for (int i = 0; i < pGeoColl.GeometryCount; i++)  
            {  
                pSegColl = pGeoColl.get_Geometry(i) as ISegmentCollection;  
                path = pGeoColl.get_Geometry(i) as IPath;  
                pEndPointCol.AddPoint(path.FromPoint);  
                pEndPointCol.AddPoint(path.ToPoint);  
           
                for (int j = 0; j < pSegColl.SegmentCount; j++)  
                {  
                    pSegment = pSegColl.get_Segment(j);  
                    //show vertex  
                    AddPointSymbolToMap(pSegment.FromPoint, pVertexMarkerSymbol);  
                    AddPointSymbolToMap(pSegment.ToPoint, pVertexMarkerSymbol);  
                }  
            }  
            //show endpoint  
            for (int k = 0; k < pEndPointCol.PointCount; k++)  
            {  
                pEndPoint = pEndPointCol.get_Point(k);  
                AddPointSymbolToMap(pEndPoint, pEndPointMarkerSymbol);  
            }  
         
        }  
        else if (currentFeature.Shape.GeometryType == esriGeometryType.esriGeometryPoint)  
        {  
            IPoint pEndPoint;  
            pEndPoint = currentFeature.Shape as IPoint;  
            AddPointSymbolToMap(pEndPoint, pEndPointMarkerSymbol);  
        }  
    }  

    2、添加节点

    OnMouseDown事件:  
    IProximityOperator proximityOperator = ucDrawPanel.currentFeature.Shape as IProximityOperator;  
    ptInsert = proximityOperator.ReturnNearestPoint(pPt, esriSegmentExtension.esriNoExtension);  
       
    //step1: 创建节点符号  
    ISimpleMarkerSymbol pVertexMarkerSymbol = new SimpleMarkerSymbolClass();  
    pVertexMarkerSymbol.Style = esriSimpleMarkerStyle.esriSMSSquare;  
    pVertexMarkerSymbol.Size = 3;  
    pVertexMarkerSymbol.Angle = 0;  
    IRgbColor rgbVertex = new RgbColorClass();  
    rgbVertex.Green = 255;  
    pVertexMarkerSymbol.Color = rgbVertex;  
    //step2: 显示在地图上  
    IMarkerElement pMarkerElement = new MarkerElementClass();  
    pMarkerElement.Symbol = pVertexMarkerSymbol;  
    var pEla = pMarkerElement as IElement;  
    pEla.Geometry = ptInsert as IGeometry;  
    pGraphicContainer.AddElement(pEla, 0);  
    pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, pActiveView.Extent);  
       
    OnMouseUp事件,添加一个节点,但不打断线:  
    // 注意:如果第三个参数createPart设为true,线会被打断,不可取  
    //线?splitAtPoint  
    bool isSplitted;  
    int newPartIndex;  
    int newSegmentIndex;  
    IPolyline polyline = ucDrawPanel.currentFeature.Shape as IPolyline;  
    //插入一点,newSegmentIndex记录插入点的相对线的节点位置  
    polyline.SplitAtPoint(ptInsert, true, false, out isSplitted, out newPartIndex, out newSegmentIndex);  
    ucDrawPanel.currentFeature.Store();  

    3、删除节点

    OnMouseDown事件:  
    //step1:获取预删除的节点  
    IPolyline pPolyline;  
    IHitTest pHitTest;  
    bool BoolHitTest;  
    double dist = 0;  
    double DbHitDis = 0;  
    int LngPrtIdx = 0;  
    bool BoolHitRt = false;  
    hitElement = getElement(pPt, esriGeometryType.esriGeometryPolyline);  
    if (hitElement != null)  
    {  
        pPolyline = hitElement.Geometry as IPolyline;  
        pHitTest = pPolyline as IHitTest;  
        ptDelete = new PointClass();  
        BoolHitTest = pHitTest.HitTest(pPt, pActiveView.Extent.Width / 100,  
                                       esriGeometryHitPartType.esriGeometryPartVertex, ptDelete,                                                           ref DbHitDis, ref LngPrtIdx, ref indexDelete, ref BoolHitRt);  
        // pHitTest.HitTest(pPt, pActiveView.Extent.Width / 100,esriGeometryHitPartType.esriGeometryPartVertex, ptDelete,ref DbHitDis, ref LngPrtIdx, ref LngSegIdx, ref BoolHitRt);  
           
        if (BoolHitTest)  
        {  
            //step2:高?亮显示,符号黑色边框镂空填充  
            ISimpleMarkerSymbol pVertexMarkerSymbol = new SimpleMarkerSymbolClass();  
            pVertexMarkerSymbol.Style = esriSimpleMarkerStyle.esriSMSDiamond;  
            pVertexMarkerSymbol.Size = 5;  
            pVertexMarkerSymbol.Angle = 0;  
            IRgbColor rgbVertex = new RgbColorClass();  
            rgbVertex.Red = 0;  
            rgbVertex.Blue = 0;  
            rgbVertex.Green = 0;  
            pVertexMarkerSymbol.Color = rgbVertex;  
           
            IMarkerElement pMarkerElement = new MarkerElementClass();  
            pMarkerElement.Symbol = pVertexMarkerSymbol;  
            var pEla = pMarkerElement as IElement;  
            pEla.Geometry = ptDelete as IGeometry;  
            pGraphicContainer.AddElement(pEla, 0);  
            pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, pActiveView.Extent);  
        }  
    }  
           
        OnMouseUp事件,删除节点:  
        IPointCollection pointCollection = ucDrawPanel.currentFeature.Shape as IPointCollection;  
        pointCollection.RemovePoints(indexDelete, 1);  
        IPolyline polylineNew = pointCollection as IPolyline;  
        StoreFeatureGeometry(ucDrawPanel.currentFeature, polylineNew);  
        保存图形要素:  
             private bool StoreFeatureGeometry(IFeature pFeature, IGeometry pIGeometry)  
    {  
        try  
        {  
            var pFeatureClass = pFeature.Class as IFeatureClass;  
            var pDataset = pFeatureClass as IDataset;  
            IWorkspace pWorkspace = pDataset.Workspace;  
            var pWorkspaceEdit = pWorkspace as IWorkspaceEdit;  
           
            pWorkspaceEdit.StartEditing(false);  
            pWorkspaceEdit.StartEditOperation();  
            pFeature.Shape = pIGeometry;  
            pFeature.Store();  
            pWorkspaceEdit.StopEditOperation();  
            pWorkspaceEdit.StopEditing(true);  
            return true;  
        }  
        catch (Exception ex)  
        {  
            return false;  
        }  
    }  

    4、打断线

    关键字:Split。  
    OnMouseDown事件:  
    IProximityOperator proximityOperator = ucDrawPanel.currentFeature.Shape as IProximityOperator;  
    ptSplit = proximityOperator.ReturnNearestPoint(pPt, esriSegmentExtension.esriNoExtension);  
       
    //step1:创建节点符号  
    ISimpleMarkerSymbol pVertexMarkerSymbol = new SimpleMarkerSymbolClass();  
    pVertexMarkerSymbol.Style = esriSimpleMarkerStyle.esriSMSSquare;  
    pVertexMarkerSymbol.Size = 4;  
    pVertexMarkerSymbol.Angle = 0;  
    IRgbColor rgbVertex = new RgbColorClass();  
    rgbVertex.Red = 255;  
    pVertexMarkerSymbol.Color = rgbVertex;  
    //step2:显示在地图上  
    IMarkerElement pMarkerElement = new MarkerElementClass();  
    pMarkerElement.Symbol = pVertexMarkerSymbol;  
    var pEla = pMarkerElement as IElement;  
    pEla.Geometry = ptSplit as IGeometry;  
    pGraphicContainer.AddElement(pEla, 0);  
    pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, pActiveView.Extent);  
       
    OnMouseUp事件打断线:  
    IFeatureEdit featureEdit = ucDrawPanel.currentFeature as IFeatureEdit;  
    ISet newFeaturesSet = featureEdit.Split(ptSplit);  
    newFeaturesSet.Reset();  
    IFeature feature = newFeaturesSet.Next() as IFeature;         

    5、合并线

    首先判断预合并的两条线拓扑关系,是否邻接关系;满足条件可以用关键字Merge实现,或者自定义方法,重新获取点的集合IPointCollection创建多线。
     
  • 相关阅读:
    Prime Time使用
    cache与MMU与总线仲裁
    IUS tcl cmd
    CPU cache
    generated clock
    PL301 matrix内部模块
    014-数据结构-树形结构-基数树、Patricia树、默克尔树、梅克尔帕特里夏树( Merkle Patricia Tree, MPT)
    001-软件架构概览、maven补充【分包工程、合并包、web容器插件】、git补充
    013-数据结构-树形结构-决策树
    012-数据结构-树形结构-哈希树[hashtree]、字典树[trietree]、后缀树
  • 原文地址:https://www.cnblogs.com/arxive/p/6263130.html
Copyright © 2011-2022 走看看