找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4046|回复: 6

[求助] [求助]:请教一个xy坐标排序lisp问题

[复制链接]
发表于 2007-1-18 10:30:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
刚接触lisp,想编一个批量打印程序,将图框按先X后Y的顺序打印。

找到一个通用排序工具,试了一下,打印顺序总是不对。我对下面这句不太明白 :

[php](if (or (= xory "xy") (= xory "XY"))
       (setq coy (+ (cadr (assoc 10 lp)) (caddr (assoc 10 lp))))
  )
[/php]

我不理解“X坐标+Y坐标”后得出什么结果,请指教,谢谢!


通用程序如下:
[php]
;;将选择的图元安X、Y或X+Y坐标排序 (其中SE为选择集,XORY为X、Y或XY
;;
(defun zhy_sort_se (se xory)
   (setq newse nil)
   (setq n (sslength se))
   (setq index 0)
   (setq aal '())
   (repeat n
     (setq name (ssname se index))
     (setq lp (entget name))
     (if (or (= xory "y") (= xory "Y"))
       (setq coy (caddr (assoc 10 lp)))
     )
     (if (or (= xory "x") (= xory "X"))
       (setq coy (cadr (assoc 10 lp)))
     )
     (if (or (= xory "xy") (= xory "XY"))
       (setq coy (+ (cadr (assoc 10 lp)) (caddr (assoc 10 lp))))
     )
     (setq item (list coy (cdr (assoc 5 lp))))
     (setq aal (cons item aal))
     (setq index (1+ index))
   )
   (setq newsort
   (vl-sort aal
     (function (lambda (e1 e2)
          (> (car e1) (car e2))
        )
     )
   )
   )
   (setq n1 (length newsort))
   (setq ind 0)
   (repeat n1
     (setq ntt (nth ind newsort))
     (setq ind (1+ ind))
     (setq ty (handent (cadr ntt)))
     (if (/= ty nil)
       (if (= newse nil)
  (setq newse (ssadd ty))
  (setq newse (ssadd ty newse))
       )
     )
   )
)

[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 2个

财富等级: 恭喜发财

发表于 2007-1-18 13:02:21 | 显示全部楼层
原作者的意图当参数“xory”的值是“xy”时,根据(X与Y的代数和的大小)进行排序。

你的需求则应通过建立二维表进行排序解决。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-18 13:54:54 | 显示全部楼层
请问二维表怎么建立呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-1-18 15:03:28 | 显示全部楼层
Y排序:
(vl-sort '((3 5) (2 2) (4 3))
             (function (lambda (e1 e2)
                         (< (cadr e1) (cadr e2)) ) ) )
返回:((2 2) (4 3) (3 5))
X排序:
(vl-sort '((3 5) (2 2) (4 3))
             (function (lambda (e1 e2)
                         (< (car e1) (car e2)) ) ) )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2007-1-18 18:37:41 | 显示全部楼层
在尽量做少的改动前提下,根据楼主的要求,对yinzhenyu在1楼提供的代码做了修改。
修改后可以满足纵横排序的要求。
代码如下,请注意注释部分:
[PHP]
(defun zhy_sort_se (se xory)
;;;重点所在
  (if (or (= xory "xy") (= xory "XY"))
    (zhy_sort_se (zhy_sort_se se "X") "Y")

    (progn
      (setq newse nil)
      (setq n (sslength se))
      (setq index 0)
      (setq aal '())
      (repeat n
        (setq name (ssname se index))
        (setq lp (entget name))
        (if (or (= xory "y") (= xory "Y"))
          (setq coy (caddr (assoc 10 lp)))
        )
        (if (or (= xory "x") (= xory "X"))
          (setq coy (cadr (assoc 10 lp)))
        )
;;;注释掉下面内容
;;;        (if (or (= xory "xy") (= xory "XY"))
;;;          (setq coy (+ (cadr (assoc 10 lp)) (caddr (assoc 10 lp))))
;;;        )
        (setq item (list coy (cdr (assoc 5 lp))))
        (setq aal (cons item aal))
        (setq index (1+ index))
      )
      (setq newsort
             (vl-sort aal
                      (function        (lambda        (e1 e2)
                                  (> (car e1) (car e2))
                                )
                      )
             )
      )
      (setq n1 (length newsort))
      (setq ind (1- n1));;;原(setq ind 0)
      (repeat n1
        (setq ntt (nth ind newsort))
        (setq ind (1- ind));;;原(setq ind (1+ ind))
        (setq ty (handent (cadr ntt)))
        (if (/= ty nil)
          (if (= newse nil)
            (setq newse (ssadd ty))
            (setq newse (ssadd ty newse))
          )
        )
      )
    );结束progn
  );结束if
)
[/PHP]
关于函数参数:
比较合理的做法,是应该对传入参数进行有效性判断和格式化。
<br>
例如本例中:
1.应该对参数SE的内容进行识别,看是否是对象选择集;
2.参数xory强制转换为大写或小写,以减少后续判断。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-5-17 13:25:27 | 显示全部楼层
5楼能否解释一下程序?程序好像有问题吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-5-20 23:40:16 | 显示全部楼层
这是我早先编的,实践证明效果不理想。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-17 11:46 , Processed in 0.177429 second(s), 44 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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