jun470 发表于 2023-11-4 14:35:51

关于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))







hhh454 发表于 2023-11-4 18:27:56

点表排序、图元坐标点排序-----通吃-----再浓缩----最终版2014.2.22
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=107489&fromuid=363233
(出处: 明经CAD社区)
直接用前辈的函数就行,这个函数很实用。

飞雪神光 发表于 2023-11-4 15:29:57

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:53:08

本帖最后由 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)



jun470 发表于 2023-11-4 21:32:00

飞雪神光 发表于 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,还是觉得有问题

jun470 发表于 2023-11-4 21:34:39

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,例子特地这么设计的,元素的索引号是这也意思吧

jun470 发表于 2023-11-4 21:53:42

hhh454 发表于 2023-11-4 18:27
点表排序、图元坐标点排序-----通吃-----再浓缩----最终版2014.2.22
http://bbs.mjtd.com/forum.php?mod=v ...

代码能力差,有点看不懂,还提到这是fsxm的扩展,也是懵的,前辈是自定了函数吗,我只需要简单的元素索引号表,不用对原数据排序。
我上传的代码是看《AutoLISP 函数参考》(明经通道翻译)里面的例子的应用,看着挺简单,还是没搞懂

lee50310 发表于 2023-11-4 21:56:32

本帖最后由 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)

jun470 发表于 2023-11-4 22:58:07

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 '<),这样的结果就是我要的了。

zxc710370969 发表于 2023-11-5 19:58:39

大佬牛杯
~~~~~~
页: [1]
查看完整版本: 关于vl-sort-i排序索引表问题