明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 15959|回复: 48

炸开块中块→att属性成Text文字

  [复制链接]
发表于 2012-4-15 15:25:10 | 显示全部楼层 |阅读模式
;;炸开块中块→att属性成Text文字
;;借用了明经一位高手的程序,记不得是哪位了,很是抱歉.由于高手是用Vlisp,我对此不太懂,用此改造成炸开块中块,使用以来,没有发现问题.我至今也使用它.
;;欢迎大家指正
;;;***************************************************************************
(defun HH:ATT2TXT (/ EN I SS)
  (vl-load-com)
  ;;1  程序开始标记
  (defun UndoBegin ()
    (vla-StartUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
  )
  ;;2  程序结束标记
  (defun UndoEnd ()
    (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
  )
  ;;3  [功能] 获取在图元 en 之后产生的图元的选择集
  (defun HH:ss-entnext (en / ss)
    (setq ss (ssadd))
    (while (setq en (entnext en))
      (if (not (wcmatch (cdr (assoc 0 (entget en)))
   "ATTRIB,VERTEX,SEQEND"
        )
   )
(ssadd en ss)
      )
    )
    (if (zerop (sslength ss))
      (setq ss nil)
    )
    ss
  )
  ;;4  清理
  (defun HH:purge ()
    (repeat 3
      (vla-purgeall
(vla-get-activedocument (vlax-get-acad-object))
      )
    )
  )
  ;;5  选择集相减
  (defun SS_SSsub (ss1 ss2 / ss)
    (command "._Select" ss1 "_Remove" ss2 "")
    (if (equal (sslength ss1) (sslength ss2))
      nil
      (setq ss (ssget "_P"))
    )
  )
  ;;6  块爆破
  (defun explodeBlock (bloc / N SS SSATT SSBLOCKS)
    (command "explode" bloc)
    (setq ss (ssget "_P"))
    (setq ssAtt (ssget "_P" '((0 . "INSERT") (66 . 1))))
    (command "select" ss "")
    (setq ssBlocks (ssget "_P" '((0 . "INSERT,HATCH,REGION"))))
    (if (and ssAtt ssBlocks)
      (setq ssBlocks (SS_SSsub ssBlocks ssAtt))
    )
    (setq n -1)
    (if ssBlocks
      (repeat (sslength ssBlocks)
(explodeBlock (ssname ssBlocks (setq n (1+ n))))
      )
    )
    (setq n -1)
    (if ssAtt
      (repeat (sslength ssAtt) (A2T (ssname ssAtt (setq n (1+ n)))))
    )
    ssAtt
  )
  ;;7  属性块爆破
  ;;7.1 子函数
  (defun DXF (code elist) (cdr (assoc code elist)))
  ;;7.2 子函数
  (defun MakeObject (obj)
    (cond
      ((= (type obj) 'VLA-OBJECT) obj)
      ((= (type obj) 'ENAME) (vlax-ename->vla-object obj))
    )
  )
  ;;7.3 子函数
  (defun VarArray->List (vaobj)
    (vlax-SafeArray->List
      (vlax-Variant-Value vaobj)
    )
  )
  ;;7.4 子函数
  (defun Explode (obj / temp)
    (setq temp (vla-explode obj))
    (vla-delete obj)
    temp
  )
  ;;7.5 主函数
  (defun A2T (obj / ATTCOL ATTLIST ATTLYR ATTOBJ BKWD BLOCKS COLR ENT HEIGHT IDX INSPT
       JUST LASTENT1 LAYR LTYP N OBJLIST ROT SPACE SSATT SSBLOCKS STYLE TMP TXT
       TXTPT UPSID WIDTH
      )
    (setq lastent1 (entlast))
    (if (setq obj (MakeObject obj))
      (if (= (vla-get-hasattributes obj) :vlax-true)
(progn
   (setq attlist (varArray->List (vla-GetAttributes obj))
  idx 0
  layr (vla-get-layer obj)
  ltyp (vla-get-linetype obj)
  colr (vla-get-color obj)
   )
   (repeat (length attlist)
     (setq attobj (nth idx attlist)
    txt  (append txt (list (vla-get-textstring attobj)))
    txtpt  (append txtpt (list (vla-get-textalignmentpoint attobj)))
    inspt  (append inspt (list (vla-get-insertionpoint attobj)))
    just  (append just (list (vla-get-alignment attobj)))
    height (append height (list (vla-get-height attobj)))
    width  (append width (list (vla-get-scalefactor attobj)))
    rot  (append rot (list (vla-get-rotation attobj)))
    style  (append style (list (vla-get-stylename attobj)))
    upsid  (append upsid (list (vla-get-upsidedown attobj)))
    bkwd  (append bkwd (list (vla-get-backward attobj)))
    attlyr (append attlyr (list (vla-get-layer attobj)))
    attcol (append attcol (list (vla-get-color attobj)))
    idx  (1+ idx)
     )
   )
   (setq objList (varArray->List (Explode obj))
  idx 0
   )
   (repeat (length objList)
     (setq ent (DXF 0 (entget (vlax-vla-object->ename (nth idx objList)))))
     (if (= ent "ATTDEF")
       (vla-erase (nth idx objList))
       (if
  (= (vla-get-layer (nth idx objList)) "0")
   (progn
     (vla-put-layer (nth idx objList) layr)
     (vla-put-linetype (nth idx objList) ltyp)
     (vla-put-color (nth idx objList) colr)
   )
       )
     )
     (setq idx (1+ idx))
   )
   (setq space
   (if (= (vla-get-activespace
     (vla-get-activedocument (vlax-get-acad-object))
   )
   acModelspace
       )
     (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))
     (vla-get-PaperSpace (vla-get-ActiveDocument (vlax-get-acad-object)))
   )
  idx 0
   )
   (repeat (length attlist)
     (setq
       tmp (vla-addText space (nth idx txt) (nth idx inspt) (nth idx height))
     )
     (vla-put-alignment tmp (nth idx just))
     (if
       (and
  (/= (nth idx just) acAlignmentLeft)
  (/= (nth idx just) acAlignmentFit)
  (/= (nth idx just) acAlignmentAligned)
       )
        (vla-move tmp (vla-get-TextAlignmentPoint tmp) (nth idx txtpt))
        (progn
   (vla-move tmp (vla-get-InsertionPoint tmp) (nth idx inspt))
   (vla-put-alignment tmp acAlignmentLeft)
        )
     )
     (vla-put-rotation tmp (nth idx rot))
     (vla-put-scalefactor tmp (nth idx width))
     (vla-put-stylename tmp (nth idx style))
     (if (/= (nth idx attlyr) "0")
       (vla-put-layer tmp (nth idx attlyr))
       (vla-put-layer tmp layr)
     )
     (if (/= (nth idx attlyr) "0")
       (vla-put-color tmp (nth idx attcol))
       (vla-put-color tmp colr)
     )
     (cond
       ((and (= (nth idx upsid) :vlax-true) (= (nth idx bkwd) :vlax-false))
        (vla-put-textgenerationflag tmp acTextFlagUpsideDown)
       )
       ((and (= (nth idx upsid) :vlax-false) (= (nth idx bkwd) :vlax-true))
        (vla-put-textgenerationflag tmp acTextFlagBackward)
       )
       ((and (= (nth idx upsid) :vlax-true) (= (nth idx bkwd) :vlax-true))
        (vla-put-textgenerationflag
   tmp
   (+ acTextFlagBackward acTextFlagUpsideDown)
        )
       )
     )
     (setq idx (1+ idx))
   )
)
      )
    )
    (setq blocks (HH:ss-entnext lastent1))
    (command "select" blocks "")
    (setq ssAtt (ssget "_P" '((0 . "INSERT") (66 . 1))))
    (command "select" blocks "")
    (setq ssBlocks (ssget "_P" '((0 . "INSERT,HATCH,REGION"))))
    (if (and ssAtt ssBlocks)
      (setq ssBlocks (SS_SSsub ssBlocks ssAtt))
    )
    (setq n -1)
    (if ssBlocks
      (repeat (sslength ssBlocks)
(explodeBlock (ssname ssBlocks (setq n (1+ n))))
      )
    )
    (setq n -1)
    (if ssAtt
      (repeat (sslength ssAtt) (A2T (ssname ssAtt (setq n (1+ n)))))
    )
  )
  ;;8 主函数
  (princ "\n 选择块来爆破,属性转成文字...")
  (if (cadr (ssgetfirst))
    (setq ss (ssget "_P" '((0 . "INSERT"))))
  )          ;有预选择集时,从预选择集中找出属性块选择集
  (if ss
    nil
    (setq ss (ssget (list (cons 0 "INSERT"))))
  )
  (UndoBegin)
  (if ss
    (progn
      (setq i 0)
      (repeat (sslength ss)
(setq en (ssname ss i))
(if (VL-POSITION ' (66 . 1) (entget en)) (A2T en)(explodeBlock en))
(setq i (1+ i))
      )
    )
  )
  (UndoEnd)
  ;;9 清理
  (HH:purge)
  ;;10 释放无用内存
  (gc)
)
;;;***********************************************************************

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2012-4-15 15:26:01 | 显示全部楼层
;;不过,"炸开块中块→att属性成Text文字",我觉得用ET中的burst.lsp改造的更好

本帖子中包含更多资源

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

x

点评

BURST不如你这个,虽然你这个仍有改造的余地。  发表于 2019-10-9 21:51
这个程序运行后,修改了线型比例,能否不懂图纸系统变量?  发表于 2018-6-28 17:10
不错,支持  发表于 2013-1-8 10:12
发表于 2012-4-15 20:52:21 | 显示全部楼层
本帖最后由 Gu_xl 于 2012-4-15 20:53 编辑
自贡黄明儒 发表于 2012-4-15 15:26
;;不过,"炸开块中块→att属性成Text文字",我觉得用ET中的burst.lsp改造的更好

我的超级炸弹工具块属性会自动炸开为文字!

http://bbs.mjtd.com/thread-92912-1-1.html
二楼!

点评

可你得不是源码!  发表于 2019-10-9 21:47
 楼主| 发表于 2012-4-15 22:52:57 | 显示全部楼层
Gu_xl 发表于 2012-4-15 20:52
我的超级炸弹工具块属性会自动炸开为文字!

http://bbs.mjtd.com/thread-92912-1-1.html

问题是你的都是.VLX的
发表于 2012-4-16 10:37:51 | 显示全部楼层
Gu_xl 发表于 2012-4-15 20:52
我的超级炸弹工具块属性会自动炸开为文字!

http://bbs.mjtd.com/thread-92912-1-1.html

版主,我用你的程序的时候线宽自动显示,炸立体图块的时候有些问题
发表于 2012-4-16 10:38:51 | 显示全部楼层
自贡黄明儒 发表于 2012-4-15 22:52
问题是你的都是.VLX的

对啦
发表于 2012-4-16 23:11:12 | 显示全部楼层
pzweng 发表于 2012-4-16 10:37
版主,我用你的程序的时候线宽自动显示,炸立体图块的时候有些问题

谢谢!学习哦
发表于 2012-4-17 10:09:11 | 显示全部楼层
呵呵,学习下先
发表于 2012-5-4 10:16:00 | 显示全部楼层
直接用burst就可以了,为什么还要用其它的呢

点评

说的很对|!  发表于 2019-10-9 21:48
burst不能炸开块中块,还得装ET  发表于 2012-5-4 10:31
因为没装ET  发表于 2012-5-4 10:19
发表于 2012-6-18 19:13:39 | 显示全部楼层
自贡黄明儒 发表于 2012-4-15 15:26
;;不过,"炸开块中块→att属性成Text文字",我觉得用ET中的burst.lsp改造的更好

这个命令是什么啊?能说下吗?

点评

burst就是炸开块,属性->文字  发表于 2012-6-19 08:47
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 21:17 , Processed in 0.240299 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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