zoukankan      html  css  js  c++  java
  • ArcGIS Engine中实现ArcMap的捕捉效果

    注意要将捕捉相关接口的对象放在OnCreate方法中,这样在初始化就可以有捕捉效果,(捕捉对象赋值放在OnClick中出现第一次点击之前不能捕捉的BUG)

    这里是直接在工具中实现的 ,可以按需求将捕捉效果的实现方式进行改写。

    using System;  
    using System.Drawing;  
    using System.Runtime.InteropServices;  
    using ESRI.ArcGIS.ADF.BaseClasses;  
    using ESRI.ArcGIS.ADF.CATIDs;  
    using ESRI.ArcGIS.Controls;  
    using System.Windows.Forms;  
    using ESRI.ArcGIS.Geometry;  
    using ESRI.ArcGIS.Display;  
    using ESRI.ArcGIS.esriSystem;  
      
    namespace DemoForm.Tools  
    {          
         public sealed class SnapTool : BaseTool  
        { 
            private IHookHelper m_hookHelper = null;  
            private IPoint m_snapPt;  
            private ISnappingEnvironment m_SnapEnv;  
            private IPointSnapper m_Snapper;  
            private ISnappingFeedback m_SnapFeedback;  
            private INewLineFeedback m_feedback;  
            private ISnappingResult m_snapRst;  
      
            public SnapTool()  
            {  
                //  
                // TODO: Define values for the public properties  
                //  
                base.m_category = ""; //localizable text   
                base.m_caption = "";  //localizable text   
                base.m_message = "This should work in ArcMap/MapControl/PageLayoutControl";  //localizable text  
                base.m_toolTip = "";  //localizable text  
                base.m_name = "";   //unique id, non-localizable (e.g. "MyCategory_MyTool")  
                try  
                {  
                    //  
                    // TODO: change resource name if necessary  
                    //  
                    string bitmapResourceName = GetType().Name + ".bmp";  
                    base.m_bitmap = new Bitmap(GetType(), bitmapResourceName);  
                    base.m_cursor = new System.Windows.Forms.Cursor(GetType(), GetType().Name + ".cur");  
                }  
                catch (Exception ex)  
                {  
                    System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap");  
                }  
            }  
     
            #region Overridden Class Methods  
              
            public override void OnCreate(object hook)  
            {  
                try  
                {  
                    m_hookHelper = new HookHelperClass();  
                    m_hookHelper.Hook = hook;  
                    if (m_hookHelper.ActiveView == null)  
                    {  
                        m_hookHelper = null;  
                    }  
                }  
                catch  
                {  
                    m_hookHelper = null;  
                }  
      
                if (m_hookHelper == null)  
                    base.m_enabled = false;  
                else  
                    base.m_enabled = true;  
      
                // TODO:  Add other initialization code  
                UID uid = new UIDClass();  
                uid.Value = "{E07B4C52-C894-4558-B804-D4050018D1DA}";  
                IExtensionManager extMar = (m_hookHelper as IHookHelper2).ExtensionManager;  
                IExtension ext = extMar.FindExtension(uid);  
                m_SnapEnv = ext as ISnappingEnvironment;  
                m_Snapper = m_SnapEnv.PointSnapper;  
                m_SnapFeedback = new SnappingFeedbackClass();  
                m_SnapFeedback.Initialize(m_hookHelper.Hook, m_SnapEnv, true); 
    
            }    
            
            public override void OnClick()  
            {  
                //
            }  
      
            public override void OnMouseDown(int Button, int Shift, int X, int Y)  
            {  
                IPoint ppt = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);  
                if (m_snapPt != null)  
                {  
                    ppt = m_snapPt;  
                }    
                if (m_feedback != null)  
                {  
                    m_feedback = new NewLineFeedbackClass();  
                    m_feedback.Display = m_hookHelper.ActiveView.ScreenDisplay;  
                    m_feedback.Start(ppt);  
                }  
                else  
                {  
                    m_feedback.AddPoint(ppt);  
                }  
            }  
      
            public override void OnMouseMove(int Button, int Shift, int X, int Y)  
            {  
                IPoint ppt = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);  
                m_snapPt = ppt;  
                m_snapRst = m_Snapper.Snap(m_snapPt);  
                m_SnapFeedback.Update(m_snapRst, 0);  
                if (m_snapRst != null)  
                {  
                    m_snapPt = m_snapRst.Location;  
                }    
                if (m_feedback != null)  
                {  
                    m_feedback.MoveTo(m_snapPt);  
                }  
            }  
      
            public override void OnMouseUp(int Button, int Shift, int X, int Y)  
            {  
                // TODO:  Add SnapTool.OnMouseUp implementation  
            }  
            #endregion  
        }  
    }  
            
  • 相关阅读:
    HDU 1059 Dividing(多重背包)
    新华网,要厚道
    js与DOM初步:访问html元素
    Hacker News网站的文章排名算法工作原理
    做技术,是个精益求精的事情
    百度贴吧客户端(Android)网络通信行为分析
    Storm同时接收多个源(spout和bolt)
    各种流处理系统的比较
    Kafka学习
    关联规则推荐及Apriori算法
  • 原文地址:https://www.cnblogs.com/vichang/p/9124816.html
Copyright © 2011-2022 走看看