How to work with the snap environment

SummaryThe snap environment manages snap agents and snap tolerance and is responsible for attempting to snap vertices and points using the snap environment settings. This topic includes code examples and methods to best manage snapping programmatically.

In this topic


Working with the snap environment

The ArcGIS Engine editor's snap environment (IEngineSnapEnvironment) controls each snap agent (IEngineSnapAgent), hit type settings, and snapping tolerance. The hit type of each feature snap agent is managed through the IEngineFeatureSnapAgent interface. All settings can be manually modified or verified on the Snapping Settings dialog box. See the following screen shot:

The ArcGIS Engine editor's snap environment also controls the snap tolerance. If required, you can provide an interface to allow the end user to manage the snap tolerance.
See the following code example to set up basic snap environment settings and turn on snap tips:

[C#]

publicvoid SnapEnvirSettings(IEngineEditor editor)
{
//Get the snap environment from the editor.
IEngineSnapEnvironment snapEnvironment = editor as IEngineSnapEnvironment; //Ensure there is a snap agent turned on in the snap environment.if (snapEnvironment.SnapAgentCount == 0)
{
System.Windows.Forms.MessageBox.Show(
"You need to turn on at least one snapping agent!!!");
return ;
} //Code to display the snap tolerance in a message box. double tolerance = snapEnvironment.SnapTolerance;
System.Windows.Forms.MessageBox.Show(Convert.ToString(tolerance)); //Set the snap tolerance.
snapEnvironment.SnapToleranceUnits =
esriEngineSnapToleranceUnits.esriEngineSnapToleranceMapUnits;
snapEnvironment.SnapTolerance = 15; //Turn on snap tips.
((IEngineEditProperties2)editor).SnapTips = true;
}

[VB.NET]

PublicSub SnapEnvirSettings(ByVal editor As IEngineEditor)
'Get the snap environment from the editor.Dim snapEnvironment As IEngineSnapEnvironment = editor As IEngineSnapEnvironment 'Ensure there is a snap agent turned on in the snap environment.If snapEnvironment.SnapAgentCount = 0 Then
System.Windows.Forms.MessageBox.Show("You need to turn on at least one snapping agent!!!")
ReturnEndIf'Code to display the snap tolerance in a message box.Dim tolerance AsDouble = snapEnvironment.SnapTolerance
System.Windows.Forms.MessageBox.Show(Convert.ToString(tolerance)) 'Set the snap tolerance.
snapEnvironment.SnapToleranceUnits = esriEngineSnapToleranceUnits.esriEngineSnapToleranceMapUnits
snapEnvironment.SnapTolerance = 15 'Turn on snap tips.
((IEngineEditProperties2)editor).SnapTips = TrueEndSub
This method checks the snap environment for selected snap agents. Feature snap agents are checked if the HitPartType is not equal to esriGeometryPartNone. The other snap agents are only registered if they are checked; therefore, if the number of snap agents is greater than the number of feature snap agents, a snap agent (sketch snap agent) is checked.
See the following code example:

[C#]

privatebool CheckIsAnySnapAgentSelected(IEngineSnapEnvironment snapEnvironment)
{
int snapAgentCount = snapEnvironment.SnapAgentCount;
int checkedFeatureSnapAgentCount = 0;
int featureSnapAgentCount = 0; //Loop through all registered snap agents in the snap environment. Count feature snap agents,//checked feature snap agents, and nonfeature snap agents.for (int i = 0; i < snapAgentCount; i++)
{
IEngineSnapAgent currentSnapAgent = snapEnvironment.get_SnapAgent(i);
if (currentSnapAgent is IEngineFeatureSnapAgent)
{
IEngineFeatureSnapAgent featureSnapAgent = currentSnapAgent as
IEngineFeatureSnapAgent;
featureSnapAgentCount++; //Determine if the feature snap agent is checked.if (featureSnapAgent.HitType !=
esriGeometryHitPartType.esriGeometryPartNone)
{
checkedFeatureSnapAgentCount++;
}
}
}
if (checkedFeatureSnapAgentCount > 0 || snapAgentCount > featureSnapAgentCount)
{
returntrue;
}
else
{
returnfalse;
}
}

[VB.NET]

PrivateFunction CheckIsAnySnapAgentSelected(ByVal snapEnvironment As IEngineSnapEnvironment) AsBooleanDim snapAgentCount AsInteger = snapEnvironment.SnapAgentCount
Dim checkedFeatureSnapAgentCount AsInteger = 0
Dim featureSnapAgentCount AsInteger = 0 'Loop through all registered snap agents in the snap environment. Count feature snap agents,'checked feature snap agents, and nonfeature snap agents.Dim i AsIntegerFor i = 0 To snapAgentCount - 1 Step i + 1
Dim currentSnapAgent As IEngineSnapAgent = snapEnvironment.get_SnapAgent(i)
IfTypeOf currentSnapAgent Is IEngineFeatureSnapAgent ThenDim featureSnapAgent As IEngineFeatureSnapAgent = currentSnapAgent As IEngineFeatureSnapAgent
featureSnapAgentCount = featureSnapAgentCount + 1 'Determine if the feature snap agent is checked.If featureSnapAgent.HitType <> esriGeomeTryHitPartType.esriGeomeTryPartNone Then
checkedFeatureSnapAgentCount = checkedFeatureSnapAgentCount + 1
EndIfEndIfNextIf checkedFeatureSnapAgentCount > 0 Or snapAgentCount > featureSnapAgentCount ThenReturnTrueElseReturnFalseEndIfEndFunction

Snap agents

Snap agents implement the IEngineSnapAgent interface and, when registered as a component category, are inserted into the ESRI snap agents component category. However, the feature snap agent (IEngineFeatureSnapAgent) is a more detailed class of snap agent, and each feature class has a feature snap agent instantiated when the snap environment window is first opened, if it hasn’t already been created programmatically.
See the following code example showing how to create a feature snap agent programmatically:

[C#]

publicvoid AddNewSnapAgent()
{
IEngineEditor editor = new EngineEditorClass();
IEngineEditLayers editLayers = editor as IEngineEditLayers;
IEngineSnapEnvironment snapEnvironment = editor as IEngineSnapEnvironment; //Check that the user is editing; otherwise, there will be no snap agent loaded.if (editLayers.TargetLayer == null)
{
System.Windows.Forms.MessageBox.Show("Please start an edit session");
return ;
} //Clear all existing snap agents.
snapEnvironment.ClearSnapAgents(); //Create a feature snap agent.
IEngineFeatureSnapAgent featureSnapAgent = new EngineFeatureSnap();
IFeatureClass layerFeatureClass = editLayers.TargetLayer.FeatureClass;
featureSnapAgent.FeatureClass = layerFeatureClass;
featureSnapAgent.HitType = esriGeometryHitPartType.esriGeometryPartBoundary; //Activate only the snap agent for the target layer.
snapEnvironment.AddSnapAgent(featureSnapAgent);
}

[VB.NET]

PublicSub AddNewSnapAgent()
Dim editor As IEngineEditor = New EngineEditorClass()
Dim editLayers As IEngineEditLayers = editor As IEngineEditLayers
Dim snapEnvironment As IEngineSnapEnvironment = editor As IEngineSnapEnvironment 'Check that the user is editing; otherwise, there will be no snap agent loaded.If editLayers.TargetLayer IsNothingThen
System.Windows.Forms.MessageBox.Show("Please start an edit session")
ReturnEndIf'Clear all existing snap agents.
snapEnvironment.ClearSnapAgents() 'Create a feature snap agent.Dim featureSnapAgent As IEngineFeatureSnapAgent = New EngineFeatureSnap()
Dim layerFeatureClass As IFeatureClass = editLayers.TargetLayer.FeatureClass
featureSnapAgent.FeatureClass = layerFeatureClass
featureSnapAgent.HitType = esriGeomeTryHitPartType.esriGeomeTryPartBoundary 'Activate only the snap agent for the target layer.
snapEnvironment.AddSnapAgent(featureSnapAgent)
EndSub
Programmatically changing the snap environment parameters does not require opening the snap window to change the settings. In ArcGIS Engine, the snap window reflects the snap environment settings while it is open. All IEngineSnapAgents, such as the edit sketch vertices snap agent, are visible on the snap window even if they have been programmatically removed; this allows the end user to turn them on and off as needed.

Snapping in z-dimension

ArcGIS Engine does not currently support snapping in z-dimension.

Snap point method

To use the SnapPoint method from the IEngineSnapEnvironment interface, an IPoint is passed to the method and used to find the closest feature to snap to. Using SnapPoint calls the IEngineSnapAgent.Snap method to then call each snap agent in priority order until it finds one that returns true. This results in new coordinates that are then assigned to the original point.
The order in which snap agents are added to the snap environment determines the priority of snap agents. This priority order is reflected in the snap environment window and can be changed using the window.

See Also:

IEngineEditProperties2.SnapTips Property

How to work with the snap environment的更多相关文章

  1. Ieditor

    Interfaces Description IActiveViewEvents (esriCarto) Provides access to events that occur when the s ...

  2. arcgis arcengine Using environment settings

    In this topic About using environment settings Environment settings summary table About using enviro ...

  3. 重新想象 Windows 8 Store Apps (56) - 系统 UI: Scale, Snap, Orientation, High Contrast 等

    [源码下载] 重新想象 Windows 8 Store Apps (56) - 系统 UI: Scale, Snap, Orientation, High Contrast 等 作者:webabcd ...

  4. 关于Ubuntu中snap安装软件太慢解决办法

    两种方法,一是下载好包手动安装,二设置snap的代理. 下载安装包方式 到 https://uappexplorer.com/snaps 搜索需要的 snap 包,然后下载 下载的时候选择对应的平台. ...

  5. deepin20使用snap并设置代理

    snap下载 $ sudo apt update $ sudo apt install snapd https://snapcraft.io/docs/installing-snap-on-ubunt ...

  6. OpenCloudOS使用snap安装.NET 6

    开源操作系统社区 OpenCloudOS 由腾讯与合作伙伴共同倡议发起,是完全中立.全面开放.安全稳定.高性能的操作系统及生态.OpenCloudOS 沉淀了多家厂商在软件和开源生态的优势,继承了腾讯 ...

  7. IEEE 802.11p (WAVE,Wireless Access in the Vehicular Environment)

    IEEE 802.11p(又称WAVE,Wireless Access in the Vehicular Environment)是一个由IEEE 802.11标准扩充的通讯协定.这个通讯协定主要用在 ...

  8. 修改/etc/profile和/etc/environment导致图形界面无法登陆的问题

    在使用ubuntu开发时,往往要修改PATH变量,有时会通过修改/etc/profile和/etc/environment来修改默认的PATH变量,但是一旦出错,很容易造成无法登陆进入图形界面的问题. ...

  9. System.Environment.CurrentDirectory和Application.StartupPath

    System.Environment.CurrentDirectory的含义是获取或设置当前工作路径,而Application.StartupPath是获取程序启动路径,表面上看二者没什么区别,但实际 ...

随机推荐

  1. express+nodemon 修改后浏览器自动刷新

    添加nodemon模块 cnpm install --save nodemon 根目录添加文件 nodemon.json { "restartable": "rs&quo ...

  2. WebDriverAPI(3)

    获取页面的Title属性 被测网址http:http://www.baidu.com Java语言版本的API实例代码 String url = "http://www.baidu.com& ...

  3. 用COS实现文件上传

    cos是O'Rrilly公司开发的一款用于HTTP上传文件的OpenSource组件 需要cos.jar,下载地址:http://www.servlets.com/cos/ cos上传文件很简单,比f ...

  4. 删除文件以后,如何通过git撤销删除的文件,不提交到远端代码库

    检查状态,看看发生了什么:$ git statusOn branch masterChanged but not updated:(use "git add/rm <file>. ...

  5. 【树】Construct Binary Tree from Preorder and Inorder Traversal

    题目: Given preorder and inorder traversal of a tree, construct the binary tree. 思路: 线序序列的第一个元素就是树根,然后 ...

  6. freepbx的SIP通话客户端X-lite Yate eyeBeam Linphone

    在上一篇文章安装freepbx后创建sip分机里我们已经创建好了SIP分机,接下来我们使用几大客户端进行登陆.我们接下来会使用到的软件有X-lite,Yate client,eyeBeam, Linp ...

  7. redis集群与分片(2)-Redis Cluster集群的搭建与实践

    Redis Cluster集群 一.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper等,但从redis 3.0之后版本支持redis-cluster集群,Re ...

  8. Mac配置多个版本JDK

    2016年mac上已经安装有jdk1.6的版本  目录在/Library/Java/JavaVirtualMachines/1.6.0.jdk 有时候mac版本跟新会自动删除jdk1.6 所以要去ma ...

  9. 开例外!微信小程序登录绕过CAS单点登录(SSO)认证检查

    1 为了让微信API能够绕过CAS认证检查,将微信api入口部分设计为独立的模块.放入controller目录下,命名为wechat.java文件为WechatController.java 文件大体 ...

  10. 【WePY小程序框架实战一】-创建项目

    最近两个小程序项目使用了微信自己出的框架wepy开发,开发完的感受就是比原生小程序顺溜很多.我就从安装到一些重点和整个项目把wepy使用整理下 全局安装WePY命令行工具 npm install we ...