C# ArcEngine 追踪线对象( INewLineFeedback)

        追踪线对象是DisplayFeedback对象中的一员,是一种用户使用鼠标与控件进行可视化交互的对象。可以使用在不产生任何几何对象的任务中,如测量两点之间的距离、进行管网横断面分析、要素选择等。追踪线对象需要在鼠标事件的配合下才能完成其功能。简而言之,就是固定点和移动点之间的动态变化的连接线。在追踪线操作结束后,不再显示。

LineFeedback常用属性
属性名称说明
Display只写属性,用于绘制图形时,使显示与屏幕显示区域相结合。

Symbol

可返回或设置对象的符号样式,如未设置,为默认样式。 

LineFeedback常用方法
方法名称说明
Start(IPoint pPoint)参数为追踪线对象的起点,即交互过程中用户点击的第一个点。该方法用于开始追踪线对象的操作。
Stop()结束追踪线对象的操作。结束后追踪线不会绘制在地图上,但追踪线对象仍存在。返回值为IPolyLine
MoveTo(IPoint pPoint)将对象移动到输入点所指定的位置。即用户鼠标当前在屏幕上的位置。
AddPoint(IPoint pPoint)设置追踪线对象的起点后,使用该方法追加追踪线对象的节点。

示例:使用追踪线对象绘制线要素,并在追踪线对象操作结束后,使用IElement在地图上绘制该线要素。追踪线对象需要和鼠标交互完成任务。本代码示例使用鼠标的MouseDown、MouseMove、DoubleClick事件完成该示例。

/*
    本代码使用BaseTool(ArcEngine模板)实现,详见 添加新项-->ArcGIS-->Extending ArcObjects-->Base Tool
    本代码只介绍追踪线在事件中的使用,关于BaseTool等ArcEngine基础知识,请自行学习
    用于测距、测面等场景,显示用户鼠标移动时,固定点和移动点之间的连线
    MapControl控件Name设为m_mapControl
*/
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Carto;

//追踪线对象字段
private INewLineFeedback m_pNewLineFeedback = null;

public override void OnMouseDown(int Button, int Shift, int X, int Y)
{
    //判断用户点击是否为鼠标左键
    if (Button != 1) return;
    //将起点的屏幕坐标转为地图坐标
    IPoint pPoint=m_mapControl.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X,Y);
    //判断绘制的要素是否为追踪线起点,即鼠标是否为第一次点击
    if (m_pNewLineFeedback == null) 
    {
        //实例化
        m_pNewLineFeedback = new NewLineFeedbackClass();
        //该方法用于设置样式,如不设置默认显示为黑色实线
        getLineSymbol(m_pNewLineFeedback.Symbol as ISimpleLineSymbol);
        m_pNewLineFeedback.Display = m_mapControl.ActiveView.ScreenDisplay;
        m_pNewLineFeedback.Start(pPoint);
    }
    //如果不是起点,直接添加到追踪线对象
    else
    {
        m_pNewLineFeedback.AddPoint(pPoint);
    }
}
public override void OnMouseMove(int Button, int Shift, int X, int Y)
{
    //判断追踪线对象是否为空
    if (m_pNewLineFeedback == null) return;
    IPoint pPoint = m_mapControl.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
    //MoveTo方法用于实现追踪效果
    m_pNewLineFeedback.MoveTo(pPoint);
}
public override void OnDblClick()
{
    if (m_pNewLineFeedback == null) return;
    
    IElement pEle = new LineElementClass();
    //结束追踪线的操作,该方法返回值为IPolyline
    //使用Element获取追踪线对象的几何信息
    pEle.Geometry = m_pNewLineFeedback.Stop();
    
    //创建图形容器,用于储存Element元素
    IGraphicsContainer pGraphicsContainer = m_mapControl.Map as IGraphicsContainer;

    ILineElement pLineEle = pEle as ILineElement;
    getLineSymbol(pLineEle.Symbol as ISimpleLineSymbol);
    pGraphicsContainer.AddElement(pLineEle as IElement, 0);
    m_mapControl.ActiveView.Refresh();
    
    //结束操作后,追踪线对象并不会清空
    //要想不影响下次操作,需要将值设置为null
    m_pNewLineFeedback = null;
}
//设置样式的方法
private void getLineSymbol(ISimpleLineSymbol pLineSymbol) 
{
    IRgbColor pRgb = new RgbColorClass()
    {
        Red = 200,
        Blue = 20,
        Green = 0
    };
    pLineSymbol.Color = pRgb;
    pLineSymbol.Width = 1.0;
    pLineSymbol.Style = esriSimpleLineStyle.esriSLSDash;
}

一种简单方式绘制追踪线,封装性强,定制性较差


using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Carto;

/*
说明:
1、下面仅为简单的功能实现代码,请读者自行选择其触发事件
2、此代码默认左键双击后,结束追踪线操作
3、此代码未设置样式,追踪线会显示为默认黑色实线样式
*/

//axMapControl为地图控件
IPolyline pPolyline = axMapControl.TrackLine() as IPolyline;
IElement pEle = new LineElementClass();
pEle.Geometry = pPolyline;
(axMapControl.Map as IGraphicsContainer).AddElement(IElement, 0);

         

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
客户最近打电话过来,说我们的软件在量距离的时候不能平移地图。我们的软件是使用ArcEngine来开发的,在网上输入关键字“arcengine 距离测量”,可以搜索到一大堆内容基本相似的文章或代码,基本上都是采用INewLineFeedback来实现的,我们的软件也是使用此种方法。方法大致如下:写一个距离测量工具,继承自BaseTool,在该类中使用INewLineFeedback动态绘制多段折线,最后转化为Element添加到地图上。如果要增加平移功能,我们仿造ArcMap使用鼠标中键平移,在OnMouseDown、OnMouseMove、OnMouseUp事件中增加判断鼠标中键的语句,然后分别使用PanStart、PanMoveTo、PanStop实现地图的平移。 此时,出现了一个新问题,一旦移动地图后,之前使用INewLineFeedback绘制的线完全乱了方寸,有一部分线丢失了。之后又发现一个更可笑的问题,在绘制的过程中,如果使用alt+tab键切换到其它窗口,然后再切换回地图窗口的时候,会多出一条线,INewLineFeedback把切换窗口前的鼠标位置记录了下来。 对于这个问题,我使用ArcMap的测量工具检查了一下,发现不存在上述问题。但是INewLineFeedback为什么会产生这个bug,难道是本人的使用方法不对。在网上搜了一下其他类似代码进行测试,都存在这个bug。ArcEngine的SDK文档上也没有特别强调INewLineFeedback的使用细节。 本来打算用gdi进行解决,最后发现INewLineFeedback有一个Refresh函数,那么应该在什么地方使用它呢?在ArcMapControl的诸多事件中,尝试了OnAfterDraw、OnAfterScreenDraw、OnViewRefresh等,发现OnAfterScreenDraw是OK的。具体是在OnAfterScreenDraw事件中使用Refresh函数刷新INewLineFeedback,完美解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值