You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							736 lines
						
					
					
						
							32 KiB
						
					
					
				
			
		
		
	
	
							736 lines
						
					
					
						
							32 KiB
						
					
					
				using System; | 
						|
using System.Collections.Generic; | 
						|
using System.Linq; | 
						|
using ESRI.ArcGIS.Carto; | 
						|
using ESRI.ArcGIS.Controls; | 
						|
using ESRI.ArcGIS.Geodatabase; | 
						|
using ESRI.ArcGIS.Geometry; | 
						|
using KGIS.Framework.AE; | 
						|
using KGIS.Framework.Utils; | 
						|
using KGIS.Framework.Utils.Enum; | 
						|
 | 
						|
namespace Kingo.Plugin.EngineEditor.Commands.Tools | 
						|
{ | 
						|
    public class ControlsEditingTrackTool : BaseToolCommand | 
						|
    { | 
						|
        private IHookHelper m_hookHelper; | 
						|
        private EngineEditorClass m_editor = new EngineEditorClass(); | 
						|
        /// <summary> | 
						|
        /// 画笔 | 
						|
        /// </summary> | 
						|
        public IEngineEditSketch editSketch { get { return m_editor as IEngineEditSketch; } } | 
						|
        /// <summary> | 
						|
        /// 当前显示的图层 | 
						|
        /// </summary> | 
						|
        private List<IFeatureLayer> VisibleLayers { get; set; } | 
						|
 | 
						|
        private IPointCollection linePoint = new PolylineClass() as IPointCollection; | 
						|
        private IPointCollection LinePath | 
						|
        { | 
						|
            get | 
						|
            { | 
						|
                //IPointCollection temp = editSketch.Geometry as IPointCollection; | 
						|
                if (linePoint.PointCount > 0) | 
						|
                { | 
						|
                    linePoint.RemovePoints(0, linePoint.PointCount); | 
						|
                } | 
						|
                if (editSketch.GeometryType == esriGeometryType.esriGeometryPolygon) | 
						|
                { | 
						|
                    ITopologicalOperator topo = editSketch.Geometry as ITopologicalOperator; | 
						|
                    linePoint = topo.Boundary as IPointCollection; | 
						|
                    if (linePoint.PointCount > 1) | 
						|
                    { | 
						|
                        linePoint.RemovePoints(linePoint.PointCount - 1, 1); | 
						|
                    } | 
						|
                    RemovePointStartIndex = 2; | 
						|
                } | 
						|
                else if (editSketch.GeometryType == esriGeometryType.esriGeometryPolyline) | 
						|
                { | 
						|
                    linePoint = editSketch.Geometry as IPointCollection; | 
						|
                    RemovePointStartIndex = 1; | 
						|
                } | 
						|
                return linePoint; | 
						|
            } | 
						|
        } | 
						|
        //private IPointCollection LinePath = new PolylineClass() as IPointCollection; | 
						|
        /// <summary> | 
						|
        /// 捕捉对象 | 
						|
        /// </summary> | 
						|
        private IEngineSnapEnvironment snapEnv = null; | 
						|
        /// <summary> | 
						|
        /// 捕捉的点 | 
						|
        /// </summary> | 
						|
        private IPoint snapPoint = null; | 
						|
        int RemovePointStartIndex = 1; | 
						|
 | 
						|
        public override void OnCreate(object hook) | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                base.OnCreate(hook); | 
						|
                if (m_hookHelper == null) | 
						|
                { | 
						|
                    m_hookHelper = new HookHelperClass() { Hook = hook }; | 
						|
                } | 
						|
                if (m_editor == null) | 
						|
                { | 
						|
                    m_editor = new EngineEditorClass(); | 
						|
                } | 
						|
                if (snapEnv == null) | 
						|
                { | 
						|
                    snapEnv = (IEngineSnapEnvironment)m_editor; | 
						|
                } | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("追踪工具OnCreate初始化异常:" + ex.Message); | 
						|
            } | 
						|
        } | 
						|
        bool IsTracking = false; | 
						|
        public override void OnClick() | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                this.OnCreate(base.hook); | 
						|
                base.OnClick(); | 
						|
                if (VisibleLayers == null) | 
						|
                { | 
						|
                    VisibleLayers = new List<IFeatureLayer>(); | 
						|
                } | 
						|
                VisibleLayers.Clear(); | 
						|
                VisibleLayers = KGIS.Framework.Maps.MapsManager.Instance.MapService.GetAllVisibleLayerInMap<IFeatureLayer>(); | 
						|
                //VisibleLayers.Add(m_editor.TargetLayer as IFeatureLayer); | 
						|
                lines.Clear(); | 
						|
                snapLine = new KeyValuePair<int, IPolyline>(); | 
						|
                PreviousSnapLine = new KeyValuePair<int, IPolyline>(); | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("追踪工具OnClick异常:" + ex.Message); | 
						|
            } | 
						|
        } | 
						|
        public override void OnMouseDown(int button, int shift, int x, int y) | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                base.OnMouseDown(button, shift, x, y); | 
						|
                if (IsTracking == false) | 
						|
                { | 
						|
                    IPoint point = this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y); | 
						|
                    if (editSketch.Geometry == null || editSketch.Geometry.IsEmpty) | 
						|
                    { | 
						|
                        if (snapEnv != null) | 
						|
                        { | 
						|
                            this.SnapPoint(m_hookHelper.ActiveView, point, snapEnv); | 
						|
                            snapPoint = point; | 
						|
                        } | 
						|
                        if (snapPoint != null) | 
						|
                        { | 
						|
                            editSketch.AddPoint(snapPoint, false); | 
						|
                            editSketch.ModifySketch(); | 
						|
                            editSketch.RefreshSketch(); | 
						|
                        } | 
						|
                    } | 
						|
                    IsTracking = true; | 
						|
                } | 
						|
                else | 
						|
                { | 
						|
                    if (snapPoint != null) | 
						|
                    { | 
						|
                        editSketch.AddPoint(snapPoint, false); | 
						|
                        editSketch.ModifySketch(); | 
						|
                        editSketch.RefreshSketch(); | 
						|
                    } | 
						|
                    IsTracking = false; | 
						|
                } | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("追踪工具OnMouseDown异常:" + ex.Message); | 
						|
            } | 
						|
        } | 
						|
        //private IPolyline snapLine = null; | 
						|
        List<IPoint> intersectPoints = new List<IPoint>(); | 
						|
        /// <summary> | 
						|
        /// 捕捉到的所有线段集合 | 
						|
        /// </summary> | 
						|
        //List<IPolyline> lines = new List<IPolyline>(); | 
						|
        Dictionary<int, IPolyline> lines = new Dictionary<int, IPolyline>(); | 
						|
        KeyValuePair<int, IPolyline> snapLine = new KeyValuePair<int, IPolyline>(); | 
						|
        KeyValuePair<int, IPolyline> PreviousSnapLine = new KeyValuePair<int, IPolyline>(); | 
						|
 | 
						|
        public override void OnMouseMove(int button, int shift, int x, int y) | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                base.OnMouseMove(button, shift, x, y); | 
						|
                IPoint point = this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y); | 
						|
                if (LinePath.PointCount == 0 || !IsTracking) | 
						|
                { | 
						|
                    return; | 
						|
                } | 
						|
                int index = LinePath.PointCount - 1; | 
						|
                if (lines.Count == 0) | 
						|
                { | 
						|
                    //获取当前点所捕捉到的要素 | 
						|
                    lines = GeneratePolyline(snapPoint); | 
						|
                } | 
						|
                IPoint nearesPoint = null; | 
						|
                //鼠标点距离线段的最短距离 | 
						|
                double d = -1; | 
						|
                foreach (int item in lines.Keys) | 
						|
                { | 
						|
                    IProximityOperator operatorPr = lines[item] as IProximityOperator; | 
						|
                    IPoint TempNearesPoint = operatorPr.ReturnNearestPoint(point, esriSegmentExtension.esriNoExtension); | 
						|
                    double temp_D = operatorPr.ReturnDistance(point); | 
						|
                    if (d == -1 || d > temp_D) | 
						|
                    { | 
						|
                        d = temp_D; | 
						|
                        snapLine = new KeyValuePair<int, IPolyline>(item, lines[item]); | 
						|
                        nearesPoint = TempNearesPoint; | 
						|
                    } | 
						|
                } | 
						|
                if (PreviousSnapLine.Value == null) | 
						|
                { | 
						|
                    PreviousSnapLine = snapLine; | 
						|
                } | 
						|
                if (nearesPoint == null || snapLine.Value == null) | 
						|
                { | 
						|
                    return; | 
						|
                } | 
						|
                ITopologicalOperator topo = snapLine.Value as ITopologicalOperator; | 
						|
                topo.Simplify(); | 
						|
                IGeometry geo = topo.Intersect(nearesPoint, esriGeometryDimension.esriGeometry0Dimension); | 
						|
                if (geo == null || geo.IsEmpty) | 
						|
                { | 
						|
                    //Bug-12973 霍岩 2018-11-09 频繁释放ITopologicalOperator, IGeometry等对象导致COM与RCW分离异常 | 
						|
                    //System.Runtime.InteropServices.Marshal.FinalReleaseComObject(topo); | 
						|
                    //System.Runtime.InteropServices.Marshal.FinalReleaseComObject(geo); | 
						|
                    snapLine = new KeyValuePair<int, IPolyline>(); | 
						|
                    return; | 
						|
                } | 
						|
                if (snapEnv != null) | 
						|
                { | 
						|
                    this.SnapPoint(m_hookHelper.ActiveView, nearesPoint, snapEnv); | 
						|
                    snapPoint = nearesPoint; | 
						|
                } | 
						|
                if (LinePath.PointCount < 1) | 
						|
                { | 
						|
                    return; | 
						|
                } | 
						|
                bool IsVPoint = false; | 
						|
                if (IsCheckPointInLine(snapPoint, PreviousSnapLine.Value, ref IsVPoint) || PreviousSnapLine.Key == snapLine.Key) | 
						|
                { | 
						|
                    index = LinePath.PointCount - 1; | 
						|
                    if (GetSubCurveAddEdit(PreviousSnapLine.Value, LinePath.get_Point(index), snapPoint)) | 
						|
                    { | 
						|
                        PreviousSnapLine = snapLine; | 
						|
                    } | 
						|
                    else | 
						|
                    { | 
						|
                        //重新获取追踪线对象 | 
						|
                        lines = GeneratePolyline(snapPoint); | 
						|
                    } | 
						|
                } | 
						|
                else | 
						|
                { | 
						|
                    lines = GeneratePolyline(snapPoint); | 
						|
                    //判断前后追踪的两条线是否存在交点 | 
						|
                    ITopologicalOperator tempTopo = PreviousSnapLine.Value as ITopologicalOperator; | 
						|
                    tempTopo.Simplify(); | 
						|
                    IGeometry tempIpoint = tempTopo.Intersect(snapLine.Value, esriGeometryDimension.esriGeometry0Dimension); | 
						|
                    if (tempIpoint != null && !tempIpoint.IsEmpty) | 
						|
                    { | 
						|
                        index = LinePath.PointCount - 1; | 
						|
                        GetSubCurveAddEdit(PreviousSnapLine.Value, LinePath.get_Point(index), (tempIpoint as IPointCollection).get_Point(0)); | 
						|
                        PreviousSnapLine = snapLine; | 
						|
                        //Bug-12973 霍岩 2018-11-09 频繁释放ITopologicalOperator, IGeometry等对象导致COM与RCW分离异常 | 
						|
                        //System.Runtime.InteropServices.Marshal.FinalReleaseComObject(tempIpoint); | 
						|
                        //System.Runtime.InteropServices.Marshal.FinalReleaseComObject(tempTopo); | 
						|
                    } | 
						|
                } | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("追踪工具OnMouseMove异常:" + ex.Message); | 
						|
            } | 
						|
        } | 
						|
        /// <summary> | 
						|
        /// 获取指定线上两点之间的线段,并添加到当前编辑对象中 | 
						|
        /// </summary> | 
						|
        /// <param name="line">指定的线</param> | 
						|
        /// <param name="point1">点1</param> | 
						|
        /// <param name="point2">点2</param> | 
						|
        /// <returns>如果未获取到线段则返回false</returns> | 
						|
        public bool GetSubCurveAddEdit(IPolyline line, IPoint point1, IPoint point2) | 
						|
        { | 
						|
            bool result = false; | 
						|
            IPolyline templine = null; | 
						|
            IGeometry interLine = null; | 
						|
            IPointCollection ps = null; | 
						|
            ITopologicalOperator2 temptopo = null; | 
						|
            try | 
						|
            { | 
						|
                templine = GetSubCurve(line, point1, point2);//GetSubCurve | 
						|
                if (templine.IsEmpty || templine.Length == 0) | 
						|
                { | 
						|
                    result = false; | 
						|
                    return result; | 
						|
                } | 
						|
                temptopo = templine as ITopologicalOperator2; | 
						|
                temptopo.Simplify(); | 
						|
                interLine = temptopo.Intersect(LinePath as IPolyline, esriGeometryDimension.esriGeometry1Dimension); | 
						|
                if (interLine == null || interLine.IsEmpty) | 
						|
                { | 
						|
                    ps = templine as IPointCollection; | 
						|
                    if (Math.Round(templine.FromPoint.X, 2) == Math.Round((LinePath as IPolyline).ToPoint.X, 2) && Math.Round(templine.FromPoint.Y, 2) == Math.Round((LinePath as IPolyline).ToPoint.Y, 2)) | 
						|
                    { | 
						|
                        //判断最后一个点是否是线上的节点 | 
						|
                        if (!PointIsVertexPointForLine(templine.ToPoint, line)) | 
						|
                        { | 
						|
                            ps.RemovePoints(ps.PointCount - 1, 1); | 
						|
                        } | 
						|
                        int count = ps.PointCount; | 
						|
                        for (int i = 1; i < count; i++) | 
						|
                        { | 
						|
                            editSketch.AddPoint(ps.get_Point(i), true); | 
						|
                            editSketch.ModifySketch(); | 
						|
                            editSketch.RefreshSketch(); | 
						|
                        } | 
						|
                    } | 
						|
                    else | 
						|
                    { | 
						|
                        //判断最后一个点是否是线上的节点 | 
						|
                        if (!PointIsVertexPointForLine(templine.FromPoint, line)) | 
						|
                        { | 
						|
                            ps.RemovePoints(0, 1); | 
						|
                        } | 
						|
                        int count = ps.PointCount - 1; | 
						|
                        for (int i = count; i > 0; i--) | 
						|
                        { | 
						|
                            editSketch.AddPoint(ps.get_Point(i), true); | 
						|
                            editSketch.ModifySketch(); | 
						|
                            editSketch.RefreshSketch(); | 
						|
                        } | 
						|
                    } | 
						|
                    result = true; | 
						|
                } | 
						|
                else | 
						|
                { | 
						|
                    for (int i = 0; i < (templine as IPointCollection).PointCount; i++) | 
						|
                    { | 
						|
                        if (LinePath.PointCount == 1) | 
						|
                            break; | 
						|
                        int index = LinePath.PointCount - 2; | 
						|
                        bool IsVPoint = false; | 
						|
                        if (!IsCheckPointInLine(LinePath.get_Point(index), snapLine.Value, ref IsVPoint)) | 
						|
                        { | 
						|
                            break; | 
						|
                        } | 
						|
                        (editSketch.Geometry as IPointCollection).RemovePoints((editSketch.Geometry as IPointCollection).PointCount - RemovePointStartIndex, 1); | 
						|
                        editSketch.ModifySketch(); | 
						|
                        editSketch.RefreshSketch(); | 
						|
                    } | 
						|
                } | 
						|
            } | 
						|
            finally | 
						|
            { | 
						|
                //Bug-12973 霍岩 2018-11-09 频繁释放ITopologicalOperator, IGeometry等对象导致COM与RCW分离异常 | 
						|
                //if (templine != null) | 
						|
                //{ | 
						|
                //    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(templine); | 
						|
                //} | 
						|
                //if (interLine != null) | 
						|
                //{ | 
						|
                //    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(interLine); | 
						|
                //} | 
						|
                //if (ps != null) | 
						|
                //{ | 
						|
                //    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(ps); | 
						|
                //} | 
						|
                //if (temptopo != null) | 
						|
                //{ | 
						|
                //    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(temptopo); | 
						|
                //} | 
						|
            } | 
						|
 | 
						|
            return result; | 
						|
        } | 
						|
 | 
						|
        public bool PointIsVertexPointForLine(IPoint point, IPolyline line) | 
						|
        { | 
						|
            bool result = false; | 
						|
            IPointCollection points = line as IPointCollection; | 
						|
            for (int i = 0; i < points.PointCount; i++) | 
						|
            { | 
						|
                if (Math.Round(point.X, 2) == Math.Round(points.get_Point(i).X, 2) && Math.Round(point.Y, 2) == Math.Round(points.get_Point(i).Y, 2)) | 
						|
                { | 
						|
                    result = true; | 
						|
                    break; | 
						|
                } | 
						|
            } | 
						|
            return result; | 
						|
        } | 
						|
 | 
						|
        public override void OnDblClick() | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                snapLine = new KeyValuePair<int, IPolyline>(); | 
						|
                PreviousSnapLine = new KeyValuePair<int, IPolyline>(); | 
						|
                lines.Clear(); | 
						|
                editSketch.FinishSketch(); | 
						|
                base.OnDblClick(); | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("追踪工具OnDblClick异常:" + ex.Message); | 
						|
            } | 
						|
        } | 
						|
        /// <summary> | 
						|
        /// 判断点是否在线上 | 
						|
        /// </summary> | 
						|
        /// <param name="pPoint">点</param> | 
						|
        /// <param name="pLine">线</param> | 
						|
        /// <param name="pContainEndPoint">是否包含端点</param> | 
						|
        /// <returns></returns> | 
						|
        private bool IsCheckPointInLine(IPoint pPoint, IPolyline pLine, ref bool pContainEndPoint) | 
						|
        { | 
						|
            bool result = false; | 
						|
 | 
						|
            pContainEndPoint = false; | 
						|
            try | 
						|
            { | 
						|
                if (pPoint != null && pLine != null) | 
						|
                { | 
						|
                    if (!pLine.IsEmpty && !pPoint.IsEmpty) | 
						|
                    { | 
						|
                        ITopologicalOperator topo = pLine as ITopologicalOperator; | 
						|
                        //Bug-12973 霍岩 2018-11-09 在拓扑操作前使其简化 | 
						|
                        topo.Simplify(); | 
						|
                        IGeometry geo = topo.Intersect(pPoint, esriGeometryDimension.esriGeometry0Dimension); | 
						|
                        if (geo != null && !geo.IsEmpty) | 
						|
                        { | 
						|
                            IPoint p = geo as IPoint; | 
						|
                            if ((Math.Round(p.X, 2) == Math.Round(pLine.FromPoint.X, 2) && Math.Round(p.Y, 2) == Math.Round(pLine.FromPoint.Y, 2)) || (Math.Round(p.X, 2) == Math.Round(pLine.ToPoint.X, 2) && Math.Round(p.Y, 2) == Math.Round(pLine.ToPoint.Y, 2))) | 
						|
                            { | 
						|
                                result = true; | 
						|
                                pContainEndPoint = true; | 
						|
                            } | 
						|
                            else | 
						|
                            { | 
						|
                                result = true; | 
						|
                            } | 
						|
                        } | 
						|
                    } | 
						|
                } | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                throw ex; | 
						|
            } | 
						|
            return result; | 
						|
        } | 
						|
        private IPolyline GetSubCurve(IPolyline inpolyLine, IPoint pnt1, IPoint pnt2) | 
						|
        { | 
						|
            double d1 = GetDistAlong(inpolyLine, pnt1); | 
						|
            double d2 = GetDistAlong(inpolyLine, pnt2); | 
						|
 | 
						|
            var c = inpolyLine as ICurve; | 
						|
            ICurve outCurve; | 
						|
            c.GetSubcurve(d1, d2, false, out outCurve); | 
						|
            if (c == null || c.IsEmpty) | 
						|
                throw new Exception("aa"); | 
						|
            var outPolyline = outCurve as IPolyline; | 
						|
            if (outPolyline == null) | 
						|
            { | 
						|
                outPolyline = new PolylineClass() as IPolyline; | 
						|
                var sc = outPolyline as ISegmentCollection; | 
						|
                sc.AddSegment((ISegment)outCurve); | 
						|
                ((IGeometry)sc).SpatialReference = outCurve.SpatialReference; | 
						|
            } | 
						|
            return outPolyline; | 
						|
        } | 
						|
 | 
						|
        private double GetDistAlong(IPolyline polyLine, IPoint pnt) | 
						|
        { | 
						|
            var outPnt = new PointClass() as IPoint; | 
						|
            double distAlong = double.NaN; | 
						|
            double distFrom = double.NaN; | 
						|
            bool bRight = false; | 
						|
            polyLine.QueryPointAndDistance(esriSegmentExtension.esriNoExtension, pnt, false, outPnt, | 
						|
            ref distAlong, ref distFrom, ref bRight); | 
						|
            return distAlong; | 
						|
        } | 
						|
 | 
						|
        private IPolyline BuildLine(IPolyline pLine, IPoint p1, IPoint p2) | 
						|
        { | 
						|
            bool isSplit; | 
						|
            int splitIndex, segIndex; | 
						|
            //插入第一点,segIndex记录插入点的相对线的节点位置 | 
						|
            pLine.SplitAtPoint(p1, true, false, out isSplit, out splitIndex, out segIndex); | 
						|
            int fIndex = segIndex; | 
						|
            //插入第二点 | 
						|
            pLine.SplitAtPoint(p2, true, false, out isSplit, out splitIndex, out segIndex); | 
						|
            int sIndex = segIndex; | 
						|
            IPointCollection pPointCol = new PolylineClass(); | 
						|
            //IPointCollection pPointCol2 = new PolylineClass(); | 
						|
            object o = Type.Missing; | 
						|
            //比较一下插入第一点和第二点的节点次序 | 
						|
            if (fIndex > sIndex) | 
						|
            { | 
						|
                int temp = fIndex; | 
						|
                fIndex = sIndex; | 
						|
                sIndex = temp; | 
						|
            } | 
						|
            else if (fIndex == sIndex) | 
						|
            { | 
						|
                pPointCol.AddPoint(p1, ref o, ref o); | 
						|
                pPointCol.AddPoint(p2, ref o, ref o); | 
						|
                return pPointCol as IPolyline; | 
						|
            } | 
						|
            //利用两点区间,获取线上区间所在的点,并将其转换为线 | 
						|
            IPointCollection LineCol = pLine as IPointCollection; | 
						|
            for (int i = fIndex; i <= sIndex; i++) | 
						|
            { | 
						|
                pPointCol.AddPoint(LineCol.get_Point(i), ref o, ref o); | 
						|
            } | 
						|
            //for (int i = 0; i < LineCol.PointCount; i++) | 
						|
            //{ | 
						|
            //    if (i < fIndex || i > sIndex) | 
						|
            //    { | 
						|
            //        pPointCol2.AddPoint(LineCol.get_Point(i), ref o, ref o); | 
						|
            //    } | 
						|
            //} | 
						|
            return pPointCol as IPolyline; | 
						|
        } | 
						|
 | 
						|
        /// <summary> | 
						|
        /// 生成地类界线 | 
						|
        /// </summary> | 
						|
        /// <param name="pFeature">地类图斑要素</param> | 
						|
        /// <param name="pFc">地类界线对应的要素类对象</param> | 
						|
        /// <returns></returns> | 
						|
        public void GenerateDLJX(IPoint point, Dictionary<int, IPolyline> lines) | 
						|
        { | 
						|
            Dictionary<int, IPolyline> dicLine = new Dictionary<int, IPolyline>(); | 
						|
            foreach (var item in lines.Keys) | 
						|
            { | 
						|
                dicLine.Add(item, lines[item]); | 
						|
            } | 
						|
            lines.Clear(); | 
						|
            try | 
						|
            { | 
						|
                if (point == null || lines == null) | 
						|
                    return; | 
						|
                List<IFeature> featureList = FeatureAPI.Snapping(snapPoint, VisibleLayers, 10); | 
						|
                foreach (IFeature item in featureList) | 
						|
                { | 
						|
                    List<IGeometry> polylineArray = FeatureAPI.FeatureToLine(item); | 
						|
                    if (polylineArray == null) | 
						|
                    { | 
						|
                        continue; | 
						|
                    } | 
						|
                    foreach (IGeometry line in polylineArray) | 
						|
                    { | 
						|
                        if (dicLine.Count == 0) | 
						|
                        { | 
						|
                            lines.Add(lines.Count, line as IPolyline); | 
						|
                            continue; | 
						|
                        } | 
						|
                        IGeometry OtherIntersect = null; | 
						|
                        foreach (IPolyline his_Line in dicLine.Values) | 
						|
                        { | 
						|
                            //不相交部分 | 
						|
                            IGeometry No_InterGeo = FeatureAPI.Difference(his_Line, OtherIntersect); | 
						|
                            IGeometryCollection No_InterList = No_InterGeo as IGeometryCollection; | 
						|
                            if (No_InterList != null) | 
						|
                            { | 
						|
                                for (int i = 0; i < No_InterList.GeometryCount; i++) | 
						|
                                { | 
						|
                                    IGeometryCollection pPolyline = new PolylineClass(); | 
						|
                                    pPolyline.AddGeometry(No_InterList.get_Geometry(i)); | 
						|
                                    lines.Add(lines.Count, pPolyline as IPolyline); | 
						|
                                } | 
						|
                            } | 
						|
                            //相交部分 | 
						|
                            IGeometry intersectGeo = FeatureAPI.InterSect(line, his_Line); | 
						|
                            if (OtherIntersect == null) | 
						|
                            { | 
						|
                                OtherIntersect = intersectGeo; | 
						|
                            } | 
						|
                            else | 
						|
                            { | 
						|
                                ITopologicalOperator topo = OtherIntersect as ITopologicalOperator; | 
						|
                                if (topo != null) | 
						|
                                { | 
						|
                                    topo.Simplify(); | 
						|
                                    OtherIntersect = topo.Union(intersectGeo); | 
						|
                                } | 
						|
                            } | 
						|
                            IGeometryCollection intersectList = intersectGeo as IGeometryCollection; | 
						|
                            if (intersectGeo != null) | 
						|
                            { | 
						|
                                for (int i = 0; i < intersectList.GeometryCount; i++) | 
						|
                                { | 
						|
                                    IGeometryCollection pPolyline = new PolylineClass(); | 
						|
                                    pPolyline.AddGeometry(intersectList.get_Geometry(i)); | 
						|
                                    lines.Add(lines.Count, pPolyline as IPolyline); | 
						|
                                } | 
						|
                            } | 
						|
                        } | 
						|
                        if (OtherIntersect != null) | 
						|
                        { | 
						|
                            //新生成的线与之不相交 | 
						|
                            IGeometry newGeoNoInter = FeatureAPI.Difference(line, OtherIntersect); | 
						|
                            IGeometryCollection newGeoList = newGeoNoInter as IGeometryCollection; | 
						|
                            if (newGeoList != null) | 
						|
                            { | 
						|
                                for (int i = 0; i < newGeoList.GeometryCount; i++) | 
						|
                                { | 
						|
                                    IGeometryCollection pPolyline = new PolylineClass(); | 
						|
                                    pPolyline.AddGeometry(newGeoList.get_Geometry(i)); | 
						|
                                    lines.Add(lines.Count, pPolyline as IPolyline); | 
						|
                                } | 
						|
                            } | 
						|
                        } | 
						|
                        //lines = result.Values.ToList<IPolyline>(); | 
						|
 | 
						|
                    } | 
						|
                    //lines = result.Values.ToList<IPolyline>(); | 
						|
                    //if (result.Count == 0) | 
						|
                    //    result = polylineArray; | 
						|
 | 
						|
                } | 
						|
 | 
						|
                return; | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                throw ex; | 
						|
            } | 
						|
        } | 
						|
 | 
						|
        public Dictionary<int, IPolyline> GeneratePolyline(IPoint point, Dictionary<int, IPolyline> lines) | 
						|
        { | 
						|
            Dictionary<int, IPolyline> result = new Dictionary<int, IPolyline>(); | 
						|
            if (point == null || lines == null) return result; | 
						|
            try | 
						|
            { | 
						|
                //获取当前追踪的要素多边形 | 
						|
                List<IFeature> snapFeatures = FeatureAPI.Snapping(point, VisibleLayers, 10); | 
						|
                //List<IFeature> snapFeatures = new List<IFeature>(); | 
						|
                //if (snapFe.Count > 0) | 
						|
                //{ | 
						|
                //    //snapFeatures.Add(snapFe[0]); | 
						|
                //    snapFeatures.AddRange(FeatureAPI.Snapping(snapFe[0].ShapeCopy, VisibleLayers, 1)); | 
						|
                //} | 
						|
                if (snapFeatures == null) return result; | 
						|
                foreach (IFeature feautre in snapFeatures) | 
						|
                { | 
						|
                    //将多边形要素转成线要素 | 
						|
                    List<IGeometry> featureToLines = FeatureAPI.PolygonToLine(feautre.ShapeCopy); | 
						|
                    if (featureToLines == null) continue; | 
						|
 | 
						|
                    IPolyline tempLine = null; | 
						|
                    foreach (IGeometry f_line in featureToLines) | 
						|
                    { | 
						|
                        if (lines.Count == 0) | 
						|
                        { | 
						|
                            result.Add(result.Count, f_line as IPolyline); | 
						|
                            continue; | 
						|
                        } | 
						|
                        //将线要素与已有的线要素进行打断 | 
						|
                        foreach (IPolyline line in lines.Values) | 
						|
                        { | 
						|
                            ITopologicalOperator topo = line as ITopologicalOperator; | 
						|
                            topo.Simplify(); | 
						|
                            IPolyline new_DifLine = topo.Difference(f_line) as IPolyline; | 
						|
                            if (new_DifLine != null && !new_DifLine.IsEmpty) | 
						|
                                result.Add(result.Count, new_DifLine); | 
						|
                            IPolyline new_InterLine = topo.Intersect(f_line, esriGeometryDimension.esriGeometry1Dimension) as IPolyline; | 
						|
                            if (new_InterLine != null && !new_InterLine.IsEmpty && new_DifLine != null && !new_DifLine.IsEmpty) | 
						|
                                result.Add(result.Count, new_InterLine); | 
						|
                        } | 
						|
                        foreach (IPolyline line in lines.Values) | 
						|
                        { | 
						|
                            if (tempLine == null) | 
						|
                                tempLine = f_line as IPolyline; | 
						|
                            ITopologicalOperator topo = tempLine as ITopologicalOperator; | 
						|
                            topo.Simplify(); | 
						|
                            tempLine = topo.Difference(line) as IPolyline; | 
						|
                            if (tempLine == null || tempLine.IsEmpty) | 
						|
                                break; | 
						|
                        } | 
						|
                        if (tempLine != null && !tempLine.IsEmpty) | 
						|
                            result.Add(result.Count, tempLine); | 
						|
                    } | 
						|
                } | 
						|
                return result; | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug(ex); | 
						|
                throw ex; | 
						|
            } | 
						|
        } | 
						|
 | 
						|
        public Dictionary<int, IPolyline> GeneratePolyline(IPoint point) | 
						|
        { | 
						|
            Dictionary<int, IPolyline> result = new Dictionary<int, IPolyline>(); | 
						|
            if (point == null) return result; | 
						|
            try | 
						|
            { | 
						|
                //获取当前追踪的要素多边形 | 
						|
                List<IFeature> snapFeatures = FeatureAPI.Snapping(point, VisibleLayers, 10); | 
						|
                if (snapFeatures == null) return result; | 
						|
                foreach (IFeature feautre in snapFeatures) | 
						|
                { | 
						|
                    //将多边形要素转成线要素 | 
						|
                    List<IGeometry> featureToLines = FeatureAPI.PolygonToLine(feautre.ShapeCopy); | 
						|
                    if (featureToLines == null) continue; | 
						|
 | 
						|
                    IPolyline tempLine = null; | 
						|
                    foreach (IGeometry f_line in featureToLines) | 
						|
                    { | 
						|
                        tempLine = f_line as IPolyline; | 
						|
                        List<IFeature> LineInsertFeature = FeatureAPI.Snapping(tempLine, VisibleLayers, 0.0001); | 
						|
                        foreach (IFeature item in LineInsertFeature) | 
						|
                        { | 
						|
                            if (item.OID == feautre.OID) | 
						|
                                continue; | 
						|
                            ITopologicalOperator topo = tempLine as ITopologicalOperator; | 
						|
                            topo.Simplify(); | 
						|
                            IPolyline newline = topo.Intersect(item.ShapeCopy, esriGeometryDimension.esriGeometry1Dimension) as IPolyline; | 
						|
                            //IPolyline obj = result.Values.FirstOrDefault(f => Math.Round(f.Length, 0) == Math.Round(newline.Length, 0)); | 
						|
                            if (newline != null && !newline.IsEmpty && result.Values.FirstOrDefault(f => Math.Round(f.Length, 0) == Math.Round(newline.Length, 0)) == null) | 
						|
                                result.Add(result.Count, newline); | 
						|
                            tempLine = topo.Difference(item.ShapeCopy) as IPolyline; | 
						|
                        } | 
						|
                        if (!tempLine.IsEmpty && result.Values.FirstOrDefault(f => Math.Round(f.Length, 0) == Math.Round(tempLine.Length, 0)) == null) | 
						|
                            result.Add(result.Count, tempLine); | 
						|
                    } | 
						|
                } | 
						|
                return result; | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                throw ex; | 
						|
            } | 
						|
        } | 
						|
 | 
						|
        public override bool Enabled | 
						|
        { | 
						|
            get | 
						|
            { | 
						|
                if (m_editor == null || m_editor.EditState != esriEngineEditState.esriEngineStateEditing) | 
						|
                { | 
						|
                    return false; | 
						|
                } | 
						|
                return true; | 
						|
            } | 
						|
        } | 
						|
 | 
						|
        public override enumProductType AttachProductType { get { return enumProductType.KDB; } } | 
						|
    } | 
						|
}
 | 
						|
 |