ArcEngine 捕捉代码

///


/// IFeatureSnapAgent 的摘要说明。
///

public interface IFeatureSnapAgent:ISnapAgent,ISnapAgentFeedback
{
IFeatureCache FeatureCache
{
get;
}
IFeatureClass FeatureClass
{
get;
set;
}
esriGeometryHitPartType HitPartType
{
get;
set;
}
///
/// 为捕捉连接事件,当捕捉发生的时候,就会触发事件。
///

///
void AddSnapedEventHandler(GeometrySnapedEventHandler handler);
///
/// 不再监听捕捉事件
///

///
void RemoveSnapedEventHandler(GeometrySnapedEventHandler handler);
}
///
/// 默认的要素捕捉代理
///

public class DefaultFeatureSnapAgent :IFeatureSnapAgent,IEditEvents,ESRI.ArcGIS .esriSystem .IPersistVariant
{
#region 构造函数
///
/// 为代理指定别名。注意该代理目前还没有关联到任何目标FeatureClass
/// 要使得该代理起作用,必须要为他设置FeatureClass.
///

/// 名称(请确保唯一)
public DefaultFeatureSnapAgent(string name):this(name,null)
{

}
///
/// 将使用该FeatureClass的别名做代理的名称
///

///
public DefaultFeatureSnapAgent(IFeatureClass feaClass):this(feaClass.AliasName,feaClass)
{
}
///
/// 完全初始化捕捉代理
///

/// 名称(请确保唯一)
/// 目标FeatureClass
public DefaultFeatureSnapAgent(string name,IFeatureClass feaClass)
{
m_snapAgentName=name;
m_bCacheHasCreated=false;
m_hitPartType=esriGeometryHitPartType.esriGeometryPartNone;
this.m_isSnapWorking=true;
this.m_featureClass=feaClass;
this.m_snapFeedbackText="";

}
#endregion
#region IFeatureSnapAgent 成员
private event GeometrySnapedEventHandler m_snapSubsciber;
///
/// FeatureClass缓冲区。
///

private IFeatureCache m_featureCache;
///
/// 该代理将捕捉在该FeatureClass上的Feature.和Geometry
///

private IFeatureClass m_featureClass;
///
/// 点击测试的有效类型。
///

protected esriGeometryHitPartType m_hitPartType;
///
/// 缓冲区对象是否已经被创建了。跟是否建立了缓冲没有关系。
///

private bool m_bCacheHasCreated;

///
/// 缓冲区对象
///

public IFeatureCache FeatureCache
{
get
{
return m_featureCache;
}
}
///
/// 目标FeatureClass。SnapAgent将针对该FeatureClass做捕捉
///

public IFeatureClass FeatureClass
{
get
{
return m_featureClass;
}
set

{
m_featureClass=value;
}
}

///


/// 点击测试类型。哪些点击类型会被测试
///

public ESRI.ArcGIS.Geometry.esriGeometryHitPartType HitPartType
{
get
{
// TODO: 添加 DefaultFeatureSnapAgent.HitPartType getter 实现
return m_hitPartType;
}
set
{

m_hitPartType=value;
}
}
///
/// 创建缓冲区对象。
///

private void CreateFeatureCache()
{
m_featureCache=new ESRI.ArcGIS.Carto.FeatureCacheClass();
m_bCacheHasCreated=true;
}
///
/// 填充缓冲区。如果还没有创建缓冲区对象,就先创建缓冲区对象。
/// 如果已经拥有缓冲区,而且当前点依然在该缓冲区内部,那么不会填充生成新的缓冲。
/// 由于缓冲是在捕捉方法内部被使用的。所以可以保证m_featureClass必然不会为空引用。
///

/// 当前点
/// 缓冲区大小
private void FillCache(IPoint point,double size)
{
if(!m_bCacheHasCreated)
{
CreateFeatureCache();
}
if(!m_featureCache.Contains (point))
{
m_featureCache.Initialize(point,size);
m_featureCache.AddFeatures(this.m_featureClass);
}
}
///
/// 添加事件侦听者。捕捉发生后,事件将会被发送到该侦听者。
///

///
public void AddSnapedEventHandler(GeometrySnapedEventHandler handler)
{
m_snapSubsciber+=handler;
}
///
/// 移去事件侦听者。
///

///
public void RemoveSnapedEventHandler(GeometrySnapedEventHandler handler)
{
m_snapSubsciber-=handler;
}
#endregion
#region ISnapAgent 成员
private string m_snapAgentName;
///
/// SnapAgent是否在工作。代表用户是打开还是关闭了SnapAgent
/// 初始化的时候默认是打开的。
///

private bool m_isSnapWorking;
public string Name
{
get
{
return m_snapAgentName;
}
}
public bool IsWorking()
{
return this.m_isSnapWorking ;
}
///
/// 捕捉。
///

///
///
///
///
public virtual bool Snap(IGeometry metry, IPoint snapPoint, double tolerance)
{
/*
* 捕捉的过程:
* 首先使用当前位置、目标图层、和误差的10倍构造一个缓冲区。
* 对缓冲区中的每个Feature,找到他包含的每一个Geometry。
* 对Geometry做点击测试。
*/
if(!this.m_isSnapWorking)
{
//捕捉代理已经被用户关闭了。不会有任何捕捉动作发生
return false;
}
if(m_featureClass==null)
{
//没有目标图层

。不能做捕捉动作。此时应该报错
//但是目前只是返回false。
return false;
}
FillCache(snapPoint,tolerance*10);
//当前被测试的Feature
IFeature feature=null;
//当前被测试的几何图形
IGeometry curMetry=null;
//当前被测试的Feature的索引和缓冲区中拥有的feature的个数。
int featureIndex,featureCount;
featureCount=m_featureCache.Count;
for(featureIndex=0;featureIndex{
feature=m_featureCache.get_Feature(featureIndex);
if(feature!=null)
{
curMetry=feature.Shape;
IPoint hitPoint=new ESRI.ArcGIS .Geometry.PointClass ();
double hitDist=0;
int hitPartIndex=-1;
bool bRightSide=false;
int hitSegmentIndex=-1;
IHitTest hitTest=(IHitTest)curMetry;
if(hitTest.HitTest (snapPoint,tolerance,this.m_hitPartType,hitPoint,ref hitDist
,ref hitPartIndex,ref hitSegmentIndex,ref bRightSide))
{
GeometrySnapEventArgs args=new GeometrySnapEventArgs (hitPoint,curMetry,
feature,this.m_featureClass,hitPartIndex,hitSegmentIndex,tolerance,
hitDist,this.m_hitPartType,bRightSide);
SetFeedback("FeatureSnapAgent"+https://www.360docs.net/doc/4614682125.html,+"捕捉到了!");
LaunchSnapEvent(args);
snapPoint.X=hitPoint.X;
snapPoint.Y=hitPoint.Y;
return true;
}




}
}

return false;
}

相关文档
最新文档