明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1967|回复: 10

[求助]打碎块保留属性值程序的问题

[复制链接]
发表于 2008-4-1 20:34:00 | 显示全部楼层 |阅读模式
程序是写出来了,可在运行过程中出现不少问题
首先是文字的对齐方式,块属性里为中上,而写出的文字居中,这样就导致打碎后出现版面非常乱。
再就是删除ATTDEF过程也不太正常
请高人修改,谢谢!
  1. ;打碎块后保留其属性值
  2. ;思路:根据ATTRIB写TEXT,打碎块,删除ATTDEF
  3. ;参考http://www.mjtd.com/Codes/ArticleShow.asp?ArticleID=1190
  4. (defun c:def (/ tc ss ent1 newtxt )
  5. (setq tc (getvar "clayer"))
  6. (prompt "\n请选择需要被打碎的块")
  7. (setq ss (ssget '((0 . "INSERT"))))
  8. (repeat (setq n (sslength ss))
  9.   (setq ent1 (entget (ssname ss (setq n (1- n)))))
  10.   (setvar "clayer" (get 8 ent1))
  11.   (while (/= (get 0 (setq ent1 (entget (entnext (get -1 ent1))))) "SEQEND")
  12.    (if (= (get 0 ent1) "ATTRIB")
  13.     (progn
  14.      (setq newtxt '((0 . "TEXT")))
  15.      (setq lst '(67 410 10 40 1 50 41 51 7 71 72 11 210 73))
  16.      (foreach xh lst
  17.       (setq dd (assoc xh ent1))
  18.       (if (/= dd nil)
  19.        (setq newtxt (append newtxt (list (assoc xh ent1))))
  20.       )
  21.      )
  22.      (entmake newtxt)
  23.     );progn
  24.    );if
  25.   );while
  26. );repeat
  27. (command "explode" ss)
  28. (setq ss (ssget "_P" '((0 . "ATTDEF"))))
  29. (command "erase" ss "")
  30. (setvar "clayer" tc)
  31. (princ)
  32. )
 楼主| 发表于 2008-4-1 20:43:00 | 显示全部楼层
附图和自定义的get
  1. (defun get (aaaaa bbbbb /)
  2.   (cdr (assoc aaaaa bbbbb))
  3. )

本帖子中包含更多资源

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

x
 楼主| 发表于 2008-4-2 09:56:00 | 显示全部楼层

前辈高人们帮帮忙呀!

发表于 2008-4-2 16:44:00 | 显示全部楼层
  1. (defun blkexp(blkref / adwg owner lst attrs atttextstr tmptext eblks )
  2.   ;首先把其中的可见的属性给分解成文字,然后炸开,然后删除获得的属性,并且重复运行,以便完全炸开镶嵌块--
  3.   (setq adwg(vlax-get (vlax-get-acad-object) 'Activedocument)
  4.     owner(vlax-get blkref 'ownerid)
  5.     owner(vlax-invoke adwg 'ObjectIDToObject owner)
  6.     lst '( "Alignment" "backward" "color"  "layer"  "linetypescale" "linetype"  "lineweight"
  7.           "obliqueangle"  "Rotation" "ScaleFactor" "StyleName" "TextAlignmentPoint" "Thickness" "upsidedown"))
  8.   (if (eq (vlax-get blkref 'hasattributes) -1)
  9.     (progn
  10.       (setq attrs(vlax-invoke blkref 'getattributes))
  11.       (mapcar '(lambda(x)(if (and (not (eq -1 (vlax-get x 'invisible)));可见属性
  12.                   (not (eq "" (setq atttextstr(vlax-get x 'textstring)))));属性值非""
  13.                (progn
  14.                  (setq tmptext(vlax-invoke owner 'AddText atttextstr (vlax-get x 'insertionpoint)
  15.                                                              (vlax-get x 'height)))
  16.                  (mapcar '(lambda(y)(setq y(read y))(vlax-put tmptext y (vlax-get x y))) lst)
  17.                )
  18.                ))attrs)
  19.     )
  20.   )
  21.   ;上面把属性改成了文字,下面就是炸开块了~~~~~
  22.   (setq eblks(vlax-invoke blkref 'explode))
  23.   (mapcar '(lambda(x)
  24.          (if (eq "AcDbAttributeDefinition" (vlax-get x 'objectname))
  25.            (vlax-invoke x 'delete);属性删除--
  26.            (progn
  27.          (if (eq "AcDbBlockReference" (vlax-get x 'objectname));是块,则继续炸开~~~
  28.            (blkexp x)
  29.          )
  30.            )
  31.          )
  32.          ) eblks)
  33.   (vlax-invoke blkref 'delete)
  34.   (princ)
  35. )
发表于 2008-4-3 08:03:00 | 显示全部楼层
  1. ;;在不爆開塊下把屬性值提出
  2. ;;BY LUCAS
  3. (defun C:DEF (/ DD ENT ENT1 LST N NEWTXT SS TC)
  4.   (vl-load-com)
  5.   (setq TC (getvar "clayer"))
  6.   (prompt "\n請選擇屬性圖塊")
  7.   (if (setq SS (ssget '((0 . "INSERT") (66 . 1))))
  8.     (repeat (setq N (sslength SS))
  9.       (setq ENT1 (entget (ssname SS (setq N (1- N)))))
  10.       (setvar "clayer" (GET 8 ENT1))
  11.       (while
  12. (/= (GET 0
  13.    (setq ENT1 (entget (setq ENT (entnext (GET -1 ENT1)))))
  14.      )
  15.      "SEQEND"
  16. )
  17.   (if (= (GET 0 ENT1) "ATTRIB")
  18.     (progn
  19.       (setq NEWTXT '((0 . "TEXT")))
  20.       (setq LST '(67 410 10 40 1 50 41 51 7 71 72 11 210))
  21.       (foreach XH LST
  22.         (setq DD (assoc XH ENT1))
  23.         (if (/= DD NIL)
  24.    (setq NEWTXT (append NEWTXT (list (assoc XH ENT1))))
  25.         )
  26.       )
  27.       (setq
  28.         NEWTXT (append NEWTXT
  29.          (list (cons 73 (cdr (assoc 74 ENT1))))
  30.         )
  31.       )
  32.       (entmake NEWTXT)
  33.       (vla-delete (vlax-ename->vla-object ENT))
  34.     )
  35.   )
  36.       )
  37.     )
  38.   )
  39.   (setvar "clayer" TC)
  40.   (princ)
  41. )
  42. (defun GET (AAAAA BBBBB /)
  43.   (cdr (assoc AAAAA BBBBB))
  44. )

点评

这个可以炸开属性块,保留文字?  发表于 2018-5-11 20:38
 楼主| 发表于 2008-4-3 10:46:00 | 显示全部楼层

感谢前辈们的支持。

4楼的大部分为vlax函数,我这部分实在没有学会,但我把程序记下来了,供以后参考。

5楼的程序非常实用,对我错误的程序稍做改动,便十分完美了。

再次感谢龙龙仔!

发表于 2008-4-3 13:18:00 | 显示全部楼层
LUCAS 出手就是不同凡响...
发表于 2008-12-22 11:42:00 | 显示全部楼层
请问这个程序应该怎么运行呢,我保存成lisp文件后运行def提示语法错误是怎么回事?
发表于 2008-12-22 12:49:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2013-11-16 19:45:06 | 显示全部楼层
众里寻他千百度
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-26 05:17 , Processed in 0.192699 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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