找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 549|回复: 10

[求助] 关于API 设置实体颜色的问题

[复制链接]

已领礼包: 34个

财富等级: 招财进宝

发表于 2017-6-21 14:50:23 | 显示全部楼层 |阅读模式

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

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

×
为什么使用rgb给块设置颜色的时候cad会崩溃?索引颜色使用的时候倒是没啥问题
  1. (defun txt-rnd ()         ; 随机数种子
  2.   (* (rem (getvar "cputicks") 1e3) 1e-3)
  3. )

  4. (defun txt-rndx2-list (a b n / lst c)  ; 随机整数表
  5.   (setq c (- b a))
  6.   (repeat n
  7.     (setq lst (cons (fix (+ a (* (txt-rnd) c))) lst))
  8.   )
  9. )

  10. ;改变块颜色
  11. (defun _blkchgclr (entname / elst n)
  12.     (setq elst (xdrx_block->entities entname T))
  13.     (foreach n elst
  14.       (xdrx_setpropertyvalue n "color" clr)
  15.     )
  16.     (xdrx_block_update entname)
  17. )

  18. ;随机块颜色(使用下来没问题)
  19. (defun c:rdmblkclr()
  20.   (prompt "\n选取要修改颜色的块<退出>:")
  21.   (setq ss(ssget '((0 . "INSERT")))
  22.    i 0
  23.   )
  24.   (repeat (sslength ss)
  25.     (setq ename1 (ssname ss i))
  26.     (setq clr (car (txt-rndx2-list 1 254 1)))
  27.     (setq i (+ 1 i))
  28.     (_blkchgclr ename1)
  29.   )
  30. )

  31. ;随机块颜色rgb(使用几次cad就会崩溃)
  32. (defun c:rdmblkclrrgb()
  33.   (prompt "\n选取要修改颜色的块<退出>:")
  34.   (setq ss(ssget '((0 . "INSERT")))
  35.    i 0
  36.   )
  37.   (repeat (sslength ss)
  38.     (setq ename1 (ssname ss i))
  39.     (setq rclr (car (txt-rndx2-list 40 200 1))
  40.           gclr (car (txt-rndx2-list 50 220 1))
  41.           bclr (car (txt-rndx2-list 30 180 1))
  42.     )
  43.     (setq clr (list rclr gclr bclr))
  44.     (setq i (+ 1 i))
  45.     (_blkchgclr ename1)
  46.   )
  47. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-6-21 15:05:34 | 显示全部楼层

以后有API的问题,请单独发帖,不要发在某个帖子下面,不利于发现处理。

看你上面的代码,随机整数的,API也有函数,不用你自己写了

(xdrx_math_rand 200)  ----- 返回 0-200之间的随机数
(xdrx_math_rand 200 1000) ----  返回 200-1000之间的随机整数


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

使用道具 举报

已领礼包: 34个

财富等级: 招财进宝

 楼主| 发表于 2017-6-21 15:08:20 | 显示全部楼层

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2017-6-21 16:10:13 | 显示全部楼层

由于ARX的一些固定的设定,对一些真彩色的点 第一位整数定义有歧义,所以,你的代码先把其中一个颜色定义成实数,ARX就当点来处理了。

这样改下,先
改下这行
(setq clr (list  rclr gclr  bclr))
为:
(setq clr (list (* 1.0 rclr) gclr  bclr))

  1. (defun c:rdmblkclrrgb ()
  2.   (prompt "\n选取要修改颜色的块<退出>:")
  3.   (setq        ss (ssget '((0 . "INSERT")))
  4.         i  0
  5.   )
  6.   (repeat (sslength ss)
  7.     (setq ename1 (ssname ss i))
  8.     (setq rclr (car (txt-rndx2-list 40 200 1))
  9.           gclr (car (txt-rndx2-list 50 220 1))
  10.           bclr (car (txt-rndx2-list 30 180 1))
  11.     )
  12.     (setq clr (list (* 1.0 rclr) gclr  bclr))
  13.     (setq i (+ 1 i))
  14.     (_blkchgclr ename1)
  15.   )
  16. )



另外,对于块,API有优化,设置实体属性时候,对于块,如果最后给参数T,那么自动嵌套设置所有,所以,你的代码可以优化

  1. (defun c:rdmblkclrrgb ()
  2.   (prompt "\n选取要修改颜色的块<退出>:")
  3.   (setq        ss (ssget '((0 . "INSERT")))
  4.         i  0
  5.   )
  6.   (repeat (sslength ss)
  7.     (setq ename1 (ssname ss i))
  8.   (setq        rclr (xdrx_math_rand 40 200)
  9.         gclr (xdrx_math_rand 50 220)
  10.         bclr (xdrx_math_rand 30 180)
  11.   )

  12.     (setq clr (list (* 1.0 rclr)  1.0 gclr  1.0 bclr))
  13.     (setq i (+ 1 i))
  14.     (xdrx_setpropertyvalue ename1 "color" (list clr t))
  15.   )
  16. )




不用去单独额外在调用你定义的函数去嵌套处理了。而且这个函数自动更新,不用调用 xdrx_block_update

另外,由于你是对选择集操作,如果你想选择的所有块都设置一个颜色的话,API还有优化,不用你去写遍历选集,直接调用 xdrx_entity_setproperty 函数对选集操作,你的代码继续优化为:
  1. (defun c:rdmblkclrrgb ()
  2.   (prompt "\n选取要修改颜色的块<退出>:")
  3.   (setq        ss (ssget '((0 . "INSERT")))
  4.         i  0
  5.   )
  6.   (setq        rclr (xdrx_math_rand 40 200)
  7.         gclr (xdrx_math_rand 50 220)
  8.         bclr (xdrx_math_rand 30 180)
  9.   )
  10.     (setq clr (list (* 1.0 rclr)  1.0 gclr  1.0 bclr))
  11.   (xdrx_entity_setproperty ss "color" (list clr t))
  12. )



其实,你这个应用,把嵌套所有实体颜色设置为BYLOCK, 然后只设置INSERT的颜色为你想要的就可以了。这样方便以后你设置颜色。


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

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

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

使用道具 举报

已领礼包: 769个

财富等级: 财运亨通

发表于 2017-6-22 13:09:49 | 显示全部楼层

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

使用道具 举报

已领礼包: 34个

财富等级: 招财进宝

 楼主| 发表于 2017-6-28 15:38:37 | 显示全部楼层

感谢,之前的代码修改以后没问题了,但是我后来又写了些代码,rgb第一位是整数,但是不会像之前那样导致cad崩溃,这是为什么呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 34个

财富等级: 招财进宝

 楼主| 发表于 2017-6-28 15:39:50 | 显示全部楼层
本帖最后由 cartman 于 2017-6-28 16:05 编辑

代码如下:
  1. (defun c:chgblkclr()
  2.   (if (not clr)
  3.     (setq clr "256")
  4.   )
  5.   (setq clr1 (getstring (strcat "\n颜色号<" clr ">(输入颜色索引号或者输入r,g,b):")))
  6.   (if (not (= (ASCII clr1) 0))
  7.     (setq clr clr1)
  8.   )
  9.   (setq clrrgb (strcat "rgb" clr))
  10.   (setq clrstr (XD::String:MatchNumAfter clrrgb "rgb" nil))
  11.   (setq clrnum nil)
  12.   (setq clrnum (mapcar
  13.                    '(lambda (x)
  14.                       (atoi x)
  15.                     )
  16.                    clrstr
  17.                )
  18.   )

  19.   (cond
  20.     ((= (length clrnum) 3)
  21.       (if (or (> (car clrnum) 255)
  22.               (< (car clrnum) 1)
  23.               (> (cadr clrnum) 255)
  24.               (< (cadr clrnum) 1)
  25.               (> (caddr clrnum) 255)
  26.               (< (caddr clrnum) 1)
  27.           )                        
  28.         (prompt "错误!rgb颜色号必须是1-255之间的数字")
  29.         (progn
  30.           (prompt "\n选取要修改颜色的块<退出>:")
  31.           (setq ss (ssget '((0 . "INSERT"))))
  32.           (xdrx_entity_setproperty ss "color" (list clrnum t))
  33.         )
  34.       )
  35.     )

  36.     ((= (length clrnum) 1)
  37.       (if (or (> (car clrnum) 255)
  38.               (< (car clrnum) 1)
  39.           )
  40.         (prompt "错误!颜色号索引必须是1-255之间的数字")
  41.         (progn
  42.           (prompt "\n选取要修改颜色的块<退出>:")
  43.           (setq ss (ssget '((0 . "INSERT"))))
  44.           (setq clrnum (car clrnum))
  45.           (xdrx_entity_setproperty ss "color" (list clrnum t))
  46.         )
  47.       )
  48.     )

  49.     (t
  50.       (prompt (strcat "\n颜色" clr "格式错误,请重新输入"))
  51.     )
  52.   )
  53. )




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

使用道具 举报

已领礼包: 34个

财富等级: 招财进宝

 楼主| 发表于 2017-6-28 15:47:35 | 显示全部楼层
本帖最后由 cartman 于 2017-6-28 16:25 编辑

这段代码用来改块颜色,可以输入索引号,也可以输入rgb,比如12,45,67,但是代码有点缺陷,比如输入的颜色带小数,如12.3,45.6,78.9,就会出错,导致后面改颜色输入rgb颜色没反应,但是如果再输入一次索引号颜色,比如4,然后再输入rgb颜色就又能使用了,我不知道哪里出错了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-6-28 16:13:15 | 显示全部楼层

试试把  

  1. (setq clrnum (mapcar
  2.                    '(lambda (x)
  3.                       (atoi x)
  4.                     )
  5.                    clrstr
  6.                )
  7.   )


改成:

  1. (setq clrnum (mapcar
  2.                    '(lambda (x)
  3.                       (atof x)
  4.                     )
  5.                    clrstr
  6.                )
  7.   )


看看。

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

使用道具 举报

已领礼包: 34个

财富等级: 招财进宝

 楼主| 发表于 2017-6-28 16:29:35 | 显示全部楼层

就是按tab键会缩进一段距离,我把那个距离改了,然后复制过来,格式全乱了,我没仔细看就发上来了,不过我已经手动把格式调整好了,我调整完了就把那句话给删了,但是刚删完你就回复我了。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 04:04 , Processed in 0.461572 second(s), 47 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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