找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2453|回复: 20

[求助] 帮忙解释系带有颜色的字体

[复制链接]

已领礼包: 218个

财富等级: 日进斗金

发表于 2013-6-5 10:58:08 | 显示全部楼层 |阅读模式

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

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

×
帮忙解释系带有颜色的字体

(defun c:tt (/ ss l1)
  (if (setq ss (ssget '((0 . "*line,arc,circle,ellipse")))) ;_(8 . "1,2,3")))可以根据需要增加图层过滤
    (vl-catch-all-apply
      '(lambda (/ sl i e el lyr n ll tl)
  (setq sl (sslength ss)
        i  -1
  )
  (repeat sl
    (setq e   (ssname ss (setq i (1+ i)))
   el  (entget e)
   lyr (cdr (assoc 8 el))
   n   (strcat "Fy" lyr)
    )
    (set (read n) (cons e (eval (read n))))
    (if (vl-position n l1)
      nil
      (setq l1 (cons n l1)
     ll (cons lyr ll)
      )
    )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2013-6-5 12:59:09 | 显示全部楼层
本帖最后由 QiaoCheng 于 2013-6-5 13:00 编辑

比如
(setq e (car (entsel)))  => <图元名: 7e40b9b8>
(setq el (entget e))    => 图元列表
(setq lyr (cdr (assoc 8 el)))  => 图层名 如 "0"
(setq n   (strcat "Fy" lyr))   => "Fy0"
(set (read n) (cons e (eval (read n))))  => (<图元名: 7e40b9b8>)

不知道您看明白没,有结果再看函数帮助就很容易理解了

点评

(set (read n) (cons e (eval (read n)))) => () 这句话没有明白  详情 回复 发表于 2013-6-5 17:34

评分

参与人数 1D豆 +6 收起 理由
XDSoft + 6 及时回复奖!

查看全部评分

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

使用道具 举报

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

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2013-6-5 14:31:21 | 显示全部楼层
(set (read n) (cons e (eval (read n))))
这句话比较难理解,用了三个不太常用的函数:read、eval、set,帮助文件分别解释如下:
read——返回从一个字符串中获得的第一个表或第一个原子;
eval——返回 AutoLISP 表达式的求值结果;
set——将一个被引起来的符号名的值设置成一个表达式的值。
很是拗口。
结合本例通俗点解释,read就是把字符串n(图层名加前缀FY组成)变成“符号”,也就是变成变量名,eval是对这个变量名求值,set和setq功能类似,都是赋值,所不同的是,set可以对需要求值才得出的变量名进行赋值。
完整的一句意义是这样的:(假定0层)将图层“0”的实体名加入名为FY0的表中。直接理解为,将实体名e加入对FY0求值的表中构成一个新表,然后再将新表赋予FY0变量中(有点递归的意思)。
实话说,就特例而言,这句话的构成还是比较巧妙的,可以将所有同层的实体名都放置在一个FY前缀加实体名的变量中,但实际上,对Lisp语言特点而言,这种又是很拙的方法,因为Lisp的表结构不需要对每一个图层的表进行命名,一个动态的表可以包容一切。

点评

这也是一种特定应用,常规写法直接构造一个表,子表关键字为图层名称,然后遍历时用 assoc + subst 替换子表 不过用 set + eval 代码更好看些  详情 回复 发表于 2013-6-5 18:01

评分

参与人数 2D豆 +9 收起 理由
xshrimp + 5 技术引导讨论和指点奖!
XDSoft + 4 及时回复奖!

查看全部评分

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

使用道具 举报

发表于 2013-6-5 14:33:00 | 显示全部楼层
(setq n   (strcat "Fy" lyr))   => "Fy0"
(read n)=>FY0
(CONS E (READ N))=>(图元名 . FY0)
(SET (READ N) (CONS E (READ N)))=>(SETQ FY0  (图元名 . FY0))

SET 会计算两个参数   而SETQ只计算第二个参数。----setq 设置“静态的变量”,set设置“动态的变量”
  至于eval这个东西我测试不加也可以啊! 不晓得加了是出于什么考虑
这是我个人的理解。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2013-6-5 14:37:51 | 显示全部楼层
wowan1314 发表于 2013-6-5 14:33
(setq n   (strcat "Fy" lyr))   => "Fy0"
(read n)=>FY0
(CONS E (READ N))=>(图元名 . FY0)

eval不加是不行的,你再增加一个实体就看出不同了。

点评

加不加区别很大呀! 还在理解中。  详情 回复 发表于 2013-6-5 15:04

评分

参与人数 1D豆 +5 收起 理由
wowan1314 + 5 热心帮忙奖!

查看全部评分

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

使用道具 举报

发表于 2013-6-5 15:04:09 | 显示全部楼层
ll_j 发表于 2013-6-5 14:37
eval不加是不行的,你再增加一个实体就看出不同了。

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

使用道具 举报

发表于 2013-6-5 15:14:02 | 显示全部楼层
(READ N)=>FY0
(CONS E (READ N))=>(图元名 . FY0)这个READ出的FY0在CONS眼里是个是常量
(CONS E (EVAL (READ N)))=>(cons e FY0);这个FY0是个变量
=> FY0为nil 结果就是(图元名),FY0有值,结果就是(图元名...)图元名表。

评分

参与人数 1D豆 +5 收起 理由
ll_j + 5 悟得挺快^_^

查看全部评分

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

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2013-6-5 15:19:40 | 显示全部楼层
wowan1314 发表于 2013-6-5 15:14
(READ N)=>FY0
(CONS E (READ N))=>(图元名 . FY0)这个READ出的FY0在CONS眼里是个是常量
(CONS E (EVAL ( ...

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

使用道具 举报

已领礼包: 218个

财富等级: 日进斗金

 楼主| 发表于 2013-6-5 17:34:11 | 显示全部楼层
QiaoCheng 发表于 2013-6-5 12:59
比如
(setq e (car (entsel)))  =>
(setq el (entget e))    => 图元列表

(set (read n) (cons e (eval (read n))))  => (<图元名: 7e40b9b8>)
这句话没有明白

点评

ll_j元老已经解释的很清楚了 看地板和9楼  详情 回复 发表于 2013-6-5 17:41
(read n) -> 将字串转换为变量名 (eval (read n)) -> 变量的值,即表  详情 回复 发表于 2013-6-5 17:39
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-5 17:39:31 | 显示全部楼层
本帖最后由 Free-Lancer 于 2013-6-5 17:50 编辑
fkyourmather 发表于 2013-6-5 17:34
(set (read n) (cons e (eval (read n))))  => ()
这句话没有明白

(read n) -> 将字串转换为变量名
(eval (read n)) -> 变量的值,即表

例如: 字串n为 "fy0" => (read n) => 返回变量名称 fy0
(eval (read n))  <=> (eval (read "fy0")) <=> (eval fy0) => 返回变量 fy0 的表
(cons e (eval (read n))) => (cons e (eval fy0)) => (cons e fy0) 将 e 加入 fy0 表

这样做可以生成动态变量,并给变量赋值。图层名称前面加前缀是保证变量名为字串,因为图层可能为纯数字格式。

点评

(if (vl-position n l1) nil (setq l1 (cons n l1) ll (cons lyr ll) 这句我真得很难懂唉  详情 回复 发表于 2013-6-20 21:01
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-5 17:41:59 | 显示全部楼层
本帖最后由 QiaoCheng 于 2013-6-5 17:49 编辑
fkyourmather 发表于 2013-6-5 17:34
(set (read n) (cons e (eval (read n))))  => ()
这句话没有明白

ll_j元老已经解释的很清楚了
看地板和9楼
其实还有个方法,我也是这样遇到不懂得代码就在CAD自带的编辑器里逐步调试下
看下得到的是什么,再看函数帮助,比人家解释印象更深点

点评

(set (read n) (cons e (eval (read n)))) (if (vl-position n l1) nil (setq l1 (cons n l1) ll (cons lyr ll) 解释下没有看明白  详情 回复 发表于 2013-6-20 21:01
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-5 18:01:36 | 显示全部楼层
本帖最后由 Free-Lancer 于 2013-6-5 18:03 编辑
ll_j 发表于 2013-6-5 14:31
(set (read n) (cons e (eval (read n))))
这句话比较难理解,用了三个不太常用的函数:read、eval、set, ...

这也是一种特定应用,常规写法直接构造一个表,子表关键字为图层名称,然后遍历时用 assoc + subst 替换子表

不过用 set + eval 代码更好看些:)

BTW:l1 为了是收集变量,最后进行释放,不然会留下很多垃圾的!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 218个

财富等级: 日进斗金

 楼主| 发表于 2013-6-20 21:01:01 | 显示全部楼层
QiaoCheng 发表于 2013-6-5 17:41
ll_j元老已经解释的很清楚了
看地板和9楼
其实还有个方法,我也是这样遇到不懂得代码就在CAD自带的编辑 ...

  (set (read n) (cons e (eval (read n))))
    (if (vl-position n l1)
      nil
      (setq l1 (cons n l1)
     ll (cons lyr ll)
解释下没有看明白
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 218个

财富等级: 日进斗金

 楼主| 发表于 2013-6-20 21:01:55 | 显示全部楼层
Free-Lancer 发表于 2013-6-5 17:39
(read n) -> 将字串转换为变量名
(eval (read n)) -> 变量的值,即表

    (if (vl-position n l1)
      nil
      (setq l1 (cons n l1)
     ll (cons lyr ll)
这句我真得很难懂唉

点评

我来解释解释看能不能说明白 n --- 是一个字符串(strcat "fy" lyr),(read n) 后就是一个变量名称 fyxxx (vl-position n l1) -> 检测 l1 中是否有字符串 n,没有的话就将 n 加入表 l1 ll 是图层名称的列表  详情 回复 发表于 2013-6-20 21:32
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-25 12:28 , Processed in 0.229914 second(s), 70 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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