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
}
}
ArcGIS Engine中实现ArcMap的捕捉效果的更多相关文章
- ArcGIS Engine中的Symbols详解
转自原文ArcGIS Engine中的Symbols详解 本文由本人翻译ESRI官方帮助文档.尊重劳动成果,转载请注明来源. Symbols ArcObjects用了三种类型的Symbol(符号样式) ...
- ArcGIS engine中Display类库 (局部刷新)
转自原文 ArcGIS engine中Display类库 (局部刷新) Display类库包括了用于显示GIS数据的对象.除了负责实际输出图像的主要显示对象(display object)外,这个类库 ...
- ArcGIS engine中Display类库——Display
转自原文 ArcGIS engine中Display类库——Display Display类库包括了用于显示GIS数据的对象.除了负责实际输出图像的主要显示对象(display object)外,这 ...
- ArcGIS Engine中的重点类库介绍
转自原文ArcGIS Engine中的重点类库介绍 System类库 System类库是ArcGIS体系结构中最底层的类库.System类库包含给构成ArcGIS的其他类库提供服务的组件.System ...
- ArcGIS Engine中的8种数据访问 (转)
数据是GIS的基础, 访问数据也是进行任何复杂的空间分析及空间可视化表达的前提.ArcGIS支持的数据格式比较丰富,对不同的数据格式支持的程度也有很大差异.本文主要介绍一下以下八种数据格式在ArcGI ...
- ArcGIS Engine中的数据访问
ArcGIS Engine中的数据访问 数据是GIS的基础, 访问数据也是进行任何复杂的空间分析及空间可视化表达的前提.ArcGIS支持的数据格式比较丰富,对不同的数据格式支持的程度也有很大差异.本文 ...
- [转载]ArcGIS Engine 中的多线程使用
ArcGIS Engine 中的多线程使用 原文链接 http://anshien.blog.163.com/blog/static/169966308201082441114173/ 一直都想写 ...
- ArcGIS Engine中加载数据
ArcGIS Engine中加载数据 http://blog.csdn.net/gisstar/article/details/4206822 分类: AE开发积累2009-05-21 16:49 ...
- ArcGIS Engine中的8种数据访问
数据是GIS的基础, 访问数据也是进行任何复杂的空间分析及空间可视化表达的前提.ArcGIS支持的数据格式比较丰富,对不同的数据格式支持的程度也有很大差异.本文主要介绍一下以下八种数据格式在ArcGI ...
随机推荐
- 高校表白App-团队冲刺第三天
今天要做什么 今天开站立会议的时候,忽然发觉在一个完整的App上好像是有一些引导页的,比如说在第一次使用App的时候,或者是在使用App的时候会出现新手指引操作. 做了什么 通过查阅资料来学习View ...
- java03类与对象相关问题
1.使用类的静态字段和构造函数,可以跟踪某个类所创建对象的个数.请写一个类,在任何时候都可以向他查询"你已经创建了几个对象" 1 package 第四五周; 2 3 public ...
- 详解API Gateway流控实现,揭开ROMA平台高性能秒级流控的技术细节
摘要:ROMA平台的核心系统ROMA Connect源自华为流程IT的集成平台,在华为内部有超过15年的企业业务集成经验. 本文分享自华为云社区<ROMA集成关键技术(1)-API流控技术详解& ...
- Redis学习——简介
一.Redis简介 Redis是一种基于键值对(key-value)的NoSQL数据库,与很多键值对数据库不同的是,Redis中的值可以是由string(字符串).hash(哈希).list(列表). ...
- Requests方法 -- post
>>> import requests 导入requests库 >>> help(requests) #查看requests方法Help on package ...
- Beam Search快速理解及代码解析(下)
Beam Search的问题 先解释一下什么要对Beam Search进行改进.因为Beam Search虽然比贪心强了不少,但还是会生成出空洞.重复.前后矛盾的文本.如果你有文本生成经验,一定对这些 ...
- 深入GraphQL 的使用语法
深入GraphQL 的使用语法 对于GraphQL 的使用语法在上一节中已经大概介绍了基本的使用方式了,这一篇将会对上一篇入门做拓展,努力将所有的使用语法都覆盖到. 1. 终端语法 首先是介绍在前端查 ...
- PAT乙级:1064 朋友数 (20分)
PAT乙级:1064 朋友数 (20分) 题干 如果两个整数各位数字的和是一样的,则被称为是"朋友数",而那个公共的和就是它们的"朋友证号".例如 123 和 ...
- 超详细!搭建本地大数据研发环境(16G内存+CDH)
工欲善其事必先利其器,在经过大量的理论学习以后,需要有一个本地的研发环境来进行练手.已经工作的可以不依赖于公司的环境,在家也可以随意的练习.而自学大数据的同学,也可以进行本地练习,大数据是一门偏实践的 ...
- Pelles C 五光十色中的一抹经典
我只是一个程序员,没有多少文化修养,根本不会组织出多么精彩动人的辞藻,所以废话不多说,开整. 前段时间,我开始了自己的毕业设计项目,项目的主题和内容是围绕数码防伪追溯原理制作一个识别装置,而这个装置并 ...