关于使用INewLineFeedback创建线段

我知道之前大家都使用过这个接口来生成空间要素PolyLine,我之前也这样使用过这个接口,大概的流程是 
1-生成一全局的IDisplayFeedback接口变量(当然生成线直接使用INewlineFeedback也行); 
2-在Mousedown时间中根据点击的点位置第一点调用Start()方法或者非第一点调用IFeedback.AddPoint()方法将点击点添加如Feedback中去; 
3-在MouseMove中调用MoveTo()方法; 
4-在你要停止的相应事件中进行Stop()方法,该方法会返回你需要的Polyline;

当然我这里写的很简便,具体的过程可以参看帮助文档,写的还是比较详细的,稍后我会贴上关键的代码。


一般来说这样就会生成一个Polyline了我们只需要创建一个Feature接受这个折线的Geometry就可以保存该线了;但是问题来了,参看帮助文档的时候也会发现这个问题,当我们需要使用这个接口创建多于2个点要素的折线的时候,使用上面的流程是完全没有问题的,而且也可以创建只有2点的线段

但是当我只想创建一条只有2点的线段该如何是好呢?!

经测定,如果直接按照上面的流程是万万不行的,会发生The number of points is less than required for feature! 这个异常,意思很简单,就是你的添加点不够构建一个线要素!

所以需要将你想要创建的线段点全部都添加到Feedback中去,而不是从第二点开始添加,所以你需要在第二步的时候做出改变: 
2-在Mousedown事件的start(point)方法之后(之前也会发生异常)立刻调用AddPoint()方法将point点添加到Feedback中去; 
4-在相应的结束事件调用stop方法获取Polyline之前,将结束点endpoint也添加到Feedback中去 
这样,就可以顺利的利用INewlineFeedback只添加只有2点的线段了!


废话结束上代码!!!

    INewLineFeedback iLineFeed;
    //计算画线的点个数
    int ptCount = 0;
    public override void OnMouseDown(int Button, int Shift, int X, int Y)
        {
            //iOriginalGeo = base.m_mapControl.TrackLine();
            if (Button == 1 && ptCount == 0 && iLineFeed == null)
            {
                StartDrawLine(X, Y);
                ptCount++;
            } 
        }
    public override void OnMouseMove(int Button, int Shift, int X, int Y)
        {
            // TODO:  Add WxCrossSectionTool.OnMouseMove implementation
            MoveToLine(X, Y);
        }
    public override void OnMouseUp(int Button, int Shift, int X, int Y)
        {
        if (ptCount == 1)
            {
                //得到所画线
               IPolyline iPolyTrack = EndLine(X,Y);
             }
        }
        //开始画线
    private void StartDrawLine(int X,int Y)
        {
            iLineFeed = new NewLineFeedbackClass();
            iLineFeed.Display = base.m_mapControl.ActiveView.ScreenDisplay;
            IPoint iStartPt = base.m_mapControl.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
            iLineFeed.Start(iStartPt);
            iLineFeed.AddPoint(iStartPt);//在Start方法之后添加点,否则异常
    }
    //移动鼠标
    private void MoveToLine(int X, int Y)
        {
            if (iLineFeed == null)
                return;
            IPoint iMoveToPt = base.m_mapControl.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
            iLineFeed.MoveTo(iMoveToPt);
        }
        //结束画线
    private IPolyline EndLine(int X,int Y)
        {
            IPolyline iLine;
            try
            {
                if (iLineFeed == null)
                    return null;
                else
                {
                    iLineFeed.AddPoint(base.m_mapControl.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X,Y));
                    iLine = iLineFeed.Stop();
                    return iLine;
                }
            }
            finally
            {   
                //重置变量
                ptCount = 0;
                //重置全局变量
                iLineFeed = null;
            }
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值