找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3318|回复: 25

[LISP函数]:SET 函数有什么用?

[复制链接]
发表于 2005-8-18 12:34:51 | 显示全部楼层 |阅读模式

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

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

×
大家都很熟悉 SETQ 函数。
SET 函数却很少用。它最适合于哪些应用? 能否给个实例?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-8-18 14:03:47 | 显示全部楼层
搜索一下 “set”
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 10246个

财富等级: 富甲天下

发表于 2005-8-18 14:59:15 | 显示全部楼层
例:统计图中每种图块的数量。

  1. (DEFUN C:SUMBLK ()
  2. (IF (SETQ SS (SSGET "X" '((0 . "INSERT")))) (PROGN
  3.   (SETQ SL (SSLENGTH SS) I 0 BL (LIST))
  4.   (REPEAT SL
  5.    (SETQ ENT (ENTGET (SSNAME SS I)) I (1+ I)
  6.          BNM (CDR (ASSOC 2 ENT)))
  7.    (IF (EVAL (READ BNM))
  8.     (SET (READ BNM) (1+ (EVAL (READ BNM))))
  9.    (PROGN
  10.     (SETQ BL (CONS (LIST BNM 0) BL))
  11.     (SET (READ BNM) 0)
  12.    ))
  13.   )
  14.   (SETQ SL (LENGTH BL) I 0 BL (REVERSE BL))
  15.   (PRINC "图块名:数量\n")
  16.   (REPEAT SL
  17.    (SETQ B (NTH I BL) BNM (CAR B)
  18.          BL (SUBST (LIST BNM (EVAL (READ BNM))) B BL))
  19.    (PRINC BNM) (PRINC " : ")
  20.    (PRINC (EVAL (READ BNM))) (PRINC "\n")
  21.    (SETQ I (1+ I))
  22.    (SET (READ BNM) nil)
  23.   )
  24. ))
  25. (PRINC)
  26. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-18 18:24:35 | 显示全部楼层
非常感谢3楼的程序, 不仅是一个set 函数的很好的应用, 也是一个非常实用的程序,可以用来统计材料表。

该程序的核心语句应该是
(SET (READ BNM) (1+ (EVAL (READ BNM)))

主要思路我看懂了, 就是以每个块的块名作为变量名, 并作为该块数量的累加器, 程序简洁,妙哉!

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

使用道具 举报

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

使用道具 举报

已领礼包: 10246个

财富等级: 富甲天下

发表于 2005-8-19 08:31:23 | 显示全部楼层
三楼程序有BUG,下面是更改过的程序。
[php]
(DEFUN C:SUMBLK ()
(IF (SETQ SS (SSGET "X" (LIST (CONS 0 "INSERT")))) (PROGN
  (SETQ SL (SSLENGTH SS) I 0 BL (LIST))
  (REPEAT SL
   (SETQ ENT (ENTGET (SSNAME SS I)) I (1+ I)
         BNM (CDR (ASSOC 2 ENT)))
   (IF (EVAL (READ BNM))
    (SET (READ BNM) (1+ (EVAL (READ BNM))))
   (PROGN
    (SETQ BL (CONS (LIST BNM 1) BL))
    (SET (READ BNM) 1)
   ))
  )
  (SETQ SL (LENGTH BL) I 0 BL (REVERSE BL))
  (PRINC "图块名:数量\n")
  (REPEAT SL
   (SETQ B (NTH I BL) BNM (CAR B)
         BL (SUBST (LIST BNM (EVAL (READ BNM))) B BL))
   (PRINC BNM) (PRINC " : ")
   (PRINC (EVAL (READ BNM))) (PRINC "\n")
   (SETQ I (1+ I))
   (SET (READ BNM) nil)
  )
))
(PRINC)
)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-19 12:04:50 | 显示全部楼层
zxq0220 的程序很好用。

可以举一反三地运用 set 函数 对图层、颜色等进行统计操作
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-9-3 19:58:28 | 显示全部楼层
用set统计存在的问题(看最下方的评论):
[iframe h=600 w=100%]http://www.mjtd.com/blog/user1/46/archives/2005/57.asp[/iframe]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-3 20:32:23 | 显示全部楼层
关于8楼所贴评论中提到的问题
“不能重复使用(数量会累加)”应该是由于该程序未设清零。
“用纯数字做块名,会出错。”是因为程序中用块名作为变量名, 而变量名不能为全数字。可以通过用一个字符加上块名作为变量名的方法来解决。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-9-3 21:51:32 | 显示全部楼层
这样一来,程序就臃肿了。光是清除程序中的变量名就有的写了,如果变量名(块名)保存为表,那么用set就显得多此一举(就本例而言)
set除了不能以数字为变量名,还不能用函数名和保留字,如 'list 'PI 'T。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-9-4 01:33:10 | 显示全部楼层
这样写,以前我发过一个关于属性修改的,用属性名保存属性值,还有以前写的一个合并直线也是用 set 和 eval ,这就是Lisp特有的一种表处理方法。

  1. (defun c:sumblk        (/ ss sl i ent  bnm bl)
  2.   ;;
  3.   (if (setq ss (ssget '((0 . "insert"))))
  4.     (progn
  5.       (setq sl (sslength ss)
  6.             i  0
  7.       )
  8.       (repeat sl
  9.         (setq ent (entget (ssname ss i))
  10.               i          (1+ i)
  11.               bnm (strcat "EA_" (cdr (assoc 2 ent)))
  12.         )
  13.         (if (eval (read bnm))
  14.           (set (read bnm) (1+ (eval (read bnm))))
  15.           (set (read bnm) 1)
  16.         )
  17.         (setq bl (if (not (vl-position bnm bl))
  18.                    (cons bnm bl)
  19.                    bl
  20.                  )
  21.         )
  22.       )
  23.       (if bl
  24.         (progn (mapcar '(lambda        (x)
  25.                           (princ (strcat "\n图块" (substr x 4) "数量: "))
  26.                           (princ (eval (read x)))
  27.                         )
  28.                        bl
  29.                )
  30.                (mapcar '(lambda (x) (set (read x) nil)) bl);_这个要定义到 *error* 中释放变量
  31.                (setq bl nil);_也要加入到 *error* 中
  32.         )
  33.       )
  34.     )
  35.   )
  36.   (princ)
  37. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-4 01:34:02 | 显示全部楼层
能否再介绍一个不用set函数统计图块数量的lisp程序?以便比较一下哪一种方法效率高?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-9-4 01:48:16 | 显示全部楼层

  1. ;|   Written By Eachy 2004.1.12
  2. 功能: 图块数量统计;;
  3. 说明: 根据点取的典型图块统计, 可以多选 ;;
  4. |;
  5. (defun c:Ea:BlkNum  (/ ss ssl i bn bl pos)
  6.   (princ "\n拾取统计范围[All - 全选].....")
  7.   (if (setq ss (ssget '((0 . "insert"))))
  8.     (progn
  9.       (setq ssl        (sslength ss)
  10.             i        -1
  11.       )
  12.       (repeat ssl
  13.         (setq bn (cdr (assoc 2 (entget (ssname ss (setq i (1+ i)))))))
  14.         (if bl
  15.           (if (setq pos (assoc bn bl))
  16.             (setq bl (subst (cons bn pos) pos bl))
  17.             (setq bl (append (list (list bn)) bl))
  18.           )
  19.           (setq bl (list (list bn)))
  20.         )
  21.       )
  22.       (mapcar '(lambda (x)
  23.                  (princ (strcat "\n图块" (car x) "数量: "))
  24.                  (princ (length x))
  25.                )
  26.               bl
  27.       )
  28.     )
  29.   )
  30.   (princ)
  31. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-4 20:35:34 | 显示全部楼层
eachy 在13楼贴出的程序也很精炼,对表的操作技巧很高,值得学习。

和用set函数的程序(见11楼)相比, 13楼的程序运行时所需要的存储空间可能要大,因为它是建立一个表bl,这个表把每个块的块名按该块的数量罗列起来,构成一个子表,这个子表的长度即该块的数量。如果图中块的数量越大, 这个表 bl 就会越大, 所需要的存储空间就越大。另外块名的长短也直接影响所需要的存储空间 的大小。

而用set函数的程序是给每个块设一个累加器,累加器的数量即选择集中不同块名的数量。所以所需存储空间不会随块的数量而增加。

另外从计算机算法上, 实现累加器应该比实现表的添加扩充简单得多。

综上所述, 我认为还是用set函数的程序(11楼)比用创建表来统计块的程序(13楼)效率要高。

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

使用道具 举报

发表于 2005-9-4 20:45:41 | 显示全部楼层
说到效率,我也很感兴趣,不知道哪位大侠可以拿一个大图测试一下?
期待结论ing
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 16:38 , Processed in 0.446809 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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