关于vl-sort-i排序索引表问题
本帖最后由 jun470 于 2023-11-4 14:38 编辑小弟我是个新手,也没系统学习过lisp,不过论坛中有很多帖子给我自己研究提供了很大的帮助,感谢论坛中格纹大佬了!!!我在论坛搜索 ” vl-sort-i “ 相关的帖子,没找到相关的,所以冒昧开个帖子讨论下,望大佬不吝赐教,感谢了!现在我遇到的情况是这样,下面这段代码是框选文字之后,对文字的Y坐标进行排序,输出索引表。上传的附件中,我执行后,应当输出(2 0 3 1 4),但是实际输出的是(1 3 0 2 4),看了好几天了,没找到问题所在,代码简短,但是就是不对,欢迎大佬指正。
(defun c:Q ( / ss k nlt ssN ptC yyj n1 e1 e2)
(vl-load-com)
(setq ss (ssget (list (cons 0 "text"))));;;框选建立选择集
(setq K 0)
(setq nlt (sslength ss));选择集个数
(repeat nlt
(setq ssN (ssname ss K));获取图元号
(setq ptC(cdr (assoc 10 (entget ssN))) );获取坐标
(print (cadr ptC));输出Y
(setq yyj (append yyj (list ptC)));坐标集合
(setq K (+ K 1))
)
(print yyj);;输出坐标合集表
(setq n1(vl-sort-i yyj
(function (lambda (e1 e2)
(< (cadr e1) (cadr e2)) ) ) ));以Y排序的索引表,如(0 1 2)
(print n1);输出索引表,实际输出不对
(princ))
点表排序、图元坐标点排序-----通吃-----再浓缩----最终版2014.2.22
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=107489&fromuid=363233
(出处: 明经CAD社区)
直接用前辈的函数就行,这个函数很实用。 326.641 119.155 419.576 219.295 536.772 y值从小到大 (1 3 0 2 4)就是 119.155 219.295 326.641 419.576 536.772 没毛病你说的(2 0 3 1 4)就是 419.576 326.641 219.295 119.155 536.772 这不合逻辑 索引位0 就是表中第一个元素 本帖最后由 lee50310 于 2023-11-4 15:55 编辑
執行:Q選取測試圖 5個數字
得到 點列表
(setq YYJ '((10830.8 326.641 0.0) (10830.8 119.155 0.0) (10830.8 419.576 0.0) (10830.8 219.295 0.0) (10830.8 536.772 0.0)) )
你要做 Y 由小到大排序
也可將Y 項先取出形成列表
執行: (setq sel mapcar 'cadr YYJ)
得到: (326.641 119.155 419.576 219.295 536.772)
執行: (vl-sort-i sel '<)
得到:(1 3 0 2 4)
實際對照 y 列表 大小 由小到大 索引值是 (1 3 0 2 4)非 (2 0 3 1 4)
飞雪神光 发表于 2023-11-4 15:29
326.641 119.155 419.576 219.295 536.772 y值从小到大 (1 3 0 2 4)就是 119.155 219.295 326.641 419.57 ...
326.641 119.155 419.576 219.295 536.772这个排序表就是百位-1,实际是
↓ ↓ ↓ ↓ ↓
2 0 3 1 4,还是觉得有问题 lee50310 发表于 2023-11-4 15:53
執行:Q選取測試圖 5個數字
得到 點列表
(setq YYJ '((10830.8 326.641 0.0) (10830 ...
326.641 119.155 419.576 219.295 536.772
↓ ↓ ↓ ↓ ↓
2 0 3 1 4,实际排序这样不对吗,其实是百位-1,例子特地这么设计的,元素的索引号是这也意思吧 hhh454 发表于 2023-11-4 18:27
点表排序、图元坐标点排序-----通吃-----再浓缩----最终版2014.2.22
http://bbs.mjtd.com/forum.php?mod=v ...
代码能力差,有点看不懂,还提到这是fsxm的扩展,也是懵的,前辈是自定了函数吗,我只需要简单的元素索引号表,不用对原数据排序。
我上传的代码是看《AutoLISP 函数参考》(明经通道翻译)里面的例子的应用,看着挺简单,还是没搞懂 本帖最后由 lee50310 于 2023-11-4 22:13 编辑
jun470 发表于 2023-11-4 21:34
326.641 119.155 419.576 219.295 536.772
↓ ↓ ↓ ↓ ↓
2...
sel =(326.641 119.155 419.576 219.295 536.772) ;; y點列表值
↓ ↓ ↓ ↓ ↓
索引值 0 1 2 3 4 ;索引值是按照列表順序由 0 開始
執行: (vl-sort-i sel '<) ;由小排到大取出所引值
119.155 < 219.295 < 326.641 < 419.576 < 536.772 ;; y點列表值 由小排到大
119.155 的索引值是 1,219.295 的索引值是 3 以此類推
故得到(1 3 0 2 4)
lee50310 发表于 2023-11-4 21:56
sel =(326.641 119.155 419.576 219.295 536.772) ;; y點列表值
↓ ...
感谢赐教!!!这是这个意思啊,我理解错了。不过我另辟蹊径,实现了输出我要的(2 0 3 1 4) 了。就是再排序一次(vl-sort-i n1 '<),这样的结果就是我要的了。 大佬牛杯
~~~~~~
页:
[1]