最初由 ykklms 发布
[B]想请教各位高手:如何对所取得的一组坐标点进行排序,如((911.102 286.647 0.0) (795.308 271.554 0.0) (650.985 253.108 0.0) (474.777 264.847 0.0) (375.764 326.895 0.0) (285.143 387.266 0.0))
按X和Y分别排?.. [/B]
xdrx_api中用于排序的几个函数。
- [color=blur]xdrx_realsort1[/color]
- 功 能:对给定的一组整(实数)从小到大排升序,省略重复项。
- 调用格式:(xdrx_realsort1 < 数1 > < 数2 > ... [数n])
- 返 回 值:返回排序后的表。
- 示 例:a='(3 4.6 56.0 2.1 4.6)
- (apply 'xdrx_realsort1 a)
- 返回:(2.1 3.0 4.6 56.0)
- [color=blue]xdrx_realsort2[/color]
- 功 能:对给定的一组整(实数)从小到大排升序,不省略重复项。
- 调用格式:(xdrx_realsort2 < 数1 > < 数2 > ... [数n])
- 返 回 值:返回排序后的表。
- 示 例:a='(3 4.6 56.0 2.1 4.6)
- (apply 'xdrx_realsort1 a)
- 返回:(2.1 3.0 4.6 4.6 56.0)
- [color=blue]xdrx_rlistdel1[/color]
- 功 能:根据关联表的索引值,把关联表中和给定的索引值相同的项删除。不省略重复项。凡是相等的都删除。
- 调用格式:(xdrx_rlistdel1 < 索引值 > < 关联表项1 > < 关联表项1 > ... [关联表项n])
- 返 回 值:返回表。
- 示 例:将关联表a='((3 "a" "b")(5 ("a" "c"))(3 (2 3)))中索引值为3的关联表项删除
- (apply 'xdrx_rlistdel1 (cons 3 a))
- 返回值为:'((5 ("a" "c")))
- [color=blue]xdrx_rlistdel2[/color]
- 功 能:根据关联表的索引值,把关联表中和给定的索引值相同的项删除。省略重复项。只删除第一个相等的关联表项。
- 调用格式:(xdrx_rlistdel2 < 索引值 > < 关联表项1 > < 关联表项1 > ... [关联表项n])
- 返 回 值:返回表。
- 示 例:将关联表a='((3 "a" "b")(5 ("a" "c"))(3 (2 3)))中索引值为3的关联表项删除
- (apply 'xdrx_rlistdel1 (cons 3 a))
- 返回值为:'((5 ("a" "c"))(3 (2 3)))
- [color=blue]xdrx_rlistsort1[/color]
- 功 能:根据关联表的索引值,把关联表从小到大排升序,省略重复项。
- 调用格式:(xdrx_rlistsort1 < 关联表项1 > < 关联表项1 > ... [关联表项n])
- 返 回 值:返回排序后的表。
- 示 例:a='((34.0 "a")(2.0 (2 3))(34 ("a" "b")))
- (apply 'xdrx_rlistsort2 a)
- 返回值:((2.0 (2.0 3.0)) (34 ("a" "b")))
- [color=blue]xdrx_rlistsort2[/color]
- 功 能:根据关联表的索引值,把关联表从小到大排升序,不省略重复项。
- 调用格式:(xdrx_rlistsort2 < 关联表项1 > < 关联表项1 > ... [关联表项n])
- 返 回 值:返回排序后的表。
- 示 例:a='((34.0 "a")(2.0 (2 3))(34 ("a" "b")))
- (apply 'xdrx_rlistsort2 a)
- 返回值:((2.0 (2.0 3.0)) (34 ("a" "b")) (34.0 "a"))
复制代码
还有一个更实用的

- xdrx_SortPointOnCurve
- 功 能:基于实体的点的排序函数,就是有一系列点是在曲线实体上,基于这个曲线实体,
- 从开始点到结束点排序这些实体上的点。结果是这些点依据实体的开始点开始排升序。
- 调用格式:(xdrx_SortPointOnCurve < 曲线实体名 > ptl]
- 返 回 值:以曲线实体的开始参数为基点,排升序后的表。
- 例 子: 该函数在求一个曲线和其他所有曲线的交点的时候,很常用。
- 如:求一个已经的ARC和一些曲线实体的交点,然后为了下面的操作需要讲这些得到的交点
- 排序,以前的做法是得到交点后,还需要根据某个特征,如求这些点到一个图形最小点
- 的距离等等作为依据,排序。(这种方法的缺点就是若第一个曲线参数不是LINE,而是ARC
- 等曲线,那么就非常不容易排序。现在有这个函数,问题就很好解决了。
- (setq e (car (xdrx_entsel "\n请选取一个曲线实体:" '((0 . "*line,arc,ellipse")))));;得到一个曲线
- (setq ptl (xdrx_getsamplept e)) ;;得到这个曲线的模拟顶点表
- (setq ss (ssget "f" ptl '((0 . "*line,arc,ellipse")))) ;;得到所有和这个曲线相交的曲线实体到选择集ss
- (setq ptl (xdrx_getinters e ss)) ;;得到曲线E和选择集中所有曲线的实际交点,不延伸。
- (setq p (cons e ptl)) ;;构造基于实体排序的函数xdrx_SortPointOnCurve的参数表
- (setq ptl (xdrx_sortpointoncurve e p)) ;;得到了排序后的点。
- 这些功能若不用XDRX_API,只用LISP,要用几十倍的代码量才能完成。
- 这些代码在求如建筑上轴网交点等等操作,极大的简化了代码量,速度还很快。
- 可以求任意实体的交点和排序。
XDRX_sortpointoncurve 的另外一个用法是用一个点表,不一定有实体 (xdrx_sortpointoncurve '(p1 p2) ptl),还有sortpointoncurve后面有个可选的参数T,如果给, 省略重复的 |