明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1355|回复: 11

[提问] lisp实现排序

[复制链接]
发表于 2020-3-25 15:43 | 显示全部楼层 |阅读模式
本人不会用lisp程序排序,排序后最终效果如图纸中右侧所示,望各路高手赐教!

本帖子中包含更多资源

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

x

点评

看下六楼,就是我说的那几个函数配合  发表于 2020-3-26 11:20
发表于 2020-3-25 18:11 | 显示全部楼层
支持一下,以前好像有人发过出来的,你在论坛上找找。
发表于 2020-3-25 18:17 来自手机 | 显示全部楼层
vl-sort 先<y后<x,排序后表配合vl-remove-if和vl-remove-ifnot即可
 楼主| 发表于 2020-3-26 08:42 | 显示全部楼层

对这几个函数我还不是很清楚,这是我写的排序程序,但是实现不了我所想要的功能,麻烦您给看看
(defun c:zdx2()
  (setvar "cmdecho" 0)
  (setq osm(getvar "osmode"))
  (setvar "osmode" 0)
  (if (tblsearch "layer" "bhc")
             (command "layer" "s" "bhc" "")
             (command "layer" "n" "bhc" "c" "4" "bhc" "s" "bhc" "")
    )      
  (princ "\n 请选择需要编号的圆:")
  (setq ss (ssget '((0 . "circle"))));过滤选择圆zdx
  (setq sn (if ss (sslength ss) 0));设sn为选择集的个数
  (princ)
  (setq ns 0 )
  (setq a1(getstring "\n加前缀<P>:"))
  (if (= a1 "")(setq a1 "P"))          ;假若参数是字符,回车空格键都是空值,不是nil
  (setq a2(getint"\n请输入起始数值<1>:"))
  (if (= a2 nil)(setq a2 1))     ;假若参数为数值,回车等于nil
  (setq ss2 '())
   (while (and (< ns sn) ss)   ;and表示后面两个参数都有值,否则输出nil  
          (setq a(rtos a2 2 0))
          (setq aa(strcat a1 a))
          (setq ssg (entget (ssname ss ns))  ;逐一获取选择集中的图元信息
                  yx(assoc 10 ssg)        ;求出圆心
                 ss2(cons (cdr yx) ss2)
                  r (cdr (assoc 40 ssg))  ;返回半径
                  y(cadr yx)              ;求出文字Y坐标
                  x(-(caddr yx)(* 1.8 r)) ;求出文字x坐标
                     ns (1+ ns)
                     )
     ;;以下排序输出,还需改进,不能按y值排列
                     (setq ss3(vl-sort ss2
                                  (function
                                    (lambda (x y)
;;;                                            (< (car x) (car y))
                                              (< (cadr x) (cadr y))
                                              )
                                    )
                                  )
                      )
;;;                      )
                     (setq ss2-yx(car ss3))
                 (command "text" "j" "Mc"  ss2-yx (* 1.4 r) "0" aa);标注文字
                 (setq a2 (1+ a2))    ;数值累加
     )
  (command "undo" "e")
  (setvar "osmode" osm)
(princ)
  )
(prompt "****【c:zdx2】****")
(princ)
发表于 2020-3-26 09:58 | 显示全部楼层
  1. (defun c:tt(  / ss lst ent ls out i )
  2. (setq ss (ssget (list '(0 . "Circle"))))
  3. (setq ls nil)
  4. (while (> (sslength ss) 0)
  5. (setq ent (ssname ss 0))
  6. (setq ss (ssdel ent ss))
  7. (setq ls (cons (cdr (assoc 10 (entget ent))) ls))
  8.   )
  9. (setq out
  10. (vl-sort ls '(lambda (a b)
  11.                             (if
  12.                              (equal (cadr a) (cadr b) 0.1 )
  13.                              (< (car a) (car b))
  14.                              (< (cadr a) (cadr b))
  15.                              )
  16.                             )
  17.                          )
  18.       )
  19. (setq i 0)
  20. (foreach e out
  21. (entmake
  22.       (list '(0 . "TEXT")
  23.       (cons 10 e)
  24.       (cons 40  450)
  25.       (cons 1 (itoa i))

  26.       )
  27.     )
  28.   (setq i (+ 1 i))
  29. )
  30. )

试一哈哇
发表于 2020-3-26 11:10 | 显示全部楼层
本帖最后由 x_s_s_1 于 2020-3-26 11:14 编辑
lty 发表于 2020-3-26 08:42
对这几个函数我还不是很清楚,这是我写的排序程序,但是实现不了我所想要的功能,麻烦您给看看
(defun c ...

根据您的稍微改了一下


本帖子中包含更多资源

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

x
 楼主| 发表于 2020-3-26 15:10 | 显示全部楼层
x_s_s_1 发表于 2020-3-26 11:10
根据您的稍微改了一下

非常感谢,你的程序非常完美!
 楼主| 发表于 2020-3-26 15:12 | 显示全部楼层

谢谢了,但是您的这个程序只实现了数字编号,没有排号
发表于 2020-3-26 15:16 | 显示全部楼层
lty 发表于 2020-3-26 15:12
谢谢了,但是您的这个程序只实现了数字编号,没有排号

改下就可以,思路是那样的
发表于 2020-3-27 21:28 | 显示全部楼层
打开你的图是空白的  
(setq lst '((1 1) (1 2) (1 3) (2 1) (2 2) (2 3)))
(vl-sort lst '(lambda (e1 e2)(if (equal (cadr e1) (cadr e2) 1)(< (car e1) (car e2))
(< (cadr e2) (cadr e1)))))
返回结果:((1 3) (2 3) (1 2) (2 2) (1 1) (2 1))
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-13 21:14 , Processed in 0.160279 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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