ISnappingEnvironment和ae自带的编辑插件共用不起作用?

ISnappingEnvironment用在自己写的插件可以使用,有捕捉的效果。但跟ae自带的编辑插件结合(例如ControlsEditingEditToolClass和ControlsEditingSketchToolClass),就没有效果
按官方文档说明ISnappingEnvironment在ae下也有效,但就是没特别说明对“自带“的”编辑“插件是否有效
已邀请:

cannel

赞同来自:

自问自答一下,想到一个折中办法,估计ae和arcmap是不一样的
原理是ae可以通过ISnappingEnvironment等接口实现捕获,以及获取捕捉后的点坐标,那只要重写自带插件的各个鼠标事件,把事件传入的坐标替换成捕捉后的坐标再调用插件原来的鼠标事件方法就行,以下提供部分代码
 
插件类因为捕捉而重写的事件方法,这里只是按需重写了OnMouseMove和OnMouseDown
        public override void OnMouseMove(int Button, int Shift, int X, int Y)
{
//因为实现点捕捉需要重写鼠标事件

//进行点捕捉,并用捕捉后的点坐标替换
MapControlSnapHelper.SnapPointReturnScreenPioint(m_HookHelper.ActiveView, ref X, ref Y);

base.OnMouseMove(Button, Shift, X, Y);
}

public override void OnMouseDown(int Button, int Shift, int X, int Y)
{
//因为实现点捕捉需要重写鼠标事件

//进行点捕捉,并用捕捉后的点坐标替换
MapControlSnapHelper.SnapPointReturnScreenPioint(m_HookHelper.ActiveView, ref X, ref Y);

base.OnMouseDown(Button, Shift, X, Y);
}

public override void Refresh(int hDC)
{
//启用捕捉时重写Tool插件刷新SnappingFeedback的方法
MapControlSnapHelper.BaseToolRefresh(hDC);
}

    /// <summary>
/// MapControl地图操作点捕捉实现类
/// </summary>
public class MapControlSnapHelper
{
private static ISnappingEnvironment m_SnappingEnvironment = null;

private static IPointSnapper m_PointSnapper;

private static ISnappingFeedback m_SnappingFeedback;

/// <summary>
/// 是否启用点捕捉
/// </summary>
public static bool EnabledSnap
{
get
{
if (m_SnappingEnvironment != null)
return m_SnappingEnvironment.Enabled;
else
return false;
}
set
{
if (m_SnappingEnvironment != null)
m_SnappingEnvironment.Enabled = value;
}
}

/// <summary>
/// 捕捉对象类型
/// </summary>
public static esriSnappingType SnappingType
{
get
{
if (m_SnappingEnvironment != null)
{
return m_SnappingEnvironment.SnappingType;
}
else
{
return esriSnappingType.esriSnappingTypeNone;
}
}
set
{
m_SnappingEnvironment.SnappingType = value;
}
}

/// <summary>
/// 获取捕捉环境(配置)
/// </summary>
public static ISnappingEnvironment SnappingEnvironment
{
get
{
return m_SnappingEnvironment;
}
}

/// <summary>
/// 点捕捉初始化,只需执行一次
/// </summary>
public static void Init()
{
//由于获取IExtensionManager需要ae自带的IHookHelper2(而不是edm封装的IHookHelperEx),因此需要通过如下方法获取
IHookHelper hookHelper = new HookHelperClass();
//IHookHelper初始化需要MapControl对象
hookHelper.Hook = MapService.GetInstance().MapControl;
IHookHelper2 hookHelper2 = hookHelper as IHookHelper2;

//获取Snapping extension
IExtensionManager extensionManager = hookHelper2.ExtensionManager;

UID guid = new UIDClass();
guid.Value = "{E07B4C52-C894-4558-B8D4-D4050018D1DA}";
IExtension extension = extensionManager.FindExtension(guid);

//初始化捕捉功能的相关对象
m_SnappingEnvironment = extension as ISnappingEnvironment;
m_PointSnapper = m_SnappingEnvironment.PointSnapper;
m_SnappingFeedback = new SnappingFeedbackClass();
m_SnappingFeedback.Initialize(hookHelper.Hook, m_SnappingEnvironment, true);

//初始化设置的捕捉对象类型
m_SnappingEnvironment.SnappingType = esriSnappingType.esriSnappingTypeEdge ^ esriSnappingType.esriSnappingTypeEndpoint ^ esriSnappingType.esriSnappingTypeVertex ^ esriSnappingType.esriSnappingTypePoint;
}

/// <summary>
/// 输入一个点,返回点捕捉结果
/// </summary>
/// <param name="point"></param>
/// <returns></returns>
public static ISnappingResult Snap(IPoint point)
{
if (EnabledSnap == false) return null;

//进行点捕捉并返回捕捉结果
ISnappingResult snapResult = m_PointSnapper.Snap(point);

m_SnappingFeedback.Update(snapResult, 0);

return snapResult;
}

/// <summary>
/// 输入一个点,返回点捕捉结果,返回的点是屏幕坐标
/// 此方法通常用于在OnMouseMove,OnMouseDown等插件坐标事件用捕捉后的坐标替换事件原始的坐标
/// </summary>
/// <param name="activeView"></param>
/// <param name="X"></param>
/// <param name="Y"></param>
public static void SnapPointReturnScreenPioint(IActiveView activeView, ref int X, ref int Y)
{
//当前鼠标位置
IPoint point = activeView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);

//进行点捕捉,返回捕捉结果
//注意:点捕捉在屏幕的效果靠此方法实现
ISnappingResult snapResult = MapControlSnapHelper.Snap(point);
//当点捕捉成功,有捕捉结果,就把鼠标点坐标设置到捕捉的坐标
if (snapResult != null)
{
point = snapResult.Location;

activeView.ScreenDisplay.DisplayTransformation.FromMapPoint(point, out X, out Y);
}
}

/// <summary>
/// 启用捕捉时重写Tool插件刷新SnappingFeedback的方法
/// </summary>
/// <param name="hDC"></param>
public static void BaseToolRefresh(int hDC)
{
if (m_SnappingFeedback != null)
m_SnappingFeedback.Refresh(hDC);
}
}

 

要回复问题请先登录注册