找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1196|回复: 11

[LISP程序]:怎样构造一个选择集

[复制链接]
发表于 2006-2-19 06:42:45 | 显示全部楼层 |阅读模式

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

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

×
当CAD图中有大量的数据时,用LISP语言构造一个数字选择集,且能取出其最大值,最小值,并且能在图上用一红框标示出来;而且自动计算出这个选择集的平均值,在屏幕上提示,请大家帮助解决此问题。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-2-19 07:01:16 | 显示全部楼层
此问题有点难.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2006-2-19 10:31:56 | 显示全部楼层
编程难度不大,思路可以很清晰
1,(ssget '((0 . "TEXT")(1 . "*#*"))) 构造选集
2 提取 文本内容 dxf 1 ,如果文本值distof 为真,将实体名和文本值组成点对(文本值 . 实体名)放入表 lst.  如果表lst不为空:
3 对表lst 按car 排序 (vla-sort lst '(lambda(x y)(< (car x)(car y)))) 得新表 lst2
4 求平均值 (/ (mapcar 'car lst) (length lst)) ;用princ 显示出来
5 求最大值并标示:
  最大值文本实体 e:(cdr (last lst2))
    用vla-boundingbox 求e的包围盒ptmin,ptmax
    画矩形框
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-2-19 17:06:38 | 显示全部楼层
  1. [FONT=courier new](load "xyp_lib.vlx")  ;版本 V.20060211(2064)
  2. ;|下载和加载通用函数(可在签名栏直接下载后放到搜索路径下)
  3. 利用以下任何一种方式(首选第一种)即可加载和运行通用函数内的所有子程序:
  4. ★1·在acad.lsp中增加(load"xyp_lib.vlx")
  5. ■2·在每个程序内增加(load"xyp_lib.vlx")
  6. ■3·在command下,输入(load"xyp_lib.vlx")
  7. ■4·在菜单.mnl中增加(load"xyp_lib.vlx")
  8. ■5·将xyp_lib.vlx文件直接拽到cad屏幕
  9. [COLOR=red] ★通用函数下载地址:[/COLOR]
  10. [url]http://www.xdcad.net/forum/attachment.php?s=&postid=1606661[/url]
  11. |;

  12. ;;;构造数字选择集,
  13. ;;;1、取出其最大值,最小值,并在图上分别用一红、绿放框标示出来;
  14. ;;;2、自动计算出这个选择集的平均值,在屏幕上提示。
  15. (defun c:test ()
  16.   (CMDLA0)
  17.   (setq        ss    (ssget '((0 . "*TEXT")))
  18.         i     -1
  19.         ss1   (ssadd)
  20.         count nil
  21.   )
  22.   (while (setq s1 (ssname ss (setq i (1+ i))))
  23.     (if        (distof (dxf 1 (entget s1)))
  24.       (setq ss1 (ssadd s1 ss1))
  25.     )
  26.   )
  27.   (if (and ss1 (>= (sslength ss1) 2))
  28.     (progn      
  29.       (setq s0          (ssname ss1 0)
  30.             s01          (ssname ss1 1)
  31.             num0  (distof (dxf 1 (entget s0)))
  32.             num01 (distof (dxf 1 (entget s01)))
  33.             count (+ num0 num01)
  34.             i          1
  35.       )
  36.       (if (>= num0 num01)
  37.         (setq smax s0
  38.               nmax num0
  39.               smin s01
  40.               nmin num01
  41.         )
  42.         (setq smax s01
  43.               nmax num01
  44.               smin s0
  45.               nmin num0
  46.         )
  47.       )
  48.       (while (setq s1 (ssname ss1 (setq i (1+ i))))
  49.         (setq dxf1  (distof (dxf 1 (entget s1)))
  50.               count (+ count dxf1)
  51.         )
  52.         (if (>= dxf1 nmax)
  53.           (setq        smax s1
  54.                 nmax dxf1
  55.           )
  56.         )
  57.         (if (< dxf1 nmin)
  58.           (setq        smin s1
  59.                 nmin dxf1
  60.           )
  61.         )
  62.       )
  63.       (mkla "MAX" 1)
  64.       (setq pt1        (xyp-get-MinMaxPoint smax 1)
  65.             pt9        (xyp-get-MinMaxPoint smax 9)
  66.       )
  67.       (command "rectang" pt1 pt9)
  68.       (mkla "MIN" 3)
  69.       (setq pt1        (xyp-get-MinMaxPoint smin 1)
  70.             pt9        (xyp-get-MinMaxPoint smin 9)
  71.       )
  72.       (command "rectang" pt1 pt9)
  73.     )
  74.   )
  75.   (princ "\n实体数 = ")
  76.   (princ i)
  77.   (princ "\n最大值 = ")
  78.   (princ nmax)
  79.   (princ "\n最小值 = ")
  80.   (princ nmin)
  81.   (princ "\n累计值 = ")
  82.   (princ count)
  83.   (princ "\n平均值 = ")
  84.   (princ (/ count i 1.0))
  85.   (CMDLA1)
  86. )[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-20 07:14:49 | 显示全部楼层
谢谢,版主的速度真快,很好用,但有一点,当数据很多时,做的红绿框也不显,找这两个框很困难,不知是否还有更好的方法,比如将这两个数字着色改为蓝色。另外最小值和最大值平均值能否出来一个屏幕提示?再次感谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-2-20 08:00:28 | 显示全部楼层
最初由 wcf 发布
[B]谢谢,版主的速度真快,很好用,但有一点,当数据很多时,做的红绿框也不显,找这两个框很困难,不知是否还有更好的方法,比如将这两个数字着色改为蓝色。另外最小值和最大值平均值能否出来一个屏幕提示?再次感谢! [/B]

加条连线?!
  1. [FONT=courier new](load "xyp_lib.vlx")                        ;版本 V.20060211(2064)
  2. ;|下载和加载通用函数(可在签名栏直接下载后放到搜索路径下)
  3. 利用以下任何一种方式(首选第一种)即可加载和运行通用函数内的所有子程序:
  4. ★1·在acad.lsp中增加(load"xyp_lib.vlx")
  5. ■2·在每个程序内增加(load"xyp_lib.vlx")
  6. ■3·在command下,输入(load"xyp_lib.vlx")
  7. ■4·在菜单.mnl中增加(load"xyp_lib.vlx")
  8. ■5·将xyp_lib.vlx文件直接拽到cad屏幕
  9. ★通用函数下载地址:
  10. [url]http://www.xdcad.net/forum/attachme...&postid=1606661[/url]
  11. |;

  12. ;;;构造数字选择集,
  13. ;;;1、取出其最大值,最小值,并在图上用一红方框及连线标示出来;
  14. ;;;2、自动计算出这个选择集的平均值,在屏幕上提示。
  15. (defun c:test ()
  16.   (CMDLA0)
  17.   (setq        ss    (ssget '((0 . "*TEXT")))
  18.         i     -1
  19.         ss1   (ssadd)
  20.         count nil
  21.   )
  22.   (while (setq s1 (ssname ss (setq i (1+ i))))
  23.     (if        (distof (dxf 1 (entget s1)))
  24.       (setq ss1 (ssadd s1 ss1))
  25.     )
  26.   )
  27.   (if (and ss1 (>= (sslength ss1) 2))
  28.     (progn
  29.       (setq s0          (ssname ss1 0)
  30.             s01          (ssname ss1 1)
  31.             num0  (distof (dxf 1 (entget s0)))
  32.             num01 (distof (dxf 1 (entget s01)))
  33.             count (+ num0 num01)
  34.             i          1
  35.       )
  36.       (if (>= num0 num01)
  37.         (setq smax s0
  38.               nmax num0
  39.               smin s01
  40.               nmin num01
  41.         )
  42.         (setq smax s01
  43.               nmax num01
  44.               smin s0
  45.               nmin num0
  46.         )
  47.       )
  48.       (while (setq s1 (ssname ss1 (setq i (1+ i))))
  49.         (setq dxf1  (distof (dxf 1 (entget s1)))
  50.               count (+ count dxf1)
  51.         )
  52.         (if (>= dxf1 nmax)
  53.           (setq        smax s1
  54.                 nmax dxf1
  55.           )
  56.         )
  57.         (if (< dxf1 nmin)
  58.           (setq        smin s1
  59.                 nmin dxf1
  60.           )
  61.         )
  62.       )
  63.       (mkla "depoint" 1)
  64.       (setq pt1        (xyp-get-MinMaxPoint smax 1)
  65.             pt9        (xyp-get-MinMaxPoint smax 9)
  66.             pt5        (xyp-get-MinMaxPoint smax 5)
  67.       )
  68.       (command "rectang" pt1 pt9)
  69.       (setq pt1         (xyp-get-MinMaxPoint smin 1)
  70.             pt9         (xyp-get-MinMaxPoint smin 9)
  71.             pt55 (xyp-get-MinMaxPoint smin 5)
  72.       )
  73.       (command "rectang" pt1 pt9)

  74.       (command "line" pt5 pt55 "")
  75.     )
  76.   )
  77.   (princ "\n实体数 = ")
  78.   (princ i)
  79.   (princ "\n最大值 = ")
  80.   (princ nmax)
  81.   (princ "\n最小值 = ")
  82.   (princ nmin)
  83.   (princ "\n累计值 = ")
  84.   (princ count)
  85.   (princ "\n平均值 = ")
  86.   (princ (/ count i 1.0))
  87.   (princ)
  88.   (alert (strcat "\n实体数 = "
  89.                  (rtos i)
  90.                  "\n最大值 = "
  91.                  (rtos nmax)
  92.                  "\n最小值 = "
  93.                  (rtos nmin)
  94.                  "\n平均值 = "
  95.                  (rtos (/ count i 1.0))
  96.          )
  97.   )
  98.   (CMDLA1)
  99. )[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-20 08:43:43 | 显示全部楼层
我试了一下,连线有了,能找着了,另外屏幕提示也有了。但是屏幕提示不想马上关,想加一个最小化按钮,然后继续其它的操作,不知能否做到,再次感谢。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-2-20 12:43:52 | 显示全部楼层
屏幕提示(Alert)不关,其它的操作无法进行。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-20 19:20:32 | 显示全部楼层
明白了,是这种语言的限制的关系。如果想实现这个功能,只能用其它的语言了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2006-2-20 19:43:53 | 显示全部楼层
  1.   (while (setq s1 (ssname ss (setq i (1+ i))))
  2.     (if        (distof (dxf 1 (entget s1)))
  3.       (setq ss1 (ssadd s1 ss1))
  4.     )
  5.   )

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-29 04:17 , Processed in 0.208476 second(s), 54 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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