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.
		
		
		
		
		
			
		
			
				
					
					
						
							3844 lines
						
					
					
						
							173 KiB
						
					
					
				
			
		
		
	
	
							3844 lines
						
					
					
						
							173 KiB
						
					
					
				using System; | 
						|
using System.Collections.Generic; | 
						|
using System.Linq; | 
						|
using System.Runtime.InteropServices; | 
						|
using ESRI.ArcGIS.ADF.BaseClasses; | 
						|
using ESRI.ArcGIS.Carto; | 
						|
using ESRI.ArcGIS.Controls; | 
						|
using ESRI.ArcGIS.Display; | 
						|
using ESRI.ArcGIS.esriSystem; | 
						|
using ESRI.ArcGIS.Geodatabase; | 
						|
using ESRI.ArcGIS.Geometry; | 
						|
using KGIS.Framework.AE; | 
						|
using KGIS.Framework.Maps; | 
						|
using KGIS.Framework.Platform; | 
						|
using KGIS.Framework.Utils; | 
						|
using KGIS.Framework.Utils.Helper; | 
						|
using Kingo.Plugin.EngineEditor.Common; | 
						|
using Kingo.Plugin.EngineEditor.Model; | 
						|
using Kingo.Plugin.EngineEditor.Views; | 
						|
using Kingo.PluginServiceInterface; | 
						|
using UIShell.OSGi; | 
						|
 | 
						|
