找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: ybyuan

[LISP函数]:请高手指点

[复制链接]
 楼主| 发表于 2003-5-2 15:26:51 | 显示全部楼层
aeo,你的程序很好用,非常感谢。可惜的是,核心技术我无法搞懂。不知能否指点一二。
eachy改动后的程序好像不能用,不知哪里出了问题。还有,我还是没懂关于排序的问题,用什么命令排序呢?能举例说明吗?谢谢。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-5-2 16:06:20 | 显示全部楼层
排序:
比如大小排序 li--> '(2 6 1 0 5)
(vl-sort li '(lamba(x y)(< x y))) -->'(0 1 2 5 6)
xdrx_sort-pointoncurve 实际是对点到实体的起点的距离大小排序.

用trim写,好象也要对circle排序的,不然就搞不清要trim那一个(是老的还是新生成的)
或者这么写:每次新老都trim一次,反正已经trim好的再trim是不发生变化的.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2003-5-2 16:07:09 | 显示全部楼层
最初由 ybyuan 发布
[B]aeo,你的程序很好用,非常感谢。可惜的是,核心技术我无法搞懂。不知能否指点一二。
eachy改动后的程序好像不能用,不知哪里出了问题。还有,我还是没懂关于排序的问题,用什么命令排序呢?能举例说明吗?谢谢。 [/B]

给你贴几个以前收集的函数参考。

  1. ;;升序排列(省略重复项):;
  2. ;;(setq lst1 '(3 5.4 3 -0.4) lst1 (range1 lst1))
  3. ;;返回    (-0.4 3.0 5.4)
  4. (defun range1 (a / b mn mx)
  5.   (setq        mn (apply 'min a)
  6.         mn (1- mn)
  7.   )
  8.   (while (< mn (setq mx (apply 'max a)))
  9.     (setq b (cons mx b)
  10.           a (subst mn mx a)
  11.     )
  12.   )
  13.   b
  14. )
  15. ;;升序排列(不省略重复项):;
  16. ;;(setq lst1 '(3 5.4 3 -0.4) lst1 (range2 lst1))
  17. ;;返回    (-0.4 3.0 3.0 5.4)
  18. (defun range2 (a / b c mn mx)
  19.   (setq        mn (apply 'min a)
  20.         mn (1- mn)
  21.   )
  22.   (while (< mn (setq mx (apply 'max a)))
  23.     (setq c a
  24.           a (subst mn mx a)
  25.     )
  26.     (while (setq c (member mx c))
  27.       (setq c (cdr c)
  28.             b (cons mx b)
  29.       )
  30.     )
  31.   )
  32.   b
  33. )
  34. ;;降序排列(不省略重复项):;
  35. ;;(setq lst1 '(3 5.4 3 -0.4) lst1 (range3 lst1))
  36. ;;返回    (5.4 3.0 3.0 -0.4)
  37. (defun range3 (a / b c mn mx)
  38.   (setq        mx (apply 'max a)
  39.         mx (1+ mx)
  40.   )
  41.   (while (> mx (setq mn (apply 'min a)))
  42.     (setq c a
  43.           a (subst mx mn a)
  44.     )
  45.     (while (setq c (member mn c))
  46.       (setq c (cdr c)
  47.             b (cons mn b)
  48.       )
  49.     )
  50.   )
  51.   b
  52. )

另外还有Vla函数


  1. [B][color=blur]VL-sort[/color][/B]

  2. 根据给定的比较函数来对表中的元素排序
  3. (vl-sort  list comparison-function)

  4. 参数

  5. list

  6. 任意表。

  7. comparison-function

  8. 比较函数。它可以是任何一个这样的函数:接受如下两个参数,如果第一个参数按排序顺序在第
  9. 二个元素之前,则返回 T 或非 nil
  10. 值。comparison-function 的值可以采用如下格式:

  11. 符号 (函数名)
  12.         '(LAMBDA (A1 A2) ...)
  13.         (FUNCTION (LAMBDA (A1 A2) ...))

  14. 返回值

  15. 表,其中包含 list 中的元素,这些元素按照 comparison-function 中指定的顺序排列。表中可能删除了重复的元素。

  16. 样例

  17. 对数值表排序:

  18. _$ (vl-sort '(3 2 1 3) '<)

  19. (1 2 3)     ;  

  20. 请注意结果表中仅包含一个 3。
  21. 按 Y 坐标对二维点表排序:

  22. _$ (vl-sort '((1 3) (2 2) (3 1))
  23.              (function (lambda (e1 e2)
  24.                          (< (cadr e1) (cadr e2)) ) ) )

  25. ((3 1) (2 2) (1 3))

  26. 对符号表排序:

  27. _$ (vl-sort  
  28.    '(a d c b a)
  29.    '(lambda (s1 s2)
  30.      (< (vl-symbol-name s1) (vl-symbol-name s2)) ) )

  31. (A B C D)       ;  请注意在结果表中仅有一个 A

  32. [B][color=red]Vl-sort-i[/color][/B]

  33. 根据给定的比较函数对表中的元素排序,并返回元素的索引号
  34. (vl-sort-i  list comparison-function)

  35. 参数

  36. list

  37. 任意表。

  38. comparison-function

  39. 比较函数。它可以是任何一个这样的函数:接受如下两个参数,如果第一个参数按排序顺序
  40. 在第二个元素之前,则返回 T 或非 nil
  41. 值。comparison-function 的值可以采用如下格式:

  42. 符号 (函数名)
  43.         '(LAMBDA (A1 A2) ...)
  44.         (FUNCTION (LAMBDA (A1 A2) ...))

  45. 返回值

  46. 表,其中包含 list 中元素的索引值,这些值按照 comparison-function 指定的次序排列。表中保留重复的元素。

  47. 样例

  48. 按降序排列字符表:

  49. _$ (vl-sort-i '("a" "d" "f" "c") '>)

  50. (2 1 3 0)

  51. 排序后,表的顺序为 "f" "d" "c"  "a"。"f" 是原始表中的第三个元素(索引号为 2),"d" 是表
  52. 的第二个元素(索引号为 1)依此类推。
  53. 按升序排列数值表:

  54. _$ (vl-sort-i '(3 2 1 3) '<)

  55. (2 1 3 0)

  56. 请注意在结果表中包含两个 3 的索引号。
  57. 按 Y 坐标对二维点表排序:

  58. _$ (vl-sort-i '((1 3) (2 2) (3 1))
  59.              (function (lambda (e1 e2)
  60.                          (< (cadr e1) (cadr e2)) ) ) )

  61. (2 1 0)

  62. 对符号表排序:

  63. _$ (vl-sort-i  
  64.    '(a d c b a)
  65.    '(lambda (s1 s2)
  66.      (< (vl-symbol-name s1) (vl-symbol-name s2)) ) )

  67. (4 0 3 2 1)

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

使用道具 举报

发表于 2003-5-2 17:33:13 | 显示全部楼层
本程序特点:
1。不用排序
2。可跳过交叉以及重合的圆
3。对直线起始点在圆内有效
4。操作过程仅仅需要点击一次(选择直线)
5。纯lisp程序
6。目前仅仅对line有效

使用了以下技巧:
1。ssget "fence"方式选择集自动排序
2。entlast取得需要剪切的实体


  1. ;;剪除圆,椭圆中的线段---------完成!!!v1.0 仅限对直线有效
  2. ;;for xdcad 论坛
  3. (defun c:xtr (/ ll le ss i e ptc)
  4. (princ "\nxtr====剪除圆,椭圆中的线段-----------lxx.2003.5")
  5. (Command ".undo" "be")
  6. (setq  ll (car (entsel "\n 选择直线:"))
  7.            le (entget  ll)
  8.           ss (ssget "f" (list (cdr (assoc 10 le)) (cdr (assoc 11 le)) ) '((0 . "CIRCLE,ELLIPSE")) )
  9.           i 0)
  10. (entdel ll)
  11. (entmake le)  ;方便调整顺序
  12. (repeat (sslength ss)
  13.    (setq e (ssname ss i)
  14.            ptc (cdr (assoc 10 (entget e)))
  15.            i (1+ i)
  16.    )
  17.    (Command "_.trim" e "" (list (entlast) ptc) ^c )
  18. )
  19. (Command ".undo" "e")
  20. (princ)
  21. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2003-5-2 19:30:19 | 显示全部楼层
根据 eachy 前面帖子的思路改的
可以剪切所有线条,不仅仅是直线,可以是pl,spline,circle,arc,ellipse等等。就是速度慢点.  cadr14测试通过
'

  1. ;;剪除圆,椭圆中的线段---------完成!!!v1.1 b 版本b   -------  对所有线有效
  2. ;;for xdcad 论坛
  3. (defun c:xtr (/ ll le ss i e ptc)
  4. (princ "\nxtr====剪除圆,椭圆中的线段v1.1b 对所有线有效-----------lxx.2003.5")
  5. (Command ".undo" "be")
  6. (princ "\n选择剪切边界")
  7. (setq  ss (ssget  '((0 . "CIRCLE,ELLIPSE")) )
  8.            ll (car (entsel "\n 选择要剪切的线条:"))
  9.            lss (cons ll lss)                                                              ;;要剪切的实体组表
  10.            laste (entlast)
  11.            i 0)
  12. (repeat (sslength ss)
  13.    (setq e (ssname ss i)
  14.             ptc (cdr (assoc 10 (entget e)))
  15.             i (1+ i)
  16.    )
  17.    (mapcar '( lambda(x)  (Command "_.trim" e "" (list x ptc) ^c )) lss)    ;;对表中每个实体trim
  18.    (while  (setq nexte (entnext laste))
  19.                (setq  lss (cons nexte lss)
  20.                          laste nexte
  21.                )
  22.    )
  23. )
  24. (Command ".undo" "e")
  25. (princ)
  26. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-5-3 10:09:16 | 显示全部楼层
19贴
ss (ssget "f" (list (cdr (assoc 10 le)) (cdr (assoc 11 le)) ) '((0 . "CIRCLE,ELLIPSE")) )

其实"f"扫过,已经 排序 好了的.先选直线,再ssget(任意选)圆应该不行.(所以说不要排序,可能你那么理解)

这样就只好交的全trim了

用21贴的吧.好象还可改进,但没必要了,能用就行.(就是新老都trim)

好玩,练练xdapi

  1. (defun c:br( / circle j line pt ptn ss)
  2. (if(and(setq line(car(entsel)))
  3.         (not(redraw line 3))
  4.         (setq ss(ssget '((0 . "CIRCLE,ELLIPSE,lwpolyline"))))  )
  5. (progn(setq ptn '() len(sslength ss) j 0)
  6.   (while(< j len)(setq circle(ssname ss j))
  7.    (if(xdrx_getinters line circle )
  8.     (progn
  9.     (setq pt(xdrx_getinters line circle 1 ) )
  10.     (if(>(length pt)1)
  11.     (setq pt1(car(vl-sort pt'(lambda(a b)
  12.             (>(xdrx_curve_getDistAtPoint line a)(xdrx_curve_getDistAtPoint line b)))))
  13.           dis(xdrx_curve_getDistAtPoint line pt1)
  14.           pc(xdrx_midp (car pt)(cadr pt))
  15.           ptn(cons(list pc circle dis)ptn) )
  16.    )))
  17.     (setq j(1+ j))
  18.   )
  19.   (setq ptn(vl-sort ptn'(lambda(a b)(>(last a)(last b)))))
  20.   (command"undo""group")
  21.   (mapcar '(lambda(x)(command "trim"(cadr x)"" (list line (car x))"")) ptn)
  22.   (command"undo""end")
  23.   ))(princ)
  24. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2003-6-8 14:16:31 | 显示全部楼层
  1. [font=courier]
  2. (defun C:tt (/ cir ln index name cen n)
  3.   (setvar "cmdecho" 0)
  4.   (if (progn
  5.         (prompt "\n select the circle:")
  6.         (setq cir (ssget '((0 . "circle"))))
  7.         (setq ln (car (entsel "\nselect line: ")))
  8.       )
  9.     (progn
  10.       (setq index 0
  11.             n 0
  12.       )
  13.       (repeat (sslength cir)
  14.         (setq name (ssname cir index))
  15.         (setq index (1+ index))
  16.         (setq cen (cdr (assoc 10 (entget name))))
  17.         (command ".trim" name "" (list ln cen) "")
  18.         (if entlst
  19.           (setq entlst (list (entlast)))
  20.           (setq entlst (append (list (entlast)) entlst))
  21.         )
  22.       )
  23.       ;;处理嵌套圆
  24.       (repeat (sslength cir)
  25.         (setq name (ssname cir n))
  26.         (setq n (1+ n))
  27.         (setq cen (cdr (assoc 10 (entget name))))
  28.         (foreach e entlst
  29.           (command ".trim" name "" (list e cen) "")
  30.         )
  31.       )
  32.     )
  33.   )
  34.   (princ)
  35. )
  36. [/font]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2004-1-2 14:10:42 | 显示全部楼层
[QUOTE]最初由 梦断江南 发布
[B]根据 eachy 前面帖子的思路改的
可以剪切所有线条,不仅仅是直线,可以是pl,spline,circle,arc,ellipse等等。就是速度慢点.  cadr14测试通过
[QUOTE]


  1. ;;对"POLYLINE"恐怕不行!
  2. ;;
  3. ;;修改LUCAS

  4. (defun C:XTRR (/ LL LE SS I E PTC LSS NEXTE LASTE)
  5.   (princ
  6.     "\nxtr====剪除圆,椭圆中的线段v1.1b 对所有线有效-----------lxx.2003.5"
  7.   )
  8.   (command ".undo" "be")
  9.   (princ "\n选择剪切边界")
  10.   (setq        SS    (ssget '((0 . "CIRCLE,ELLIPSE")))
  11.         LL    (car (entsel "\n 选择要剪切的线条:"))
  12.         TYP   (cdr (assoc 0 (entget LL)))
  13.         LSS   (cons LL LSS)                ;要剪切的实体组表
  14.         LASTE (entlast)
  15.         I     0
  16.   )
  17.   (repeat (sslength SS)
  18.     (setq E   (ssname SS I)
  19.           PTC (cdr (assoc 10 (entget E)))
  20.           I   (1+ I)
  21.     )
  22.     (mapcar '(lambda (X) (command "_.trim" E "" (list X PTC) ^C))
  23.             LSS
  24.     )

  25.     ;;对表中每个实体trim
  26.     (if        (not (equal LASTE (entlast)))
  27.       (progn
  28.         (if (/= TYP "POLYLINE")
  29.           (while (setq NEXTE (entnext LASTE))
  30.             (setq LSS        (cons NEXTE LSS)
  31.                   LASTE        NEXTE
  32.             )
  33.           )
  34.           (progn
  35.             (setq NEXTE (entnext LASTE))
  36.             (while NEXTE
  37.               (if (and (= (cdr (assoc 0 (entget NEXTE))) "POLYLINE")
  38.                        (not (member NEXTE LSS))
  39.                   )
  40.                 (setq LSS   (cons NEXTE LSS)
  41.                       LASTE NEXTE
  42.                 )
  43.               )
  44.               (setq NEXTE (entnext NEXTE))
  45.             )
  46.           )
  47.         )
  48.       )
  49.     )

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-27 00:11 , Processed in 0.354386 second(s), 50 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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