易云网络 发表于 2015-8-18 10:31:29

一个很奇怪的表排序的问题

本帖最后由 易云网络 于 2015-8-18 13:37 编辑

    (setq ssma (mapcar 'cdr ssma))
    (setq lll    (vl-sort ssma'(lambda (a b) (< (caar a)(caar b)))))
    (setq lllzzz (vl-sort lll   '(lambda (a b) (< (cadr(car a)) (cadr(car b))))));好像就这一行起作用把LLL的排序忽略了
这个排序是这个样子的

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


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

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

(setq b 0)

(repeat (length lllzzz)
    (setq a (caar lllzzz))
    (setq #k (rtos (setq b (1+ b))2 0))
    (entmake
      (list '(0 . "MTEXT") '(100 . "AcDbEntity")'(100 . "AcDbMText")
      (cons 1 #k)      ;;文字内容
      (cons 40 1.9)      ;;文字高度
      (cons 41 0.7)      ;;文字倾斜度
      (cons 10 a)       ;;文字插入点
      (cons 7 "standard");; 文字样式
      (cons 8 "0")       ;;文字图层
      )
    )
    (setq lllzzz (cdr lllzzz))
)
;            
)

鱼与熊掌 发表于 2015-8-18 11:42:27

(setq ssma   '(((43.9648 45.5411) (53.9648 45.5411) <图元名: 7C56D560>) ((28.2134 30.3314)
(38.2134 30.3314) <图元名: 7C56D550>) ((26.7721 19.9772) (36.7721 19.9772)
<图元名: 7C56D538>) ((10.0 10.0) (20.0 10.0) <图元名: 7C56D500>) ((0.682195
45.5411) (10.6822 45.5411) <图元名: 7C56D578>) ((15.6344 45.5411) (25.6344
45.5411) <图元名: 7C56D570>) ((31.8457 45.5411) (41.8457 45.5411) <图元名:
7C56D568>) ((13.2612 30.3314) (23.2612 30.3314) <图元名: 7C56D558>) ((44.4247
30.3314) (54.4247 30.3314) <图元名: 7C56D548>) ((56.5438 30.3314) (66.5438
30.3314) <图元名: 7C56D540>) ((41.7242 19.9772) (51.7242 19.9772) <图元名:
7C56D530>) ((57.9355 19.9772) (67.9355 19.9772) <图元名: 7C56D528>) ((70.0546
19.9772) (80.0546 19.9772) <图元名: 7C56D520>) ((53.2826 10.0) (63.2826 10.0)
<图元名: 7C56D518>) ((41.1635 10.0) (51.1635 10.0) <图元名: 7C56D510>)
((24.9522 10.0) (34.9522 10.0) <图元名: 7C56D508>))
)这个代码.你怎么写的... 好厉害.

易云网络 发表于 2015-8-18 12:40:12

本帖最后由 易云网络 于 2015-8-18 12:41 编辑

鱼与熊掌 发表于 2015-8-18 11:42 http://bbs.mjtd.com/static/image/common/back.gif
这个代码.你怎么写的... 好厉害.

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

edata 发表于 2015-8-18 12:52:11

一次解决
(setqlst(mapcar 'cdr ssma))
(setq lst(vl-sort lst '(lambda(e1 e2)(if (equal (cadr e1)(cadr e2) 1e-8)(< (car e1)(car e2))(< (cadr e1)(cadr e2))))
                        ))

易云网络 发表于 2015-8-18 13:14:12

edata 发表于 2015-8-18 12:52 static/image/common/back.gif
一次解决

两个一起还不会改,麻烦看看
错误: 用于比较的参数类型不正确: (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 http://bbs.mjtd.com/static/image/common/back.gif
一次解决

                                                                (setqlst(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))))

                        ))
改成这样可以运行了,问题依旧
               (setqlst(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)))) ))
这样子可以了 太谢谢您了

edata 发表于 2015-8-18 15:20:10

你用的第二个点比较,如果是第一个点,mapcar'cdr ssma都可以省掉了。
如果还是第二点
(vl-sort lst ==> (vl-sort (mapcar 'cdr ssma)
又省掉了一个setq
。。

903242237 发表于 2015-8-18 15:49:12

高级

易云网络 发表于 2015-8-19 08:57:48

edata 发表于 2015-8-18 15:20 static/image/common/back.gif
你用的第二个点比较,如果是第一个点,mapcar'cdr ssma都可以省掉了。
如果还是第二点
(vl-sort lst ==>...

说来也奇怪,为什么会出现这种情况能

edata 发表于 2015-8-19 11:45:49

vl-sort是重新排序,不是按原来的顺序排列,必须在vl-sort指定的判断函数下完成两个比较。
比如说,你把学生先按男女排列,再把学生按年龄排列,那么你最后的命令是按年龄排列,但是没说还得分男女,所以同学们最后只会按照年龄排列了。
页: [1] 2
查看完整版本: 一个很奇怪的表排序的问题