namespace Kingo.Plugin.EngineEditor.Commands.Tools | 
						|
{ | 
						|
    /// <summary> | 
						|
    /// 画线物面(线状地物面)工具 | 
						|
    /// </summary> | 
						|
    public class ControlsEditingDrawLineToPolygonToolForKDB : BaseTool | 
						|
    { | 
						|
 | 
						|
        //public KGIS.Common.Interface.IRegionAuthorize RegionAuthorize | 
						|
        //{ | 
						|
        //    get; | 
						|
        //    set; | 
						|
        //} | 
						|
        public VerificationOfFeatureNodeDensity density | 
						|
        { | 
						|
            get; | 
						|
            set; | 
						|
        } | 
						|
        //RegionAuthorize RegionAuthorize = null; | 
						|
        private IEngineSnapEnvironment snapEnv = null; | 
						|
        #region 私有变量 | 
						|
        //KOTilesLayer layer = null; | 
						|
        private EngineEditorClass m_editor; | 
						|
        private IHookHelper m_hookHelper; | 
						|
        /// <summary> | 
						|
        /// 平移工具 | 
						|
        /// </summary> | 
						|
        private ControlsMapPanToolClass panTool = null; | 
						|
        /// <summary> | 
						|
        /// 中间线 | 
						|
        /// </summary> | 
						|
        private LineModel MiddleLine; | 
						|
        /// <summary> | 
						|
        /// 左边线 | 
						|
        /// </summary> | 
						|
        private LineModel LeftLine; | 
						|
        /// <summary> | 
						|
        /// 右边线 | 
						|
        /// </summary> | 
						|
        private LineModel RightLine; | 
						|
        /// <summary> | 
						|
        /// 是否续画 | 
						|
        /// </summary> | 
						|
        private bool IsContinueDraw = false; | 
						|
        /// <summary> | 
						|
        /// 续画左端点 | 
						|
        /// </summary> | 
						|
        private IPoint ContinueDrawLeftPoint = null; | 
						|
        /// <summary> | 
						|
        /// 续画右端点 | 
						|
        /// </summary> | 
						|
        private IPoint ContinueDrawRightPoint = null; | 
						|
        /// <summary> | 
						|
        /// 续画宽度 | 
						|
        /// </summary> | 
						|
        private double ContinueDrawLength = 0.0; | 
						|
        private bool _IsDrawing; | 
						|
        /// <summary> | 
						|
        /// 正在绘制 | 
						|
        /// </summary> | 
						|
        private bool IsDrawing | 
						|
        { | 
						|
            get | 
						|
            { | 
						|
                return _IsDrawing; | 
						|
            } | 
						|
            set | 
						|
            { | 
						|
                _IsDrawing = value; | 
						|
                if (_IsDrawing) | 
						|
                { | 
						|
                    //替换Env改动 | 
						|
                    //Env.Instance.KMap.AxMapControl.AutoMouseWheel = false; | 
						|
                    //Env.Instance.KMap.AxMapControl.AutoKeyboardScrolling = false; | 
						|
                    (m_hookHelper.Hook as IMapControlDefault).AutoMouseWheel = false; | 
						|
                    (m_hookHelper.Hook as IMapControlDefault).AutoKeyboardScrolling = false; | 
						|
 | 
						|
                } | 
						|
                else | 
						|
                { | 
						|
                    //替换Env改动 | 
						|
                    //Env.Instance.KMap.AxMapControl.AutoMouseWheel = true; | 
						|
                    //Env.Instance.KMap.AxMapControl.AutoKeyboardScrolling = true; | 
						|
                    (m_hookHelper.Hook as IMapControlDefault).AutoMouseWheel = true; | 
						|
                    (m_hookHelper.Hook as IMapControlDefault).AutoKeyboardScrolling = true; | 
						|
 | 
						|
                } | 
						|
            } | 
						|
        } | 
						|
        private Boolean IsSpaceDown = false; | 
						|
        private bool IsCtrlDown = false; | 
						|
        private IElement TextElement; | 
						|
        /// <summary> | 
						|
        /// 记录鼠标当前位置 | 
						|
        /// </summary> | 
						|
        private System.Drawing.Point MousePoint = new System.Drawing.Point(); | 
						|
        private bool IsChangedWidht = false; | 
						|
        /// <summary> | 
						|
        /// 道路线最小点间距 | 
						|
        /// </summary> | 
						|
        private int MinPointDistance = 30; | 
						|
        /// <summary> | 
						|
        /// 道路线最大点间距 | 
						|
        /// </summary> | 
						|
        private int MaxPointDistance = 80; | 
						|
 | 
						|
        public DrawParam drawParam | 
						|
        { | 
						|
            get; | 
						|
            set; | 
						|
        } | 
						|
        FrmDrawDoublePolyline paramFrm = null; | 
						|
 | 
						|
        private bool IsAutoTrackPoint | 
						|
        { | 
						|
            set | 
						|
            { | 
						|
                if (MiddleLine != null) | 
						|
                { | 
						|
                    MiddleLine.IsAutoTrackPoint = value; | 
						|
                } | 
						|
                if (LeftLine != null) | 
						|
                { | 
						|
                    LeftLine.IsAutoTrackPoint = value; | 
						|
                } | 
						|
                if (RightLine != null) | 
						|
                { | 
						|
                    RightLine.IsAutoTrackPoint = value; | 
						|
                } | 
						|
            } | 
						|
        } | 
						|
        /// <summary> | 
						|
        /// 是否自动追踪 | 
						|
        /// </summary> | 
						|
        private bool IsAuto = false; | 
						|
 | 
						|
        #region 地图自动漫游相关变量 | 
						|
        /// <summary> | 
						|
        /// 表示是否开启自动漫游功能 | 
						|
        /// </summary> | 
						|
        private bool AllowMoveMap = false; | 
						|
        /// <summary> | 
						|
        /// 地图漫游计时器(表示多久移动一次地图) | 
						|
        /// </summary> | 
						|
        private System.Windows.Forms.Timer timer = null; | 
						|
        /// <summary> | 
						|
        /// 鼠标距离地图边界的距离(当小于指定值是开始漫游) | 
						|
        /// </summary> | 
						|
        private int MapBorderDistance = 10; | 
						|
        #endregion | 
						|
        #region 自动识别功能相关变量 | 
						|
        /// <summary> | 
						|
        /// 自动识别计时器(相隔一定时间,根据鼠标位置自动识别一次) | 
						|
        /// </summary> | 
						|
        private System.Windows.Forms.Timer autoDistinguishTimer = null; | 
						|
        /// <summary> | 
						|
        /// 用于存放自动识别到的点元素集合 | 
						|
        /// </summary> | 
						|
        private List<IElement> PointElement = new List<IElement>(); | 
						|
        /// <summary> | 
						|
        /// 用于存放自动识别到的宽度 | 
						|
        /// </summary> | 
						|
        private double TempWidht = 0; | 
						|
        /// <summary> | 
						|
        /// 用于临时存放自动识别到的中心点 | 
						|
        /// </summary> | 
						|
        private IPoint TempCenterPoint = null; | 
						|
        #endregion | 
						|
 | 
						|
 | 
						|
        /// <summary> | 
						|
        /// 记录捕捉Element上点的索引 | 
						|
        /// </summary> | 
						|
        private int SnapElementPointIndex = -1; | 
						|
        /// <summary> | 
						|
        /// 记录捕捉的点在哪条线上(0:中心线;1:左边线;-1:右边线) | 
						|
        /// </summary> | 
						|
        private int SnapElementPointLine = 0; | 
						|
        #endregion | 
						|
 | 
						|
        /// <summary> | 
						|
        /// 初始化工具相关属性 | 
						|
        /// </summary> | 
						|
        private void Init() | 
						|
        { | 
						|
            //初始化计时器 | 
						|
            timer = new System.Windows.Forms.Timer(); | 
						|
            timer.Interval = 100; | 
						|
            timer.Tick += timer_Tick; | 
						|
            autoDistinguishTimer = new System.Windows.Forms.Timer(); | 
						|
            autoDistinguishTimer.Interval = 100; | 
						|
            autoDistinguishTimer.Tick += autoDistinguishTimer_Tick; | 
						|
 | 
						|
            //初始化地图漫游工具 | 
						|
            panTool = new ControlsMapPanToolClass(); | 
						|
            panTool.OnCreate(m_hookHelper.Hook); | 
						|
 | 
						|
            //初始化编辑对象 | 
						|
            if (m_editor == null) | 
						|
                m_editor = new EngineEditorClass();// Env.Instance.KMap.EngEditor; | 
						|
            if (snapEnv == null) | 
						|
                snapEnv = m_editor; | 
						|
 | 
						|
            //开启自动漫游功能 | 
						|
            AllowMoveMap = false; | 
						|
 | 
						|
            //注册鼠标滚轮事件 | 
						|
            //替换Env改动 | 
						|
            //Env.Instance.Platfrom.MapMouseWheel -= Platfrom_MapMouseWheel; | 
						|
            //Env.Instance.Platfrom.MapMouseWheel += Platfrom_MapMouseWheel; | 
						|
            if (_MapService != null) | 
						|
            { | 
						|
                _MapService.MapContainerMouseWheel -= Platfrom_MapMouseWheel; | 
						|
                _MapService.MapContainerMouseWheel += Platfrom_MapMouseWheel; | 
						|
            } | 
						|
            //白明雅 2020-04-07 用于激活键盘事件 | 
						|
            MapsManager.Instance.MapService.getAxMapControl().Focus(); | 
						|
            //初始化绘制模型 | 
						|
            if (MiddleLine == null) | 
						|
                MiddleLine = new LineModel(m_hookHelper.ActiveView, esriSimpleLineStyle.esriSLSDash, 0.5); | 
						|
            if (LeftLine == null) | 
						|
                LeftLine = new LineModel(m_hookHelper.ActiveView, esriSimpleLineStyle.esriSLSSolid); | 
						|
            if (RightLine == null) | 
						|
                RightLine = new LineModel(m_hookHelper.ActiveView, esriSimpleLineStyle.esriSLSSolid); | 
						|
            MiddleLine.Init(); | 
						|
            LeftLine.Init(); | 
						|
            RightLine.Init(); | 
						|
 | 
						|
            //设置鼠标样式 | 
						|
            base.m_cursor = System.Windows.Forms.Cursors.Cross; | 
						|
 | 
						|
            //初始化其他参数 | 
						|
            IsSpaceDown = false; | 
						|
            IsDeactivate = false; | 
						|
            if (PointElement == null) | 
						|
                PointElement = new List<IElement>(); | 
						|
        } | 
						|
        /// <summary> | 
						|
        /// 释放工具相关对象 | 
						|
        /// </summary> | 
						|
        private void Dispose() | 
						|
        { | 
						|
            //销毁计时器 | 
						|
            if (timer != null) | 
						|
            { | 
						|
                timer.Tick -= timer_Tick; | 
						|
                timer.Stop(); | 
						|
                timer.Dispose(); | 
						|
            } | 
						|
            if (autoDistinguishTimer != null) | 
						|
            { | 
						|
                autoDistinguishTimer.Tick -= autoDistinguishTimer_Tick; | 
						|
                autoDistinguishTimer.Stop(); | 
						|
                autoDistinguishTimer.Dispose(); | 
						|
            } | 
						|
            //销毁panTool工具 | 
						|
            if (panTool != null) | 
						|
            { | 
						|
                panTool.Deactivate(); | 
						|
                Marshal.ReleaseComObject(panTool); | 
						|
                panTool = null; | 
						|
            } | 
						|
 | 
						|
            //取消事件注册 | 
						|
            //替换Env改动 | 
						|
            //Env.Instance.Platfrom.MapMouseWheel -= Platfrom_MapMouseWheel; | 
						|
            if (_MapService != null) | 
						|
            { | 
						|
                _MapService.MapContainerMouseWheel -= Platfrom_MapMouseWheel; | 
						|
            } | 
						|
 | 
						|
            //销毁绘制模型 | 
						|
            if (MiddleLine != null) | 
						|
            { | 
						|
                MiddleLine.Dissvoe(); | 
						|
                MiddleLine = null; | 
						|
            } | 
						|
            if (LeftLine != null) | 
						|
            { | 
						|
                LeftLine.Dissvoe(); | 
						|
                LeftLine = null; | 
						|
            } | 
						|
            if (RightLine != null) | 
						|
            { | 
						|
                RightLine.Dissvoe(); | 
						|
                RightLine = null; | 
						|
            } | 
						|
 | 
						|
            this.IsDrawing = false; | 
						|
            this.IsContinueDraw = false; | 
						|
            IsDeactivate = true; | 
						|
            this.m_checked = false; | 
						|
            if (PointElement != null) | 
						|
                PointElement.Clear(); | 
						|
        } | 
						|
        #region 重写BaseCommand | 
						|
        public override void OnCreate(object hook) | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                if (m_hookHelper == null) | 
						|
                { | 
						|
                    //替换Env改动 | 
						|
                    //m_hookHelper = Env.Instance.KMap.HookHelper; | 
						|
                    m_hookHelper = new HookHelperClass(); | 
						|
                    m_hookHelper.Hook = hook; | 
						|
                } | 
						|
 | 
						|
                //初始化编辑对象 | 
						|
                if (m_editor == null) | 
						|
                    m_editor = new EngineEditorClass(); | 
						|
 | 
						|
                //m_editor = new EngineEditorClass(); | 
						|
                ////m_editor.OnStopEditing += m_editor_OnStopEditing; | 
						|
                ////m_editor.OnTargetLayerChanged += m_editor_OnTargetLayerChanged; | 
						|
                //snapEnv = (IEngineSnapEnvironment)m_editor; | 
						|
 | 
						|
                if (drawParam == null) | 
						|
                { | 
						|
                    drawParam = new DrawParam(); | 
						|
                    drawParam.DrawMode = DrawMode.LeftAndRight; | 
						|
                    drawParam.Width = 10; | 
						|
                    drawParam.ToloranceScale = 0.2; | 
						|
                    drawParam.DLBM = "1003-公路用地"; | 
						|
                } | 
						|
 | 
						|
                if (density == null) | 
						|
                { | 
						|
                    density = new VerificationOfFeatureNodeDensity(m_hookHelper); | 
						|
                } | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("初始化 画线物面(线状地物面)工具 时异常,异常信息如下:"); | 
						|
                LogAPI.Debug(ex); | 
						|
                LogAPI.Debug("初始化 画线物面(线状地物面)工具 时异常信息结束"); | 
						|
            } | 
						|
        } | 
						|
 | 
						|
        //void m_editor_OnTargetLayerChanged() | 
						|
        //{ | 
						|
        //    if (paramFrm != null) | 
						|
        //    { | 
						|
        //        paramFrm.Close(); | 
						|
        //        paramFrm = null; | 
						|
        //        base.Deactivate(); | 
						|
        //    } | 
						|
        //} | 
						|
 | 
						|
        //void m_editor_OnStopEditing(bool saveChanges) | 
						|
        //{ | 
						|
        //    if (paramFrm != null) | 
						|
        //    { | 
						|
        //        paramFrm.Close(); | 
						|
        //        paramFrm = null; | 
						|
        //        base.Deactivate(); | 
						|
        //    } | 
						|
        //} | 
						|
        private bool IsDeactivate; | 
						|
        private IMapService _MapService; | 
						|
 | 
						|
        public override void OnClick() | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                //KGIS.Framework.Common.Utils.LicenseManager.License(); | 
						|
                _MapService = MapsManager.Instance.MapService; | 
						|
 | 
						|
                Init(); | 
						|
                panTool.OnClick(); | 
						|
                base.OnClick(); | 
						|
                if (paramFrm != null) | 
						|
                { | 
						|
                    paramFrm.Close(); | 
						|
                } | 
						|
                if (paramFrm == null) | 
						|
                { | 
						|
                    paramFrm = new FrmDrawDoublePolyline(drawParam); | 
						|
                    paramFrm.SetParam(true, true); | 
						|
                    paramFrm.Closed += paramFrm_Closed; | 
						|
                    paramFrm.Title = "画线物面"; | 
						|
                    paramFrm.Topmost = true; | 
						|
                    paramFrm.ShowInTaskbar = false; | 
						|
                    paramFrm.Top = 175; | 
						|
                    paramFrm.Left = 235; | 
						|
                    paramFrm.Show(); | 
						|
                } | 
						|
                //timer.Interval = 100; | 
						|
                //timer.Tick += timer_Tick; | 
						|
                //autoDistinguishTimer.Interval = 100; | 
						|
                //autoDistinguishTimer.Tick += autoDistinguishTimer_Tick; | 
						|
                //AllowMoveMap = true; | 
						|
                //Env.Instance.Platfrom.MapMouseWheel -= Platfrom_MapMouseWheel; | 
						|
                //Env.Instance.Platfrom.MapMouseWheel += Platfrom_MapMouseWheel; | 
						|
                //MiddleLine = new LineModel(m_hookHelper.ActiveView, esriSimpleLineStyle.esriSLSDash, 0.5); | 
						|
                //LeftLine = new LineModel(m_hookHelper.ActiveView, esriSimpleLineStyle.esriSLSSolid); | 
						|
                //RightLine = new LineModel(m_hookHelper.ActiveView, esriSimpleLineStyle.esriSLSSolid); | 
						|
 | 
						|
                //IsSpaceDown = false; IsDeactivate = false; | 
						|
                //base.m_cursor = System.Windows.Forms.Cursors.Cross; | 
						|
                base.OnClick(); | 
						|
                //layer = Common.Utility.LayerHelper.GetLayerByName<KOTilesLayer>(m_hookHelper.FocusMap, "YGYXT"); | 
						|
                this.m_checked = true; | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("初始化 画线物面(线状地物面)工具 时异常,异常信息如下:"); | 
						|
                LogAPI.Debug(ex); | 
						|
                LogAPI.Debug("初始化 画线物面(线状地物面)工具 时异常信息结束"); | 
						|
                MessageHelper.ShowError(ex.Message); | 
						|
            } | 
						|
        } | 
						|
        /// <summary> | 
						|
        /// 鼠标距离地图边界一定距离时,开始漫游 | 
						|
        /// </summary> | 
						|
        /// <param name="sender"></param> | 
						|
        /// <param name="e"></param> | 
						|
        void timer_Tick(object sender, EventArgs e) | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                IEnvelope extent = this.m_hookHelper.ActiveView.Extent; | 
						|
                int centerX = 0; | 
						|
                int centerY = 0; | 
						|
                int rX = 0; | 
						|
                int rY = 0; | 
						|
                this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(new PointClass() { X = extent.XMax, Y = extent.YMin }, out rX, out rY); | 
						|
                IPoint centerPoint = new PointClass() { X = extent.XMin + (extent.XMax - extent.XMin) / 2, Y = extent.YMin + (extent.YMax - extent.YMin) / 2 }; | 
						|
                this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(centerPoint, out centerX, out centerY); | 
						|
                bool NeedPan = false; | 
						|
                if (!IsDrawing) | 
						|
                { | 
						|
                    timer.Stop(); | 
						|
                    return; | 
						|
                } | 
						|
                if (MousePoint.X < MapBorderDistance) | 
						|
                { | 
						|
                    NeedPan = true; | 
						|
                    centerX -= 5; | 
						|
                } | 
						|
                if (MousePoint.Y < MapBorderDistance) | 
						|
                { | 
						|
                    NeedPan = true; | 
						|
                    centerY -= 5; | 
						|
                } | 
						|
                if (Math.Abs(rX - MousePoint.X) < MapBorderDistance) | 
						|
                { | 
						|
                    NeedPan = true; | 
						|
                    centerX += 5; | 
						|
                } | 
						|
                if (Math.Abs(rY - MousePoint.Y) < MapBorderDistance) | 
						|
                { | 
						|
                    NeedPan = true; | 
						|
                    centerY += 5; | 
						|
                } | 
						|
                if (NeedPan) | 
						|
                { | 
						|
                    centerPoint = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(centerX, centerY); | 
						|
                    (this.m_hookHelper.Hook as IMapControl2).CenterAt(centerPoint); | 
						|
                } | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 鼠标距离地图边界一定距离时,开始漫游 时异常,异常信息如下:"); | 
						|
                LogAPI.Debug(ex); | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 鼠标距离地图边界一定距离时,开始漫游 时异常信息结束"); | 
						|
            } | 
						|
        } | 
						|
 | 
						|
        void paramFrm_Closed(object sender, EventArgs e) | 
						|
        { | 
						|
            if (paramFrm != null) | 
						|
            { | 
						|
                paramFrm.Closed -= paramFrm_Closed; | 
						|
            } | 
						|
            paramFrm = null; | 
						|
        } | 
						|
 | 
						|
        public override bool Enabled | 
						|
        { | 
						|
            get | 
						|
            { | 
						|
                if (MapsManager.Instance == null) return false; | 
						|
                object pTemp = (MapsManager.Instance.CurrProjectInfo as ProjectInfo); | 
						|
                if (pTemp == null) | 
						|
                { | 
						|
                    return false; | 
						|
                } | 
						|
                else | 
						|
                { | 
						|
                    ILayer layer = m_editor.TargetLayer;//Env.Instance.KMap.EngEditor.TargetLayer; | 
						|
                    if (m_editor.EditState == esriEngineEditState.esriEngineStateEditing && layer != null && (layer as ESRI.ArcGIS.Carto.IFeatureLayer).FeatureClass.ShapeType == esriGeometryType.esriGeometryPolygon) | 
						|
                    { | 
						|
                        return true; | 
						|
                    } | 
						|
                    else | 
						|
                    { | 
						|
                        return false; | 
						|
                    } | 
						|
                } | 
						|
            } | 
						|
        } | 
						|
        #endregion | 
						|
        IElement element = null; | 
						|
        private int IsEnterClickNum = 0; | 
						|
        private bool IsShiftDown = false; | 
						|
        #region 重写BaseTool | 
						|
        //[LogWrite(Description = "")] | 
						|
        public override void OnKeyDown(int keyCode, int Shift) | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                //键盘按下时不启用放大缩小功能 | 
						|
                //替换Env改动 | 
						|
                //Env.Instance.KMap.AxMapControl.AutoMouseWheel = false; | 
						|
                //Env.Instance.KMap.AxMapControl.AutoKeyboardScrolling = false; | 
						|
                (m_hookHelper.Hook as IMapControlDefault).AutoMouseWheel = false; | 
						|
                (m_hookHelper.Hook as IMapControlDefault).AutoKeyboardScrolling = false; | 
						|
 | 
						|
                //---------------------- | 
						|
                IPoint point = this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(MousePoint.X, MousePoint.Y);//Env.Instance.MousePoint; | 
						|
 | 
						|
                //替换Env改动 | 
						|
                //Env.Instance.CurrentKeyDown = keyCode; | 
						|
                Platform.Instance.SetCurrentKeyDown(keyCode); | 
						|
 | 
						|
                if (keyCode == (int)ConsoleKey.F7) | 
						|
                { | 
						|
                    try | 
						|
                    { | 
						|
                        #region 自动识别 | 
						|
                        if (TempCenterPoint == null || TempWidht <= 0) | 
						|
                        { | 
						|
                            //如果没有识别到,调用手动取点 | 
						|
                            this.OnKeyDown((int)ConsoleKey.F8, Shift); | 
						|
                            return; | 
						|
                        } | 
						|
                        this.IsAuto = true; | 
						|
                        if (TempWidht > 0 && MiddleLine.Line.PointCount == 1 && !IsChangedWidht) | 
						|
                        { | 
						|
                            //如果识别到点,并且已经绘制了一个点,并且宽度没有手动调整过,则应用识别的宽度并修改第一个点的宽度 | 
						|
                            this.drawParam.Width = TempWidht; | 
						|
                            this.OnMouseMove(1, Shift, MousePoint.X, MousePoint.Y); | 
						|
                            //Moveing(point); | 
						|
                        } | 
						|
                        this.drawParam.Width = TempWidht; | 
						|
                        ///当前线上面最后一个点的X坐标 | 
						|
                        int endX = -1; | 
						|
                        ///当前线上面最后一个点的Y坐标 | 
						|
                        int endY = -1; | 
						|
                        ///下一个点的X坐标 | 
						|
                        int nextX = -1; | 
						|
                        ///下一个点的Y坐标 | 
						|
                        int nextY = -1; | 
						|
                        if (MiddleLine.Line.PointCount > 0) | 
						|
                        { | 
						|
                            this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(MiddleLine.Line.get_Point(MiddleLine.Line.PointCount - 1), out endX, out endY); | 
						|
                        } | 
						|
                        this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(TempCenterPoint, out nextX, out nextY); | 
						|
                        if (nextX != -1 && nextY != -1 && endX != -1 && endY != -1) | 
						|
                        { | 
						|
                            IPolyline line = new PolylineClass(); | 
						|
                            line.FromPoint = MiddleLine.Line.get_Point(MiddleLine.Line.PointCount - 1); | 
						|
                            line.ToPoint = TempCenterPoint; | 
						|
                            //当两次取点距离小于30像素的时候,取消上一个点,以第二次的点为主 | 
						|
                            if (line.Length < 3) | 
						|
                            { | 
						|
                                //取消上一个点 | 
						|
                                this.OnKeyDown((int)ConsoleKey.F9, 0); | 
						|
                            } | 
						|
                            ///以识别到的点进行绘制新的点 | 
						|
                            LeftClick(nextX, nextY); | 
						|
                            this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(MiddleLine.Line.get_Point(MiddleLine.Line.PointCount - 1), out nextX, out nextY); | 
						|
                            //MoveMapExtent(nextX, nextY, 100); | 
						|
                        } | 
						|
                        TempCenterPoint = null; | 
						|
                        #endregion | 
						|
                    } | 
						|
                    catch (Exception ex) | 
						|
                    { | 
						|
                        LogAPI.Debug("画线物面(线状地物面)工具 过程中 键盘按下 F7 时异常,异常信息如下:"); | 
						|
                        LogAPI.Debug(ex); | 
						|
                        LogAPI.Debug("画线物面(线状地物面)工具 过程中 键盘按下 F7 时异常信息结束"); | 
						|
                    } | 
						|
                } | 
						|
                else if (keyCode == (int)ConsoleKey.F8) | 
						|
                { | 
						|
                    try | 
						|
                    { | 
						|
                        #region 快捷键取点 | 
						|
                        this.IsAuto = false; | 
						|
                        ///当前线上面最后一个点的X坐标 | 
						|
                        int endX = -1; | 
						|
                        ///当前线上面最后一个点的Y坐标 | 
						|
                        int endY = -1; | 
						|
                        if (MiddleLine.Line.PointCount > 0) | 
						|
                        { | 
						|
                            this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(MiddleLine.Line.get_Point(MiddleLine.Line.PointCount - 1), out endX, out endY); | 
						|
                        } | 
						|
                        //当两次取点距离小于30像素的时候,取消上一个点,以第二次的点为主 | 
						|
                        if (endX != -1 && endY != -1 && Math.Abs(MousePoint.X - endX) < 30 && Math.Abs(MousePoint.Y - endY) < 30) | 
						|
                        { | 
						|
                            //取消上一个点 | 
						|
                            this.OnKeyDown((int)ConsoleKey.F9, 0); | 
						|
                        } | 
						|
                        //绘制新的点 | 
						|
                        this.LeftClick(MousePoint.X, MousePoint.Y); | 
						|
                        #endregion | 
						|
                    } | 
						|
                    catch (Exception ex) | 
						|
                    { | 
						|
                        LogAPI.Debug("画线物面(线状地物面)工具 过程中 键盘按下 F8 时异常,异常信息如下:"); | 
						|
                        LogAPI.Debug(ex); | 
						|
                        LogAPI.Debug("画线物面(线状地物面)工具 过程中 键盘按下 F8 时异常信息结束"); | 
						|
                    } | 
						|
                } | 
						|
                else if (keyCode == (int)ConsoleKey.F9 || keyCode == (int)ConsoleKey.Escape) | 
						|
                { | 
						|
                    try | 
						|
                    { | 
						|
                        if (this.MiddleLine.Line.PointCount > 0 && this.IsDrawing == false) | 
						|
                        { | 
						|
                            //删除点 | 
						|
                            if (SnapElementPointIndex == -1) | 
						|
                            { | 
						|
                                SnapElementPointIndex = SnapElement(point, out SnapElementPointLine); | 
						|
                            } | 
						|
                            if (SnapElementPointIndex != -1 && SnapElementPointLine == 0) | 
						|
                            { | 
						|
                                MiddleLine.Line.RemovePoints(SnapElementPointIndex, 1); | 
						|
                                LeftLine.Line.RemovePoints(SnapElementPointIndex, 1); | 
						|
                                RightLine.Line.RemovePoints(SnapElementPointIndex, 1); | 
						|
                                MiddleLine.RefreshPoint(SnapElementPointIndex); | 
						|
                                LeftLine.RefreshPoint(SnapElementPointIndex); | 
						|
                                RightLine.RefreshPoint(SnapElementPointIndex); | 
						|
                                SnapElementPointIndex = -1; | 
						|
                                SnapElementPointLine = int.MaxValue; | 
						|
                            } | 
						|
                        } | 
						|
                        else | 
						|
                        { | 
						|
                            #region 撤销点 | 
						|
                            IPointCollection tempLine = new Polyline(); | 
						|
                            if (LeftLine.Line.PointCount > 1) | 
						|
                            { | 
						|
                                LeftLine.Line.RemovePoints(LeftLine.Line.PointCount - 1, 1); | 
						|
                                tempLine.AddPoint(LeftLine.Line.get_Point(LeftLine.Line.PointCount - 1)); | 
						|
                            } | 
						|
                            else if (LeftLine.Line.PointCount == 1) | 
						|
                            { | 
						|
                                LeftLine.Line.RemovePoints(LeftLine.Line.PointCount - 1, 1); | 
						|
                                LeftLine.FollowLine.Stop(); | 
						|
                                //LeftLine.FollowLine.RemovePoints(0, LeftLine.FollowLine.PointCount); | 
						|
                                //LeftLine.DrawLine(); | 
						|
                            } | 
						|
                            if (RightLine.Line.PointCount > 1) | 
						|
                            { | 
						|
                                RightLine.Line.RemovePoints(RightLine.Line.PointCount - 1, 1); | 
						|
                                tempLine.AddPoint(RightLine.Line.get_Point(RightLine.Line.PointCount - 1)); | 
						|
                            } | 
						|
                            else if (RightLine.Line.PointCount == 1) | 
						|
                            { | 
						|
                                RightLine.Line.RemovePoints(RightLine.Line.PointCount - 1, 1); | 
						|
                                LeftLine.FollowLine.Stop(); | 
						|
                                //RightLine.FollowLine.RemovePoints(0, RightLine.FollowLine.PointCount); | 
						|
                                //RightLine.DrawLine(); | 
						|
                            } | 
						|
                            if (MiddleLine.Line.PointCount > 1) | 
						|
                            { | 
						|
                                MiddleLine.Line.RemovePoints(MiddleLine.Line.PointCount - 1, 1); | 
						|
                                IEnvelope extent = m_hookHelper.ActiveView.Extent; | 
						|
                                IPoint p = MiddleLine.Line.Point[MiddleLine.Line.PointCount - 1]; | 
						|
                                if (extent.XMax < p.X || extent.XMin > p.X || extent.YMax < p.Y || extent.YMin > p.Y) | 
						|
                                { | 
						|
                                    (this.m_hookHelper.Hook as IMapControl2).CenterAt(p); | 
						|
                                } | 
						|
                            } | 
						|
                            else if (MiddleLine.Line.PointCount == 1) | 
						|
                            { | 
						|
                                MiddleLine.Line.RemovePoints(MiddleLine.Line.PointCount - 1, 1); | 
						|
                                LeftLine.FollowLine.Stop(); | 
						|
                                //MiddleLine.FollowLine.RemovePoints(0, MiddleLine.FollowLine.PointCount); | 
						|
                                //MiddleLine.DrawLine(); | 
						|
                                PointElement = new List<IElement>(); | 
						|
                                this.IsDrawing = false; | 
						|
                                this.IsContinueDraw = false; | 
						|
                            } | 
						|
                            //计算前一个点时划线的宽度 | 
						|
                            //if (tempLine.PointCount == 2) | 
						|
                            //{ | 
						|
                            //    this.drawParam.Width = (tempLine as IPolyline).Length; | 
						|
                            //} | 
						|
 | 
						|
                            LeftLine.DrawLine(LeftLine.Line.PointCount); | 
						|
                            RightLine.DrawLine(LeftLine.Line.PointCount); | 
						|
                            MiddleLine.DrawLine(LeftLine.Line.PointCount); | 
						|
                            this.OnMouseMove(1, Shift, MousePoint.X, MousePoint.Y); | 
						|
                            //Moveing(point); | 
						|
                            #endregion | 
						|
                        } | 
						|
                    } | 
						|
                    catch (Exception ex) | 
						|
                    { | 
						|
                        LogAPI.Debug("画线物面(线状地物面)工具 过程中 键盘按下 F9||ESC 时异常,异常信息如下:"); | 
						|
                        LogAPI.Debug(ex); | 
						|
                        LogAPI.Debug("画线物面(线状地物面)工具 过程中 键盘按下 F9||ESC 时异常信息结束"); | 
						|
                    } | 
						|
                } | 
						|
                else if (keyCode == (int)ConsoleKey.Backspace) | 
						|
                { | 
						|
                    #region 清除绘制的图形 | 
						|
                    this.MiddleLine.Reset(); | 
						|
                    this.LeftLine.Reset(); | 
						|
                    this.RightLine.Reset(); | 
						|
                    PointElement = new List<IElement>(); | 
						|
                    this.IsDrawing = false; | 
						|
                    this.IsContinueDraw = false; | 
						|
                    #endregion | 
						|
                } | 
						|
                else if (keyCode == (int)ConsoleKey.Spacebar) | 
						|
                { | 
						|
                    #region 空格移动地图 | 
						|
                    if (!IsSpaceDown) | 
						|
                    { | 
						|
                        base.Deactivate(); | 
						|
                        IsSpaceDown = true; | 
						|
                    } | 
						|
                    base.m_cursor = System.Windows.Forms.Cursors.Hand; | 
						|
                    //this.OnMouseMove(1, 0, MousePoint.X, MousePoint.Y); | 
						|
                    #endregion | 
						|
                } | 
						|
                else if (keyCode == (int)ConsoleKey.D9) | 
						|
                { | 
						|
                    #region 减小识别灵敏度 | 
						|
                    if (this.drawParam.ToloranceScale > 0.05) | 
						|
                    { | 
						|
 | 
						|
                        this.drawParam.ToloranceScale -= 0.05; | 
						|
                        autoDistinguishTimer.Stop(); | 
						|
                        autoDistinguishTimer.Start(); | 
						|
                    } | 
						|
                    else | 
						|
                    { | 
						|
                        this.drawParam.ToloranceScale = 0.05; | 
						|
                    } | 
						|
                    #endregion | 
						|
                } | 
						|
                else if (keyCode == (int)ConsoleKey.D0) | 
						|
                { | 
						|
                    #region 增加识别灵敏度 | 
						|
                    if (this.drawParam.ToloranceScale < 0.5) | 
						|
                    { | 
						|
                        this.drawParam.ToloranceScale += 0.05; | 
						|
                        autoDistinguishTimer.Stop(); | 
						|
                        autoDistinguishTimer.Start(); | 
						|
                    } | 
						|
                    else | 
						|
                    { | 
						|
                        this.drawParam.ToloranceScale = 0.5; | 
						|
                        autoDistinguishTimer.Stop(); | 
						|
                        autoDistinguishTimer.Start(); | 
						|
                    } | 
						|
                    #endregion | 
						|
                } | 
						|
                else if (keyCode == 17) | 
						|
                { | 
						|
                    #region Ctrl键调整双线宽度 | 
						|
                    if (!IsCtrlDown) | 
						|
                    { | 
						|
                        //替换Env改动 | 
						|
                        //Env.Instance.KMap.AxMapControl.AutoMouseWheel = false; | 
						|
                        //Env.Instance.KMap.AxMapControl.AutoKeyboardScrolling = false; | 
						|
                        (m_hookHelper.Hook as IMapControlDefault).AutoMouseWheel = false; | 
						|
                        (m_hookHelper.Hook as IMapControlDefault).AutoKeyboardScrolling = false; | 
						|
 | 
						|
                        DrawTextElement(point, ref TextElement); | 
						|
                        IsCtrlDown = true; | 
						|
                    } | 
						|
                    #endregion | 
						|
                } | 
						|
                else if (keyCode == 16) | 
						|
                { | 
						|
                    this.IsShiftDown = true; | 
						|
                } | 
						|
                else if (keyCode == (int)ConsoleKey.Enter) | 
						|
                { | 
						|
                    if (this.MiddleLine.Line.PointCount > 1) | 
						|
                    { | 
						|
                        if (IsEnterClickNum == 0) | 
						|
                        { | 
						|
                            IsEnterClickNum++; | 
						|
                            IsDrawing = false; | 
						|
                        } | 
						|
                        else if (IsEnterClickNum == 1) | 
						|
                        { | 
						|
                            this.DrawComplete(); | 
						|
                            IsEnterClickNum = 0; | 
						|
                            SnapElementPointIndex = -1; | 
						|
                            SnapElementPointLine = 0; | 
						|
                            IsContinueDraw = false; | 
						|
                        } | 
						|
                    } | 
						|
                } | 
						|
                else if (keyCode == (int)ConsoleKey.Insert) | 
						|
                { | 
						|
                    //增加点 | 
						|
                    if (SnapElementPointIndex == -1) | 
						|
                    { | 
						|
                        SnapElementPointIndex = SnapElement(point); | 
						|
 | 
						|
                        double a = GeometryOperations.getAngle(MiddleLine.Line.get_Point(0), MiddleLine.Line.get_Point(1)); | 
						|
                        if (SnapElementPointIndex != -1) | 
						|
                        { | 
						|
                            IPoint p = MiddleLine.Line.get_Point(SnapElementPointIndex); | 
						|
                            double angle = GeometryOperations.getAngle(p, point); | 
						|
                            if ((a > 0 && angle > 0) || (a < 0 && angle < 0)) | 
						|
                            { | 
						|
                                SnapElementPointIndex++; | 
						|
                            } | 
						|
                            else | 
						|
                            { | 
						|
                                //if (a < 0 && angle < 0) | 
						|
                                //{ | 
						|
                                //    SnapElementPointIndex++; | 
						|
                                //} | 
						|
                                //if (a > 45 && a < 135) | 
						|
                                //{ | 
						|
                                //    if (angle > 0) | 
						|
                                //    { | 
						|
                                //        SnapElementPointIndex++; | 
						|
                                //    } | 
						|
                                //} | 
						|
                            } | 
						|
                            IPointCollection newPoint = new Polyline(); | 
						|
                            newPoint.AddPoint(point); | 
						|
                            MiddleLine.Line.InsertPointCollection(SnapElementPointIndex, newPoint); | 
						|
                            LeftLine.Line.InsertPointCollection(SnapElementPointIndex, newPoint); | 
						|
                            RightLine.Line.InsertPointCollection(SnapElementPointIndex, newPoint); | 
						|
                            SnapElementPointLine = 0; | 
						|
                        } | 
						|
                    } | 
						|
                } | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 键盘按下 时异常,异常信息如下:"); | 
						|
                LogAPI.Debug(ex); | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 键盘按下 时异常信息结束"); | 
						|
            } | 
						|
        } | 
						|
        //[LogWrite(Description = "")] | 
						|
        public override void OnKeyUp(int keyCode, int Shift) | 
						|
        { | 
						|
            //替换Env改动 | 
						|
            //Env.Instance.CurrentKeyDown = -1; | 
						|
            Platform.Instance.SetCurrentKeyDown(-1); | 
						|
 | 
						|
            base.OnKeyUp(keyCode, Shift); | 
						|
            if (keyCode == (int)ConsoleKey.Spacebar) | 
						|
            { | 
						|
                if (IsSpaceDown && IsDrawing) | 
						|
                { | 
						|
                    m_hookHelper.ActiveView.Refresh(); | 
						|
                    base.OnClick(); | 
						|
                    IsSpaceDown = false; | 
						|
                    base.m_cursor = System.Windows.Forms.Cursors.Cross; | 
						|
                    //this.OnMouseMove(1, 0, MousePoint.X, MousePoint.Y); | 
						|
                } | 
						|
            } | 
						|
            if (keyCode == 17) | 
						|
            { | 
						|
                //替换Env改动 | 
						|
                //Env.Instance.KMap.AxMapControl.AutoMouseWheel = true; | 
						|
                //Env.Instance.KMap.AxMapControl.AutoKeyboardScrolling = true; | 
						|
                (m_hookHelper.Hook as IMapControlDefault).AutoMouseWheel = true; | 
						|
                (m_hookHelper.Hook as IMapControlDefault).AutoKeyboardScrolling = true; | 
						|
 | 
						|
                DelElement(ref TextElement); | 
						|
                IsCtrlDown = false; | 
						|
            } | 
						|
            if (keyCode == 16) | 
						|
            { | 
						|
                this.IsShiftDown = false; | 
						|
            } | 
						|
        } | 
						|
        //[LogWrite(Description = "")] | 
						|
        public override void OnMouseDown(int Button, int Shift, int X, int Y) | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
 | 
						|
                IsAuto = false; | 
						|
                if (IsSpaceDown) | 
						|
                { | 
						|
                    base.Deactivate(); | 
						|
                    panTool.OnMouseDown(1, Shift, X, Y); | 
						|
                    return; | 
						|
                } | 
						|
                if (Button == 1) | 
						|
                { | 
						|
                    //左键按下取点 | 
						|
                    IPoint point = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y); | 
						|
                    if (snapEnv != null) | 
						|
                    { | 
						|
                        snapEnv.SnapPoint(point); | 
						|
                    } | 
						|
                    if (this.MiddleLine.Line.PointCount > 0 && IsDrawing == false) | 
						|
                    { | 
						|
                        #region 调整单个点的位置 | 
						|
                        if (SnapElementPointIndex == -1) | 
						|
                        { | 
						|
                            SnapElementPointIndex = SnapElement(point, out SnapElementPointLine); | 
						|
                            //IsDrawing = true; | 
						|
                        } | 
						|
                        else | 
						|
                        { | 
						|
                            if (SnapElementPointLine == 0) | 
						|
                            { | 
						|
                                this.MiddleLine.Line.UpdatePoint(SnapElementPointIndex, point); | 
						|
                                double angle = 0; | 
						|
                                if (SnapElementPointIndex == 0) | 
						|
                                { | 
						|
                                    angle = GeometryOperations.getAngle(point, this.MiddleLine.Line.get_Point(SnapElementPointIndex + 1)); | 
						|
                                } | 
						|
                                else | 
						|
                                { | 
						|
                                    angle = GeometryOperations.getAngle(this.MiddleLine.Line.get_Point(SnapElementPointIndex - 1), point); | 
						|
                                } | 
						|
                                this.LeftLine.Line.UpdatePoint(SnapElementPointIndex, GeometryOperations.GetPoint(point, this.drawParam.Width * 0.5, -angle)); | 
						|
                                this.RightLine.Line.UpdatePoint(SnapElementPointIndex, GeometryOperations.GetPoint(point, this.drawParam.Width * -0.5, -angle)); | 
						|
                                this.MiddleLine.RefreshPoint(SnapElementPointIndex); | 
						|
                                this.LeftLine.RefreshPoint(SnapElementPointIndex); | 
						|
                                this.RightLine.RefreshPoint(SnapElementPointIndex); | 
						|
                            } | 
						|
                            else if (SnapElementPointLine == 1) | 
						|
                            { | 
						|
                                this.LeftLine.Line.UpdatePoint(SnapElementPointIndex, point); | 
						|
                                this.LeftLine.RefreshPoint(SnapElementPointIndex); | 
						|
                            } | 
						|
                            else if (SnapElementPointLine == -1) | 
						|
                            { | 
						|
                                this.RightLine.Line.UpdatePoint(SnapElementPointIndex, point); | 
						|
                                this.RightLine.RefreshPoint(SnapElementPointIndex); | 
						|
                            } | 
						|
                            SnapElementPointIndex = -1; | 
						|
                            IsDrawing = false; | 
						|
                        } | 
						|
                        #endregion | 
						|
                    } | 
						|
                    else | 
						|
                    { | 
						|
                        #region 绘制点 | 
						|
                        #region 根据道路宽度调整相关参数 | 
						|
                        if (TempWidht < 10) | 
						|
                        { | 
						|
                            MinPointDistance = 15; | 
						|
                            MaxPointDistance = 40; | 
						|
                        } | 
						|
                        else if (TempWidht > 15) | 
						|
                        { | 
						|
                            MinPointDistance = 30; | 
						|
                            MaxPointDistance = 80; | 
						|
                        } | 
						|
                        #endregion | 
						|
                        if (this.MiddleLine.Line.PointCount > 0) | 
						|
                        { | 
						|
                            IPoint p = this.MiddleLine.Line.get_Point(this.MiddleLine.Line.PointCount - 1); | 
						|
                            if (p.X == point.X && p.Y == point.Y) | 
						|
                            { | 
						|
                                return; | 
						|
                            } | 
						|
                            IPolyline line = new PolylineClass(); | 
						|
                            line.FromPoint = point; | 
						|
                            line.ToPoint = p; | 
						|
                            if (line.Length < 3) | 
						|
                            { | 
						|
                                return; | 
						|
                            } | 
						|
                        } | 
						|
                        if (TempWidht == -1) | 
						|
                        { | 
						|
                            TempWidht = 10; | 
						|
                        } | 
						|
                        Drawing(point); | 
						|
                        if (this.MiddleLine.Line.PointCount > 0) | 
						|
                            this.IsDrawing = true; | 
						|
                        else | 
						|
                            return; | 
						|
                        if (this.MiddleLine.Line.PointCount > 1) | 
						|
                        { | 
						|
                            IPoint p2 = MiddleLine.Line.get_Point(this.MiddleLine.Line.PointCount - 2); | 
						|
                            IPoint p1 = MiddleLine.Line.get_Point(this.MiddleLine.Line.PointCount - 1); | 
						|
                            double angle = GeometryOperations.getAngle(p2, p1); | 
						|
                            //angle = 90 - angle; | 
						|
                            IPolyline tempLine = new PolylineClass(); | 
						|
                            tempLine.FromPoint = p1; | 
						|
                            tempLine.ToPoint = p2; | 
						|
                            MoveMapExtent(X, Y, (int)Math.Floor(tempLine.Length)); | 
						|
                            if (this.drawParam.IsAutoTrack) | 
						|
                            { | 
						|
                                //this.OnMouseDown(2, Shift, MousePoint.X, MousePoint.Y); | 
						|
                            } | 
						|
                        } | 
						|
                        else | 
						|
                        { | 
						|
                            MoveMapExtent(X, Y, 100); | 
						|
                        } | 
						|
                        #endregion | 
						|
                    } | 
						|
                } | 
						|
                else if (Button == 2) | 
						|
                { | 
						|
                    this.OnKeyDown((int)ConsoleKey.F7, Shift); | 
						|
                } | 
						|
                else if (Button == 4) | 
						|
                { | 
						|
                    ////鼠标滚轮按下 | 
						|
                    //base.Deactivate(); | 
						|
                    //panTool.OnMouseDown(Button, Shift, X, Y); | 
						|
                    //this.OnKeyDown((int)ConsoleKey.Enter, Shift); | 
						|
                } | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 按下鼠标 时异常,异常信息如下:"); | 
						|
                LogAPI.Debug(ex); | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 按下鼠标 时异常信息结束"); | 
						|
            } | 
						|
        } | 
						|
        private bool isRunning = false; | 
						|
        public override void OnMouseMove(int Button, int Shift, int X, int Y) | 
						|
        { | 
						|
            if (isRunning) | 
						|
                return; | 
						|
            isRunning = true; | 
						|
            try | 
						|
            { | 
						|
                if (IsSpaceDown) | 
						|
                { | 
						|
                    panTool.OnMouseMove(1, Shift, X, Y); | 
						|
                    MousePoint.X = X; | 
						|
                    MousePoint.Y = Y; | 
						|
                    return; | 
						|
                } | 
						|
 | 
						|
                var vT10 = m_hookHelper; | 
						|
                var vT12 = m_hookHelper.ActiveView; | 
						|
                var vT13 = m_hookHelper.ActiveView.ScreenDisplay; | 
						|
                var vT14 = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation; | 
						|
                var vT15 = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y); | 
						|
 | 
						|
 | 
						|
                IPoint point = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y); | 
						|
                if (snapEnv != null) | 
						|
                { | 
						|
                    this.SnapPoint(m_hookHelper.ActiveView, point, snapEnv); | 
						|
                } | 
						|
                if (this.MiddleLine.Line.PointCount > 0) | 
						|
                { | 
						|
                    if (this.IsDrawing) | 
						|
                    { | 
						|
                        Moveing(point); | 
						|
                        if (MousePoint.X == X && MousePoint.Y == Y) | 
						|
                        { | 
						|
                            return; | 
						|
                        } | 
						|
                        else | 
						|
                        { | 
						|
                            MousePoint.X = X; | 
						|
                            MousePoint.Y = Y; | 
						|
                        } | 
						|
                        autoDistinguishTimer.Stop(); | 
						|
                        autoDistinguishTimer.Dispose(); | 
						|
                        try | 
						|
                        { | 
						|
                            autoDistinguishTimer.Start(); | 
						|
                        } | 
						|
                        catch (Exception ex) | 
						|
                        { | 
						|
                            LogAPI.Debug("画线物面(线状地物面)工具 过程中 移动鼠标后 正在绘制 期间 异常,异常信息如下:"); | 
						|
                            LogAPI.Debug(ex); | 
						|
                            LogAPI.Debug("画线物面(线状地物面)工具 过程中 移动鼠标后 正在绘制 期间 异常信息结束"); | 
						|
                            System.Windows.Forms.Application.DoEvents(); | 
						|
                            autoDistinguishTimer.Start(); | 
						|
                        } | 
						|
                        System.Windows.Forms.Application.DoEvents(); | 
						|
                        #region 当鼠标移动到地图边界时,自动移动地图 | 
						|
                        if (AllowMoveMap) | 
						|
                        { | 
						|
                            IEnvelope extent = this.m_hookHelper.ActiveView.Extent; | 
						|
                            int rX = 0; | 
						|
                            int rY = 0; | 
						|
                            //替换Env改动 | 
						|
                            //Env.Instance.KMap.AxMapControl.FromMapPoint(new PointClass() { X = extent.XMax, Y = extent.YMin }, ref rX, ref rY); | 
						|
                            (m_hookHelper.Hook as IMapControlDefault).FromMapPoint(new PointClass() { X = extent.XMax, Y = extent.YMin }, ref rX, ref rY); | 
						|
 | 
						|
                            bool NeedPan = false; | 
						|
                            System.Windows.Forms.Application.DoEvents(); | 
						|
                            if (X < MapBorderDistance) | 
						|
                            { | 
						|
                                if (!NeedPan) | 
						|
                                { | 
						|
                                    timer.Start(); | 
						|
                                } | 
						|
                                NeedPan = true; | 
						|
                            } | 
						|
                            if (Y < MapBorderDistance) | 
						|
                            { | 
						|
                                if (!NeedPan) | 
						|
                                { | 
						|
                                    timer.Start(); | 
						|
                                } | 
						|
                                NeedPan = true; | 
						|
                            } | 
						|
                            if (Math.Abs(rX - X) < MapBorderDistance) | 
						|
                            { | 
						|
                                if (!NeedPan) | 
						|
                                { | 
						|
                                    timer.Start(); | 
						|
                                } | 
						|
                                NeedPan = true; | 
						|
                            } | 
						|
                            if (Math.Abs(rY - Y) < MapBorderDistance) | 
						|
                            { | 
						|
                                if (!NeedPan) | 
						|
                                { | 
						|
                                    timer.Start(); | 
						|
                                } | 
						|
                                NeedPan = true; | 
						|
                            } | 
						|
                            if (!NeedPan) | 
						|
                            { | 
						|
                                timer.Stop(); | 
						|
                                NeedPan = false; | 
						|
                            } | 
						|
                        } | 
						|
                        #endregion | 
						|
                    } | 
						|
                    else | 
						|
                    { | 
						|
                        MousePoint.X = X; | 
						|
                        MousePoint.Y = Y; | 
						|
                        if (SnapElementPointIndex != -1) | 
						|
                        { | 
						|
                            if (SnapElementPointLine == 0) | 
						|
                            { | 
						|
                                this.MiddleLine.Line.UpdatePoint(SnapElementPointIndex, point); | 
						|
                                double angle = 0; | 
						|
                                if (SnapElementPointIndex == 0) | 
						|
                                { | 
						|
                                    angle = GeometryOperations.getAngle(point, this.MiddleLine.Line.get_Point(SnapElementPointIndex + 1)); | 
						|
                                } | 
						|
                                else | 
						|
                                { | 
						|
                                    angle = GeometryOperations.getAngle(this.MiddleLine.Line.get_Point(SnapElementPointIndex - 1), point); | 
						|
                                } | 
						|
                                this.LeftLine.Line.UpdatePoint(SnapElementPointIndex, GeometryOperations.GetPoint(point, this.drawParam.Width * 0.5, -angle)); | 
						|
                                this.RightLine.Line.UpdatePoint(SnapElementPointIndex, GeometryOperations.GetPoint(point, this.drawParam.Width * -0.5, -angle)); | 
						|
                                this.MiddleLine.RefreshPoint(SnapElementPointIndex); | 
						|
                                this.LeftLine.RefreshPoint(SnapElementPointIndex); | 
						|
                                this.RightLine.RefreshPoint(SnapElementPointIndex); | 
						|
                            } | 
						|
                            else if (SnapElementPointLine == 1) | 
						|
                            { | 
						|
                                this.LeftLine.Line.UpdatePoint(SnapElementPointIndex, point); | 
						|
                                this.LeftLine.RefreshPoint(SnapElementPointIndex); | 
						|
                            } | 
						|
                            else if (SnapElementPointLine == -1) | 
						|
                            { | 
						|
                                this.RightLine.Line.UpdatePoint(SnapElementPointIndex, point); | 
						|
                                this.RightLine.RefreshPoint(SnapElementPointIndex); | 
						|
                            } | 
						|
 | 
						|
                            autoDistinguishTimer.Stop(); | 
						|
                            autoDistinguishTimer.Dispose(); | 
						|
                            try | 
						|
                            { | 
						|
                                autoDistinguishTimer.Start(); | 
						|
                            } | 
						|
                            catch (Exception ex) | 
						|
                            { | 
						|
                                LogAPI.Debug("画线物面(线状地物面)工具 过程中 移动鼠标后 未在绘制 期间 异常,异常信息如下:"); | 
						|
                                LogAPI.Debug(ex); | 
						|
                                LogAPI.Debug("画线物面(线状地物面)工具 过程中 移动鼠标后 未在绘制 期间 异常信息结束"); | 
						|
                                System.Windows.Forms.Application.DoEvents(); | 
						|
                                autoDistinguishTimer.Start(); | 
						|
                            } | 
						|
                        } | 
						|
                    } | 
						|
                } | 
						|
                else if (Button == 4) | 
						|
                { | 
						|
                    //鼠标滚轮按下 | 
						|
                    //panTool.OnMouseMove(Button, Shift, X, Y); | 
						|
                    //MousePoint.X = X; | 
						|
                    //MousePoint.Y = Y; | 
						|
                } | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 移动鼠标后 异常,异常信息如下:"); | 
						|
                LogAPI.Debug(ex); | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 移动鼠标后 期间 异常信息结束"); | 
						|
            } | 
						|
            finally | 
						|
            { | 
						|
                isRunning = false; | 
						|
            } | 
						|
        } | 
						|
        //[LogWrite(Description = "")] | 
						|
        public override void OnMouseUp(int Button, int Shift, int X, int Y) | 
						|
        { | 
						|
            if (Button == 4) | 
						|
            { | 
						|
                //panTool.OnMouseUp(1, Shift, X, Y); | 
						|
                //m_hookHelper.ActiveView.Refresh(); | 
						|
                //base.OnClick(); | 
						|
            } | 
						|
            else | 
						|
            { | 
						|
                //base.OnMouseUp(button, shift, x, y); | 
						|
                //点击右键时,弹出编辑菜单 | 
						|
                if (IsSpaceDown) | 
						|
                { | 
						|
                    panTool.OnMouseUp(Button, Shift, X, Y); | 
						|
                } | 
						|
                else | 
						|
                { | 
						|
                    base.OnMouseUp(Button, Shift, X, Y);//调用基类的OnMouseDown事件 | 
						|
                } | 
						|
            } | 
						|
        } | 
						|
 | 
						|
        IPoint m_SnapPoint = null; | 
						|
        bool m_isHasSnap; | 
						|
        //[LogWrite(Description = "")] | 
						|
        public void SnapPoint(IActiveView activeView, IPoint inPoint, IEngineSnapEnvironment m_editEnvironment) | 
						|
        { | 
						|
            if (this.m_isHasSnap && (this.m_SnapPoint != null)) | 
						|
            { | 
						|
                this.DrawSnapPoint(activeView, this.m_SnapPoint); | 
						|
            } | 
						|
            this.m_isHasSnap = ((IEngineSnapEnvironment)m_editEnvironment).SnapPoint(inPoint); | 
						|
            if (this.m_isHasSnap) | 
						|
            { | 
						|
                this.m_SnapPoint = inPoint; | 
						|
                this.DrawSnapPoint(activeView, this.m_SnapPoint); | 
						|
            } | 
						|
        } | 
						|
        //[LogWrite(Description = "")] | 
						|
        private void DrawSnapPoint(IActiveView activeView, IPoint point) | 
						|
        { | 
						|
            IScreenDisplay screenDisplay = activeView.ScreenDisplay; | 
						|
            screenDisplay.StartDrawing(screenDisplay.hDC, -1); | 
						|
            IEngineEditProperties engProperties = new EngineEditorClass(); | 
						|
            screenDisplay.SetSymbol((ISymbol)engProperties.SnapSymbol); | 
						|
            screenDisplay.DrawPoint(point); | 
						|
            screenDisplay.FinishDrawing(); | 
						|
            screenDisplay = null; | 
						|
        } | 
						|
        //CheckAssistant dataCheckView = null; | 
						|
        IPolyline StartLine = null; | 
						|
        IPolyline EndLine = null; | 
						|
        //[LogWrite(Description = "")] | 
						|
        public void DrawComplete() | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                //if (!ss()) | 
						|
                //{ | 
						|
                //    return; | 
						|
                //} | 
						|
                bool isSplit; | 
						|
                int splitIndex, segIndex; | 
						|
                if (LeftLine.Line.PointCount < 2 || this.RightLine.Line.PointCount < 2) | 
						|
                { | 
						|
                    return; | 
						|
                } | 
						|
                IFeatureLayer layer = m_editor.TargetLayer as IFeatureLayer; | 
						|
                if (layer == null || layer.FeatureClass == null) | 
						|
                { | 
						|
                    return; | 
						|
                } | 
						|
 | 
						|
                int selectIdZYQ = 1; | 
						|
                IUcZYQMagrHelper ucZYQMagrHelper = null; | 
						|
                ProjectInfo ProInfo = MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo; | 
						|
                if (ProInfo != null && ProInfo.ProjType == EnumProjType.BHTBTQ && Platform.Instance.SystemType == SystemTypeEnum.BGFWCG) | 
						|
                { | 
						|
                    ucZYQMagrHelper = BundleRuntime.Instance.GetFirstOrDefaultService<IUcZYQMagrHelper>(); | 
						|
                    if (ucZYQMagrHelper != null) | 
						|
                    { | 
						|
                        selectIdZYQ = ucZYQMagrHelper.GetCheckedID(); | 
						|
                    } | 
						|
                } | 
						|
                m_editor.StartOperation(); | 
						|
                //if (StartLine == null) | 
						|
                //{ | 
						|
                //    StartLine = new PolylineClass(); | 
						|
                //    StartLine.FromPoint = LeftLine.Line.get_Point(0); | 
						|
                //    StartLine.ToPoint = RightLine.Line.get_Point(0); | 
						|
                //} | 
						|
                //if (EndLine == null) | 
						|
                //{ | 
						|
                //    EndLine = new PolylineClass(); | 
						|
                //    EndLine.FromPoint = LeftLine.Line.get_Point(LeftLine.Line.PointCount - 1); | 
						|
                //    EndLine.ToPoint = RightLine.Line.get_Point(LeftLine.Line.PointCount - 1); | 
						|
                //} | 
						|
 | 
						|
                IPointCollection line1 = new Polyline(); | 
						|
                line1.AddPoint((LeftLine.Line as IPolyline).FromPoint); | 
						|
                line1.AddPoint((RightLine.Line as IPolyline).FromPoint); | 
						|
                IGeometry geo1 = line1 as IGeometry; | 
						|
 | 
						|
                IPointCollection line2 = new Polyline(); | 
						|
                line2.AddPoint((LeftLine.Line as IPolyline).ToPoint); | 
						|
                line2.AddPoint((RightLine.Line as IPolyline).ToPoint); | 
						|
                IGeometry geo4 = line2 as IGeometry; | 
						|
 | 
						|
                //IGeometry geo1 = StartLine; | 
						|
                IGeometry geo2 = LeftLine.Line as IGeometry; | 
						|
                IGeometry geo3 = RightLine.Line as IGeometry; | 
						|
                //IGeometry geo4 = EndLine; | 
						|
 | 
						|
                ITopologicalOperator2 topo = geo1 as ITopologicalOperator2; | 
						|
                topo.Simplify(); | 
						|
                ITopologicalOperator topo1 = geo2 as ITopologicalOperator; | 
						|
                topo1.Simplify(); | 
						|
                topo = topo.Union(geo2) as ITopologicalOperator2; | 
						|
                topo.Simplify(); | 
						|
                topo1 = geo3 as ITopologicalOperator; | 
						|
                topo1.Simplify(); | 
						|
                topo = topo.Union(geo3) as ITopologicalOperator2; | 
						|
                topo1 = geo4 as ITopologicalOperator; | 
						|
                topo1.Simplify(); | 
						|
                IPointCollection allPoint = topo.Union(geo4) as IPointCollection; | 
						|
 | 
						|
                IFeatureSelection featureSelection = layer as IFeatureSelection; | 
						|
                featureSelection.Clear(); | 
						|
                IPointCollection polygon = new PolygonClass(); | 
						|
                polygon.AddPointCollection(allPoint); | 
						|
 | 
						|
                IGeometry geo = (polygon as IGeometry); | 
						|
                geo.SpatialReference = m_hookHelper.FocusMap.SpatialReference; | 
						|
 | 
						|
                //验证区域授权 | 
						|
                //if (RegionAuthorize == null) | 
						|
                //{ | 
						|
                //    RegionAuthorize = new RegionAuthorize(); | 
						|
                //} | 
						|
                //if (!RegionAuthorize.ValidateAuthorize(LeftLine.Line as IGeometry) || !RegionAuthorize.ValidateAuthorize(RightLine.Line as IGeometry)) | 
						|
                //{ | 
						|
                //    MessageHelper.ShowError("绘制图形不在授权区域范围内!"); | 
						|
                //    return; | 
						|
                //} | 
						|
                if (density == null) | 
						|
                { | 
						|
                    density = new VerificationOfFeatureNodeDensity(m_hookHelper); | 
						|
                } | 
						|
                geo = density.Verification(geo); | 
						|
                //白明雅 2020-04-01 | 
						|
                //if (dataCheckService != null) | 
						|
                //{ | 
						|
                //    dataCheckService.GeometryCheck(geo, layer); | 
						|
                //} | 
						|
                DrawFeature(layer.FeatureClass, geo, featureSelection); | 
						|
 | 
						|
                if (ucZYQMagrHelper != null) | 
						|
                { | 
						|
                    ucZYQMagrHelper.AddMask(selectIdZYQ); | 
						|
                } | 
						|
                #region | 
						|
 | 
						|
                //IFeatureLayer selectFeatureLayer = _MapService.GetFeatureLayerByName(Env.Instance.DefaultValue.ED_DLTB_TableName); | 
						|
                ////if (selectFeatureLayer == null || selectFeatureLayer.FeatureClass == null) | 
						|
                ////{ | 
						|
                ////    selectFeatureLayer = Env.Instance.KMap.GetFeatureLayerByName(this.m_hookHelper.ActiveView.FocusMap, Env.Instance.DefaultValue.DLTB_TableName) as IFeatureLayer; | 
						|
                ////} | 
						|
                ////按权属分割、合并图斑 | 
						|
                //List<IGeometry> GeoList = null; | 
						|
                //if (selectFeatureLayer != null && selectFeatureLayer.FeatureClass != null) | 
						|
                //{ | 
						|
                //    GeoList = FeatureAPI.GenerateNewFeature(geo, selectFeatureLayer.FeatureClass); | 
						|
                //} | 
						|
                ////else | 
						|
                ////{ | 
						|
                ////    DrawFeature(layer.FeatureClass, geo, featureSelection); | 
						|
                ////} | 
						|
                //if (GeoList == null || GeoList.Count <= 0) | 
						|
                //{ | 
						|
                //    GeoList = new List<IGeometry>() { geo }; | 
						|
                //    //DrawFeature(layer.FeatureClass, geo, featureSelection); | 
						|
                //} | 
						|
                //IIdentify identify = layer as IIdentify; | 
						|
                //List<IFeature> featureList = new List<IFeature>(); | 
						|
                //for (int k = 0; k < GeoList.Count; k++) | 
						|
                //{ | 
						|
                //    IGeometry item = GeoList[k]; | 
						|
                //    if (item.IsEmpty) | 
						|
                //        continue; | 
						|
                //    ITopologicalOperator2 topologicalOperator2 = item as ITopologicalOperator2; | 
						|
                //    IPolyline pPolyline = topologicalOperator2.Boundary as IPolyline; | 
						|
                //    item.SpatialReference = this.m_hookHelper.FocusMap.SpatialReference; | 
						|
                //    if (identify == null) | 
						|
                //    { | 
						|
                //        continue; | 
						|
                //    } | 
						|
                //    IArray iarray = identify.Identify(item); | 
						|
                //    if (iarray == null) | 
						|
                //    { | 
						|
                //        continue; | 
						|
                //    } | 
						|
                //    for (int i = 0; i < iarray.Count; i++) | 
						|
                //    { | 
						|
                //        IFeatureIdentifyObj pFeatIdObj = iarray.get_Element(i) as IFeatureIdentifyObj; | 
						|
                //        IRowIdentifyObject pRowObj = pFeatIdObj as IRowIdentifyObject; | 
						|
                //        IFeature newFeature = pRowObj.Row as IFeature; | 
						|
                //        newFeature.Shape.SpatialReference = this.m_hookHelper.FocusMap.SpatialReference; | 
						|
                //        ITopologicalOperator topOper = newFeature.ShapeCopy as ITopologicalOperator; | 
						|
                //        IGeometry geometryNew = topOper.Difference(item); | 
						|
                //        if (geometryNew != null && !geometryNew.IsEmpty) | 
						|
                //        { | 
						|
                //            newFeature.Shape = geometryNew; | 
						|
                //        } | 
						|
                //        //属性继承 | 
						|
                //        //FeatureHelper.SetFeatureAttribute(newFeature);//以后待改回 | 
						|
                //        //if (!string.IsNullOrWhiteSpace(this.drawParam.DLBM)) | 
						|
                //        //{ | 
						|
                //        //    string[] str = this.drawParam.DLBM.Split(new string[] { "-" }, StringSplitOptions.RemoveEmptyEntries); | 
						|
                //        //    if (str.Length == 2) | 
						|
                //        //    { | 
						|
                //        //        int index = newFeature.Fields.FindField("DLBM"); | 
						|
                //        //        if (index > -1) | 
						|
                //        //        { | 
						|
                //        //            newFeature.set_Value(index, str[0]); | 
						|
                //        //        } | 
						|
                //        //        index = newFeature.Fields.FindField("DLMC");  | 
						|
                //        //        if (index > -1) | 
						|
                //        //        { | 
						|
                //        //            newFeature.set_Value(index, str[1]); | 
						|
                //        //        } | 
						|
                //        //    } | 
						|
                //        //} | 
						|
                //        newFeature.Store(); | 
						|
                //        KGIS.Framework.AE.FeatureAPI.SplitMultipartFeature(new List<IFeature>() { newFeature }); | 
						|
                //        IPointCollection pointCollection = geometryNew as IPointCollection; | 
						|
                //        for (int j = 0; j < pointCollection.PointCount; j++) | 
						|
                //        { | 
						|
                //            if (KGIS.Framework.AE.FeatureAPI.IsInterSect(pointCollection.get_Point(j) as IGeometry, item)) | 
						|
                //            { | 
						|
                //                pPolyline.SplitAtPoint(pointCollection.get_Point(j), false, false, out isSplit, out splitIndex, out segIndex); | 
						|
                //            } | 
						|
                //        } | 
						|
                //        GeoList[k] = KGIS.Framework.AE.FeatureAPI.ConstructPolygonFromPolyline(pPolyline); | 
						|
                //    } | 
						|
                //} | 
						|
                //featureSelection.Clear(); | 
						|
                //foreach (IGeometry item in GeoList) | 
						|
                //{ | 
						|
                //    DrawFeature(layer.FeatureClass, item, featureSelection); | 
						|
                //} | 
						|
                //featureSelection.SelectionChanged(); | 
						|
 | 
						|
 | 
						|
                #endregion | 
						|
 | 
						|
                #region 打开数据检查助手 | 
						|
                //if (dataCheckView == null) | 
						|
                //{ | 
						|
                //    dataCheckView = new CheckAssistant(m_hookHelper); | 
						|
                //    dataCheckView.Width = 310; | 
						|
                //    IPoint topRightPoint = new PointClass(); | 
						|
                //    topRightPoint.X = m_hookHelper.ActiveView.Extent.XMax; | 
						|
                //    topRightPoint.Y = m_hookHelper.ActiveView.Extent.YMax; | 
						|
                //    topRightPoint.SpatialReference = m_hookHelper.FocusMap.SpatialReference; | 
						|
                //    int x2 = 0; | 
						|
                //    int y2 = 0; | 
						|
                //    //获取地图工作区右下角的坐标x2,y2,用于判断当前鼠标点是否在右边/下边边界处 | 
						|
                //    this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(topRightPoint, out x2, out y2); | 
						|
                //    System.Drawing.Point screenPoint = Env.Instance.KMap.AxMapControl.PointToScreen(new System.Drawing.Point(x2, y2)); | 
						|
                //    dataCheckView.Top = screenPoint.Y; | 
						|
                //    dataCheckView.Left = screenPoint.X - 310; | 
						|
                //    dataCheckView.Closed += dataCheckView_Closed; | 
						|
                //    dataCheckView.ShowInMainForm(); | 
						|
                //} | 
						|
                //dataCheckView.InitData(featureList); | 
						|
                #endregion | 
						|
                m_editor.StopOperation("画线物面"); | 
						|
                //KGIS.Common.Utility.CustomLogAPI.WriteSystemOperationLog("数据新增", "画线物面"); | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 执行 DrawComplete 异常,异常信息如下:"); | 
						|
                LogAPI.Debug(ex); | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 执行 DrawComplete 异常信息结束"); | 
						|
                m_editor.AbortOperation(); | 
						|
                MessageHelper.ShowError(ex.Message); | 
						|
            } | 
						|
            finally | 
						|
            { | 
						|
                DelElement(ref element); | 
						|
                PointElement = new List<IElement>(); | 
						|
                this.LeftLine.Dissvoe(); | 
						|
                this.RightLine.Dissvoe(); | 
						|
                this.MiddleLine.Dissvoe(); | 
						|
                this.MiddleLine.Init(); | 
						|
                this.RightLine.Init(); | 
						|
                this.LeftLine.Init(); | 
						|
                this.m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewBackground, null, m_hookHelper.ActiveView.Extent); | 
						|
                this.m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, m_hookHelper.ActiveView.Extent); | 
						|
                this.TempWidht = -1; | 
						|
                this.TempCenterPoint = null; | 
						|
                this.IsChangedWidht = false; | 
						|
                this.IsDrawing = false; | 
						|
                this.IsContinueDraw = false; | 
						|
            } | 
						|
        } | 
						|
 | 
						|
        /// <summary> | 
						|
        /// 绘制图形到图层上 | 
						|
        /// </summary> | 
						|
        /// <param name="pFeatureClass"></param> | 
						|
        /// <param name="geometry"></param> | 
						|
        /// <param name="featureSelection"></param> | 
						|
        //[LogWrite(Description = "")] | 
						|
        private void DrawFeature(IFeatureClass pFeatureClass, IGeometry geometry, IFeatureSelection featureSelection) | 
						|
        { | 
						|
            //绘制出空图形问题 | 
						|
            if (geometry == null || geometry.IsEmpty) | 
						|
            { | 
						|
                return; | 
						|
            } | 
						|
            IFeature feature = pFeatureClass.CreateFeature(); | 
						|
            feature.Shape = geometry; | 
						|
            feature.Shape.SpatialReference = m_hookHelper.FocusMap.SpatialReference; | 
						|
            //属性继承 | 
						|
            //FeatureHelper.SetFeatureAttribute(feature);//以后待改回 | 
						|
 | 
						|
            if (!string.IsNullOrWhiteSpace(this.drawParam.DLBM)) | 
						|
            { | 
						|
                string[] str = this.drawParam.DLBM.Split(new string[] { "-" }, StringSplitOptions.RemoveEmptyEntries); | 
						|
                if (str.Length == 2) | 
						|
                { | 
						|
                    int index = feature.Fields.FindField("DLBM"); | 
						|
                    if (index > -1) | 
						|
                    { | 
						|
                        feature.set_Value(index, str[0]); | 
						|
                    } | 
						|
                    index = feature.Fields.FindField("DLMC"); | 
						|
                    if (index > -1) | 
						|
                    { | 
						|
                        feature.set_Value(index, str[1]); | 
						|
                    } | 
						|
                } | 
						|
            } | 
						|
            feature.Store(); | 
						|
            featureSelection.Add(feature); | 
						|
        } | 
						|
 | 
						|
        //[LogWrite(Description = "")] | 
						|
        void dataCheckView_Closed(object sender, EventArgs e) | 
						|
        { | 
						|
            //dataCheckView = null; | 
						|
        } | 
						|
 | 
						|
        //[LogWrite(Description = "")] | 
						|
        public override bool Deactivate() | 
						|
        { | 
						|
 | 
						|
            int selectIdZYQ = 1; | 
						|
            IUcZYQMagrHelper ucZYQMagrHelper = null; | 
						|
            ProjectInfo ProInfo = MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo; | 
						|
            if (ProInfo != null && ProInfo.ProjType == EnumProjType.BHTBTQ && Platform.Instance.SystemType == SystemTypeEnum.BGFWCG) | 
						|
            { | 
						|
                ucZYQMagrHelper = BundleRuntime.Instance.GetFirstOrDefaultService<IUcZYQMagrHelper>(); | 
						|
                if (ucZYQMagrHelper != null) | 
						|
                { | 
						|
                    selectIdZYQ = ucZYQMagrHelper.GetCheckedID(); | 
						|
                } | 
						|
            } | 
						|
            Dispose(); | 
						|
            if (paramFrm != null) | 
						|
            { | 
						|
                paramFrm.Close(); | 
						|
                paramFrm = null; | 
						|
            } | 
						|
            if (ucZYQMagrHelper != null) | 
						|
            { | 
						|
                ucZYQMagrHelper.AddMask(selectIdZYQ); | 
						|
            } | 
						|
            //if (this.MiddleLine != null) | 
						|
            //{ | 
						|
            //    this.MiddleLine.Dissvoe(); | 
						|
            //} | 
						|
            //if (this.LeftLine != null) | 
						|
            //{ | 
						|
            //    this.LeftLine.Dissvoe(); | 
						|
            //} | 
						|
            //if (this.RightLine != null) | 
						|
            //{ | 
						|
            //    this.RightLine.Dissvoe(); | 
						|
            //} | 
						|
            //this.MiddleLine = new LineModel(m_hookHelper.ActiveView, esriSimpleLineStyle.esriSLSDash, 0.5); | 
						|
            //this.LeftLine = new LineModel(m_hookHelper.ActiveView, esriSimpleLineStyle.esriSLSSolid); | 
						|
            //this.RightLine = new LineModel(m_hookHelper.ActiveView, esriSimpleLineStyle.esriSLSSolid); | 
						|
            //Env.Instance.Platfrom.MapMouseWheel -= Platfrom_MapMouseWheel; | 
						|
            //if (timer != null) | 
						|
            //{ | 
						|
            //    timer.Tick -= timer_Tick; | 
						|
            //    timer.Stop(); | 
						|
            //} | 
						|
            //autoDistinguishTimer.Tick -= autoDistinguishTimer_Tick; | 
						|
            //autoDistinguishTimer.Stop(); | 
						|
            //PointElement = new List<IElement>(); | 
						|
            //this.IsDrawing = false; | 
						|
            //IsDeactivate = true; | 
						|
            //this.m_checked = false; | 
						|
            return base.Deactivate(); | 
						|
        } | 
						|
 | 
						|
        //[LogWrite(Description = "")] | 
						|
        private void LeftClick(int X, int Y) | 
						|
        { | 
						|
            //左键按下取点 | 
						|
            IPoint point = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y); | 
						|
            if (this.MiddleLine.Line.PointCount > 0 && IsDrawing == false) | 
						|
            { | 
						|
                #region 调整单个点的位置 | 
						|
                if (SnapElementPointIndex == -1) | 
						|
                { | 
						|
                    SnapElementPointIndex = SnapElement(point, out SnapElementPointLine); | 
						|
                    //IsDrawing = true; | 
						|
                } | 
						|
                else | 
						|
                { | 
						|
                    if (SnapElementPointLine == 0) | 
						|
                    { | 
						|
                        this.MiddleLine.Line.UpdatePoint(SnapElementPointIndex, point); | 
						|
                        double angle = 0; | 
						|
                        if (SnapElementPointIndex == 0) | 
						|
                        { | 
						|
                            angle = GeometryOperations.getAngle(point, this.MiddleLine.Line.get_Point(SnapElementPointIndex + 1)); | 
						|
                        } | 
						|
                        else | 
						|
                        { | 
						|
                            angle = GeometryOperations.getAngle(this.MiddleLine.Line.get_Point(SnapElementPointIndex - 1), point); | 
						|
                        } | 
						|
                        this.LeftLine.Line.UpdatePoint(SnapElementPointIndex, GeometryOperations.GetPoint(point, this.drawParam.Width * 0.5, -angle)); | 
						|
                        this.RightLine.Line.UpdatePoint(SnapElementPointIndex, GeometryOperations.GetPoint(point, this.drawParam.Width * -0.5, -angle)); | 
						|
                        this.MiddleLine.RefreshPoint(SnapElementPointIndex); | 
						|
                        this.LeftLine.RefreshPoint(SnapElementPointIndex); | 
						|
                        this.RightLine.RefreshPoint(SnapElementPointIndex); | 
						|
                    } | 
						|
                    else if (SnapElementPointLine == 1) | 
						|
                    { | 
						|
                        this.LeftLine.Line.UpdatePoint(SnapElementPointIndex, point); | 
						|
                        this.LeftLine.RefreshPoint(SnapElementPointIndex); | 
						|
                    } | 
						|
                    else if (SnapElementPointLine == -1) | 
						|
                    { | 
						|
                        this.RightLine.Line.UpdatePoint(SnapElementPointIndex, point); | 
						|
                        this.RightLine.RefreshPoint(SnapElementPointIndex); | 
						|
                    } | 
						|
                    SnapElementPointIndex = -1; | 
						|
                    IsDrawing = false; | 
						|
                } | 
						|
                #endregion | 
						|
            } | 
						|
            else | 
						|
            { | 
						|
                #region 绘制点 | 
						|
                #region 根据道路宽度调整相关参数 | 
						|
                if (TempWidht < 10) | 
						|
                { | 
						|
                    MinPointDistance = 15; | 
						|
                    MaxPointDistance = 40; | 
						|
                } | 
						|
                else if (TempWidht > 15) | 
						|
                { | 
						|
                    MinPointDistance = 30; | 
						|
                    MaxPointDistance = 80; | 
						|
                } | 
						|
                #endregion | 
						|
                if (this.MiddleLine.Line.PointCount > 0) | 
						|
                { | 
						|
                    IPoint p = this.MiddleLine.Line.get_Point(this.MiddleLine.Line.PointCount - 1); | 
						|
                    if (p.X == point.X && p.Y == point.Y) | 
						|
                    { | 
						|
                        return; | 
						|
                    } | 
						|
                    IPolyline line = new PolylineClass(); | 
						|
                    line.FromPoint = point; | 
						|
                    line.ToPoint = p; | 
						|
                    if (line.Length < 3) | 
						|
                    { | 
						|
                        return; | 
						|
                    } | 
						|
                } | 
						|
                if (TempWidht == -1) | 
						|
                { | 
						|
                    TempWidht = 10; | 
						|
                } | 
						|
                Drawing(point); | 
						|
                if (this.MiddleLine.Line.PointCount > 0) | 
						|
                    this.IsDrawing = true; | 
						|
                if (this.MiddleLine.Line.PointCount > 1) | 
						|
                { | 
						|
                    IPoint p2 = MiddleLine.Line.get_Point(this.MiddleLine.Line.PointCount - 2); | 
						|
                    IPoint p1 = MiddleLine.Line.get_Point(this.MiddleLine.Line.PointCount - 1); | 
						|
                    double angle = GeometryOperations.getAngle(p2, p1); | 
						|
                    //angle = 90 - angle; | 
						|
                    IPolyline tempLine = new PolylineClass(); | 
						|
                    tempLine.FromPoint = p1; | 
						|
                    tempLine.ToPoint = p2; | 
						|
                    MoveMapExtent(X, Y, (int)Math.Floor(tempLine.Length)); | 
						|
                    if (this.drawParam.IsAutoTrack) | 
						|
                    { | 
						|
                        //this.OnMouseDown(2, Shift, MousePoint.X, MousePoint.Y); | 
						|
                    } | 
						|
                } | 
						|
                else | 
						|
                { | 
						|
                    MoveMapExtent(X, Y, 100); | 
						|
                } | 
						|
                #endregion | 
						|
            } | 
						|
        } | 
						|
        #endregion | 
						|
 | 
						|
        /// <summary> | 
						|
        /// 获取两条线段交点 | 
						|
        /// </summary> | 
						|
        /// <param name="pointStart"></param> | 
						|
        /// <param name="pointEnd"></param> | 
						|
        /// <param name="targetGeo"></param> | 
						|
        /// <returns></returns> | 
						|
        //[LogWrite(Description = "")] | 
						|
        private IPoint GetIntersectPoint(IPoint pointStart, IPoint pointEnd, IGeometry targetGeo) | 
						|
        { | 
						|
            IPolyline newLine = new PolylineClass(); | 
						|
            IPointCollection newLinepoint = newLine as IPointCollection; | 
						|
            if (pointStart.X == pointEnd.X) | 
						|
            { | 
						|
                double minY = targetGeo.Envelope.YMin; | 
						|
                newLinepoint.AddPoint(pointStart); | 
						|
                newLinepoint.AddPoint(new PointClass() { X = pointEnd.X, Y = minY }); | 
						|
            } | 
						|
            else | 
						|
            { | 
						|
                double pointX = pointEnd.X > pointStart.X ? targetGeo.Envelope.XMax : targetGeo.Envelope.XMin; | 
						|
                double sourceLineK = (pointStart.Y - pointEnd.Y) / (pointStart.X - pointEnd.X); | 
						|
                double longPointY = pointStart.Y - ((pointStart.X - pointX) * sourceLineK); | 
						|
                newLinepoint.AddPoint(pointStart); | 
						|
                newLinepoint.AddPoint(new PointClass() { X = pointX, Y = longPointY }); | 
						|
            } | 
						|
            ITopologicalOperator topOper = targetGeo as ITopologicalOperator; | 
						|
            IGeometry geometry = topOper.Intersect(newLine as IGeometry, esriGeometryDimension.esriGeometry0Dimension); | 
						|
            return GetMinDisPoint(geometry, pointEnd); | 
						|
        } | 
						|
 | 
						|
        //[LogWrite(Description = "")] | 
						|
        private IPoint GetMinDisPoint(IGeometry geometry, IPoint pointEnd) | 
						|
        { | 
						|
            if (!geometry.IsEmpty) | 
						|
            { | 
						|
                IProximityOperator operatorPr = geometry as IProximityOperator; | 
						|
                return operatorPr.ReturnNearestPoint(pointEnd, esriSegmentExtension.esriExtendTangents); | 
						|
            } | 
						|
 | 
						|
            return null; | 
						|
        } | 
						|
 | 
						|
        /// <summary> | 
						|
        /// 滚动滚轮调整宽度 | 
						|
        /// </summary> | 
						|
        /// <param name="sender"></param> | 
						|
        /// <param name="e"></param> | 
						|
        //[LogWrite(Description = "")] | 
						|
        void Platfrom_MapMouseWheel(object sender, System.Windows.Forms.MouseEventArgs e) | 
						|
        { | 
						|
            if (IsDeactivate) | 
						|
                return; | 
						|
            if (drawParam != null) | 
						|
            { | 
						|
                //替换Env改动 | 
						|
                //if (Env.Instance.CurrentKeyDown == 17) | 
						|
                if (Platform.Instance.GetCurrentKeyDown() == 17) | 
						|
                { | 
						|
                    IPoint point = this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(MousePoint.X, MousePoint.Y); | 
						|
                    if (e.Delta > 0) | 
						|
                    { | 
						|
                        drawParam.Width = drawParam.Width + 0.5; | 
						|
                    } | 
						|
                    else if (e.Delta < 0 && drawParam.Width > 0) | 
						|
                    { | 
						|
                        drawParam.Width = drawParam.Width - 0.5; | 
						|
                    } | 
						|
                    int d = (int)Math.Abs(drawParam.Width); | 
						|
                    if (d == 0) | 
						|
                        return; | 
						|
                    if (d < 10) | 
						|
                    { | 
						|
                        drawParam.ToloranceScale = 0.1; | 
						|
                    } | 
						|
                    if (d == 10) | 
						|
                    { | 
						|
                        drawParam.ToloranceScale = 0.15; | 
						|
                    } | 
						|
                    if (d > 10 && d < 20) | 
						|
                    { | 
						|
                        drawParam.ToloranceScale = 0.2; | 
						|
                    } | 
						|
                    if (d == 20) | 
						|
                    { | 
						|
                        drawParam.ToloranceScale = 0.25; | 
						|
                    } | 
						|
                    if (d > 20) | 
						|
                    { | 
						|
                        drawParam.ToloranceScale = 0.3; | 
						|
                    } | 
						|
                    if (d > 30) | 
						|
                    { | 
						|
                        drawParam.ToloranceScale = 0.4; | 
						|
                    } | 
						|
                    if (d > 40) | 
						|
                    { | 
						|
                        drawParam.ToloranceScale = 0.5; | 
						|
                    } | 
						|
                    this.IsChangedWidht = true; | 
						|
                    DrawTextElement(point, ref TextElement); | 
						|
                    //this.OnMouseMove(1, 0, MousePoint.X, MousePoint.Y); | 
						|
                    //传入IsChangedWidht | 
						|
                    Moveing(point, IsChangedWidht); | 
						|
                } | 
						|
                else | 
						|
                { | 
						|
                    //shift+滚轮调节识别度 | 
						|
                    //if (IsDrawing) | 
						|
                    if (IsShiftDown) | 
						|
                    { | 
						|
                        if (e.Delta > 0) | 
						|
                        { | 
						|
                            //drawParam.ToloranceScale += 0.05; | 
						|
                            this.OnKeyDown((int)ConsoleKey.D0, 0); | 
						|
                        } | 
						|
                        if (e.Delta < 0) | 
						|
                        { | 
						|
                            //drawParam.ToloranceScale -= 0.05; | 
						|
                            this.OnKeyDown((int)ConsoleKey.D9, 0); | 
						|
                        } | 
						|
                        this.OnKeyDown((int)ConsoleKey.P, 0); | 
						|
                    } | 
						|
                    else | 
						|
                    { | 
						|
                        //添加滚轮放大缩小地图 | 
						|
                        //替换Env改动 | 
						|
                        //Env.Instance.KMap.AxMapControl.AutoMouseWheel = true; | 
						|
                        //Env.Instance.KMap.AxMapControl.AutoKeyboardScrolling = true; | 
						|
                        (m_hookHelper.Hook as IMapControlDefault).AutoMouseWheel = true; | 
						|
                        (m_hookHelper.Hook as IMapControlDefault).AutoKeyboardScrolling = true; | 
						|
 | 
						|
                        //---------------- | 
						|
                    } | 
						|
                } | 
						|
            } | 
						|
        } | 
						|
        /// <summary> | 
						|
        /// 移动地图范围 | 
						|
        /// </summary> | 
						|
        /// <param name="X">鼠标位置的X坐标</param> | 
						|
        /// <param name="Y">鼠标位置的Y坐标</param> | 
						|
        /// <param name="pWidth">鼠标位置距离地图边界的宽度</param> | 
						|
        //[LogWrite(Description = "")] | 
						|
        private void MoveMapExtent(int X, int Y, int pWidth) | 
						|
        { | 
						|
            //鼠标点击的点 | 
						|
            IPoint point = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y); | 
						|
            #region 当鼠标点击屏幕边界时移动地图范围 | 
						|
            //当前屏幕中心点坐标 | 
						|
            IPoint centerPoint = new PointClass() { X = (this.m_hookHelper.ActiveView.Extent.XMax - this.m_hookHelper.ActiveView.Extent.Width / 2), Y = (this.m_hookHelper.ActiveView.Extent.YMax - this.m_hookHelper.ActiveView.Extent.Height / 2) }; | 
						|
            //地图窗口右下角坐标 | 
						|
            IPoint p = new PointClass() { X = this.m_hookHelper.ActiveView.Extent.XMax, Y = this.m_hookHelper.ActiveView.Extent.YMin }; | 
						|
            //鼠标点击到边界时移动地图 | 
						|
            int x2 = 0; | 
						|
            int y2 = 0; | 
						|
            //获取地图工作区右下角的坐标x2,y2,用于判断当前鼠标点是否在右边/下边边界处 | 
						|
            this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(p, out x2, out y2); | 
						|
            //获取工作区右下角的坐标对应的屏幕坐标 | 
						|
            //替换Env改动 | 
						|
            //System.Drawing.Point rightBottomPoint = Env.Instance.KMap.AxMapControl.PointToScreen(new System.Drawing.Point(x2, y2)); | 
						|
            System.Drawing.Point rightBottomPoint = _MapService.PointToScreen(new System.Drawing.Point(x2, y2)); | 
						|
 | 
						|
            //获取工作区左上角的坐标对应的屏幕坐标 | 
						|
            //替换Env改动 | 
						|
            //System.Drawing.Point leftTopPoint = Env.Instance.KMap.AxMapControl.PointToScreen(new System.Drawing.Point(0, 0)); | 
						|
            System.Drawing.Point leftTopPoint = _MapService.PointToScreen(new System.Drawing.Point(0, 0)); | 
						|
 | 
						|
            IPoint CPoint = point; | 
						|
            double angle = 0; | 
						|
            if (MiddleLine.Line.PointCount > 1) | 
						|
            { | 
						|
                //计算当前道路线的方向 | 
						|
                angle = GeometryOperations.getAngle(MiddleLine.Line.get_Point(MiddleLine.Line.PointCount - 2), MiddleLine.Line.get_Point(MiddleLine.Line.PointCount - 1)); | 
						|
            } | 
						|
            //计算屏幕每像素代表实际横向距离 | 
						|
            double d1 = this.m_hookHelper.ActiveView.Extent.Width / x2; | 
						|
            //计算屏幕每像素代表实际纵向距离 | 
						|
            double d2 = this.m_hookHelper.ActiveView.Extent.Height / y2; | 
						|
            IPoint p1 = MiddleLine.Line.get_Point(this.MiddleLine.Line.PointCount - 1); | 
						|
 | 
						|
            //自动识别的下一个点的位置 | 
						|
            IPoint n_p = null; | 
						|
            //第一次识别的点 | 
						|
            IPoint n_p2 = null; | 
						|
            //第二次识别的点 | 
						|
            IPoint n_p3 = null; | 
						|
            //记录自动识别下一点的宽度 | 
						|
            IPolyline line = null; | 
						|
            //第一次识别的宽度 | 
						|
            IPolyline line2 = null; | 
						|
            //第二次识别的宽度 | 
						|
            IPolyline line3 = null; | 
						|
            IPolyline tempLine = new PolylineClass(); | 
						|
            if (this.MiddleLine.Line.PointCount > 1) | 
						|
            { | 
						|
                double d = 0; | 
						|
                if (this.MiddleLine.Line.PointCount > 0) | 
						|
                { | 
						|
                    tempLine.FromPoint = this.LeftLine.Line.get_Point(this.LeftLine.Line.PointCount - 1); | 
						|
                    tempLine.ToPoint = this.RightLine.Line.get_Point(this.RightLine.Line.PointCount - 1); | 
						|
                    d = tempLine.Length; | 
						|
                } | 
						|
                n_p2 = GeometryOperations.GetPoint(p1, pWidth, 90 - angle); | 
						|
                line2 = (IPolyline)AutoDistinguish3(0, n_p2); | 
						|
                if (Math.Abs(line2.Length - d) > 4) | 
						|
                { | 
						|
                    n_p3 = GeometryOperations.GetPoint(p1, pWidth + pWidth * 0.1, 90 - angle); | 
						|
                    line3 = (IPolyline)AutoDistinguish3(0, n_p3); | 
						|
                    if (Math.Abs(line2.Length - d) < Math.Abs(line3.Length - d)) | 
						|
                    { | 
						|
                        n_p = n_p2; | 
						|
                        line = line2; | 
						|
                    } | 
						|
                    else | 
						|
                    { | 
						|
                        n_p = n_p3; | 
						|
                        line = line3; | 
						|
                    } | 
						|
                } | 
						|
                else | 
						|
                { | 
						|
                    n_p = n_p2; | 
						|
                    line = line2; | 
						|
                } | 
						|
                #region 将自动识别的点显示在地图上 | 
						|
                TempCenterPoint = new PointClass(); | 
						|
                TempCenterPoint.X = line.FromPoint.X - (line.FromPoint.X - line.ToPoint.X) / 2; | 
						|
                TempCenterPoint.Y = line.FromPoint.Y - (line.FromPoint.Y - line.ToPoint.Y) / 2; | 
						|
                TempCenterPoint.SpatialReference = (line as IPolyline).SpatialReference; | 
						|
                IPointCollection newPoints = new Polyline(); | 
						|
                newPoints.AddPoint(line.FromPoint); | 
						|
                newPoints.AddPoint(TempCenterPoint); | 
						|
                newPoints.AddPoint(line.ToPoint); | 
						|
                DrawPoint(newPoints); | 
						|
                #endregion | 
						|
            } | 
						|
 | 
						|
            if (n_p != null) | 
						|
            { | 
						|
                //计算下一个点的坐标对应的地图工作区坐标位置 | 
						|
                int nextX = 0; | 
						|
                int nextY = 0; | 
						|
                this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(n_p, out nextX, out nextY); | 
						|
                if (nextX - 50 < 0 || nextX + 50 > x2) | 
						|
                { | 
						|
                    #region 横向移动 | 
						|
                    double moveWidth = 0; | 
						|
                    if (nextX - 50 < 0) | 
						|
                    { | 
						|
                        moveWidth = Math.Abs(nextX - 50) * d1; | 
						|
                    } | 
						|
                    else if (nextX + 50 > x2) | 
						|
                    { | 
						|
                        moveWidth = (nextX + 50 - x2) * d1; | 
						|
                    } | 
						|
                    if (moveWidth < this.m_hookHelper.ActiveView.Extent.Width / 2) | 
						|
                    { | 
						|
                        moveWidth = this.m_hookHelper.ActiveView.Extent.Width * 0.5; | 
						|
                    } | 
						|
                    if (angle != 0) | 
						|
                    { | 
						|
                        CPoint = GeometryOperations.GetPoint(centerPoint, moveWidth, 90 - angle); | 
						|
                        (this.m_hookHelper.Hook as IMapControl2).CenterAt(CPoint); | 
						|
                    } | 
						|
                    else | 
						|
                    { | 
						|
                        (this.m_hookHelper.Hook as IMapControl2).CenterAt(CPoint); | 
						|
                        this.OnMouseMove(1, 0, MousePoint.X + 1, MousePoint.Y + 1); | 
						|
                    } | 
						|
                    #endregion | 
						|
                } | 
						|
                if (nextY < 50 || nextY + 50 > y2) | 
						|
                { | 
						|
                    #region 纵向移动 | 
						|
                    double moveWidth = 0; | 
						|
                    if (nextY + 50 < 0) | 
						|
                    { | 
						|
                        moveWidth = Math.Abs(nextY - 50) * d2; | 
						|
                        if (moveWidth < this.m_hookHelper.ActiveView.Extent.Height / 2) | 
						|
                        { | 
						|
                            moveWidth = this.m_hookHelper.ActiveView.Extent.Height * 0.5; | 
						|
                        } | 
						|
                    } | 
						|
                    else if (nextY + 50 > y2) | 
						|
                    { | 
						|
                        moveWidth = (nextY + 50 - y2) * d2; | 
						|
                        if (moveWidth < this.m_hookHelper.ActiveView.Extent.Height / 2) | 
						|
                        { | 
						|
                            moveWidth = this.m_hookHelper.ActiveView.Extent.Height * 0.5; | 
						|
                        } | 
						|
                    } | 
						|
                    if (angle != 0) | 
						|
                    { | 
						|
                        CPoint = GeometryOperations.GetPoint(centerPoint, moveWidth, 90 - angle); | 
						|
                        (this.m_hookHelper.Hook as IMapControl2).CenterAt(CPoint); | 
						|
                    } | 
						|
                    else | 
						|
                    { | 
						|
                        (this.m_hookHelper.Hook as IMapControl2).CenterAt(CPoint); | 
						|
                        this.OnMouseMove(1, 0, MousePoint.X + 1, MousePoint.Y + 1); | 
						|
                    } | 
						|
                    #endregion | 
						|
                } | 
						|
                this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(TempCenterPoint, out nextX, out nextY); | 
						|
                int m_x = 0; | 
						|
                int m_y = 0; | 
						|
                this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(n_p, out m_x, out m_y); | 
						|
                //替换Env改动 | 
						|
                //System.Drawing.Point screenPoint = Env.Instance.KMap.AxMapControl.PointToScreen(new System.Drawing.Point(m_x, m_y)); | 
						|
                System.Drawing.Point screenPoint = _MapService.PointToScreen(new System.Drawing.Point(m_x, m_y)); | 
						|
 | 
						|
                this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(p1, out nextX, out nextY); | 
						|
                this.MousePoint.X = m_x; | 
						|
                this.MousePoint.Y = m_y; | 
						|
                //SetCursorPos(screenPoint.X, screenPoint.Y);  | 
						|
                if (this.drawParam.IsAutoStep) | 
						|
                { | 
						|
                    SetCursorPos(screenPoint.X, screenPoint.Y); | 
						|
                } | 
						|
                //this.m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography,null, | 
						|
                if (this.drawParam.IsAutoTrack && IsAuto) | 
						|
                { | 
						|
                    double angle2 = GeometryOperations.getAngle(MiddleLine.Line.get_Point(MiddleLine.Line.PointCount - 1), TempCenterPoint); | 
						|
                    ITopologicalOperator topo = TempCenterPoint as ITopologicalOperator; | 
						|
                    IGeometry geo = topo.Buffer(line.Length / 2); | 
						|
                    ImgDistinguish imgDis = new ImgDistinguish(); | 
						|
                    TilesImage img = imgDis.GetImg(geo.Envelope); | 
						|
                    if (img == null) | 
						|
                        return; | 
						|
                    img.PixelCount = 9; | 
						|
                    int gray1 = img.GetGrayValue(TempCenterPoint); | 
						|
                    topo = MiddleLine.Line.get_Point(MiddleLine.Line.PointCount - 1) as ITopologicalOperator; | 
						|
                    geo = topo.Buffer(line.Length / 2); | 
						|
                    img = imgDis.GetImg(geo.Envelope); | 
						|
                    if (img == null) | 
						|
                        return; | 
						|
                    img.PixelCount = 9; | 
						|
                    int gray2 = img.GetGrayValue(MiddleLine.Line.get_Point(MiddleLine.Line.PointCount - 1)); | 
						|
                    int w = pWidth / 3; | 
						|
                    if (Math.Abs(Math.Abs(angle) - Math.Abs(angle2)) < 10) | 
						|
                    { | 
						|
                        if (Math.Abs(gray1 - gray2) < 25 && Math.Abs(line.Length - tempLine.Length) < tempLine.Length * 0.3) | 
						|
                        { | 
						|
                            IsAutoTrackPoint = true; | 
						|
                            this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(TempCenterPoint, out nextX, out nextY); | 
						|
                            this.OnMouseDown(2, 0, nextX, nextY); | 
						|
                        } | 
						|
                        else | 
						|
                        { | 
						|
                            int i = 0; | 
						|
                            while (pWidth - w >= 3) | 
						|
                            { | 
						|
                                i++; | 
						|
                                w = w + pWidth / 3; | 
						|
                                if (i > 3) | 
						|
                                { | 
						|
                                    IsAutoTrackPoint = false; | 
						|
                                    break; | 
						|
                                } | 
						|
                                IPoint c_P = AutoTrack(X, Y, pWidth - w); | 
						|
                                if (c_P != null) | 
						|
                                { | 
						|
                                    TempCenterPoint = c_P; | 
						|
                                    IsAutoTrackPoint = true; | 
						|
                                    this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(TempCenterPoint, out nextX, out nextY); | 
						|
                                    this.OnMouseDown(2, 0, nextX, nextY); | 
						|
                                    break; | 
						|
                                } | 
						|
                                else | 
						|
                                { | 
						|
                                    IsAutoTrackPoint = false; | 
						|
                                } | 
						|
                            } | 
						|
                        } | 
						|
                    } | 
						|
                    else | 
						|
                    { | 
						|
                        if (Math.Abs(gray1 - gray2) < 30 && Math.Abs(line.Length - tempLine.Length) < tempLine.Length * 0.3) | 
						|
                        { | 
						|
                            IsAutoTrackPoint = true; | 
						|
                            this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(TempCenterPoint, out nextX, out nextY); | 
						|
                            this.OnMouseDown(2, 0, nextX, nextY); | 
						|
                        } | 
						|
                        else | 
						|
                        { | 
						|
                            int i = 0; | 
						|
                            while (pWidth - w >= 3) | 
						|
                            { | 
						|
                                i++; | 
						|
                                w = w + pWidth / 3; | 
						|
                                if (i > 3) | 
						|
                                { | 
						|
                                    IsAutoTrackPoint = false; | 
						|
                                    break; | 
						|
                                } | 
						|
                                IPoint c_P = AutoTrack(X, Y, pWidth - w); | 
						|
                                if (c_P != null) | 
						|
                                { | 
						|
                                    TempCenterPoint = c_P; | 
						|
                                    IsAutoTrackPoint = true; | 
						|
                                    this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(TempCenterPoint, out nextX, out nextY); | 
						|
                                    this.OnMouseDown(2, 0, nextX, nextY); | 
						|
                                    break; | 
						|
                                } | 
						|
                                else | 
						|
                                { | 
						|
                                    IsAutoTrackPoint = false; | 
						|
                                } | 
						|
                            } | 
						|
                            //if (pWidth / 3 >= 3) | 
						|
                            //{ | 
						|
                            //    MoveMapExtent(X, Y, pWidth / 3); | 
						|
                            //} | 
						|
                            //else | 
						|
                            //{ | 
						|
                            //    IsAutoTrackPoint = false; | 
						|
                            //} | 
						|
                        } | 
						|
                    } | 
						|
                } | 
						|
            } | 
						|
            #endregion | 
						|
        } | 
						|
        //[LogWrite(Description = "")] | 
						|
        private IPoint AutoTrack(int X, int Y, int pWidth) | 
						|
        { | 
						|
            IPoint result = null; | 
						|
            try | 
						|
            { | 
						|
                //鼠标点击的点 | 
						|
                IPoint point = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y); | 
						|
                #region 当鼠标点击屏幕边界时移动地图范围 | 
						|
                //当前屏幕中心点坐标 | 
						|
                IPoint centerPoint = new PointClass() { X = (this.m_hookHelper.ActiveView.Extent.XMax - this.m_hookHelper.ActiveView.Extent.Width / 2), Y = (this.m_hookHelper.ActiveView.Extent.YMax - this.m_hookHelper.ActiveView.Extent.Height / 2) }; | 
						|
                //地图窗口右下角坐标 | 
						|
                IPoint p = new PointClass() { X = this.m_hookHelper.ActiveView.Extent.XMax, Y = this.m_hookHelper.ActiveView.Extent.YMin }; | 
						|
                //鼠标点击到边界时移动地图 | 
						|
                int x2 = 0; | 
						|
                int y2 = 0; | 
						|
                //获取地图工作区右下角的坐标x2,y2,用于判断当前鼠标点是否在右边/下边边界处 | 
						|
                this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(p, out x2, out y2); | 
						|
                //获取工作区右下角的坐标对应的屏幕坐标 | 
						|
                //替换Env改动 | 
						|
                //System.Drawing.Point rightBottomPoint = Env.Instance.KMap.AxMapControl.PointToScreen(new System.Drawing.Point(x2, y2)); | 
						|
                System.Drawing.Point rightBottomPoint = _MapService.PointToScreen(new System.Drawing.Point(x2, y2)); | 
						|
 | 
						|
                //获取工作区左上角的坐标对应的屏幕坐标 | 
						|
                //替换Env改动 | 
						|
                //System.Drawing.Point leftTopPoint = Env.Instance.KMap.AxMapControl.PointToScreen(new System.Drawing.Point(0, 0)); | 
						|
                System.Drawing.Point leftTopPoint = _MapService.PointToScreen(new System.Drawing.Point(0, 0)); | 
						|
 | 
						|
                IPoint CPoint = point; | 
						|
                double angle = 0; | 
						|
                if (MiddleLine.Line.PointCount > 1) | 
						|
                { | 
						|
                    //计算当前道路线的方向 | 
						|
                    angle = GeometryOperations.getAngle(MiddleLine.Line.get_Point(MiddleLine.Line.PointCount - 2), MiddleLine.Line.get_Point(MiddleLine.Line.PointCount - 1)); | 
						|
                } | 
						|
                //计算屏幕每像素代表实际横向距离 | 
						|
                double d1 = this.m_hookHelper.ActiveView.Extent.Width / x2; | 
						|
                //计算屏幕每像素代表实际纵向距离 | 
						|
                double d2 = this.m_hookHelper.ActiveView.Extent.Height / y2; | 
						|
                IPoint p1 = MiddleLine.Line.get_Point(this.MiddleLine.Line.PointCount - 1); | 
						|
 | 
						|
                //自动识别的下一个点的位置 | 
						|
                IPoint n_p = null; | 
						|
                //第一次识别的点 | 
						|
                IPoint n_p2 = null; | 
						|
                //第二次识别的点 | 
						|
                IPoint n_p3 = null; | 
						|
                //记录自动识别下一点的宽度 | 
						|
                IPolyline line = null; | 
						|
                //第一次识别的宽度 | 
						|
                IPolyline line2 = null; | 
						|
                //第二次识别的宽度 | 
						|
                IPolyline line3 = null; | 
						|
                IPolyline tempLine = new PolylineClass(); | 
						|
                if (this.MiddleLine.Line.PointCount > 1) | 
						|
                { | 
						|
                    double d = 0; | 
						|
                    if (this.MiddleLine.Line.PointCount > 0) | 
						|
                    { | 
						|
                        tempLine.FromPoint = this.LeftLine.Line.get_Point(this.LeftLine.Line.PointCount - 1); | 
						|
                        tempLine.ToPoint = this.RightLine.Line.get_Point(this.RightLine.Line.PointCount - 1); | 
						|
                        d = tempLine.Length; | 
						|
                    } | 
						|
                    n_p2 = GeometryOperations.GetPoint(p1, pWidth, 90 - angle); | 
						|
                    line2 = (IPolyline)AutoDistinguish3(0, n_p2); | 
						|
                    if (Math.Abs(line2.Length - d) > 4) | 
						|
                    { | 
						|
                        n_p3 = GeometryOperations.GetPoint(p1, pWidth + pWidth * 0.1, 90 - angle); | 
						|
                        line3 = (IPolyline)AutoDistinguish3(0, n_p3); | 
						|
                        if (Math.Abs(line2.Length - d) < Math.Abs(line3.Length - d)) | 
						|
                        { | 
						|
                            n_p = n_p2; | 
						|
                            line = line2; | 
						|
                        } | 
						|
                        else | 
						|
                        { | 
						|
                            n_p = n_p3; | 
						|
                            line = line3; | 
						|
                        } | 
						|
                    } | 
						|
                    else | 
						|
                    { | 
						|
                        n_p = n_p2; | 
						|
                        line = line2; | 
						|
                    } | 
						|
                    #region 将自动识别的点显示在地图上 | 
						|
                    TempCenterPoint = new PointClass(); | 
						|
                    TempCenterPoint.X = line.FromPoint.X - (line.FromPoint.X - line.ToPoint.X) / 2; | 
						|
                    TempCenterPoint.Y = line.FromPoint.Y - (line.FromPoint.Y - line.ToPoint.Y) / 2; | 
						|
                    TempCenterPoint.SpatialReference = (line as IPolyline).SpatialReference; | 
						|
                    IPointCollection newPoints = new Polyline(); | 
						|
                    newPoints.AddPoint(line.FromPoint); | 
						|
                    newPoints.AddPoint(TempCenterPoint); | 
						|
                    newPoints.AddPoint(line.ToPoint); | 
						|
                    DrawPoint(newPoints); | 
						|
                    #endregion | 
						|
                } | 
						|
 | 
						|
                //计算下一个点的坐标对应的地图工作区坐标位置 | 
						|
                int nextX = 0; | 
						|
                int nextY = 0; | 
						|
                #region | 
						|
                //this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(n_p, out nextX, out nextY); | 
						|
                //if (nextX - 50 < 0 || nextX + 50 > x2) | 
						|
                //{ | 
						|
                //    #region 横向移动 | 
						|
                //    double moveWidth = 0; | 
						|
                //    if (nextX - 50 < 0) | 
						|
                //    { | 
						|
                //        moveWidth = Math.Abs(nextX - 50) * d1; | 
						|
                //    } | 
						|
                //    else if (nextX + 50 > x2) | 
						|
                //    { | 
						|
                //        moveWidth = (nextX + 50 - x2) * d1; | 
						|
                //    } | 
						|
                //    if (angle != 0) | 
						|
                //    { | 
						|
                //        CPoint = GeometryOperations.GetPoint(centerPoint, moveWidth, 90 - angle); | 
						|
                //        (this.m_hookHelper.Hook as IMapControl2).CenterAt(CPoint); | 
						|
                //    } | 
						|
                //    else | 
						|
                //    { | 
						|
                //        (this.m_hookHelper.Hook as IMapControl2).CenterAt(CPoint); | 
						|
                //        this.OnMouseMove(1, 0, MousePoint.X + 1, MousePoint.Y + 1); | 
						|
                //    } | 
						|
                //    #endregion | 
						|
                //} | 
						|
                //if (nextY + 50 < 0 || nextY + 50 > y2) | 
						|
                //{ | 
						|
                //    #region 纵向移动 | 
						|
                //    double moveWidth = 0; | 
						|
                //    if (nextY + 50 < 0) | 
						|
                //    { | 
						|
                //        moveWidth = Math.Abs(nextY - 50) * d2; | 
						|
                //    } | 
						|
                //    else if (nextY + 50 > y2) | 
						|
                //    { | 
						|
                //        moveWidth = -(nextY + 50 - x2) * d2; | 
						|
                //    } | 
						|
                //    if (angle != 0) | 
						|
                //    { | 
						|
                //        CPoint = GeometryOperations.GetPoint(centerPoint, moveWidth, 90 - angle); | 
						|
                //        (this.m_hookHelper.Hook as IMapControl2).CenterAt(CPoint); | 
						|
                //    } | 
						|
                //    else | 
						|
                //    { | 
						|
                //        (this.m_hookHelper.Hook as IMapControl2).CenterAt(CPoint); | 
						|
                //        this.OnMouseMove(1, 0, MousePoint.X + 1, MousePoint.Y + 1); | 
						|
                //    } | 
						|
                //    #endregion | 
						|
                //} | 
						|
                #endregion | 
						|
                if (n_p != null) | 
						|
                { | 
						|
                    this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(TempCenterPoint, out nextX, out nextY); | 
						|
                    int m_x = 0; | 
						|
                    int m_y = 0; | 
						|
                    this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(n_p, out m_x, out m_y); | 
						|
 | 
						|
                    //替换Env改动 | 
						|
                    //System.Drawing.Point screenPoint = Env.Instance.KMap.AxMapControl.PointToScreen(new System.Drawing.Point(m_x, m_y)); | 
						|
                    System.Drawing.Point screenPoint = _MapService.PointToScreen(new System.Drawing.Point(m_x, m_y)); | 
						|
 | 
						|
                    this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(p1, out nextX, out nextY); | 
						|
                    this.MousePoint.X = m_x; | 
						|
                    this.MousePoint.Y = m_y; | 
						|
                    SetCursorPos(screenPoint.X, screenPoint.Y); | 
						|
                    if (this.drawParam.IsAutoTrack) | 
						|
                    { | 
						|
                        double angle2 = GeometryOperations.getAngle(MiddleLine.Line.get_Point(MiddleLine.Line.PointCount - 1), TempCenterPoint); | 
						|
                        ITopologicalOperator topo = TempCenterPoint as ITopologicalOperator; | 
						|
                        IGeometry geo = topo.Buffer(line.Length / 2); | 
						|
                        ImgDistinguish imgDis = new ImgDistinguish(); | 
						|
                        TilesImage img = imgDis.GetImg(geo.Envelope); | 
						|
                        if (img == null) | 
						|
                            return result; | 
						|
                        img.PixelCount = 9; | 
						|
                        int gray1 = img.GetGrayValue(TempCenterPoint); | 
						|
                        topo = MiddleLine.Line.get_Point(MiddleLine.Line.PointCount - 1) as ITopologicalOperator; | 
						|
                        geo = topo.Buffer(line.Length / 2); | 
						|
                        img = imgDis.GetImg(geo.Envelope); | 
						|
                        if (img == null) | 
						|
                            return result; | 
						|
                        img.PixelCount = 9; | 
						|
                        int gray2 = img.GetGrayValue(MiddleLine.Line.get_Point(MiddleLine.Line.PointCount - 1)); | 
						|
 | 
						|
                        if (Math.Abs(Math.Abs(angle) - Math.Abs(angle2)) < 5 && Math.Abs(gray1 - gray2) < 25 && Math.Abs(line.Length - tempLine.Length) < tempLine.Length * 0.3) | 
						|
                        { | 
						|
                            //IsAutoTrackPoint = true; | 
						|
                            //this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(TempCenterPoint, out nextX, out nextY); | 
						|
                            //this.OnMouseDown(2, 0, nextX, nextY); | 
						|
                            result = TempCenterPoint; | 
						|
                        } | 
						|
                        else | 
						|
                        { | 
						|
                            //IsAutoTrackPoint = false; | 
						|
                        } | 
						|
                    } | 
						|
                } | 
						|
                return result; | 
						|
                #endregion | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 执行 AutoTrack 异常,异常信息如下:"); | 
						|
                LogAPI.Debug(ex); | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 执行 AutoTrack 异常信息结束"); | 
						|
                throw ex; | 
						|
            } | 
						|
        } | 
						|
        /// <summary> | 
						|
        /// 定时进行自动识别影像 | 
						|
        /// </summary> | 
						|
        /// <param name="sender"></param> | 
						|
        /// <param name="e"></param> | 
						|
        //[LogWrite(Description = "")] | 
						|
        void autoDistinguishTimer_Tick(object sender, EventArgs e) | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                IPoint point = this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(MousePoint.X, MousePoint.Y); | 
						|
                double angle = 0; | 
						|
                if (MiddleLine.Line.PointCount <= 0) | 
						|
                { | 
						|
                    return; | 
						|
                    #region | 
						|
                    //IPolyline p1 = (IPolyline)AutoDistinguish(0); | 
						|
                    //IPolyline p2 = (IPolyline)AutoDistinguish(90); | 
						|
                    //if (p1.Length > p2.Length) | 
						|
                    //{ | 
						|
                    //    TempWidht = p2.Length; | 
						|
                    //    #region 将自动识别记过显示在地图上 | 
						|
                    //    TempCenterPoint = new PointClass(); | 
						|
                    //    TempCenterPoint.X = p2.FromPoint.X - (p2.FromPoint.X - p2.ToPoint.X) / 2; | 
						|
                    //    TempCenterPoint.Y = p2.FromPoint.Y - (p2.FromPoint.Y - p2.ToPoint.Y) / 2; | 
						|
                    //    TempCenterPoint.SpatialReference = (p2 as IPolyline).SpatialReference; | 
						|
                    //    IPointCollection newPoints = new Polyline(); | 
						|
                    //    newPoints.AddPoint(p2.FromPoint); | 
						|
                    //    newPoints.AddPoint(TempCenterPoint); | 
						|
                    //    newPoints.AddPoint(p2.ToPoint); | 
						|
                    //    DrawPoint(newPoints); | 
						|
                    //    #endregion | 
						|
                    //} | 
						|
                    //else | 
						|
                    //{ | 
						|
                    //    TempWidht = p1.Length; | 
						|
                    //    #region 将自动识别记过显示在地图上 | 
						|
                    //    TempCenterPoint = new PointClass(); | 
						|
                    //    TempCenterPoint.X = p1.FromPoint.X - (p1.FromPoint.X - p1.ToPoint.X) / 2; | 
						|
                    //    TempCenterPoint.Y = p1.FromPoint.Y - (p1.FromPoint.Y - p1.ToPoint.Y) / 2; | 
						|
                    //    TempCenterPoint.SpatialReference = (p1 as IPolyline).SpatialReference; | 
						|
                    //    IPointCollection newPoints = new Polyline(); | 
						|
                    //    newPoints.AddPoint(p1.FromPoint); | 
						|
                    //    newPoints.AddPoint(TempCenterPoint); | 
						|
                    //    newPoints.AddPoint(p1.ToPoint); | 
						|
                    //    DrawPoint(newPoints); | 
						|
                    //    #endregion | 
						|
                    //} | 
						|
                    #endregion | 
						|
                } | 
						|
                else | 
						|
                { | 
						|
                    //LogAPI.Debug("开始时间:" + DateTime.Now.Subtract(); | 
						|
                    angle = GeometryOperations.getAngle(MiddleLine.Line.Point[MiddleLine.Line.PointCount - 1], point); | 
						|
                    if (double.IsNaN(angle) && (MiddleLine.Line.PointCount - 2) > -1) | 
						|
                    { | 
						|
                        angle = GeometryOperations.getAngle(MiddleLine.Line.Point[MiddleLine.Line.PointCount - 2], point); | 
						|
                    } | 
						|
                    if (!Double.IsNaN(angle)) | 
						|
                    { | 
						|
                        //DateTime t1 = DateTime.Now; | 
						|
                        //Int32 d = t1.Minute * 60 * 1000 + t1.Second * 1000 + t1.Millisecond; | 
						|
                        //LogAPI.Debug("开始时间:" + (t1.Minute * 60 * 1000 + t1.Second * 1000 + t1.Millisecond)); | 
						|
                        IPolyline polyline = (IPolyline)AutoDistinguish(angle); | 
						|
                        this.drawParam.ToloranceScale += 0.05; | 
						|
                        IPolyline polyline1 = (IPolyline)AutoDistinguish(angle); | 
						|
                        this.drawParam.ToloranceScale -= 0.1; | 
						|
                        IPolyline polyline2 = (IPolyline)AutoDistinguish(angle); | 
						|
                        this.drawParam.ToloranceScale += 0.05; | 
						|
                        double d = this.drawParam.Width; | 
						|
                        if (this.MiddleLine.Line.PointCount > 0) | 
						|
                        { | 
						|
                            IPolyline tempLine = new PolylineClass(); | 
						|
                            tempLine.FromPoint = this.LeftLine.Line.get_Point(this.LeftLine.Line.PointCount - 1); | 
						|
                            tempLine.ToPoint = this.RightLine.Line.get_Point(this.RightLine.Line.PointCount - 1); | 
						|
                            d = tempLine.Length; | 
						|
                        } | 
						|
                        if (Math.Abs(polyline.Length - d) < Math.Abs(polyline1.Length - d)) | 
						|
                        { | 
						|
                            if (Math.Abs(polyline.Length - d) > Math.Abs(polyline2.Length - d)) | 
						|
                            { | 
						|
                                polyline = polyline2; | 
						|
                            } | 
						|
                        } | 
						|
                        else | 
						|
                        { | 
						|
                            if (Math.Abs(polyline1.Length - d) > Math.Abs(polyline2.Length - d)) | 
						|
                            { | 
						|
                                polyline = polyline2; | 
						|
                            } | 
						|
                            else | 
						|
                            { | 
						|
                                polyline = polyline1; | 
						|
                            } | 
						|
                        } | 
						|
                        TempWidht = polyline.Length; | 
						|
                        if ((TempWidht > this.drawParam.Width + this.drawParam.Width * 0.5 || TempWidht < this.drawParam.Width - this.drawParam.Width * 0.5) && this.MiddleLine.Line.PointCount > 1) | 
						|
                        { | 
						|
                            TempWidht = -1; | 
						|
                            TempCenterPoint = null; | 
						|
                            try | 
						|
                            { | 
						|
                                if (PointElement.Count > 0) | 
						|
                                { | 
						|
                                    foreach (IElement item in PointElement) | 
						|
                                    { | 
						|
                                        m_hookHelper.ActiveView.GraphicsContainer.DeleteElement(item); | 
						|
                                    } | 
						|
                                    PointElement = new List<IElement>(); | 
						|
                                    m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, m_hookHelper.ActiveView.Extent); | 
						|
                                } | 
						|
                            } | 
						|
                            catch (Exception ex) | 
						|
                            { | 
						|
                                LogAPI.Debug("画线物面(线状地物面)工具 过程 中 定时进行自动识别影像 时异常,异常信息如下:"); | 
						|
                                LogAPI.Debug(ex); | 
						|
                                LogAPI.Debug("画线物面(线状地物面)工具 过程 中 定时进行自动识别影像 异常信息结束"); | 
						|
                            } | 
						|
                        } | 
						|
                        else | 
						|
                        { | 
						|
                            #region 将自动识别的点显示在地图上 | 
						|
                            TempCenterPoint = new PointClass(); | 
						|
                            TempCenterPoint.X = polyline.FromPoint.X - (polyline.FromPoint.X - polyline.ToPoint.X) / 2; | 
						|
                            TempCenterPoint.Y = polyline.FromPoint.Y - (polyline.FromPoint.Y - polyline.ToPoint.Y) / 2; | 
						|
                            TempCenterPoint.SpatialReference = (polyline as IPolyline).SpatialReference; | 
						|
                            IPointCollection newPoints = new Polyline(); | 
						|
                            newPoints.AddPoint(polyline.FromPoint); | 
						|
                            newPoints.AddPoint(TempCenterPoint); | 
						|
                            newPoints.AddPoint(polyline.ToPoint); | 
						|
                            DrawPoint(newPoints); | 
						|
                            #endregion | 
						|
                        } | 
						|
                        //DateTime t2 = DateTime.Now; | 
						|
                        //Int32 d2 = t2.Minute * 60 * 1000 + t2.Second * 1000 + t2.Millisecond; | 
						|
                        //LogAPI.Debug("识别结束:" + (t2.Minute * 60 * 1000 + t2.Second * 1000 + t2.Millisecond)); | 
						|
 | 
						|
                        //LogAPI.Debug("识别结束:" + (d2 - d) + "毫秒"); | 
						|
                    } | 
						|
                } | 
						|
                autoDistinguishTimer.Stop(); | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 定时进行自动识别影像 时异常,异常信息如下:"); | 
						|
                LogAPI.Debug(ex); | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 定时进行自动识别影像 时异常信息结束"); | 
						|
            } | 
						|
        } | 
						|
 | 
						|
        #region 捕捉 | 
						|
        //[LogWrite(Description = "")] | 
						|
        private List<IFeature> Snapping(IPoint pPoint, List<IFeatureLayer> pLayers) | 
						|
        { | 
						|
            List<IFeature> result = new List<IFeature>(); | 
						|
            try | 
						|
            { | 
						|
                if (pPoint != null && pLayers != null) | 
						|
                { | 
						|
                    foreach (IFeatureLayer item in pLayers) | 
						|
                    { | 
						|
                        IIdentify identify = item as IIdentify; | 
						|
                        if (identify == null) | 
						|
                            continue; | 
						|
                        ESRI.ArcGIS.esriSystem.IArray array = identify.Identify(pPoint); | 
						|
                        if (array == null) | 
						|
                            continue; | 
						|
                        for (int i = 0; i < array.Count; i++) | 
						|
                        { | 
						|
                            IRowIdentifyObject row = (IRowIdentifyObject)array.get_Element(i); | 
						|
                            if (row == null) | 
						|
                                continue; | 
						|
                            IFeature f = row.Row as IFeature; | 
						|
                            result.Add(f); | 
						|
                        } | 
						|
                    } | 
						|
                } | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 捕捉 时异常,异常信息如下:"); | 
						|
                LogAPI.Debug(ex); | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 捕捉 时异常信息结束"); | 
						|
            } | 
						|
            return result; | 
						|
        } | 
						|
        #endregion | 
						|
        #region 获取所有可见图层 | 
						|
        /// <summary> | 
						|
        /// 获取当前地图中可见的矢量图层 | 
						|
        /// </summary> | 
						|
        /// <param name="pMap"></param> | 
						|
        /// <returns></returns> | 
						|
        //[LogWrite(Description = "")] | 
						|
        private List<IFeatureLayer> GetVisibleLayer(IMap pMap, esriGeometryType geoType = esriGeometryType.esriGeometryAny) | 
						|
        { | 
						|
            List<IFeatureLayer> result = new List<IFeatureLayer>(); | 
						|
            if (pMap == null) | 
						|
                return result; | 
						|
            try | 
						|
            { | 
						|
                for (int i = 0; i < pMap.LayerCount; i++) | 
						|
                { | 
						|
                    ILayer layer = pMap.get_Layer(i); | 
						|
                    if (layer is IFeatureLayer) | 
						|
                    { | 
						|
                        if ((layer as IFeatureLayer).Visible && (layer as IFeatureLayer).FeatureClass.ShapeType == geoType) | 
						|
                        { | 
						|
                            result.Add(layer as IFeatureLayer); | 
						|
                        } | 
						|
                    } | 
						|
                    else if (layer is ICompositeLayer) | 
						|
                    { | 
						|
                        if ((layer as IGroupLayer).Visible) | 
						|
                        { | 
						|
                            result.AddRange(GetVisibleLayerByGroupLayer(layer as ICompositeLayer, geoType)); | 
						|
                        } | 
						|
                    } | 
						|
                } | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 获取当前地图中可见的矢量图层 时异常,异常信息如下:"); | 
						|
                LogAPI.Debug(ex); | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 获取当前地图中可见的矢量图层 时异常信息结束"); | 
						|
            } | 
						|
            return result; | 
						|
        } | 
						|
        //[LogWrite(Description = "")] | 
						|
        private List<IFeatureLayer> GetVisibleLayerByGroupLayer(ICompositeLayer pGroupLayer, esriGeometryType geoType = esriGeometryType.esriGeometryAny) | 
						|
        { | 
						|
            List<IFeatureLayer> result = new List<IFeatureLayer>(); | 
						|
            if (pGroupLayer != null && pGroupLayer.Count > 0) | 
						|
            { | 
						|
                for (int i = 0; i < pGroupLayer.Count; i++) | 
						|
                { | 
						|
                    ILayer layer = pGroupLayer.get_Layer(i); | 
						|
                    if (layer is IAnnotationLayer) | 
						|
                    { | 
						|
 | 
						|
                    } | 
						|
                    else if (layer is IGroupLayer) | 
						|
                    { | 
						|
                        if ((layer as IGroupLayer).Visible) | 
						|
                        { | 
						|
                            result.AddRange(GetVisibleLayerByGroupLayer(layer as ICompositeLayer, geoType)); | 
						|
                        } | 
						|
                    } | 
						|
                    else | 
						|
                    { | 
						|
                        if (layer is IFeatureLayer) | 
						|
                        { | 
						|
                            if ((layer as IFeatureLayer).Visible && (layer as IFeatureLayer).FeatureClass.ShapeType == geoType) | 
						|
                            { | 
						|
                                result.Add((IFeatureLayer)layer); | 
						|
                            } | 
						|
                        } | 
						|
                    } | 
						|
                } | 
						|
            } | 
						|
            return result; | 
						|
        } | 
						|
        #endregion | 
						|
        #region 绘制相关私有函数 | 
						|
 | 
						|
        //[LogWrite(Description = "")] | 
						|
        private IPointCollection AutoDistinguish3(double angle = 0, IPoint pPoint = null) | 
						|
        { | 
						|
            IPolyline polyline = (IPolyline)AutoDistinguish(angle, pPoint); | 
						|
            this.drawParam.ToloranceScale += 0.05; | 
						|
            IPolyline polyline1 = (IPolyline)AutoDistinguish(angle, pPoint); | 
						|
            this.drawParam.ToloranceScale -= 0.1; | 
						|
            IPolyline polyline2 = (IPolyline)AutoDistinguish(angle, pPoint); | 
						|
            this.drawParam.ToloranceScale += 0.05; | 
						|
            double d = this.drawParam.Width; | 
						|
            if (this.MiddleLine.Line.PointCount > 0) | 
						|
            { | 
						|
                IPolyline tempLine = new PolylineClass(); | 
						|
                tempLine.FromPoint = this.LeftLine.Line.get_Point(this.LeftLine.Line.PointCount - 1); | 
						|
                tempLine.ToPoint = this.RightLine.Line.get_Point(this.RightLine.Line.PointCount - 1); | 
						|
                d = tempLine.Length; | 
						|
            } | 
						|
            if (Math.Abs(polyline.Length - d) < Math.Abs(polyline1.Length - d)) | 
						|
            { | 
						|
                if (Math.Abs(polyline.Length - d) > Math.Abs(polyline2.Length - d)) | 
						|
                { | 
						|
                    polyline = polyline2; | 
						|
                } | 
						|
            } | 
						|
            else | 
						|
            { | 
						|
                if (Math.Abs(polyline1.Length - d) > Math.Abs(polyline2.Length - d)) | 
						|
                { | 
						|
                    polyline = polyline2; | 
						|
                } | 
						|
                else | 
						|
                { | 
						|
                    polyline = polyline1; | 
						|
                } | 
						|
            } | 
						|
            return polyline as IPointCollection; | 
						|
        } | 
						|
 | 
						|
        /// <summary> | 
						|
        /// 自动识别中心点 | 
						|
        /// </summary> | 
						|
        //[LogWrite(Description = "")] | 
						|
        private IPointCollection AutoDistinguish(double angle = 0, IPoint pPoint = null) | 
						|
        { | 
						|
            #region 自动识别道路中心线 | 
						|
            IPoint point = pPoint; | 
						|
            if (point == null) | 
						|
            { | 
						|
                point = this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(MousePoint.X, MousePoint.Y); | 
						|
            } | 
						|
            IPointCollection vertical = new Polyline(); | 
						|
            vertical.AddPoint(point); | 
						|
            vertical.AddPoint(point); | 
						|
            //KOTilesLayer layer = Common.Utility.LayerHelper.GetLayerByName<KOTilesLayer>(m_hookHelper.FocusMap, "YGYXT"); | 
						|
            double InitWidht = 50; | 
						|
            //获取鼠标点周围50米的范围 | 
						|
            IEnvelope env = new EnvelopeClass(); | 
						|
            //计算当前道路的角度 | 
						|
            if (MiddleLine.Line.PointCount > 1) | 
						|
            { | 
						|
                env.XMax = point.X + this.drawParam.Width; | 
						|
                env.XMin = point.X - this.drawParam.Width; | 
						|
                env.YMax = point.Y + this.drawParam.Width; | 
						|
                env.YMin = point.Y - this.drawParam.Width; | 
						|
                InitWidht = drawParam.Width; | 
						|
                angle = GeometryOperations.getAngle(MiddleLine.Line.Point[MiddleLine.Line.PointCount - 1], point); | 
						|
                if (double.IsNaN(angle) && (MiddleLine.Line.PointCount - 2) > -1) | 
						|
                { | 
						|
                    angle = GeometryOperations.getAngle(MiddleLine.Line.Point[MiddleLine.Line.PointCount - 2], point); | 
						|
                } | 
						|
                if (Double.IsNaN(angle)) | 
						|
                    return vertical; | 
						|
            } | 
						|
            else | 
						|
            { | 
						|
                env.XMax = point.X + InitWidht / 2; | 
						|
                env.XMin = point.X - InitWidht / 2; | 
						|
                env.YMax = point.Y + InitWidht / 2; | 
						|
                env.YMin = point.Y - InitWidht / 2; | 
						|
            } | 
						|
            env.SpatialReference = m_hookHelper.FocusMap.SpatialReference; | 
						|
            if (double.IsNaN(angle)) | 
						|
                return vertical; | 
						|
            //根据范围获取影像图片 | 
						|
            ImgDistinguish imgDis = new ImgDistinguish(); | 
						|
            TilesImage img = imgDis.GetImg(env); | 
						|
            if (img == null) | 
						|
                return vertical; | 
						|
            img.PixelCount = 49; | 
						|
            //获取平均灰度值 | 
						|
            int Gray = img.GetGrayValue(point); | 
						|
            //重新设置单次搜索像素个数 | 
						|
            img.PixelCount = 1; | 
						|
            //计算单次搜索的实际距离 | 
						|
            double distance = img.Resolution * Math.Sqrt(img.PixelCount); | 
						|
            //记录已经搜索的总距离 | 
						|
            double sumDistance = distance; | 
						|
            //检索出在容差范围内的平均灰度值集合 | 
						|
            List<int> grayValues = new List<int>(); | 
						|
            grayValues.Add(Gray); | 
						|
            //记录参考点左边的错误像素个数 | 
						|
            int leftBadPixelCount = 0; | 
						|
            //记录参考点右边的错误像素个数 | 
						|
            int rightBadPixelCount = 0; | 
						|
            //记录容差范围内的灰度平均值 | 
						|
            double tolerance = 0; | 
						|
            ///容差比例 | 
						|
            double toloranceScale = this.drawParam.ToloranceScale; | 
						|
            //容差半径(污点宽度) | 
						|
            double toloranceRadius = 2.5; | 
						|
 | 
						|
            while (sumDistance < InitWidht) | 
						|
            { | 
						|
                #region 循环对比像素值 | 
						|
                tolerance = Math.Floor((double)grayValues.Sum() / grayValues.Count); | 
						|
                if (leftBadPixelCount < toloranceRadius / distance) | 
						|
                { | 
						|
                    IPoint leftPoint = GeometryOperations.GetPoint(point, sumDistance, -angle); | 
						|
                    int grayvalue = img.GetGrayValue(leftPoint); | 
						|
                    if (grayvalue == -1) | 
						|
                        break; | 
						|
                    if (Math.Abs(grayvalue - tolerance) < tolerance * toloranceScale) | 
						|
                    { | 
						|
                        leftBadPixelCount = 0; | 
						|
                        grayValues.Add(grayvalue); | 
						|
                        vertical.UpdatePoint(0, leftPoint); | 
						|
                    } | 
						|
                    else | 
						|
                    { | 
						|
                        leftBadPixelCount++; | 
						|
                        if (leftBadPixelCount < toloranceRadius / distance / 5) | 
						|
                        { | 
						|
                            vertical.UpdatePoint(0, leftPoint); | 
						|
                        } | 
						|
                    } | 
						|
                } | 
						|
                if (rightBadPixelCount < toloranceRadius / distance) | 
						|
                { | 
						|
                    IPoint rightPoint = GeometryOperations.GetPoint(point, -sumDistance, -angle); | 
						|
                    int grayvalue = img.GetGrayValue(rightPoint); | 
						|
                    if (grayvalue == -1) | 
						|
                        break; | 
						|
                    if (Math.Abs(grayvalue - tolerance) < tolerance * toloranceScale) | 
						|
                    { | 
						|
                        rightBadPixelCount = 0; | 
						|
                        grayValues.Add(grayvalue); | 
						|
                        vertical.UpdatePoint(1, rightPoint); | 
						|
                    } | 
						|
                    else | 
						|
                    { | 
						|
                        rightBadPixelCount++; | 
						|
                        if (rightBadPixelCount < toloranceRadius / distance / 5) | 
						|
                        { | 
						|
                            vertical.UpdatePoint(1, rightPoint); | 
						|
                        } | 
						|
                    } | 
						|
                } | 
						|
                sumDistance += distance; | 
						|
                #endregion | 
						|
            } | 
						|
            return vertical; | 
						|
 | 
						|
            #endregion | 
						|
        } | 
						|
 | 
						|
        /// <summary> | 
						|
        /// 自动识别中心点 | 
						|
        /// </summary> | 
						|
        //[LogWrite(Description = "")] | 
						|
        private IPointCollection AutoDistinguish2(IPoint pPoint, double angle, double pWidht) | 
						|
        { | 
						|
            #region 自动识别道路中心线 | 
						|
            IPoint point = pPoint; | 
						|
            IPointCollection vertical = new Polyline(); | 
						|
            vertical.AddPoint(point); | 
						|
            vertical.AddPoint(point); | 
						|
            //获取鼠标点周围50米的范围 | 
						|
            IEnvelope env = new EnvelopeClass(); | 
						|
            env.XMax = point.X + pWidht; | 
						|
            env.XMin = point.X - pWidht; | 
						|
            env.YMax = point.Y + pWidht; | 
						|
            env.YMin = point.Y - pWidht; | 
						|
            env.SpatialReference = m_hookHelper.FocusMap.SpatialReference; | 
						|
            if (double.IsNaN(angle)) | 
						|
                return vertical; | 
						|
            //根据范围获取影像图片 | 
						|
            ImgDistinguish imgDis = new ImgDistinguish(); | 
						|
            TilesImage img = imgDis.GetImg(env); | 
						|
            if (img == null) | 
						|
                return vertical; | 
						|
            img.PixelCount = 49; | 
						|
            //获取平均灰度值 | 
						|
            int Gray = img.GetGrayValue(point); | 
						|
            //重新设置单次搜索像素个数 | 
						|
            img.PixelCount = 1; | 
						|
            //计算单次搜索的实际距离 | 
						|
            double distance = img.Resolution * Math.Sqrt(img.PixelCount); | 
						|
            //记录已经搜索的总距离 | 
						|
            double sumDistance = distance; | 
						|
            //检索出在容差范围内的平均灰度值集合 | 
						|
            List<int> grayValues = new List<int>(); | 
						|
            grayValues.Add(Gray); | 
						|
            //记录参考点左边的错误像素个数 | 
						|
            int leftBadPixelCount = 0; | 
						|
            //记录参考点右边的错误像素个数 | 
						|
            int rightBadPixelCount = 0; | 
						|
            //记录容差范围内的灰度平均值 | 
						|
            double tolerance = 0; | 
						|
            ///容差比例 | 
						|
            double toloranceScale = this.drawParam.ToloranceScale; | 
						|
            //容差半径 | 
						|
            double toloranceRadius = 2.5; | 
						|
 | 
						|
            while (sumDistance < pWidht) | 
						|
            { | 
						|
                #region 循环对比像素值 | 
						|
                tolerance = Math.Floor((double)grayValues.Sum() / grayValues.Count); | 
						|
                if (leftBadPixelCount < toloranceRadius / distance) | 
						|
                { | 
						|
                    IPoint leftPoint = GeometryOperations.GetPoint(point, sumDistance, -angle); | 
						|
                    int grayvalue = img.GetGrayValue(leftPoint); | 
						|
                    if (grayvalue == -1) | 
						|
                        break; | 
						|
                    if (Math.Abs(grayvalue - tolerance) < tolerance * toloranceScale) | 
						|
                    { | 
						|
                        leftBadPixelCount = 0; | 
						|
                        grayValues.Add(grayvalue); | 
						|
                        vertical.UpdatePoint(0, leftPoint); | 
						|
                    } | 
						|
                    else | 
						|
                    { | 
						|
                        leftBadPixelCount++; | 
						|
                        if (leftBadPixelCount < toloranceRadius / distance / 5) | 
						|
                        { | 
						|
                            vertical.UpdatePoint(0, leftPoint); | 
						|
                        } | 
						|
                    } | 
						|
                } | 
						|
                if (rightBadPixelCount < toloranceRadius / distance) | 
						|
                { | 
						|
                    IPoint rightPoint = GeometryOperations.GetPoint(point, -sumDistance, -angle); | 
						|
                    int grayvalue = img.GetGrayValue(rightPoint); | 
						|
                    if (grayvalue == -1) | 
						|
                        break; | 
						|
                    if (Math.Abs(grayvalue - tolerance) < tolerance * toloranceScale) | 
						|
                    { | 
						|
                        rightBadPixelCount = 0; | 
						|
                        grayValues.Add(grayvalue); | 
						|
                        vertical.UpdatePoint(1, rightPoint); | 
						|
                    } | 
						|
                    else | 
						|
                    { | 
						|
                        rightBadPixelCount++; | 
						|
                        if (rightBadPixelCount < toloranceRadius / distance / 5) | 
						|
                        { | 
						|
                            vertical.UpdatePoint(1, rightPoint); | 
						|
                        } | 
						|
                    } | 
						|
                } | 
						|
                sumDistance += distance; | 
						|
                #endregion | 
						|
            } | 
						|
            return vertical; | 
						|
 | 
						|
            #endregion | 
						|
        } | 
						|
 | 
						|
        /// <summary> | 
						|
        /// 绘制 | 
						|
        /// </summary> | 
						|
        /// <param name="pPoint"></param> | 
						|
        //[LogWrite(Description = "")] | 
						|
        private void Drawing(IPoint pPoint) | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                if (!IsShiftDown || this.MiddleLine.Line.PointCount > 0) | 
						|
                { | 
						|
                    switch (drawParam.DrawMode) | 
						|
                    { | 
						|
                        case DrawMode.Left: | 
						|
                            this.MiddleLine.Scale = -0.5; | 
						|
                            this.RightLine.Scale = -1; | 
						|
                            DrawPointExe(pPoint, this.LeftLine, this.MiddleLine, this.RightLine); | 
						|
                            break; | 
						|
                        case DrawMode.Right: | 
						|
                            this.LeftLine.Scale = 1; | 
						|
                            this.MiddleLine.Scale = 0.5; | 
						|
                            DrawPointExe(pPoint, this.RightLine, this.MiddleLine, this.LeftLine); | 
						|
                            break; | 
						|
                        case DrawMode.LeftAndRight: | 
						|
                            this.RightLine.Scale = -0.5; | 
						|
                            this.LeftLine.Scale = 0.5; | 
						|
                            DrawPointExe(pPoint, this.MiddleLine, this.LeftLine, this.RightLine); | 
						|
                            break; | 
						|
                        default: | 
						|
                            break; | 
						|
                    } | 
						|
                } | 
						|
                else | 
						|
                { | 
						|
                    IsContinueDraw = true; | 
						|
                    IFeatureLayer pFeatureLayer = m_editor.TargetLayer as IFeatureLayer; | 
						|
                    IIdentify pIdentify = pFeatureLayer as IIdentify; | 
						|
                    IGeometry pGeometry = m_SnapPoint as IGeometry; | 
						|
                    //获取鼠标点击的要素 | 
						|
                    IArray pArray = pIdentify.Identify(pGeometry); | 
						|
                    if (pArray == null || pArray.Count <= 0) | 
						|
                    { | 
						|
                        return; | 
						|
                    } | 
						|
                    IFeatureIdentifyObj pFeatIdObj = pArray.get_Element(0) as IFeatureIdentifyObj; | 
						|
                    IRowIdentifyObject pRowObj = pFeatIdObj as IRowIdentifyObject; | 
						|
                    IFeature pFeature = pRowObj.Row as IFeature; | 
						|
                    if (pFeature == null) | 
						|
                    { | 
						|
                        return; | 
						|
                    } | 
						|
 | 
						|
                    IPoint clickedPt = m_SnapPoint; | 
						|
                    double searchRadius = 3; | 
						|
                    IHitTest hitShape = pFeature.ShapeCopy as IHitTest; | 
						|
                    IPoint hitPoint = new PointClass(); | 
						|
                    double hitDistance = 0; | 
						|
                    int hitPartIndex = 0; | 
						|
                    int hitSegmentIndex = 0; | 
						|
                    bool bRightSide = false; | 
						|
                    esriGeometryHitPartType hitPartType = esriGeometryHitPartType.esriGeometryPartBoundary; | 
						|
                    //获取鼠标点击的边的索引 | 
						|
                    hitShape.HitTest(clickedPt, searchRadius, hitPartType, hitPoint, ref hitDistance, ref hitPartIndex, ref hitSegmentIndex, ref bRightSide); | 
						|
                    ISegmentCollection segmentCollection = pFeature.ShapeCopy as ISegmentCollection; | 
						|
                    //获取点击的边 | 
						|
                    if (hitSegmentIndex < 0) | 
						|
                    { | 
						|
                        return; | 
						|
                    } | 
						|
                    ISegment segment = segmentCollection.get_Segment(hitSegmentIndex); | 
						|
 | 
						|
                    //将点击边的端点和宽度作为新绘制线物面的起始点和宽度 | 
						|
                    ContinueDrawLeftPoint = segment.FromPoint; | 
						|
                    ContinueDrawRightPoint = segment.ToPoint; | 
						|
                    ContinueDrawLength = segment.Length; | 
						|
                    drawParam.Width = segment.Length; | 
						|
                    IPoint segmentMiddlePoint = new PointClass(); | 
						|
                    segment.QueryPoint(esriSegmentExtension.esriNoExtension, segment.Length / 2, false, segmentMiddlePoint); | 
						|
 | 
						|
                    MiddleLine.Line.AddPoint(segmentMiddlePoint); | 
						|
                    LeftLine.Line.AddPoint(ContinueDrawLeftPoint); | 
						|
                    RightLine.Line.AddPoint(ContinueDrawRightPoint); | 
						|
                } | 
						|
                this.LeftLine.DrawLine(); | 
						|
                this.MiddleLine.DrawLine(); | 
						|
                this.RightLine.DrawLine(); | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 绘制 时异常,异常信息如下:"); | 
						|
                LogAPI.Debug(ex); | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 绘制 时异常信息结束"); | 
						|
            } | 
						|
        } | 
						|
        /// <summary> | 
						|
        /// 移动 | 
						|
        /// </summary> | 
						|
        /// <param name="pPoint"></param> | 
						|
        /// <param name="IsAdjustWidth">添加 宽度调整标识</param> | 
						|
        //[LogWrite(Description = "")] | 
						|
        private void Moveing(IPoint pPoint, bool IsAdjustWidth = false) | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                switch (drawParam.DrawMode) | 
						|
                { | 
						|
                    case DrawMode.Left: | 
						|
                        this.MiddleLine.Scale = -0.5; | 
						|
                        this.RightLine.Scale = -1; | 
						|
                        MovePointExe(pPoint, LeftLine, RightLine, MiddleLine, IsAdjustWidth); | 
						|
                        break; | 
						|
                    case DrawMode.Right: | 
						|
                        this.LeftLine.Scale = 1; | 
						|
                        this.MiddleLine.Scale = 0.5; | 
						|
                        MovePointExe(pPoint, RightLine, LeftLine, MiddleLine, IsAdjustWidth); | 
						|
                        break; | 
						|
                    case DrawMode.LeftAndRight: | 
						|
                        this.RightLine.Scale = -0.5; | 
						|
                        this.LeftLine.Scale = 0.5; | 
						|
                        MovePointExe(pPoint, MiddleLine, LeftLine, RightLine, IsAdjustWidth); | 
						|
                        break; | 
						|
                    default: | 
						|
                        break; | 
						|
                } | 
						|
                LeftLine.DrawLine(); | 
						|
                RightLine.DrawLine(); | 
						|
                MiddleLine.DrawLine(); | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 移动 时异常,异常信息如下:"); | 
						|
                LogAPI.Debug(ex); | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 移动 时异常信息结束"); | 
						|
            } | 
						|
        } | 
						|
        /// <summary> | 
						|
        /// 绘制新的点 | 
						|
        /// </summary> | 
						|
        /// <param name="pPoint">点对象</param> | 
						|
        /// <param name="pMainLine">鼠标绘制的线对象</param> | 
						|
        /// <param name="pExtLine1">通过角度和距离计算出来的线对象1</param> | 
						|
        /// <param name="pExtLine2">通过角度和距离计算出来的线对象2</param> | 
						|
        //[LogWrite(Description = "")] | 
						|
        private void DrawPointExe(IPoint pPoint, LineModel pMainLine, LineModel pExtLine1, LineModel pExtLine2, double pAngle = -1) | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                pMainLine.Line.AddPoint(pPoint); | 
						|
                if (pMainLine.Line.PointCount > 1 && pAngle == -1) | 
						|
                { | 
						|
                    pAngle = GeometryOperations.getAngle(pMainLine.Line.get_Point(pMainLine.Line.PointCount - 2), pMainLine.Line.get_Point(pMainLine.Line.PointCount - 1)); | 
						|
                } | 
						|
                if (pAngle == -1) | 
						|
                    pAngle = 0; | 
						|
 | 
						|
                IPoint p1 = GeometryOperations.GetPoint(pPoint, drawParam.Width * pExtLine1.Scale, -pAngle); | 
						|
                if (p1 == null || p1.IsEmpty) | 
						|
                    return; | 
						|
                IPoint p2 = GeometryOperations.GetPoint(pPoint, drawParam.Width * pExtLine2.Scale, -pAngle); | 
						|
                if (p2 == null || p2.IsEmpty) | 
						|
                    return; | 
						|
                if (pMainLine.Line.PointCount <= 1) | 
						|
                { | 
						|
                    pExtLine1.Line.AddPoint(p1); | 
						|
                    pExtLine2.Line.AddPoint(p2); | 
						|
                    return; | 
						|
                } | 
						|
                //判断第一个点是否识别到已有要素边界 | 
						|
                if (pMainLine.Line.PointCount == 2) | 
						|
                { | 
						|
                    #region 起始端线 | 
						|
                    IPolyline line = null; | 
						|
                    IPolyline leftLine = GeneratePolyline(pExtLine1.Line.get_Point(0)); | 
						|
                    if (leftLine != null && !leftLine.IsEmpty) | 
						|
                    { line = leftLine; } | 
						|
                    IPolyline rightLine = GeneratePolyline(pExtLine2.Line.get_Point(0)); | 
						|
                    IPolyline mainLine = GeneratePolyline(pMainLine.Line.get_Point(0)); | 
						|
                    if (rightLine != null && !rightLine.IsEmpty) | 
						|
                    { | 
						|
                        if (line != null) | 
						|
                        { | 
						|
                            ITopologicalOperator topo = line as ITopologicalOperator; | 
						|
                            line = topo.Union(rightLine) as IPolyline; | 
						|
                        } | 
						|
                        else | 
						|
                        { | 
						|
                            line = rightLine; | 
						|
                        } | 
						|
                    } | 
						|
                    if (mainLine != null && !mainLine.IsEmpty) | 
						|
                    { | 
						|
                        if (line != null) | 
						|
                        { | 
						|
                            ITopologicalOperator topo = line as ITopologicalOperator; | 
						|
                            line = topo.Union(mainLine) as IPolyline; | 
						|
                        } | 
						|
                        else | 
						|
                        { | 
						|
                            line = mainLine; | 
						|
                        } | 
						|
                    } | 
						|
                    if (line != null && !line.IsEmpty) | 
						|
                    { | 
						|
                        StartLine = GetSubCurve(line, pExtLine1.Line.get_Point(0), pExtLine2.Line.get_Point(0)); | 
						|
                    } | 
						|
 | 
						|
                    #endregion | 
						|
                } | 
						|
 | 
						|
                #region 结束端线 | 
						|
                //优化效率,GeneratePolyline方法比较耗时 | 
						|
                if (IsShiftDown) | 
						|
                { | 
						|
                    IPolyline endLine = null; | 
						|
                    IPolyline tempLine = GeneratePolyline(pMainLine.Line.get_Point(pMainLine.Line.PointCount - 1)); | 
						|
                    if (tempLine != null && !tempLine.IsEmpty) | 
						|
                    { | 
						|
                        endLine = tempLine; | 
						|
                        IPoint p4 = GetIntersectPoint(pExtLine1.Line.get_Point(pExtLine1.Line.PointCount - 1), p1, tempLine as IPolyline); | 
						|
                        if (p4 != null && !p4.IsEmpty) | 
						|
                            p1 = p4; | 
						|
                        IPoint p3 = GetIntersectPoint(pExtLine2.Line.get_Point(pExtLine2.Line.PointCount - 1), p2, tempLine as IPolyline); | 
						|
                        if (p3 != null && !p3.IsEmpty) | 
						|
                            p2 = p3; | 
						|
                        EndLine = GetSubCurve(endLine, p1, p2); | 
						|
                    } | 
						|
                } | 
						|
                pExtLine1.Line.AddPoint(p1); | 
						|
                pExtLine2.Line.AddPoint(p2); | 
						|
                if (EndLine != null && IsShiftDown) | 
						|
                { | 
						|
                    this.DrawComplete(); | 
						|
                } | 
						|
                #endregion | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 绘制新的点 时异常,异常信息如下:"); | 
						|
                LogAPI.Debug(ex); | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 绘制新的点 时异常信息结束"); | 
						|
            } | 
						|
        } | 
						|
        /// <summary> | 
						|
        /// 移动现有的点 | 
						|
        /// </summary> | 
						|
        /// <param name="pPoint">目标点</param> | 
						|
        /// <param name="pMainLine">鼠标绘制的线对象</param> | 
						|
        /// <param name="pExtLine1">通过角度和距离计算出来的线对象1</param> | 
						|
        /// <param name="pExtLine2">通过角度和距离计算出来的线对象2</param> | 
						|
        /// <param name="IsAdjustWidth">添加 宽度调整标识</param> | 
						|
        //[LogWrite(Description = "")] | 
						|
        private void MovePointExe(IPoint pPoint, LineModel pMainLine, LineModel pExtLine1, LineModel pExtLine2, bool IsAdjustWidth = false) | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                if (pMainLine.Line.PointCount < 1 || pExtLine1.Line.PointCount < 1 || pExtLine1.Line.PointCount < 1) | 
						|
                    return; | 
						|
                double angle = GeometryOperations.getAngle(pMainLine.Line.Point[pMainLine.Line.PointCount - 1], pPoint); | 
						|
                if (Double.IsNaN(angle)) | 
						|
                    return; | 
						|
                IPoint pExtLine1StartPoint = null; | 
						|
                IPoint pExtLine2StartPoint = null; | 
						|
                IPoint pExtLine1EndPoint = null; | 
						|
                IPoint pExtLine2EndPoint = null; | 
						|
                //获取鼠标跟随线上的第二个点 | 
						|
                pExtLine1EndPoint = GeometryOperations.GetPoint(pPoint, drawParam.Width * pExtLine1.Scale, -angle); | 
						|
                pExtLine2EndPoint = GeometryOperations.GetPoint(pPoint, drawParam.Width * pExtLine2.Scale, -angle); | 
						|
                if (pMainLine.Line.PointCount == 1) | 
						|
                { | 
						|
                    pExtLine1StartPoint = GeometryOperations.GetPoint(pMainLine.Line.get_Point(0), drawParam.Width * pExtLine1.Scale, -angle); | 
						|
                    pExtLine2StartPoint = GeometryOperations.GetPoint(pMainLine.Line.get_Point(0), drawParam.Width * pExtLine2.Scale, -angle); | 
						|
                    //判断第一个点是否识别到已有要素边界 | 
						|
                    List<IFeature> IdentifyFeature = KGIS.Framework.AE.FeatureAPI.Identify(pMainLine.Line.get_Point(0), m_editor.TargetLayer, 1); | 
						|
                    IdentifyFeature.AddRange(KGIS.Framework.AE.FeatureAPI.Identify(pExtLine1.Line.get_Point(0), m_editor.TargetLayer, 1)); | 
						|
                    IdentifyFeature.AddRange(KGIS.Framework.AE.FeatureAPI.Identify(pExtLine2.Line.get_Point(0), m_editor.TargetLayer, 1)); | 
						|
                    if (IdentifyFeature != null && IdentifyFeature.Count > 0) | 
						|
                    { | 
						|
                        IPolyline line = null; | 
						|
                        //IFeature f = IdentifyFeature[0]; | 
						|
                        if (m_editor.GeometryType == esriGeometryType.esriGeometryPolygon) | 
						|
                        { | 
						|
                            foreach (IFeature item in IdentifyFeature) | 
						|
                            { | 
						|
                                ITopologicalOperator topo = item.ShapeCopy as ITopologicalOperator; | 
						|
                                if (line == null) | 
						|
                                { | 
						|
                                    line = topo.Boundary as IPolyline; | 
						|
                                } | 
						|
                                else | 
						|
                                { | 
						|
                                    ITopologicalOperator topolog = line as ITopologicalOperator; | 
						|
                                    topolog.Simplify(); | 
						|
                                    line = topolog.Union(topo.Boundary) as IPolyline; | 
						|
                                } | 
						|
                            } | 
						|
                            IGeometryCollection geoCollection = line as IGeometryCollection; | 
						|
                            if (geoCollection != null) | 
						|
                            { | 
						|
                                for (int i = 0; i < geoCollection.GeometryCount; i++) | 
						|
                                { | 
						|
                                    if (KGIS.Framework.AE.FeatureAPI.IsInterSect(pMainLine.Line.get_Point(pMainLine.Line.PointCount - 1) as IGeometry, geoCollection.get_Geometry(i) as IPolyline)) | 
						|
                                    { | 
						|
                                        line = geoCollection.get_Geometry(i) as IPolyline; | 
						|
                                    } | 
						|
                                } | 
						|
                            } | 
						|
                        } | 
						|
                        else if (m_editor.GeometryType == esriGeometryType.esriGeometryPolyline) | 
						|
                        { | 
						|
                            foreach (IFeature item in IdentifyFeature) | 
						|
                            { | 
						|
                                if (line == null) | 
						|
                                { | 
						|
                                    line = item.ShapeCopy as IPolyline; | 
						|
                                } | 
						|
                                else | 
						|
                                { | 
						|
                                    ITopologicalOperator topolog = line as ITopologicalOperator; | 
						|
                                    topolog.Simplify(); | 
						|
                                    line = topolog.Union(item.ShapeCopy) as IPolyline; | 
						|
                                } | 
						|
                            } | 
						|
                        } | 
						|
                        if (line != null) | 
						|
                        { | 
						|
                            if (KGIS.Framework.AE.FeatureAPI.IsInterSect(pMainLine.Line.get_Point(0) as IGeometry, line)) | 
						|
                            { | 
						|
                                ITopologicalOperator2 topo = line as ITopologicalOperator2; | 
						|
                                IPoint p = GetIntersectPoint(pExtLine1EndPoint, pExtLine1StartPoint, line); | 
						|
                                if (p != null && !p.IsEmpty && !IsContinueDraw) | 
						|
                                { | 
						|
                                    pExtLine1StartPoint = p; | 
						|
                                } | 
						|
                                IPoint p2 = GetIntersectPoint(pExtLine2EndPoint, pExtLine2StartPoint, line); | 
						|
                                if (p2 != null && !p2.IsEmpty && !IsContinueDraw) | 
						|
                                { | 
						|
                                    pExtLine2StartPoint = p2; | 
						|
                                } | 
						|
                            } | 
						|
                        } | 
						|
                    } | 
						|
                } | 
						|
                else | 
						|
                { | 
						|
                    pExtLine1StartPoint = GeometryOperations.getParallelPoint(pMainLine.Line.get_Point(pMainLine.Line.PointCount - 2), pMainLine.Line.get_Point(pMainLine.Line.PointCount - 1), pPoint, drawParam.Width * pExtLine1.Scale); | 
						|
                    pExtLine2StartPoint = GeometryOperations.getParallelPoint(pMainLine.Line.get_Point(pMainLine.Line.PointCount - 2), pMainLine.Line.get_Point(pMainLine.Line.PointCount - 1), pPoint, drawParam.Width * pExtLine2.Scale); | 
						|
                } | 
						|
 | 
						|
                if (!IsContinueDraw || pExtLine1.Line.PointCount > 1) | 
						|
                { | 
						|
                    //更新第一条线上的点 | 
						|
                    pExtLine1.Line.UpdatePoint(pExtLine1.Line.PointCount - 1, pExtLine1StartPoint); | 
						|
                    //更新第一条跟随线上的点 | 
						|
                    pExtLine1.FollowLine.Stop(); | 
						|
                    pExtLine1.FollowLine.Start(new PolylineClass() { FromPoint = pExtLine1StartPoint, ToPoint = pExtLine1StartPoint }, 0, pExtLine1StartPoint); | 
						|
                } | 
						|
                else | 
						|
                { | 
						|
                    pExtLine1.FollowLine.Stop(); | 
						|
                    pExtLine1.FollowLine.Start(new PolylineClass() { FromPoint = pExtLine1.Line.get_Point(0), ToPoint = pExtLine1.Line.get_Point(0) }, 0, pExtLine1.Line.get_Point(0)); | 
						|
                } | 
						|
                pExtLine1.FollowLine.MoveTo(GeometryOperations.GetPoint(pPoint, drawParam.Width * pExtLine1.Scale, -angle)); | 
						|
 | 
						|
                if (!IsContinueDraw || pExtLine1.Line.PointCount > 1) | 
						|
                { | 
						|
                    //更新第二条线上的点 | 
						|
                    pExtLine2.Line.UpdatePoint(pExtLine1.Line.PointCount - 1, pExtLine2StartPoint); | 
						|
                    //更新第二条跟随线上的点 | 
						|
                    pExtLine2.FollowLine.Stop(); | 
						|
                    pExtLine2.FollowLine.Start(new PolylineClass() { FromPoint = pExtLine2StartPoint, ToPoint = pExtLine2StartPoint }, 0, pExtLine2StartPoint); | 
						|
                } | 
						|
                else | 
						|
                { | 
						|
                    pExtLine2.FollowLine.Stop(); | 
						|
                    pExtLine2.FollowLine.Start(new PolylineClass() { FromPoint = pExtLine2.Line.get_Point(0), ToPoint = pExtLine2.Line.get_Point(0) }, 0, pExtLine2.Line.get_Point(0)); | 
						|
                } | 
						|
                pExtLine2.FollowLine.MoveTo(GeometryOperations.GetPoint(pPoint, drawParam.Width * pExtLine2.Scale, -angle)); | 
						|
 | 
						|
                //添加布尔型参数IsAdjustWidth使其为true时跳过刷新MainLine | 
						|
                if (IsAdjustWidth) | 
						|
                    return; | 
						|
                if (!IsContinueDraw || pExtLine1.Line.PointCount > 1) | 
						|
                { | 
						|
                    //更新主跟随线上的点 | 
						|
                    pMainLine.FollowLine.Stop(); | 
						|
                    pMainLine.FollowLine.Start(new PolylineClass() { FromPoint = pMainLine.Line.get_Point(pMainLine.Line.PointCount - 1), ToPoint = pMainLine.Line.get_Point(pMainLine.Line.PointCount - 1) }, 0, pMainLine.Line.get_Point(pMainLine.Line.PointCount - 1)); | 
						|
                } | 
						|
                else | 
						|
                { | 
						|
                    pMainLine.FollowLine.Stop(); | 
						|
                    pMainLine.FollowLine.Start(new PolylineClass() { FromPoint = pMainLine.Line.get_Point(0), ToPoint = pMainLine.Line.get_Point(0) }, 0, pMainLine.Line.get_Point(0)); | 
						|
                } | 
						|
                pMainLine.FollowLine.MoveTo(pPoint); | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 移动现有的点 时异常,异常信息如下:"); | 
						|
                LogAPI.Debug(ex); | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 移动现有的点 时异常信息结束"); | 
						|
            } | 
						|
        } | 
						|
        /// <summary> | 
						|
        /// 创建区间线段 | 
						|
        /// </summary> | 
						|
        /// <param name="pLine">输入的线图形</param> | 
						|
        /// <param name="p1">插入的其中第一个点</param> | 
						|
        /// <param name="p2">插入的其中第一个点</param> | 
						|
        /// <returns>这两点间的线段</returns> | 
						|
        //[LogWrite(Description = "")] | 
						|
        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; | 
						|
        } | 
						|
 | 
						|
        //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; | 
						|
        //} | 
						|
 | 
						|
        //[LogWrite(Description = "")] | 
						|
        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; | 
						|
        } | 
						|
        /// <summary> | 
						|
        /// 绘制点对象到地图 | 
						|
        /// </summary> | 
						|
        /// <param name="pPoints"></param> | 
						|
        //[LogWrite(Description = "")] | 
						|
        private void DrawPoint(IPointCollection pPoints) | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                if (pPoints == null || pPoints.PointCount == 0) | 
						|
                    return; | 
						|
                // 获取IRGBColor接口 | 
						|
                IRgbColor color = new RgbColor(); | 
						|
                // 设置颜色属性 | 
						|
                color.Red = 255; | 
						|
                color.Green = 0; | 
						|
                color.Blue = 0; | 
						|
                IMarkerSymbol symbol = new SimpleMarkerSymbolClass(); | 
						|
                symbol.Color = color; | 
						|
                symbol.Size = 5; | 
						|
                IPointCollection pointList = new Polyline(); | 
						|
                pointList.AddPoint(this.LeftLine.Line.get_Point(this.LeftLine.Line.PointCount - 1)); | 
						|
                pointList.AddPoint(this.MiddleLine.Line.get_Point(this.MiddleLine.Line.PointCount - 1)); | 
						|
                pointList.AddPoint(this.RightLine.Line.get_Point(this.RightLine.Line.PointCount - 1)); | 
						|
                IPointCollection pointList2 = new Polyline(); | 
						|
                pointList2.AddPoint(this.LeftLine.Line.get_Point(this.LeftLine.Line.PointCount - 1)); | 
						|
                pointList2.AddPoint(this.MiddleLine.Line.get_Point(this.MiddleLine.Line.PointCount - 1)); | 
						|
                pointList2.AddPoint(this.RightLine.Line.get_Point(this.RightLine.Line.PointCount - 1)); | 
						|
                for (int i = 0; i < pPoints.PointCount; i++) | 
						|
                { | 
						|
                    if (PointElement.Count == i) | 
						|
                    { | 
						|
                        IMarkerElement e = new MarkerElementClass(); | 
						|
                        e.Symbol = symbol; | 
						|
                        PointElement.Add(e as IElement); | 
						|
                        this.m_hookHelper.ActiveView.GraphicsContainer.AddElement(e as IElement, 0); | 
						|
                    } | 
						|
                    IElement element = PointElement[i]; | 
						|
                    pointList.AddPoint(element.Geometry as IPoint); | 
						|
                    element.Geometry = pPoints.get_Point(i); | 
						|
                    pointList2.AddPoint(pPoints.get_Point(i)); | 
						|
                } | 
						|
                pointList.AddPoint(this.LeftLine.Line.get_Point(this.LeftLine.Line.PointCount - 1)); | 
						|
                IPolyline line = pointList as IPolyline; | 
						|
                if (line.Length <= 0 || line.Length.Equals(double.NaN)) | 
						|
                { | 
						|
                    return; | 
						|
                } | 
						|
                ITopologicalOperator topo = line as ITopologicalOperator; | 
						|
                IGeometry geo = topo.Buffer(10); | 
						|
                this.m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, this.m_hookHelper.ActiveView.Extent); | 
						|
                //this.m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, geo.Envelope); | 
						|
                //this.m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, (pointList2 as IPolyline).Envelope); | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 绘制点对象到地图 时异常,异常信息如下:"); | 
						|
                LogAPI.Debug(ex); | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 绘制点对象到地图 时异常信息结束"); | 
						|
            } | 
						|
        } | 
						|
        /// <summary> | 
						|
        /// 绘制文本对象 | 
						|
        /// </summary> | 
						|
        /// <param name="geoDraw"></param> | 
						|
        /// <param name="pElement"></param> | 
						|
        //[LogWrite(Description = "")] | 
						|
        public void DrawTextElement(ESRI.ArcGIS.Geometry.IGeometry geoDraw, ref IElement pElement) | 
						|
        { | 
						|
            if (pElement != null && geoDraw != null) | 
						|
            { | 
						|
                if (pElement is ITextElement) | 
						|
                { | 
						|
                    (pElement as ITextElement).Text = string.Format("当前宽度 {0} 米", drawParam.Width); | 
						|
                } | 
						|
                pElement.Geometry = geoDraw; | 
						|
                m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, m_hookHelper.ActiveView.Extent); | 
						|
                return; | 
						|
            } | 
						|
            // 获取IRGBColor接口 | 
						|
            IRgbColor color = new RgbColor(); | 
						|
            // 设置颜色属性 | 
						|
            color.Red = 0; | 
						|
            color.Green = 255; | 
						|
            color.Blue = 255; | 
						|
            //IFontDisp pFont = new StdFont()   | 
						|
            //{   | 
						|
            //    Name = "宋体",   | 
						|
            //    Bold = true   | 
						|
            //} as IFontDisp; | 
						|
 | 
						|
            ITextSymbol pTextSymbol = new TextSymbolClass() | 
						|
            { | 
						|
                Color = color, | 
						|
                //Font = pFont, | 
						|
                Size = 12 | 
						|
            }; | 
						|
            ITextElement pTextElement = new TextElementClass() | 
						|
            { | 
						|
                Symbol = pTextSymbol, | 
						|
                ScaleText = true, | 
						|
                Text = string.Format("当前宽度 {0} 米", drawParam.Width) | 
						|
            }; | 
						|
            IPoint point = geoDraw as IPoint; | 
						|
            point.X += 2; | 
						|
            point.Y -= 1; | 
						|
            if (pElement == null) | 
						|
            { | 
						|
                pElement = pTextElement as IElement; | 
						|
                pElement.Geometry = point; | 
						|
                m_hookHelper.ActiveView.GraphicsContainer.AddElement(pElement, 0); | 
						|
            } | 
						|
            m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, m_hookHelper.ActiveView.Extent); | 
						|
        } | 
						|
        /// <summary> | 
						|
        /// 删除指定的Element | 
						|
        /// </summary> | 
						|
        /// <param name="pElement"></param> | 
						|
        //[LogWrite(Description = "")] | 
						|
        public void DelElement(ref IElement pElement) | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                if (pElement != null) | 
						|
                { | 
						|
                    m_hookHelper.ActiveView.GraphicsContainer.DeleteElement(pElement); | 
						|
                    m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, m_hookHelper.ActiveView.Extent); | 
						|
                    pElement = null; | 
						|
                } | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 删除指定的Element 时异常,异常信息如下:"); | 
						|
                LogAPI.Debug(ex); | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 删除指定的Element 时异常信息结束"); | 
						|
            } | 
						|
        } | 
						|
        /// <summary> | 
						|
        /// 捕捉Element上的点并返回点的索引 | 
						|
        /// </summary> | 
						|
        /// <param name="pPoint"></param> | 
						|
        /// <returns></returns> | 
						|
        //[LogWrite(Description = "")] | 
						|
        private int SnapElement(IPoint pPoint) | 
						|
        { | 
						|
            int pointIndex = -1; | 
						|
            try | 
						|
            { | 
						|
                //中心线距离 | 
						|
                double len = -1; | 
						|
                for (int i = 0; i < MiddleLine.Line.PointCount; i++) | 
						|
                { | 
						|
                    IPolyline line = new PolylineClass(); | 
						|
                    line.FromPoint = MiddleLine.Line.get_Point(i); | 
						|
                    line.ToPoint = pPoint; | 
						|
                    line.SpatialReference = pPoint.SpatialReference; | 
						|
                    if (len == -1) | 
						|
                    { | 
						|
                        len = line.Length; | 
						|
                        pointIndex = i; | 
						|
                    } | 
						|
                    else | 
						|
                    { | 
						|
                        if (len > line.Length) | 
						|
                        { | 
						|
                            len = line.Length; | 
						|
                            pointIndex = i; | 
						|
                        } | 
						|
                    } | 
						|
                } | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 捕捉Element上的点并返回点的索引 时异常,异常信息如下:"); | 
						|
                LogAPI.Debug(ex); | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 捕捉Element上的点并返回点的索引 时异常信息结束"); | 
						|
                return -1; | 
						|
            } | 
						|
            return pointIndex; | 
						|
        } | 
						|
 | 
						|
        /// <summary> | 
						|
        /// 捕捉Element上的点并返回点的索引 | 
						|
        /// </summary> | 
						|
        /// <param name="pPoint"></param> | 
						|
        /// <returns></returns> | 
						|
        //[LogWrite(Description = "")] | 
						|
        private int SnapElement(IPoint pPoint, out int p) | 
						|
        { | 
						|
            int pointIndex = -1; | 
						|
            try | 
						|
            { | 
						|
                double tempLen = -1; | 
						|
                //中心线距离 | 
						|
                double len = -1; | 
						|
                //左边线距离 | 
						|
                double len1 = -1; | 
						|
                //右边线距离 | 
						|
                double len2 = -1; | 
						|
                //中心线索引 | 
						|
                int m_index = -1; | 
						|
                //左边线索引 | 
						|
                int l_index = -1; | 
						|
                //右边线索引 | 
						|
                int r_index = -1; | 
						|
                for (int i = 0; i < MiddleLine.Line.PointCount; i++) | 
						|
                { | 
						|
                    IPolyline line = new PolylineClass(); | 
						|
                    line.FromPoint = MiddleLine.Line.get_Point(i); | 
						|
                    line.ToPoint = pPoint; | 
						|
                    line.SpatialReference = pPoint.SpatialReference; | 
						|
                    if (len == -1) | 
						|
                    { | 
						|
                        len = line.Length; | 
						|
                        m_index = i; | 
						|
                    } | 
						|
                    else | 
						|
                    { | 
						|
                        if (len > line.Length) | 
						|
                        { | 
						|
                            len = line.Length; | 
						|
                            m_index = i; | 
						|
                        } | 
						|
                    } | 
						|
                } | 
						|
                for (int i = 0; i < LeftLine.Line.PointCount; i++) | 
						|
                { | 
						|
                    IPolyline line = new PolylineClass(); | 
						|
                    line.FromPoint = LeftLine.Line.get_Point(i); | 
						|
                    line.ToPoint = pPoint; | 
						|
                    line.SpatialReference = pPoint.SpatialReference; | 
						|
                    if (len1 == -1) | 
						|
                    { | 
						|
                        len1 = line.Length; | 
						|
                        l_index = i; | 
						|
                    } | 
						|
                    else | 
						|
                    { | 
						|
                        if (len1 > line.Length) | 
						|
                        { | 
						|
                            len1 = line.Length; | 
						|
                            l_index = i; | 
						|
                        } | 
						|
                    } | 
						|
                } | 
						|
                for (int i = 0; i < RightLine.Line.PointCount; i++) | 
						|
                { | 
						|
                    IPolyline line = new PolylineClass(); | 
						|
                    line.FromPoint = RightLine.Line.get_Point(i); | 
						|
                    line.ToPoint = pPoint; | 
						|
                    line.SpatialReference = pPoint.SpatialReference; | 
						|
                    if (len2 == -1) | 
						|
                    { | 
						|
                        len2 = line.Length; | 
						|
                        r_index = i; | 
						|
                    } | 
						|
                    else | 
						|
                    { | 
						|
                        if (len2 > line.Length) | 
						|
                        { | 
						|
                            len2 = line.Length; | 
						|
                            r_index = i; | 
						|
                        } | 
						|
                    } | 
						|
                } | 
						|
                if (len > len1) | 
						|
                { | 
						|
                    if (len1 > len2) | 
						|
                    { | 
						|
                        p = -1; | 
						|
                        tempLen = len2; | 
						|
                        pointIndex = r_index; | 
						|
                    } | 
						|
                    else | 
						|
                    { | 
						|
                        p = 1; | 
						|
                        tempLen = len1; | 
						|
                        pointIndex = l_index; | 
						|
                    } | 
						|
                } | 
						|
                else | 
						|
                { | 
						|
                    if (len > len2) | 
						|
                    { | 
						|
                        p = -1; | 
						|
                        tempLen = len2; | 
						|
                        pointIndex = r_index; | 
						|
                    } | 
						|
                    else | 
						|
                    { | 
						|
                        p = 0; | 
						|
                        tempLen = len; | 
						|
                        pointIndex = m_index; | 
						|
                    } | 
						|
                } | 
						|
                if (tempLen > 3) | 
						|
                { | 
						|
                    pointIndex = -1; | 
						|
                } | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 在捕捉Element上的点并返回点的索引 时异常,异常信息如下:"); | 
						|
                LogAPI.Debug(ex); | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 在捕捉Element上的点并返回点的索引 时异常信息结束"); | 
						|
 | 
						|
                p = 0; | 
						|
                return -1; | 
						|
            } | 
						|
            return pointIndex; | 
						|
        } | 
						|
        //[LogWrite(Description = "")] | 
						|
        private IPolyline GetSubCurve(IPolyline LineCurve, IPoint SplitePoint1, IPoint SplitePoint2) | 
						|
        { | 
						|
            IPolyline Lines = null; | 
						|
            bool isSplit; | 
						|
            int splitIndex, segStartIndex, segEndIndex, minIndex, maxIndex; | 
						|
            LineCurve.SplitAtPoint(SplitePoint1, true, false, out isSplit, out splitIndex, out segStartIndex); | 
						|
            LineCurve.SplitAtPoint(SplitePoint2, true, false, out isSplit, out splitIndex, out segEndIndex); | 
						|
            if (isSplit) | 
						|
            { | 
						|
                IPolyline newLine = new PolylineClass(); | 
						|
                ISegmentCollection lineSegCol = (ISegmentCollection)LineCurve; | 
						|
                ISegmentCollection newSegCol = (ISegmentCollection)newLine; | 
						|
                object o = Type.Missing; | 
						|
                if (segStartIndex > segEndIndex) | 
						|
                { | 
						|
                    minIndex = segEndIndex; | 
						|
                    maxIndex = segStartIndex; | 
						|
                } | 
						|
                else | 
						|
                { | 
						|
                    minIndex = segStartIndex; | 
						|
                    maxIndex = segEndIndex; | 
						|
                } | 
						|
                for (int j = minIndex; j <= maxIndex; j++) | 
						|
                { | 
						|
                    ISegment segment = lineSegCol.get_Segment(j); | 
						|
                    //if ((Math.Round(segment.FromPoint.X, 4) == Math.Round(SplitePoint1.X, 4) && Math.Round(segment.FromPoint.Y, 4) == Math.Round(SplitePoint1.Y, 4) && Math.Round(segment.ToPoint.X, 4) == Math.Round(SplitePoint2.X, 4) && Math.Round(segment.ToPoint.Y, 4) == Math.Round(SplitePoint2.Y, 4)) | 
						|
                    //    || (Math.Round(segment.ToPoint.X, 4) == Math.Round(SplitePoint1.X, 4) && Math.Round(segment.ToPoint.Y, 4) == Math.Round(SplitePoint1.Y, 4) && Math.Round(segment.FromPoint.X, 4) == Math.Round(SplitePoint2.X, 4) && Math.Round(segment.FromPoint.Y, 4) == Math.Round(SplitePoint2.Y, 4))) | 
						|
                    //{ | 
						|
                    newSegCol.AddSegment(segment, ref o, ref o); | 
						|
                    //Lines = newSegCol as IPolyline; | 
						|
                    //break; | 
						|
                    //} | 
						|
                } | 
						|
                Lines = newSegCol as IPolyline; | 
						|
            } | 
						|
            return Lines; | 
						|
        } | 
						|
        //[LogWrite(Description = "")] | 
						|
        public IPolyline GeneratePolyline(IPoint point) | 
						|
        { | 
						|
            IPolyline result = null; | 
						|
            if (point == null) return result; | 
						|
            try | 
						|
            { | 
						|
                List<IFeatureLayer> snapLayers = new List<IFeatureLayer>(); | 
						|
                snapLayers.Add(m_editor.TargetLayer as IFeatureLayer); | 
						|
                //获取当前捕捉的要素多边形 | 
						|
                List<IFeature> snapFeatures = FeatureAPI.Snapping(point, snapLayers, 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, snapLayers, 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 (FeatureAPI.IsInterSect(point as IGeometry, newline)) | 
						|
                            { | 
						|
                                result = newline; | 
						|
                                return result; | 
						|
                            } | 
						|
                            tempLine = topo.Difference(item.ShapeCopy) as IPolyline; | 
						|
                        } | 
						|
                    } | 
						|
                    if (FeatureAPI.IsInterSect(point as IGeometry, tempLine)) | 
						|
                    { | 
						|
                        result = tempLine; | 
						|
                        break; | 
						|
                    } | 
						|
                } | 
						|
                return result; | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 执行 GeneratePolyline 时异常,异常信息如下:"); | 
						|
                LogAPI.Debug(ex); | 
						|
                LogAPI.Debug("画线物面(线状地物面)工具 过程中 执行 GeneratePolyline 时异常信息结束"); | 
						|
                throw; | 
						|
            } | 
						|
        } | 
						|
        #endregion | 
						|
        /// <summary>    | 
						|
        /// 设置鼠标的坐标    | 
						|
        /// </summary>    | 
						|
        /// <param name="x">横坐标</param>    | 
						|
        /// <param name="y">纵坐标</param>    | 
						|
        [DllImport("User32")] | 
						|
        public extern static void SetCursorPos(int x, int y); | 
						|
 | 
						|
        //[LogWrite(Description = "")] | 
						|
        //private bool ss() | 
						|
        //{ | 
						|
        //    try | 
						|
        //    { | 
						|
        //        if (Env.Instance.KeyType != "F")//非本地授权 直接返回 | 
						|
        //        { | 
						|
        //            return true; | 
						|
        //        } | 
						|
        //        RunIDHelper id = new RunIDHelper(); | 
						|
        //        return id.QCCheck(); | 
						|
        //    } | 
						|
        //    catch | 
						|
        //    { | 
						|
        //        return false; | 
						|
        //    } | 
						|
        //} | 
						|
        public override void Refresh(int hDC) | 
						|
        { | 
						|
            if (MiddleLine != null && MiddleLine.FollowLine != null) | 
						|
                MiddleLine.FollowLine.Refresh(hDC); | 
						|
            if (LeftLine != null && LeftLine.FollowLine != null) | 
						|
                LeftLine.FollowLine.Refresh(hDC); | 
						|
            if (RightLine != null && RightLine.FollowLine != null) | 
						|
                RightLine.FollowLine.Refresh(hDC); | 
						|
            base.Refresh(hDC); | 
						|
        } | 
						|
 | 
						|
    } | 
						|
}
 | 
						|
 |