明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4343|回复: 29

[函数] 请教各位,LISP又遇到难题了(对本人来讲是难题)

  [复制链接]
发表于 2013-4-9 15:18 | 显示全部楼层 |阅读模式
本帖最后由 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 (CDAR  a2))))
   (entmod (subst (cons 40 a ) (assoc 40 a3) a3))
   (command  "regen")
(princ)
  );repeat闭括号
);defun闭括号




这段代码我运行以后,CAD中屏幕一个劲的闪,最后只改掉了第一个选择的那个块的字高。这是为什么,REPEAT用的不是地方吗?用什么方法可以一次性修改大批量的块文字高度呢?望各位刺激
发表于 2013-4-9 15:59 | 显示全部楼层

(command "regen")不能在repeat循环里,每次步进a1要更新,(setq a1 (ssname AA b))要放在repeat循环里!改好如下:
  1. (Defun C:ccc (/ A B AA A1 A2 A3)
  2.   (setq a (getreal "\n请输入文字高度:"))
  3.   (setq b -1)
  4.   (setq aa (ssget '((0 . "INSERT") (66 . 1))))
  5.   (repeat (sslength aa)
  6.     (setq a1 (ssname AA (setq b (1+ b))))
  7.     (setq a2 (entget a1))
  8.     (setq a3 (ENTGET (EntNext (CDAR a2))))
  9.     (entmod (subst (cons 40 a) (assoc 40 a3) a3))
  10.     )
  11.   (command "regen")
  12.   (princ)
  13.   )
 楼主| 发表于 2013-4-9 16:10 | 显示全部楼层
Gu_xl 发表于 2013-4-9 15:59
(command "regen")不能在repeat循环里,每次步进a1要更新,(setq a1 (ssname AA b))要放在repeat循环里! ...

谢谢你,我马上试试,可行的话我就按你改写的进行自已重练,直到体会到里面函数的真正意义为止。再次感谢。
发表于 2013-4-9 16:33 | 显示全部楼层
个人看法:(command "regen")换成(entupd a1)更好一些。
 楼主| 发表于 2013-4-9 16:44 | 显示全部楼层
Gu_xl 发表于 2013-4-9 15:59
(command "regen")不能在repeat循环里,每次步进a1要更新,(setq a1 (ssname AA b))要放在repeat循环里! ...

(entmod (subst (cons 41 c ) (assoc 41 a3) a3))我在改字高的后面又加了一句这个,为什么运行后没有反应了。望版主帮忙
 楼主| 发表于 2013-4-9 16:57 | 显示全部楼层
本帖最后由 45296876 于 2013-4-9 17:24 编辑
ll_j 发表于 2013-4-9 16:33
个人看法:(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闭括号
 楼主| 发表于 2013-4-9 17:00 | 显示全部楼层
本帖最后由 45296876 于 2013-4-9 17:02 编辑

只改变了一项,晕
发表于 2013-4-9 17:17 | 显示全部楼层
试试这样
  1. (Defun C:ccc (/ A B AA A1 A2 A3)
  2.   (setq a (getreal "\n请输入文字高度:"))
  3.   (setq b -1)
  4.   (setq aa (ssget '((0 . "INSERT") (66 . 1))))
  5.   (repeat (sslength aa)
  6.     (setq a1 (ssname AA (setq b (1+ b))))
  7.     (setq a2 (entnext a1))
  8.     (setq a3 (ENTGET a2))
  9.     (while (= (cdr (assoc 0 a3)) "ATTRIB")
  10.       (entmod (subst (cons 40 a) (assoc 40 a3) a3))
  11.       (setq a2 (entnext a2)
  12.       a3 (entget a2)
  13.       )
  14.       (entupd a1)
  15.     )
  16.   )
  17.   (princ)
  18. )

 楼主| 发表于 2013-4-9 17:27 | 显示全部楼层
ll_j 发表于 2013-4-9 17:17
试试这样

我试了一下,可以用,但我刚刚用REPEAT,想先把这个搞明白再用WHILE这个函数。但还是要谢谢你。这个LISP我先保存下来了,以便日后学习之用。
 楼主| 发表于 2013-4-9 17:38 | 显示全部楼层
(entmod (subst (cons 41 c ) (assoc 41 a3) a3))
     (entmod (subst (cons 40 a ) (assoc 40 a3) a3))
这两句谁在后面,最后返回的结果就是谁,为什么呢?两项不能够同时改吗?还是需要再加什么函数?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-18 21:30 , Processed in 0.243526 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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