明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1400|回复: 30

[建筑] 顽固图纸,炸属性门窗块,文字丢失

[复制链接]
发表于 2024-7-17 20:56:13 | 显示全部楼层 |阅读模式
本帖最后由 尘缘一生 于 2024-7-18 04:43 编辑

如题:今设计院转来图,这个问题头疼,天正的门窗属性块,

关于炸开,文字转属性问题,
本坛技术部分好像对这个图无效,组装了下代码,发个模样,算是能炸开不丢失文字了,但是不完美,还有特殊部分丢失。
图纸如下:


为了炸开此图不丢失文字,下面进行的尝试,
  1. ;炸开选择集属性块,属性转文字-----(一级)------
  2. ;(sl-a2t (ssget))
  3. (defun sl-a2t (ss / n nam tp)
  4.   (_undo1)
  5.   (repeat (setq n (sslength ss))
  6.     (setq nam (ssname ss (setq n (1- n))) tp (dxf1 nam 0))
  7.     (cond
  8.       ((= tp "ATTDEF")
  9.         (sl-att-text nam) ;属性转文字
  10.       )
  11.       ((and (= tp "INSERT") (= (dxf1 nam 66) 1) (= (vla-get-hasattributes (en2obj nam)) :vlax-true))
  12.         (slblka2t nam)
  13.       )
  14.     )
  15.   )
  16.   (_undo2)
  17.   (princ)
  18. )
  19. ;;炸属性块blknam----(一级)--------
  20. ;(slblka2t (car (entsel)))
  21. (defun slblka2t (blknam / obj nam str p0 ly)
  22.   (defun explode-atfblk (obj / temp)
  23.     (setq temp (vla-explode obj))
  24.     (vla-delete obj)
  25.     temp
  26.   )
  27.   ;炸属性块obj--
  28.   (defun slblka2tss (obj / attlist attobj txt txtpt just inspt height width rot ent n objList style space tmp upsid bkwd ltyp attlyr attcol)
  29.     (setq attlist (vlax-SafeArray->List (vlax-Variant-Value (vla-GetAttributes obj))) n 0 ltyp (vla-get-linetype obj))
  30.     (repeat (length attlist)
  31.       (setq
  32.         attobj (nth n attlist)
  33.         txt    (append txt     (list (vla-get-textstring attobj)))
  34.         txtpt  (append txtpt   (list (vla-get-textalignmentpoint attobj)))
  35.         inspt  (append inspt   (list (vla-get-insertionpoint attobj)))
  36.         just   (append just    (list (vla-get-alignment attobj)))
  37.         height (append height  (list (vla-get-height attobj)))
  38.         width  (append width   (list (vla-get-scalefactor attobj)))
  39.         rot    (append rot     (list (vla-get-rotation attobj)))
  40.         style  (append style   (list (vla-get-stylename attobj)))
  41.         upsid  (append upsid   (list (vla-get-upsidedown attobj)))
  42.         bkwd   (append bkwd    (list (vla-get-backward attobj)))
  43.         attlyr (append attlyr  (list (vla-get-layer attobj)))
  44.         attcol (append attcol  (list (vla-get-color attobj)))
  45.         n    (1+ n)
  46.       )
  47.     )
  48.     (setq objList (vlax-SafeArray->List (vlax-Variant-Value (explode-atfblk obj))) n 0)
  49.     (repeat (length objList)
  50.       (setq ent (dxf1 (obj2en (nth n objList)) 0))
  51.       (if (= ent "ATTDEF")
  52.         (vla-erase (nth n objList))
  53.         (if (= (vla-get-layer (nth n objList)) "0")
  54.           (progn
  55.             (vla-put-layer (nth n objList) ly)
  56.             (vla-put-linetype (nth n objList) ltyp)
  57.             (vla-put-color (nth n objList) col)
  58.           )
  59.         )
  60.       )
  61.       (setq n (1+ n))
  62.     )
  63.     (setq space (if (= (vla-get-activespace *AcDocument*) acModelspace) *Model-Space* *Paper-Space*) n 0)
  64.     (repeat (length attlist)
  65.       (setq tmp (vla-addText space (nth n txt) (nth n inspt) (nth n height)))
  66.       (vla-put-alignment tmp (nth n just))
  67.       (if (and
  68.             (/= (nth n just) acAlignmentLeft)
  69.             (/= (nth n just) acAlignmentFit)
  70.             (/= (nth n just) acAlignmentAligned)
  71.           )
  72.         (vla-move tmp (vla-get-TextAlignmentPoint tmp) (nth n txtpt))
  73.         (progn
  74.           (vla-move tmp (vla-get-InsertionPoint tmp) (nth n inspt))
  75.           (vla-put-alignment tmp acAlignmentLeft)
  76.         )
  77.       )
  78.       (vla-put-rotation tmp (nth n rot))
  79.       (vla-put-scalefactor tmp (nth n width))
  80.       (vla-put-stylename tmp (nth n style))
  81.       (if (/= (nth n attlyr) "0") (vla-put-layer tmp (nth n attlyr)) (vla-put-layer tmp ly))
  82.       (if (/= (nth n attlyr) "0") (vla-put-color tmp (nth n attcol)) (vla-put-color tmp col))
  83.       (cond
  84.         ((and (= (nth n upsid) :vlax-true) (= (nth n bkwd) :vlax-false))
  85.           (vla-put-textgenerationflag tmp acTextFlagUpsideDown)
  86.         )
  87.         ((and (= (nth n upsid) :vlax-false) (= (nth n bkwd) :vlax-true))
  88.           (vla-put-textgenerationflag tmp acTextFlagBackward)
  89.         )
  90.         ((and (= (nth n upsid) :vlax-true) (= (nth n bkwd) :vlax-true))
  91.           (vla-put-textgenerationflag tmp (+ acTextFlagBackward acTextFlagUpsideDown))
  92.         )
  93.       )
  94.       (setq n (1+ n))
  95.     )
  96.     (princ)
  97.   )
  98.   ;;-------------
  99.   (if (and (= (dxf1 blknam 0) "INSERT") (= (dxf1 blknam 66) 1) (setq obj (en2obj blknam)) (= (vla-get-hasattributes obj) :vlax-true))
  100.     (progn
  101.       (setq p0 (e9pt blknam 2) ly (vla-get-layer obj) col (vla-get-color obj))
  102.       (if (vl-catch-all-error-p (vl-catch-all-apply 'slblka2tss (list obj))) ;注 本程序炸开本帖分享图纸,文字丢失
  103.         (if (and (setq nam (entnext blknam)) (setq str (getstr nam))) ;注 以下4句,为了炸开顽固图纸,做了新写出来,getstr 取实体字符集成,SLdesign V3.0  modify by  尘缘一生  QQ:15290049
  104.           (progn
  105.             (slmkwz str p0 (/ (e-higt nam) slbl) (e-ang nam nil) 0.7 ly $hz nil "m")
  106.             (text:alignmod (entlast) "L")
  107.           )
  108.         )
  109.       )
  110.     )
  111.   )
  112. )
  113. ;属性->转换为文本实体-----(一级)----
  114. (defun sl-att-text (anam / ent new dolst addto)
  115.   (if (= "ATTDEF" (dxf1 anam 0))
  116.     (progn
  117.       (setq ent (entget anam))
  118.       (setq new '((0 . "TEXT")))
  119.       (setq new (append new (list (cons 1 (dxf1 anam 2)))))
  120.       (setq dolst (list 7 8 10 11 39 40 41 50 51 62 71 72 73))
  121.       (foreach x dolst
  122.         (setq addto (assoc x ent))
  123.         (if (/= addto nil) (setq new (append new (list addto))))
  124.       )
  125.       (entdel anam)
  126.       (entmake new)
  127.     )
  128.   )
  129. )
  130. ;;属性选择集转文本-----(一级)--------
  131. (defun att2txt (ss / nam n i) ;(att2txt (ssget))
  132.   (setq i 0)
  133.   (repeat (setq n (sslength ss))
  134.     (setq nam (ssname ss (setq n (1- n))))
  135.     (if (= (dxf1 nam 0) "ATTDEF")
  136.       (progn
  137.         (setq i (1+ i))
  138.         (sl-att-text nam)
  139.         (entdel nam)
  140.       )
  141.     )
  142.   )
  143.   (princ (strcat (slmsg "\n 共 " "\n  " "\n total ") (rtos i 2 0) (slmsg " 个属性转为文字!" " 妮┦锣ゅ!" " Attributes converted to text!")))
  144. )
注:burst我有的是,但是,都不能解决这个问题,就这个特殊,那么你怎么炸开的?





如果你炸开了不丢失,说明你炸好了即可,用的什么?明确说下。

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2024-7-19 17:52:29 | 显示全部楼层
本帖最后由 KO你 于 2024-7-19 17:53 编辑

论坛里可以找得到,忘记是那个大佬的了,测试过没问题


快捷键  pburst  属性块分解   可以分解不允许分解的块
快捷键  nburst  嵌套属性块分解   可以分解不允许分解的块
(defun c:pburst nil (LM:burst nil))
(defun c:nburst nil (LM:burst   t))

;;----------------------------------------------------------------------;;

(defun LM:burst ( nst / *error* )

    (defun *error* ( msg )
        (LM:endundo (LM:acdoc))
        (if (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))
            (princ (strcat "\nError: " msg))
        )
        (princ)
    )
   
    (LM:startundo (LM:acdoc))
    (LM:burstsel
        (LM:ssget "\n选择要分解的块: "
            (list "_"
                (append '((0 . "INSERT"))
                    (
                        (lambda ( / def lst )
                            (while (setq def (tblnext "block" (null def)))
                                (if (= 4 (logand 4 (cdr (assoc 70 def))))
                                    (setq lst (vl-list* "," (cdr (assoc 2 def)) lst))
                                )
                            )
                            (if lst (list '(-4 . "<NOT") (cons 2 (apply 'strcat (cdr lst))) '(-4 . "NOT>")))
                        )
                    )
                    (if (= 1 (getvar 'cvport))
                        (list (cons 410 (getvar 'ctab)))
                       '((410 . "Model"))
                    )
                )
            )
        )
        nst
    )
    (LM:endundo (LM:acdoc)) (princ)
)

(defun LM:burstsel ( sel nst / idx )
    (if (= 'pickset (type sel))
        (repeat (setq idx (sslength sel))
            (LM:burstobject (vlax-ename->vla-object (ssname sel (setq idx (1- idx)))) nst)
        )
    )
)

(defun LM:burstobject ( obj nst / cmd col ent err lay lin lst qaf tmp )
    (if
        (and
            (= "AcDbBlockReference" (vla-get-objectname obj))
            (not (vlax-property-available-p obj 'path))
            (vlax-write-enabled-p  obj)
            (or (and (LM:usblock-p obj)
                     (not (vl-catch-all-error-p (setq err (vl-catch-all-apply 'vlax-invoke (list obj 'explode)))))
                     (setq lst err)
                )
                (progn
                    (setq tmp (vla-copy obj)
                          ent (LM:entlast)
                          cmd (getvar 'cmdecho)
                          qaf (getvar 'qaflags)
                    )
                    (setvar 'cmdecho 0)
                    (setvar 'qaflags 0)
                    (vl-cmdf "_.explode" (vlax-vla-object->ename tmp))
                    (setvar 'qaflags qaf)
                    (setvar 'cmdecho cmd)
                    (while (setq ent (entnext ent))
                        (setq lst (cons (vlax-ename->vla-object ent) lst))
                    )
                    lst
                )
            )
        )
        (progn
            (setq lay (vla-get-layer    obj)
                  col (vla-get-color    obj)
                  lin (vla-get-linetype obj)
            )
            (foreach att (vlax-invoke obj 'getattributes)
                (if (vlax-write-enabled-p att)
                    (progn
                        (if (= "0" (vla-get-layer att))
                            (vla-put-layer att lay)
                        )
                        (if (= acbyblock (vla-get-color att))
                            (vla-put-color att col)
                        )
                        (if (= "byblock" (strcase (vla-get-linetype att) t))
                            (vla-put-linetype att lin)
                        )
                    )
                )
                (if
                    (and
                        (= :vlax-false (vla-get-invisible att))
                        (= :vlax-true  (vla-get-visible   att))
                    )
                    (   (if (and (vlax-property-available-p att 'mtextattribute) (= :vlax-true (vla-get-mtextattribute att)))
                            LM:burst:matt2mtext
                            LM:burst:att2text
                        )
                        (entget (vlax-vla-object->ename att))
                    )
                )
            )
            (foreach new lst
                (cond
                    (   (not (vlax-write-enabled-p new)))
                    (   (= :vlax-false (vla-get-visible new))
                        (vla-delete new)
                    )
                    (   t
                        (if (= "0" (vla-get-layer new))
                            (vla-put-layer new lay)
                        )
                        (if (= acbyblock (vla-get-color new))
                            (vla-put-color new col)
                        )
                        (if (= "byblock" (strcase (vla-get-linetype new) t))
                            (vla-put-linetype new lin)
                        )
                        (if (= "AcDbAttributeDefinition" (vla-get-objectname new))
                            (progn
                                (if
                                    (and
                                        (= :vlax-true  (vla-get-constant  new))
                                        (= :vlax-false (vla-get-invisible new))
                                    )
                                    (   (if (and (vlax-property-available-p new 'mtextattribute) (= :vlax-true (vla-get-mtextattribute new)))
                                            LM:burst:matt2mtext
                                            LM:burst:att2text
                                        )
                                        (entget (vlax-vla-object->ename new))
                                    )
                                )
                                (vla-delete new)
                            )
                            (if nst (LM:burstobject new nst))
                        )
                    )
                )
            )
            (vla-delete obj)
        )
    )
)

(defun LM:burst:removepairs ( itm lst )
    (vl-remove-if '(lambda ( x ) (member (car x) itm)) lst)
)

(defun LM:burst:remove1stpairs ( itm lst )
    (vl-remove-if '(lambda ( x ) (if (member (car x) itm) (progn (setq itm (vl-remove (car x) itm)) t))) lst)
)
  
(defun LM:burst:att2text ( enx )
    (entmakex
        (append '((0 . "TEXT"))
            (LM:burst:removepairs '(000 002 003 070 074 100 280 440)
                (subst (cons 73 (cdr (assoc 74 enx))) (assoc 74 enx) enx)
            )
        )
    )
)

(defun LM:burst:matt2mtext ( enx )
    (entmakex
        (append '((0 . "MTEXT") (100 . "AcDbEntity") (100 . "AcDbMText"))
            (LM:burst:remove1stpairs
                (if (= "ATTDEF" (cdr (assoc 0 enx)))
                   '(001 003 007 010 040 041 050 071 072 073 210)
                   '(001 007 010 040 041 050 071 072 073 210)
                )
                (LM:burst:removepairs '(000 002 011 042 043 051 070 074 100 101 102 280 330 360 440) enx)
            )
            (list (assoc 011 (reverse enx)))
        )
    )
)

;; Uniformly Scaled Block  -  Lee Mac
;; Returns T if the supplied VLA Block Reference is uniformly scaled
;; obj - [vla] VLA Block Reference

(defun LM:usblock-p ( obj / s )
    (if (vlax-property-available-p obj 'xeffectivescalefactor)
        (setq s "effectivescalefactor")
        (setq s "scalefactor")
    )
    (eval
        (list 'defun 'LM:usblock-p '( obj )
            (list 'and
                (list 'equal
                    (list 'abs (list 'vlax-get-property 'obj (strcat "x" s)))
                    (list 'abs (list 'vlax-get-property 'obj (strcat "y" s)))
                    1e-8
                )
                (list 'equal
                    (list 'abs (list 'vlax-get-property 'obj (strcat "x" s)))
                    (list 'abs (list 'vlax-get-property 'obj (strcat "z" s)))
                    1e-8
                )
            )
        )
    )
    (LM:usblock-p obj)
)

;; entlast  -  Lee Mac
;; A wrapper for the entlast function to return the last subentity in the database

(defun LM:entlast ( / ent tmp )
    (setq ent (entlast))
    (while (setq tmp (entnext ent)) (setq ent tmp))
    ent
)

;; ssget  -  Lee Mac
;; A wrapper for the ssget function to permit the use of a custom selection prompt
;; msg - [str] selection prompt
;; arg - [lst] list of ssget arguments

(defun LM:ssget ( msg arg / sel )
    (princ msg)
    (setvar 'nomutt 1)
    (setq sel (vl-catch-all-apply 'ssget arg))
    (setvar 'nomutt 0)
    (if (not (vl-catch-all-error-p sel)) sel)
)

;; Start Undo  -  Lee Mac
;; Opens an Undo Group.

(defun LM:startundo ( doc )
    (LM:endundo doc)
    (vla-startundomark doc)
)

;; End Undo  -  Lee Mac
;; Closes an Undo Group.

(defun LM:endundo ( doc )
    (while (= 8 (logand 8 (getvar 'undoctl)))
        (vla-endundomark doc)
    )
)

;; Active Document  -  Lee Mac
;; Returns the VLA Active Document Object

(defun LM:acdoc nil
    (eval (list 'defun 'LM:acdoc 'nil (vla-get-activedocument (vlax-get-acad-object))))
    (LM:acdoc)
)

;;----------------------------------------------------------------------;;

(vl-load-com)
(princ)
;;----------------------------------------------------------------------;;
;;                             End of File                              ;;
;;----------------------------------------------------------------------;;

 楼主| 发表于 2024-7-18 08:31:43 | 显示全部楼层
对这一问题,再次组织代码,不用那么长写法。

对于复合CAD标准的图纸,实际代码不复杂,并能做到完美,就怕特殊软件画的图。



  1. ;;炸属性块blknam----(一级)--------
  2. ;(slblka2t (car (entsel)))
  3. ;modify by 尘缘一生
  4. (defun slblka2t (blknam / e attnam atdef nam obj str p h ly ang col ss)
  5.   (setq e (entlast))
  6.   (if (and (= (dxf1 blknam 0) "INSERT") (= (dxf1 blknam 66) 1) (setq obj (en2obj blknam)) (= (vla-get-hasattributes obj) :vlax-true))
  7.     (progn
  8.       (setq attnam (entnext blknam))
  9.       (while (= "ATTRIB" (dxf1 attnam 0))
  10.         (setq p (e9pt attnam 5) str (dxf1 attnam 1) h (dxf1 attnam 40) ang (angle-sharp (dxf1 attnam 50)) ly (dxf1 attnam 8) col (sl-getcolor attnam))
  11.         (if (/= "STAR" (dxf1 attnam 2))
  12.           (progn
  13.             (slmkwz str p (/ h slbl) ang 0.7 ly $hz col "m")
  14.             (text:alignmod (entlast) "L")
  15.             (if (if-color) ;变色系统激活
  16.               (vla-put-color (en2obj (entlast)) (atoi (slsjqs)))
  17.             )
  18.           )
  19.         )
  20.         (setq attnam (entnext attnam))
  21.       )
  22.       (command "explode" blknam)
  23.     )
  24.   )
  25.   (setq ss (last_ent e))
  26.   (while (setq atdef (ssname ss 0))
  27.     (if (= (dxf1 atdef 0) "ATTDEF")
  28.       (entdel atdef)
  29.     )
  30.     (ssdel atdef ss)
  31.   )
  32.   (princ)
  33. )
  34. ;炸开选择集属性块,属性转文字-----(一级)------
  35. ;(sl-a2t (ssget))
  36. (defun sl-a2t (ss / n nam tp)
  37.   (_undo1)
  38.   (repeat (setq n (sslength ss))
  39.     (setq nam (ssname ss (setq n (1- n))) tp (dxf1 nam 0))
  40.     (cond
  41.       ((= tp "ATTDEF")
  42.         (sl-att-text nam) ;属性转文字
  43.       )
  44.       ((and (= tp "INSERT") (= (dxf1 nam 66) 1) (= (vla-get-hasattributes (en2obj nam)) :vlax-true))
  45.         (slblka2t nam)
  46.       )
  47.     )
  48.   )
  49.   (_undo2)
  50.   (princ)
  51. )
  52. ;;测试---
  53. (defun c:tt ()
  54.   (if (setq ss (ssget (list (cons 0 "INSERT") (cons 66 1))))
  55.     (sl-a2t ss)
  56.   )
  57. )



本帖子中包含更多资源

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

x
发表于 2024-7-18 11:54:02 | 显示全部楼层
lxl217114 发表于 2024-7-18 09:12
命令栏输入burst、回车、点选需要炸开的属性块、回车
直接解决


刚才试了一下,对于“炸门窗块_t3.dwg”
burst确实也可以。
不过因为字体的缺少要代替。

本帖子中包含更多资源

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

x
发表于 2024-7-17 21:44:25 | 显示全部楼层
burst不是轻松解决么?

点评

不能解决这个问题  发表于 2024-7-17 22:09
发表于 2024-7-17 21:52:56 来自手机 | 显示全部楼层
小菜123 发表于 2024-7-17 21:44
burst不是轻松解决么?

先转t3再炸呢

点评

这就是转了T3的,不知问题出在哪里  发表于 2024-7-17 22:11
发表于 2024-7-17 22:11:44 | 显示全部楼层
压缩包里就是t3,我是试过了才说的
发表于 2024-7-17 22:25:15 | 显示全部楼层

burst炸属性块为文字
发表于 2024-7-17 22:28:02 | 显示全部楼层

burst直接解决

点评

可能原因是,天正版本高画的,那么我用天正V7.0转的T3  发表于 2024-7-18 04:28
我这里burst炸不了这个事,WIN7,64 CAD2020,  发表于 2024-7-18 04:26
发表于 2024-7-17 23:23:00 | 显示全部楼层
装B失败,挫的1P

本帖子中包含更多资源

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

x

点评

眼睛瞪大点,说你装你是因为你自己七月一号粗口别人不知天高地厚。31年经验了还写那么小白水平的代码,不是挫是啥?难道说你蠢吗?我可没你那么没涵养。  发表于 2024-7-18 10:19
我画图31年,写代码也31年,286DOS年代就写代码画图,都快退休的人了,我31年的经验积累,你说我装B,这是你回复的,我能不骂你,就此打住吧,说声,保重见谅。  发表于 2024-7-18 05:10
如果啊,本坛谁能装B,解决画图的这些问题,我倒是希望得到这段代码,但是我却不会回复,学到了东西,得到了源码,还不用回复,广场舞老太太还等着呢!  发表于 2024-7-18 05:02
本坛这么些年,我算常客,因为画图需要,回复的些人,大家去搜搜看,啥样的人也有,最近来不少新人,甚至有些问题很基本,你见过有谁回复讽刺吗?有,异类罢了。  发表于 2024-7-18 04:56
这么多年,我见过不少此类回复别人帖子,甚至连清华陈教授的帖子,都看到过此类回复,你技术高,解决问题,回复别人讽刺、不尊重,回复时候,先要了解,那是清华陈教授,当然不是我,举例说明。装B的见的多了去了。  发表于 2024-7-18 04:54
妈的的屄,你八辈祖宗那个出轨了,出了你这个玩意?不懂狗日的玩意,乱他妈说什么!  发表于 2024-7-18 04:25
发表于 2024-7-18 09:12:40 | 显示全部楼层
本帖最后由 lxl217114 于 2024-7-18 09:42 编辑

命令栏输入burst、回车、点选需要炸开的属性块、回车
直接解决

老陈喝假酒了吧,31年画图经验居然这么不堪一击

点评

还是群众眼睛雪亮。画图写代码31年都自己没遇到要分解属性块,也没有用户有需求,今年才遇上。哈哈,这31年真是画了个寂寞。  发表于 2024-7-18 10:21
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 11:41 , Processed in 0.218211 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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