找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 626|回复: 8

[编程申请]:若该数字小于1200则将其改为1200且将其颜色改为红色

[复制链接]
发表于 2005-9-16 17:42:18 | 显示全部楼层 |阅读模式

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

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

×
(求LSP程序,cad2002用)判断选定的数字,若该数字小于1200则将其改为1200且将其颜色改为红色,谢谢。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-9-17 01:36:29 | 显示全部楼层
你试试吧,找了两个通用函数,问题解决了

  1. (defun c:ll (/ ss s1 i sn sl sp sp1 sl1 ia sp2 a b)
  2.   (command "undo" "be")
  3.   (setq        ss (ssget '((0 . "TEXT")))
  4.         s1
  5.            (ssadd)
  6.         sl
  7.            (sslength ss)
  8.         i
  9.            0
  10.         sn
  11.            (ssname ss i)
  12.   )
  13.   (repeat sl
  14.     (progn (setq sp  (entget (ssname ss i))
  15.                  sp1
  16.                      (cdr (assoc 1 sp))
  17.            )
  18.            (setq b (strisnum sp1))
  19.            (if (= b T)
  20.              (progn (setq a (atoi sp1))
  21.                     (if        (< a 1200)
  22.                       (progn (setq s1 (ssadd (ssname ss i) s1)
  23.                                    i  (+ i 1)
  24.                              )
  25.                       )
  26.                       (setq i (+ i 1))
  27.                     )
  28.              )
  29.              (setq i (+ i 1))
  30.            )
  31.     )
  32.   )
  33.   (setq        sl1 (sslength s1)
  34.         ia  0
  35.   )
  36.   (if (> sl1 0)
  37.     (progn (command "change" s1 "" "p" "c" 1 "")
  38.            (repeat sl1
  39.              (progn
  40.                (setq sp2 (entget (ssname s1 ia))
  41.                      sp2 (subst (cons 1 "1200") (assoc 1 sp2) sp2)
  42.                                         ;sp2        ((subst (cons 62 1) (assoc 62 sp2) sp2))
  43.                )
  44.                (entmod sp2)

  45.                (setq ia        (+ ia 1)
  46.                )
  47.              )

  48.            )
  49.     )
  50.   )
  51.   (command "undo" "end")
  52.   (prin1)
  53. )

  54. (princ "\n文字变数----LL")
  55. (prin1)

  56. ;;;功能  
  57. ;;;确定字符串是否为数字  
  58. ;;;语法  
  59. ;;;(strIsNum str)  
  60. ;;;参数  
  61. ;;;Str: str 检查的字符串  
  62. ;;;返回值  
  63. ;;;[LOG] T :字符串为数字, F 字符串不是数字  
  64. ;;;样例  
  65. ;;;(setq a '123')
  66. ;;;(setq b '1B5')
  67. ;;;(strIsNum a) 返回 T
  68. ;;;(strIsNum b) 返回 F  

  69. (defun strIsNum        (str / ascList n len return char)
  70.   (setq ascList (stoal str))
  71.   (setq n 0)
  72.   (setq return T)
  73.   (setq len (length ascList))
  74.   (while (and return (< n len))
  75.     (setq char (nth n ascList))
  76.     (if        (or
  77.           (and (>= char 48)                ; 0
  78.                (<= char 57)
  79.           )                                ; 9
  80.           (= char 46)                        ; .
  81.         ) ;_ end of or
  82.       (setq return T)
  83.       (setq return nil)
  84.     ) ;_ end of if
  85.     (setq n (1+ n))
  86.   ) ;_ end of while
  87.   return
  88. ) ;_ end of defun


  89. ;;;功能  
  90. ;;;将字符串转换为以ASCII码表示的整数的列表  
  91. ;;;语法  
  92. ;;;(stoal strA)  
  93. ;;;参数  
  94. ;;;要转换为列表的字符串  
  95. ;;;返回值  
  96. ;;;ASCII码列表  

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

使用道具 举报

发表于 2005-9-17 22:44:53 | 显示全部楼层
  1. [FONT=courier new](defun c:test ()
  2.   (CMDLA0)
  3.   (setq        ss (ssget '((0 . "TEXT")))
  4.         i  -1
  5.   )
  6.   (while (setq s1 (ssname ss (setq i (1+ i))))
  7.     (setq tx (dxf 1 (entget s1)))
  8.     (if        (< (distof tx) 1200)
  9.       (sub_upd s1 1 "1200")
  10.     )
  11.   )
  12.   (CMDLA1)
  13. )[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-9-17 23:44:03 | 显示全部楼层
xyp,您的命令没把小于1200的烽变成红色,还有,就是如果选到的字不是整数字符串或实数字符串,就不行了,我加的那两个通用函数就是那个目的,可以把字都滤出选择集,对于这个命令,我认为还可以延伸的就是把1200变成用户输入的,只要输入过一回,回车就确认那种方式,这个命令就算是一个通用的命令了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-9-17 23:58:45 | 显示全部楼层
最初由 青马 发布
[B]xyp,您的命令没把小于1200的烽变成红色,还有,就是如果选到的字不是整数字符串或实数字符串,就不行了,我加的那两个通用函数就是那个目的,可以把字都滤出选择集,对于这个命令,我认为还可以延伸的就是把1200变成... [/B]

修改:
  1. [FONT=courier new](defun c:test ()
  2.   (CMDLA0)
  3.   (setq        ss (ssget '((0 . "TEXT")))
  4.         i  -1
  5.   )
  6.   (while (setq s1 (ssname ss (setq i (1+ i))))
  7.     (setq tx (dxf 1 (entget s1)))
  8.     (if        (and (distof tx) (< (distof tx) 1200))
  9.       (progn
  10.         (sub_upd s1 1 "1200")
  11.         (command "change" s1 "" "p" "co" 1 "")
  12.       )
  13.     )
  14.   )
  15.   (CMDLA1)
  16. )[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-9-18 01:29:56 | 显示全部楼层

  1. (defun c:test ()
  2.   (setq        ss (ssget '((0 . "TEXT")(1 . "#*")))
  3.         i  -1
  4.   )
  5.   (while (setq s1 (ssname ss (setq i (1+ i))))
  6.     (setq tx (distof(cdr(assoc 1 (setq ent(entget s1))))))
  7.     (if(and tx        (< tx 1200))
  8.         (entmod (append (subst (cons 1 "1200")(assoc 1 ent) ent) '((62 . 1))))
  9.       )
  10.   )(princ)
  11. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-9-18 23:49:15 | 显示全部楼层
最初由 狂刀 发布
[B][code]
(defun c:test ()
  (setq        ss (ssget '((0 . "TEXT")(1 . "#*")))
        i  -1
  )
  (while (setq s1 (ssname ss (setq i (1+ i))))
    (setq tx (distof(cdr(assoc 1 (setq ent(entget s1))))))
    (if... [/B]


又学到了新东西,#*过滤真是太方便了,不过我看了一下书,发现#是匹配任何单个字母,@是匹配任何单个数字,我用@*过滤试了,只能选重字母开头的text,感觉是书上写错了

还有一个问题了,命令中定义的ent(实体属性列表),如果text是随层的,62代码不会出现,用(append ent '((62 . 1))很明白,但我又设了一个不随层的数,(62 .3),用append后,ent中就有两组62的代码,(62 . 3 ) (62 .1) 后者在列表的尾部,字真是变成了红色,但我不明白了,为什么有两组62的代码,都没有问题,为什么是以最后的那个(62 .1)为准呢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-9-19 11:21:40 | 显示全部楼层
第一个问题。是什么书啊?你应该看cad帮助。#是数字
第二个:为什么为什么?程序写多了。就会发现一些书上不一定讲到的窍门。你写多了也一样。至于原理是什么?你真要知道的话得问编写autocad的人。
我感觉有点像堆栈,后面的后入,但是用同一个“地址”,就把原来前面的数据“冲”掉了。
所以,传递给entmod的表不是一个“好”表,但是在cad自己数据处理的时候,把这个bug忽略了。结果是正常的。
这样,在entmod实体表的时候,不一定要用subst,用append也是可以的:)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-19 19:27:40 | 显示全部楼层
谢谢青马、谢谢xyp1964斑竹、谢谢狂刀大侠,三位的程序在CAD2002上测试可用。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-22 04:22 , Processed in 0.251080 second(s), 48 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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