45296876 发表于 2013-4-9 15:18:32

请教各位,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用的不是地方吗?用什么方法可以一次性修改大批量的块文字高度呢?望各位刺激

Gu_xl 发表于 2013-4-9 15:59:17


(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)
)

45296876 发表于 2013-4-9 16:10:07

Gu_xl 发表于 2013-4-9 15:59 static/image/common/back.gif
(command "regen")不能在repeat循环里,每次步进a1要更新,(setq a1 (ssname AA b))要放在repeat循环里! ...

谢谢你,我马上试试,可行的话我就按你改写的进行自已重练,直到体会到里面函数的真正意义为止。再次感谢。

ll_j 发表于 2013-4-9 16:33:54

个人看法:(command "regen")换成(entupd a1)更好一些。

45296876 发表于 2013-4-9 16:44:01

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 16:57:50

本帖最后由 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:00:03

本帖最后由 45296876 于 2013-4-9 17:02 编辑

只改变了一项,晕

ll_j 发表于 2013-4-9 17:17:53

试试这样
(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)
)

45296876 发表于 2013-4-9 17:27:08

ll_j 发表于 2013-4-9 17:17 static/image/common/back.gif
试试这样

我试了一下,可以用,但我刚刚用REPEAT,想先把这个搞明白再用WHILE这个函数。但还是要谢谢你。这个LISP我先保存下来了,以便日后学习之用。

45296876 发表于 2013-4-9 17:38:00

(entmod (subst (cons 41 c ) (assoc 41 a3) a3))
   (entmod (subst (cons 40 a ) (assoc 40 a3) a3))
这两句谁在后面,最后返回的结果就是谁,为什么呢?两项不能够同时改吗?还是需要再加什么函数?
页: [1] 2 3
查看完整版本: 请教各位,LISP又遇到难题了(对本人来讲是难题)