明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1918|回复: 10

[已解答] 一个很奇怪的表排序的问题

[复制链接]
发表于 2015-8-18 10:31:29 | 显示全部楼层 |阅读模式
本帖最后由 易云网络 于 2015-8-18 13:37 编辑
  1.     (setq ssma (mapcar 'cdr ssma))
  2.     (setq lll    (vl-sort ssma  '(lambda (a b) (< (caar a)  (caar b)))))
  3.     (setq lllzzz (vl-sort lll   '(lambda (a b) (< (cadr(car a)) (cadr(car b))))));好像就这一行起作用把LLL的排序忽略了
这个排序是这个样子的

我在CAD里面输入 :
!ssma 把结果重新(setq ssma ‘ 就可以了第二个图


下面的SSMA 就是在CAD里面输入 : !ssma 的结果的表
*
  1. (defun c:ttw ()
  2.    (setq ssma   '(((43.9648 45.5411) (53.9648 45.5411) <图元名: 7C56D560>) ((28.2134 30.3314)
  3. (38.2134 30.3314) <图元名: 7C56D550>) ((26.7721 19.9772) (36.7721 19.9772)
  4. <图元名: 7C56D538>) ((10.0 10.0) (20.0 10.0) <图元名: 7C56D500>) ((0.682195
  5. 45.5411) (10.6822 45.5411) <图元名: 7C56D578>) ((15.6344 45.5411) (25.6344
  6. 45.5411) <图元名: 7C56D570>) ((31.8457 45.5411) (41.8457 45.5411) <图元名:
  7. 7C56D568>) ((13.2612 30.3314) (23.2612 30.3314) <图元名: 7C56D558>) ((44.4247
  8. 30.3314) (54.4247 30.3314) <图元名: 7C56D548>) ((56.5438 30.3314) (66.5438
  9. 30.3314) <图元名: 7C56D540>) ((41.7242 19.9772) (51.7242 19.9772) <图元名:
  10. 7C56D530>) ((57.9355 19.9772) (67.9355 19.9772) <图元名: 7C56D528>) ((70.0546
  11. 19.9772) (80.0546 19.9772) <图元名: 7C56D520>) ((53.2826 10.0) (63.2826 10.0)
  12. <图元名: 7C56D518>) ((41.1635 10.0) (51.1635 10.0) <图元名: 7C56D510>)
  13. ((24.9522 10.0) (34.9522 10.0) <图元名: 7C56D508>))
  14. )

  15.   (setq lll    (vl-sort ssma  '(lambda (a b) (< (caar a)  (caar b)))))
  16.   (setq lllzzz (vl-sort lll   '(lambda (a b) (< (cadar a) (cadar b)))))

  17.   (setq b 0)
  18.   
  19.   (repeat (length lllzzz)
  20.     (setq a (caar lllzzz))
  21.     (setq #k (rtos (setq b (1+ b))2 0))
  22.     (entmake
  23.       (list '(0 . "MTEXT") '(100 . "AcDbEntity")  '(100 . "AcDbMText")
  24.         (cons 1 #k)        ;;文字内容
  25.         (cons 40 1.9)      ;;文字高度
  26.         (cons 41 0.7)      ;;文字倾斜度
  27.         (cons 10 a)       ;;文字插入点
  28.         (cons 7 "standard");; 文字样式
  29.         (cons 8 "0")       ;;文字图层
  30.       )
  31.     )
  32.     (setq lllzzz (cdr lllzzz))
  33.   )
  34.   ;              
  35. )

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2015-8-18 11:42:27 | 显示全部楼层
  1. (setq ssma   '(((43.9648 45.5411) (53.9648 45.5411) <图元名: 7C56D560>) ((28.2134 30.3314)
  2. (38.2134 30.3314) <图元名: 7C56D550>) ((26.7721 19.9772) (36.7721 19.9772)
  3. <图元名: 7C56D538>) ((10.0 10.0) (20.0 10.0) <图元名: 7C56D500>) ((0.682195
  4. 45.5411) (10.6822 45.5411) <图元名: 7C56D578>) ((15.6344 45.5411) (25.6344
  5. 45.5411) <图元名: 7C56D570>) ((31.8457 45.5411) (41.8457 45.5411) <图元名:
  6. 7C56D568>) ((13.2612 30.3314) (23.2612 30.3314) <图元名: 7C56D558>) ((44.4247
  7. 30.3314) (54.4247 30.3314) <图元名: 7C56D548>) ((56.5438 30.3314) (66.5438
  8. 30.3314) <图元名: 7C56D540>) ((41.7242 19.9772) (51.7242 19.9772) <图元名:
  9. 7C56D530>) ((57.9355 19.9772) (67.9355 19.9772) <图元名: 7C56D528>) ((70.0546
  10. 19.9772) (80.0546 19.9772) <图元名: 7C56D520>) ((53.2826 10.0) (63.2826 10.0)
  11. <图元名: 7C56D518>) ((41.1635 10.0) (51.1635 10.0) <图元名: 7C56D510>)
  12. ((24.9522 10.0) (34.9522 10.0) <图元名: 7C56D508>))
  13. )
这个代码.你怎么写的... 好厉害.
 楼主| 发表于 2015-8-18 12:40:12 | 显示全部楼层
本帖最后由 易云网络 于 2015-8-18 12:41 编辑
鱼与熊掌 发表于 2015-8-18 11:42
这个代码.你怎么写的... 好厉害.


不是写的是复制来的,有什么问题吗?请指教 !

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2015-8-18 12:52:11 | 显示全部楼层
一次解决
  1. (setq  lst(mapcar 'cdr ssma))
  2. (setq lst(vl-sort lst '(lambda(e1 e2)(if (equal (cadr e1)(cadr e2) 1e-8)(< (car e1)(car e2))(< (cadr e1)(cadr e2))))
  3.                         ))
 楼主| 发表于 2015-8-18 13:14:12 | 显示全部楼层
edata 发表于 2015-8-18 12:52
一次解决

两个一起还不会改,麻烦看看
错误: 用于比较的参数类型不正确: (38.2134 30.3314) (36.7721 19.9772)
 楼主| 发表于 2015-8-18 13:21:00 | 显示全部楼层
本帖最后由 易云网络 于 2015-8-18 13:51 编辑
edata 发表于 2015-8-18 12:52
一次解决


                                                                (setq  lst(mapcar 'cdr ssma))
(setq lst(vl-sort lst '(lambda(e1 e2)(if (equal (cadr e1)(cadr e2) 1e-8)(< (caar e1)(caar e2))(< (cadar e1)(cadar e2))))

                        ))
改成这样可以运行了,问题依旧
[size=14.107pt]               (setq  lst(mapcar 'cdr ssma))(setq lst  (vl-sort lst '(lambda(e1 e2)(if (equal (cadar e1)(cadar e2) 1e-8)(< (caar e1)(caar e2))(< (cadar e1)(cadar e2)))) ))
这样子可以了 太谢谢您了
发表于 2015-8-18 15:20:10 | 显示全部楼层
你用的第二个点比较,如果是第一个点,mapcar'cdr ssma都可以省掉了。
如果还是第二点
(vl-sort lst ==> (vl-sort (mapcar 'cdr ssma)
又省掉了一个setq
。。
发表于 2015-8-18 15:49:12 | 显示全部楼层
高级
 楼主| 发表于 2015-8-19 08:57:48 | 显示全部楼层
edata 发表于 2015-8-18 15:20
你用的第二个点比较,如果是第一个点,mapcar'cdr ssma都可以省掉了。
如果还是第二点
(vl-sort lst ==>  ...

说来也奇怪,为什么会出现这种情况能
发表于 2015-8-19 11:45:49 | 显示全部楼层
vl-sort是重新排序,不是按原来的顺序排列,必须在vl-sort指定的判断函数下完成两个比较。
比如说,你把学生先按男女排列,再把学生按年龄排列,那么你最后的命令是按年龄排列,但是没说还得分男女,所以同学们最后只会按照年龄排列了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-9-29 04:39 , Processed in 0.187173 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表