请教各位,LISP又遇到难题了(对本人来讲是难题)
本帖最后由 45296876 于 2013-4-9 15:55 编辑(Defun C:ccc (/ )
(setq a (getreal "\n请输入文字高度:"))
(setq b 0)
(setq aa (ssget '((0 . "INSERT") (66 . 1))))
(setq a1 (ssname AA b))
(setq ss (sslength aa))
(repeat ss
(setq b (+ 1 b))
(setq a2 (entget a1))
(setq a3 (ENTGET (EntNext (CDARa2))))
(entmod (subst (cons 40 a ) (assoc 40 a3) a3))
(command"regen")
(princ)
);repeat闭括号
);defun闭括号
这段代码我运行以后,CAD中屏幕一个劲的闪,最后只改掉了第一个选择的那个块的字高。这是为什么,REPEAT用的不是地方吗?用什么方法可以一次性修改大批量的块文字高度呢?望各位刺激
(command "regen")不能在repeat循环里,每次步进a1要更新,(setq a1 (ssname AA b))要放在repeat循环里!改好如下:
(Defun C:ccc (/ A B AA A1 A2 A3)
(setq a (getreal "\n请输入文字高度:"))
(setq b -1)
(setq aa (ssget '((0 . "INSERT") (66 . 1))))
(repeat (sslength aa)
(setq a1 (ssname AA (setq b (1+ b))))
(setq a2 (entget a1))
(setq a3 (ENTGET (EntNext (CDAR a2))))
(entmod (subst (cons 40 a) (assoc 40 a3) a3))
)
(command "regen")
(princ)
) Gu_xl 发表于 2013-4-9 15:59 static/image/common/back.gif
(command "regen")不能在repeat循环里,每次步进a1要更新,(setq a1 (ssname AA b))要放在repeat循环里! ...
谢谢你,我马上试试,可行的话我就按你改写的进行自已重练,直到体会到里面函数的真正意义为止。再次感谢。 个人看法:(command "regen")换成(entupd a1)更好一些。 Gu_xl 发表于 2013-4-9 15:59 static/image/common/back.gif
(command "regen")不能在repeat循环里,每次步进a1要更新,(setq a1 (ssname AA b))要放在repeat循环里! ...
(entmod (subst (cons 41 c ) (assoc 41 a3) a3))我在改字高的后面又加了一句这个,为什么运行后没有反应了。望版主帮忙 本帖最后由 45296876 于 2013-4-9 17:24 编辑
ll_j 发表于 2013-4-9 16:33 http://bbs.mjtd.com/static/image/common/back.gif
个人看法:(command "regen")换成(entupd a1)更好一些。
(entmod (subst (cons 41 c ) (assoc 41 a3) a3))我在改字高的后面又加了一句这个,为什么运行后就只改宽度了呢,高度没有变
ENTUPD确实比我之前的好用,不会闪屏了。高手真是多啊。真心感谢论坛和群内的朋友们。
(Defun C:ccc (/ a b c a1 a2 a3 )
(princ "\n本程序纯属本人学习之用")
(setq a (getreal "\n请输入文字高度:"))
;(setq c (getreal "\n请输入文字宽度比例:"))
(setq b -1)
(setq aa (ssget '((0 . "INSERT") (66 . 1))))
(repeat (sslength aa)
(setq a1 (ssname aa (setq b (1+ b))))
(setq a2 (entget a1))
(setq a3 (entget (entnext (cdar a2))))
(entmod (subst (cons 40 a ) (assoc 40 a3) a3))
; (entmod (subst (cons 41 c ) (assoc 41 a3) a3))
(entupd a1);更新A1图元,相当于生新生成图元
);repeat闭括号
;(princ)
);defun闭括号
本帖最后由 45296876 于 2013-4-9 17:02 编辑
只改变了一项,晕
试试这样
(Defun C:ccc (/ A B AA A1 A2 A3)
(setq a (getreal "\n请输入文字高度:"))
(setq b -1)
(setq aa (ssget '((0 . "INSERT") (66 . 1))))
(repeat (sslength aa)
(setq a1 (ssname AA (setq b (1+ b))))
(setq a2 (entnext a1))
(setq a3 (ENTGET a2))
(while (= (cdr (assoc 0 a3)) "ATTRIB")
(entmod (subst (cons 40 a) (assoc 40 a3) a3))
(setq a2 (entnext a2)
a3 (entget a2)
)
(entupd a1)
)
)
(princ)
)
ll_j 发表于 2013-4-9 17:17 static/image/common/back.gif
试试这样
我试了一下,可以用,但我刚刚用REPEAT,想先把这个搞明白再用WHILE这个函数。但还是要谢谢你。这个LISP我先保存下来了,以便日后学习之用。 (entmod (subst (cons 41 c ) (assoc 41 a3) a3))
(entmod (subst (cons 40 a ) (assoc 40 a3) a3))
这两句谁在后面,最后返回的结果就是谁,为什么呢?两项不能够同时改吗?还是需要再加什么函数?