关于使用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;

}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 16:19:04

关于使用INewLineFeedback创建线段的相关文章

线段树入门总结

线段树的入门级 总结   线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点.      对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2+1,b].因此线段树是平衡二叉树,最后的子节点数目为N,即整个线段区间的长度.      使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN).而未优化的空间复杂度为2N,因此有时需要离散化让空间

Algorithms(线段树)

线段树 #ifndef LINETREE_H_INCLUDED #define LINETREE_H_INCLUDED typedef struct Node { int i, j; // 表示线段树区间[i, j] int cover; // 表示区间被覆盖的次数 struct Node *left, *right; // 左右儿子的节点 }LTree; /* ** 创建线段树 */ LTree* create(int i, int j); /* ** 插入一个区间 */ void inser

区间覆盖(线段树)

区间覆盖(线段树) X轴上方有若干条平行于X轴的线段,求这些线段能够覆盖X轴的总长度? 输入格式 第一行一个数n(n<=100000),表示线段个数: 接下来n行,每行两个整数a[i],b[i](-10^8<=a[i],b[i]<=10^8),代表一个线段的两个端点输出覆盖X轴的长度 输入样例 2 10 12 2 4 输出样例 4 1 /* 2 样例: 3 有两段线 4 1 2 5 2 3 6 */ 7 8 #include <bits/stdc++.h> 9 using n

HDU5877 线段树

题目大意:给你一棵树,有n-1条边,每条边都有方向,每个顶点有权值,给出weak pair的定义是val[u]*val[v] <=k,u是v的祖先,问有多少对这样的顶点 思路:创建线段树,通过dfs动态创建,每次都不断更新.因为我们只能是根节点开始往下的,所以我们遍历到兄弟节点的之前要把其他的兄弟节点的信息给删除掉.(这就和用vis标记一样的,一会儿变为true,一会儿变为false) 不过我很奇怪,为啥我的代码没有吧k/a[i]放进去就迷之RE了 当然,这道题也可以用主席树做,也可以用trea

笔试算法题(42):线段树(区间树,Interval Tree)

议题:线段树(Interval Tree) 分析: 线段树是一种二叉搜索树,将一个大区间划分成单元区间,每个单元区间对应一个叶子节点:内部节点对应部分区间,如对于一个内部节点[a, b]而言,其左子节点表示的区间为[a, (a+b)/2],其右子节点表示的区间为[1+(a+b)/2, b]: 对于区间长度为N的线段树,由于其单元节点都是[a, a]的叶子节点,所以其叶子节点数为N,并且整棵树为平衡二叉树,所以总节点数为2N-1,树的深度为log(N)+1: 插入操作:将一条线段[a, b]插入到

树状数组与线段树

一:树状数组 树状数组是对一个数组改变某个元素和求和比较实用的数据结构.两中操作都是O(logn). 需求:有时候我们需要频繁地求数组的前k项和或者求数组从小标i到j的和,这样每次最坏情况下的时间复杂度就会为O(N),这样效率太低了.而树状数组主要就是为了解决这样一个问题.树状数组在求和及修改都可以在O(lgN)时间内完成. 树状数组需要额外维护一个数组,我们设为C[N],原数组为A[N], 其中每个元素C[i]表示A[i-2^k+1]到A[i]的和,这里k是i在二进制时末尾0的个数.注意通过位

白话数据结构之【线段树】

线段树的入门 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2+1,b].因此线段树是平衡二叉树,最后的子节点数目为N,即整个线段区间的长度. 使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN).而未优化的空间复杂度为2N,因此有时需要离散化让空间压缩. ----来自百度百科 [

线段树入门整理、

线段树(interval tree) 是把区间逐次二分得到的一树状结构,它反映了包括归并排序在内的很多分治算法的问题求解方式. [声明] 1 #include<cstdio> 2 #include<cmath> 3 const int MAXNODE = 2097152; 4 const int MAX = 1000003; 5 struct NODE{ 6 int left,right; // 区间[left,right] . 7 int value; // 节点区间对应的权值.

线段树入门---给定多个线段求点的出现个数

线段树是一颗二叉树,他的每个节点都是一个区间,此题为线段树的入门题目,只是学习笔记.例题:给定N个线段,给定M个点,求点在多少个线段中出现过,此时如果用传统的方法来求,时间复杂度太高,但是,线段树的时间复杂度还可以接受. 步骤为: 1. 首先找一个区间,能覆盖给定的所有区间, 然后把此区间建立线段树,建立线段树的方式是二分法建立,即它的左孩子是他的左半个区间,右孩子是它的右边那个区间.一个图足以说明清楚 2. 将所有的区间映射到此树上, 从根节点开始遍历, 每遍历一个节点考虑四种情况: 1) 当