明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2351|回复: 14

[函数] 新问题 请教,还是属性块的问题。

[复制链接]
发表于 2013-4-10 11:38 | 显示全部楼层 |阅读模式
本帖最后由 45296876 于 2013-4-11 12:43 编辑



下面就是经超版指点所完成的批量修改属性块文字的字高与字宽程序,真心感谢此论坛的各坛友与版主。谢谢



  1. (defun c:zg(/ a b c d e f g )
  2.   
  3. (setq a (getdist "\n输入字高:"))
  4.   (setq b (getdist "\n请输入字宽比例:"))
  5. (setq c -1)
  6.   (setq d (ssget '((0 . "INSERT") (66 . 1))));获得包含'((0 . "INSERT") (66 . 1))两种信息的图块,也就是说获得有属性的图块
  7. (repeat (sslength d)
  8.    (setq e (ssname d (setq c (+ 1 c))))
  9.    (setq f e)
  10.   
  11.   (while (and
  12.            (setq f (entnext f))
  13.            (= "ATTRIB" (cdr (assoc 0 (setq g (entget f)))))
  14.            )   

  15.    (setq g (entmod (subst (cons 40 a) (assoc 40 g) g)))
  16.            (entmod (subst (cons 41 b) (assoc 41 g) g))
  17.   

  18.   (entupd e)
  19.     );while闭括号
  20.   );repeat闭括号
  21.   
  22.   (princ)
  23.   );defun闭括号
发表于 2020-8-14 23:22 | 显示全部楼层
谢谢分享学习了,解决了我很多问题
 楼主| 发表于 2013-4-10 17:27 | 显示全部楼层
木有人回答啊……
发表于 2013-4-10 17:42 | 显示全部楼层
属性块没玩过,估计也就是加个循环把一个块里面的属性都弄出来按条件处理下。

你可以先去查查看怎么得到属性块内的全部属性文字。
 楼主| 发表于 2013-4-11 08:38 | 显示全部楼层
wowan1314 发表于 2013-4-10 17:42
属性块没玩过,估计也就是加个循环把一个块里面的属性都弄出来按条件处理下。

你可以先去查查看怎么得到 ...

暂时先这样,研究一下吧,等有人帮忙再看看。也许这回能自已解决了,如果解决了就把源码发上来给大家参考一下。

点评

http://bbs.mjtd.com/forum.php?mod=viewthread&tid=99980可供参考。搜索下还有很多  发表于 2013-4-11 08:50
 楼主| 发表于 2013-4-11 09:17 | 显示全部楼层
  1. (defun c:ccc()
  2. (setq a (getreal "\n输入字高:"))
  3.   (setq b (getreal "\n字宽:"))
  4. (setq c -1)
  5.   (setq d (ssget '((0 . "INSERT") (66 . 1))))
  6. (repeat (sslength d)
  7.    (setq e (ssname d (setq c (+ 1 c))))
  8.    (setq f (entnext (cdar ( entget e))))
  9.    (setq g (entget f))
  10.    (setq g (entmod (subst (cons 40 a) (assoc 40 g) g)))
  11.            (entmod (subst (cons 41 b) (assoc 41 g) g))
  12.   
  13. (setq h (entnext f))
  14.   (setq i (entget h))
  15.   (setq i (entmod (subst (cons 40 a) (assoc 40 i) i)))
  16.            (entmod (subst (cons 41 b) (assoc 41 i) i))

  17.   (setq j (entnext h))
  18.   (setq k (entget j))
  19.   (setq k (entmod (subst (cons 40 a) (assoc 40 k) k)))
  20.            (entmod (subst (cons 41 b) (assoc 41 k) k))

  21.    (setq L (entnext j))
  22.   (setq m (entget L))
  23.   (setq m (entmod (subst (cons 40 a) (assoc 40 m) m)))
  24.            (entmod (subst (cons 41 b) (assoc 41 m) m))
  25.   (entupd e)
  26.   );repeat闭括号       
  27.   (princ)
  28.   );defun闭括号
这样一个一个的做,把ENTMOD一直做下去,同时还要把ENTNEXT一直做下去,如何用WHILE判断呢?高手帮忙修改一下,谢谢
发表于 2013-4-11 09:29 | 显示全部楼层
45296876 发表于 2013-4-11 09:17
这样一个一个的做,把ENTMOD一直做下去,同时还要把ENTNEXT一直做下去,如何用WHILE判断呢?高手帮忙修改一 ...

.
.
.
(repeat (sslength d)
   (setq f (ssname d (setq c (+ 1 c))))
  (while (and
           (setq f (entnext f))
           (= "ATTRIB" (cdr (assoc 0 (setq g (entget f)))))
           )
    .
    .
    .
    )
  )
.
.
.
 楼主| 发表于 2013-4-11 09:43 | 显示全部楼层
Gu_xl 发表于 2013-4-11 09:29
.
.
.

超版就是超版,小弟在此学习了,谢谢。有啥问题我还会回来的。
 楼主| 发表于 2013-4-11 10:42 | 显示全部楼层
Gu_xl 发表于 2013-4-11 09:29
.
.
.
  1. (defun c:ccc()
  2. (setq a (getreal "\n输入字高:"))
  3.   (setq b (getreal "\n字宽:"))
  4. (setq c -1)
  5.   (setq d (ssget '((0 . "INSERT") (66 . 1))))
  6. (repeat (sslength d)
  7.    (setq e (ssname d (setq c (+ 1 c))))
  8.   

  9.   (while (and
  10.            (setq f (entnext f))
  11.            (= "attrib" (cdr (assoc 0 (setq g (entget f))))))
  12.     (setq f (entnext (cdar (entget e))))
  13.     (setq g (entget f))            
  14.   
  15.    (setq g (entmod (subst (cons 40 a) (assoc 40 g) g)))
  16.            (entmod (subst (cons 41 b) (assoc 41 g) g))
  17.   )

  18.   (entupd e)
  19.   );repeat闭括号       
  20.   (princ)
  21.   );defun闭括号
  22. 这里加载的时候提示点位置不对,望版主给指路明灯
发表于 2013-4-11 10:46 | 显示全部楼层
45296876 发表于 2013-4-11 10:42

(setq f (entnext (cdar (entget e))))
    (setq g (entget f))            
两句代码删掉!
要仔细阅读代码!看明白每句都是什么意思!
 楼主| 发表于 2013-4-11 10:53 | 显示全部楼层
本帖最后由 45296876 于 2013-4-11 10:53 编辑
Gu_xl 发表于 2013-4-11 10:46
(setq f (entnext (cdar (entget e))))
    (setq g (entget f))            
两句代码删掉!


(setq e (ssname d (setq c (+ 1 c))))这句里面如果不用entnext,能让assoc搜索到“ATTRIB”吗?直接ENTGET E,只能获得(0 . "INSERT")

点评

在while前将e赋给f , (setq f e)  发表于 2013-4-11 11:19
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-3 14:24 , Processed in 1.228304 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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