明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 638|回复: 6

[讨论] 关于“炸”

[复制链接]
发表于 2024-7-27 20:01:21 | 显示全部楼层 |阅读模式
本帖最后由 尘缘一生 于 2024-7-28 05:36 编辑

当CAD出现时候,是画点线面,当你拿到二手图,进行深入设计之时,你首先需要的是:炸开到点、线、面,否则,你觉得挺能的(安装有好多插件奥,觉得可以了,是吧?),你试试看?你就不可能随心应手的去完善去!

所以,炸开,不是可有可无的事,然而,炸开这个问题,说是简单,包含多少问题呢?
一:各种块的炸开(普通块,嵌套块,参照块,不可炸开块,加密的块,无名块,属性块,XCLIP块.....+各种2B块.....)
二:标注的炸开
三:文字的炸开
四:属性、属性定义转文字
五:组的解散,炸开
六:炸 TCH 实体(这种垃圾,写代码针对,不值得)
.......
总之一句话,那就是,这个工具在哪里呢?什么工具,就是”彻底解散“,回家睡觉,到目前为止啊,没有,(特有的都藏起来在自己工具里,自己用着罢了!)为什么没有呢?那就是,垃圾软件层出不穷,你不可能做到,对它们也能”炸“!畜生的软件,我这么叫它们,还高看一步,否则,连畜生都不如。误导几十年的学子!

那么,关于块的炸开部分呢,我先发个模样,
本坛哪,并没有彻底炸开的集成存在,因为,这个问题,就不可以穷尽,曾记得有个VLX程序,叫”超级炸弹“,对吧?
可能啊,是真对块的,捷足先登吧,实际上,要我来说,配不上这个名字。配上这个名字的,应该是,我说的全部解散,散伙,回家睡觉,你才有脸叫”超级炸弹“,否则,你配得上吗?

  1. ;;en 图块名--嵌套炸块---(一级)-------
  2. (defun exp-blk (en / obj e0 e ss n nam kk str1 str2)
  3.   (setq obj (en2obj en))
  4.   (if (> (abs (caddr (dxf1 en 10))) 0.0)
  5.     (vl-catch-all-apply 'zero-ent (list en))
  6.   )
  7.   (if (= (vlax-property-available-p obj "Path") nil);;非参照
  8.     (if (and (= (dxf1 en 0) "INSERT") (= (isxclip en) nil)) ;;排除xclip块
  9.       (progn
  10.         (setq e0 (entlast))
  11.         (cond
  12.           ((and
  13.              (vlax-property-available-p obj 'Explodable) ;;具有分解属性
  14.              (eq :vlax-false (vla-get-Explodable obj)) ;且不允许分解
  15.            )
  16.             (if (not (vl-catch-all-error-p (vl-catch-all-apply '(lambda () (vla-put-Explodable obj :vlax-true))))) ;修改为可分解属性
  17.               (vl-catch-all-apply 'exp-blk (list en)) ;_ 炸块
  18.             )
  19.           )
  20.           ((and (/= (dxf1 en 66) 1) ;;非属性块
  21.              (/= (vla-get-objectname obj) "AcDbMInsertBlock")  ;;非多重插入块
  22.              (= (vla-get-objectname obj) "AcDbBlockReference") ;;普通块
  23.              (equal (vla-get-XScaleFactor obj) (vla-get-YScaleFactor obj) (vla-get-ZScaleFactor obj)) ;等比块
  24.            )
  25.             (sl-explo en)
  26.           )
  27.           ((and ;炸开非属性块之外的 (非等比例块、多重插入块、无名块)
  28.              (/= (dxf1 en 66) 1) ;;非属性块
  29.              (or
  30.                (not (equal (vla-get-XScaleFactor obj) (vla-get-YScaleFactor obj) (vla-get-ZScaleFactor obj))) ;非等比
  31.                (= (vla-get-objectname obj) "AcDbMInsertBlock")  ;;多重插入块
  32.                (wcmatch (dxf1 en 2) "`**") ;无名块
  33.              )
  34.            )
  35.             (m-blk-exp en)
  36.           )
  37.           ((= (dxf1 en 66) 1) ;;属性块
  38.             (sl-a2t (ssadd en))
  39.           )
  40.           ((and ;炸动态块,属性不只一个,转文字全删除
  41.              (vlax-property-available-p obj 'isdynamicblock)
  42.              (eq :vlax-true (vla-get-isdynamicblock obj))
  43.            )
  44.             (setq e (entlast))
  45.             (sl-a2t (ssadd en))
  46.             (setq ss (last_ent e))
  47.             (repeat (setq n (sslength ss))
  48.               (setq nam (ssname ss (setq n (1- n))))
  49.               (if (getstr nam) (entdel nam))
  50.             )
  51.           )
  52.         )
  53.         (setq n -1)
  54.         (if (setq ss (last_ent e0))
  55.           (while (setq nam (ssname ss (setq n (1+ n))))
  56.             (if (= (dxf1 nam 0) "INSERT") (exp-blk nam))
  57.           )
  58.         )
  59.       )
  60.       (if (null c:sl-tkgl)
  61.         (progn
  62.           (load (strcat sl-path0 "\\Support\" "sl-tkgl.VLX"))
  63.           (exp-xclip-blk (ssadd en))
  64.         )
  65.       )
  66.     )
  67.     (progn ;参照
  68.       (setq kk
  69.         (sl:do1ordo2
  70.           (slmsg "外部参照!是否绑定->炸开?" "场把酚!琌竕﹚->秨?" "External reference! Bind ->Explode?")
  71.           (setq str1 (slmsg "->绑定->炸开" "->竕﹚->秨" "->bind->exp"))
  72.           (setq str2 (slmsg "放弃" "斌" "Cancel"))
  73.         )
  74.       )
  75.       (if (= kk str1)
  76.         (progn
  77.           (vla-bind (vla-item *BLKS* (dxf1 en 2)) :vlax-true)
  78.           (command "EXPLODE" en) ;必须如此
  79.         )
  80.       )
  81.     )
  82.   )
  83. )
  84. ;;炸开嵌套块-----(一级)------
  85. ;;返回:炸开后选择集
  86. (defun sl-explo (en / e nam ss)
  87.   (setq e (entlast))
  88.   (vl-catch-all-apply '(lambda () (command "EXPLODE" en)))
  89.   (if (setq ss (ssget "p" '((0 . "INSERT"))))
  90.     (repeat (sslength ss)
  91.       (setq nam (ssname ss 0))
  92.       (ssdel nam ss)
  93.       (if (/= (dxf1 nam 66) 1)
  94.         (sl-explo nam)
  95.         (sl-a2t (ssadd nam))
  96.       )
  97.     )
  98.   )
  99.   (setq ss (last_ent e))
  100.   ss
  101. )
  102. ;;炸开非等比例块、多重插入块、无名块-----(一级)------
  103. ;;en: 块实体名
  104. (defun m-blk-exp (en / lasten layer blkref)
  105.   ;;分解嵌套块---------
  106.   (defun supperexplodeblock (obj parlst / origin x y z r insertpt copyent atts stylename dxf blkobj e0 txtobj tmp copys row col rowspc colspc)
  107.     (setq origin (vlax-3d-point '(0 0 0)))
  108.     (if (or (= "AcDbBlockReference" (vla-get-objectname obj)) (= "AcDbMInsertBlock" (vla-get-objectname obj)))
  109.       (progn
  110.         (setq x  (vla-get-XScaleFactor obj) y (vla-get-YScaleFactor obj) z  (vla-get-ZScaleFactor obj) r (vla-get-Rotation obj) Insertpt (vla-get-InsertionPoint obj))
  111.         (setq copyent (vlax-invoke *AcDocument* 'CopyObjects (sl-itemsall (vla-item (vla-get-blocks *AcDocument*) (vla-get-name obj))) *Model-Space*))
  112.         (vla-delete obj)
  113.         (setq parlst (cons (list x y z r Insertpt) parlst))
  114.         (foreach aobj copyent
  115.           (if (or (= "AcDbBlockReference" (vla-get-objectname aobj)) (= "AcDbMInsertBlock" (vla-get-objectname aobj)))
  116.             (supperexplodeblock aobj parlst)
  117.             (progn
  118.               (setq copyent (list aobj))
  119.               (mapcar
  120.                 '(lambda (pars / x y z r insertpt blkobj e0)
  121.                    (setq x (car pars) y  (cadr pars) z  (caddr pars) r (cadddr pars) Insertpt  (last pars))
  122.                    (setq blkobj (vla-add (vla-get-blocks *AcDocument*) origin "*U"))
  123.                    (vlax-invoke *AcDocument* 'CopyObjects copyent blkobj)
  124.                    (mapcar 'vla-Delete copyent)
  125.                    (vla-insertblock *Model-Space* Insertpt (vla-get-name blkobj) x y z r)
  126.                    (command "_.explode" (setq e0 (entlast)))
  127.                    (vla-delete blkobj)
  128.                    (setq copyent (ssget->vla-list (last_ent e0)))
  129.                  )
  130.                 parlst
  131.               )
  132.             )
  133.           )
  134.         )
  135.       )
  136.       (progn
  137.         (setq copyent (list obj))
  138.         (mapcar
  139.           '(lambda (pars / x y z r insertpt blkobj e0)
  140.              (setq x (car pars) y  (cadr pars) z  (caddr pars) r (cadddr pars) Insertpt (last pars))
  141.              (setq blkobj  (vla-add (vla-get-blocks *AcDocument*) origin "*U"))
  142.              (vlax-invoke *AcDocument* 'CopyObjects copyent blkobj)
  143.              (mapcar 'vla-Delete copyent)
  144.              (vla-insertblock *Model-Space* Insertpt (vla-get-name blkobj) x y z r)
  145.              (command "_.explode" (setq e0 (entlast)))
  146.              (vla-delete blkobj)
  147.              (setq copyent (ssget->vla-list (last_ent e0)))
  148.            )
  149.           parlst
  150.         )
  151.       )
  152.     )
  153.   )
  154.   ;;主程序
  155.   (if (= 'ename (type en))
  156.     (setq blkref (en2obj en))
  157.     (setq  blkref en en (obj2en en))
  158.   )
  159.   (if
  160.     (and
  161.       (= "INSERT" (dxf1 en 0))
  162.       (not (= 4 (logand (cdr (assoc 70 (entget (tblobjname "block" (cdr (assoc 2 (entget en))))))) 4))) ;_ 非外部参照块
  163.       (/= (dxf1 en 66) 1) ;;非属性块
  164.     )
  165.     (supperexplodeblock blkref nil)
  166.   )
  167. )
  168. ;炸开选择集属性块,属性转文字-----(一级)------
  169. ;(sl-a2t (ssget))
  170. (defun sl-a2t (ss / n nam tp)
  171.   (_undo1)
  172.   (repeat (setq n (sslength ss))
  173.     (setq nam (ssname ss (setq n (1- n))) tp (dxf1 nam 0))
  174.     (cond
  175.       ((= tp "ATTDEF")
  176.         (sl-att-text nam) ;属性转文字
  177.       )
  178.       ((and (= tp "INSERT") (= (dxf1 nam 66) 1) (= (vla-get-hasattributes (en2obj nam)) :vlax-true))
  179.         (slblka2t nam)
  180.       )
  181.     )
  182.   )
  183.   (_undo2)
  184.   (princ)
  185. )
  186. ;属性->转换为文本实体-----(一级)----
  187. (defun sl-att-text (anam / ent new dolst addto)
  188.   (if (= "ATTDEF" (dxf1 anam 0))
  189.     (progn
  190.       (setq ent (entget anam))
  191.       (setq new '((0 . "TEXT")))
  192.       (setq new (append new (list (cons 1 (dxf1 anam 2)))))
  193.       (setq dolst (list 7 8 10 11 39 40 41 50 51 62 71 72 73))
  194.       (foreach x dolst
  195.         (setq addto (assoc x ent))
  196.         (if (/= addto nil) (setq new (append new (list addto))))
  197.       )
  198.       (entdel anam)
  199.       (entmake new)
  200.     )
  201.   )
  202. )
  203. ;;炸属性块bnam----(一级)--------
  204. ;(slblka2t (car (entsel)))
  205. (defun slblka2t (bnam / e_lst e attnam atdef nam obj str p h ly lt col ly0 lt0 col0 ang ss ss-layer ss-color ss-ltype)
  206.   (if (and (= (dxf1 bnam 0) "INSERT") (= (dxf1 bnam 66) 1) (setq obj (en2obj bnam)) (= (vla-get-hasattributes obj) :vlax-true))
  207.     (progn
  208.       (setq e_lst (sysvar '("QAFLAGS" "CMDECHO")))
  209.       (setvar "CMDECHO" 0)
  210.       (setvar "QAFLAGS" 0)
  211.       (setq ly (dxf1 bnam 8) lt (sl-linetype bnam) col (sl-getcolor bnam))
  212.       (setq attnam (entnext bnam) e (entlast))
  213.       (while (= "ATTRIB" (dxf1 attnam 0))
  214.         (setq p (e9pt attnam 5) str (dxf1 attnam 1) h (dxf1 attnam 40) ang (angle-sharp (dxf1 attnam 50)))
  215.         (if (/= "STAR" (dxf1 attnam 2))
  216.           (progn
  217.             (slmkwz str p (/ h slbl) ang 0.7 (dxf1 attnam 8) $hz (sl-getcolor attnam) "m")
  218.             (text:alignmod (entlast) "L")
  219.             (if (if-color)
  220.               (vla-put-color (en2obj (entlast)) (atoi (slsjqs)))
  221.             )
  222.           )
  223.         )
  224.         (setq attnam (entnext attnam))
  225.       )
  226.       (command "explode" bnam)
  227.       (setq ss-layer (ssadd) ss-color (ssadd) ss-ltype (ssadd) ss (last_ent e))
  228.       (while (setq nam (ssname ss 0))
  229.         (setq ly0 (dxf1 nam 8) col0 (dxf1 nam 62) lt0 (dxf1 nam 6))
  230.         (if (= (dxf1 nam 0) "ATTDEF" )
  231.           (sl-att-text nam) ;(entdel atdef)
  232.           (cond
  233.             ((and (= ly0 "0")(/= ly0 ly))
  234.               (ssadd nam ss-layer)
  235.             )
  236.             ((and (= col0 "0")(/= col0 col))
  237.               (ssadd nam ss-color)
  238.             )
  239.             ((and (= lt0 "BYBLOCK") (/= lt0 lt))
  240.               (ssadd nam ss-ltype)
  241.             )
  242.           )
  243.         )
  244.         (ssdel nam ss)
  245.       )
  246.       (if (> (sslength ss-layer) 0)
  247.         (command  "_.chprop" ss-layer "" "_LA" ly "")
  248.       )
  249.       (if (> (sslength ss-color) 0)
  250.         (slchcol ss-color col)
  251.       )
  252.       (if (> (sslength ss-ltype) 0)
  253.         (command "_.chprop" ss-ltype "" "_LT" lt "")
  254.       )
  255.       (mapcar 'eval e_lst)
  256.     )
  257.   )
  258.   (princ)
  259. )
那么好了,本坛的”超级炸弹“,能不能出来?我看够呛!
我是没有,否则,我势必要发出来的,你别不要脸的,敢叫此名!
你也别不要脸的,随便回复我得帖子!你不懂,看看得了,
实在你闲的蛋疼,不如去巴黎体会没空调的桑拿!
你根本就不明白到底我说的啥个事!
  1. ;炸开(含有Xclip块)的实体集---(一级)----
  2. (defun exp-xclip-blk (ss / file_path wmffile p1 p2 nam p0 e_lst lst d1 d2)
  3.   (defun slhas (TYPE_1 NAME)
  4.     (if (not
  5.           (vl-catch-all-error-p
  6.             (vl-catch-all-apply 'vla-item (list ((eval (read (strcat "vla-get-" TYPE_1))) *AcDocument*) NAME))
  7.           )
  8.         )
  9.       t
  10.     )
  11.   )
  12.   ;;-------------------
  13.   (princ (slmsg "\n Xclip块裂解-->>" "\n Xclip遏吊秆-->>" "\ n Xclip block Explode-->"))
  14.   (setq file_path (strcat sl-path0 "\\tmp"))
  15.   (if (findfile file_path) (princ) (vxmakedirectory file_path))
  16.   (setq wmffile (strcat file_path "\\WMF_" (slsjqs)))
  17.   (while (findfile (strcat wmffile ".wmf"))
  18.     (setq wmffile (strcat file_path "\\WMF_" (slsjqs)))
  19.   )
  20.   (setq lst (slget-box ss) p1 (car lst) p2 (cadr lst) d1 (distance p1 p2))
  21.   (setq e_lst (sysvar '("WMFBKGND" "TILEMODE")))
  22.   (setvar "WMFBKGND" 0);;清除底色
  23.   (if (slhas "LAYOUTS" "Temporary layout")
  24.     (princ)
  25.     (command "layout" "n" "Temporary layout") ;创建并切换布局
  26.   )
  27.   (command "_.layout" "s" "Temporary layout")
  28.   (setvar "tilemode" 0)
  29.   (command "erase" (ssget "X" '((0 . "VIEWPORT"))) "") ;删除所有布局视口
  30.   (command "mview" p1 p2)
  31.   (vla-ZoomWindow *ACAD* (vlax-3d-point p1) (vlax-3d-point p2))
  32.   (if (= (getvar "CVPORT") 1) (command "mspace")) ;激活视口;(command "pspace");切换到图纸空间
  33.   (vla-ZoomWindow *ACAD* (vlax-3d-point p1) (vlax-3d-point p2))
  34.   (if (not (vl-catch-all-error-p (vl-catch-all-apply '(lambda () (command "wmfout" wmffile ss "")))))
  35.     (progn
  36.       (sl:erase ss) ;删除
  37.       (setvar "tilemode" 1) ;切换回模型空间
  38.       (if (slhas "LAYOUTS" "Temporary layout")
  39.         (command "_.layout" "D" "Temporary layout") ;删除临时布局
  40.       )
  41.       (command "_.wmfin" wmffile 1 1 1 0)
  42.       (setq nam (entlast) lst (e9pt nam nil) p0 (nth 4 lst) d2 (distance (car lst) (nth 8 lst)))
  43.       (command "SCALE" nam "" p0 (/ d1 d2) "_.MOVE" nam "" "non" p0 PAUSE)
  44.       (vl-catch-all-apply 'exp-blk (list nam));炸块
  45.     )
  46.   )
  47.   (mapcar 'eval e_lst)
  48.   (princ)
  49. )
  50. ;;炸XCLIP块(备用)---
  51. ;;速度慢,结果还可以理想(exp-xclip-blkr (car (entsel "\n选择剪裁块:")))
  52. (defun exp-xclip-blk--- (ss / ss1 nam nam1 e n pls)
  53.   (repeat (setq n (sslength ss))
  54.     (setq nam (ssname ss (setq n (1- n))))
  55.     (if (isxclip nam) ;是XCLIP块
  56.       (progn
  57.         (command "_.XCLIP" nam "" "P")
  58.         (setq e (entlast) pls (getpt (ssadd e)))
  59.         (command "_.XCLIP" nam "" "D")
  60.         (vl-catch-all-apply 'exp-blk (list nam));炸块
  61.         (vl-catch-all-apply 'slexpline (list (last_ent e)));线类裂解系统
  62.         (vl-catch-all-apply 'sl_break_with (list (ssadd e (last_ent e)) t));交点断开系统
  63.         (setq ss1 (last_ent e)) ;;炸断开后总集
  64.         (command "_.COPY" (ssget "WP" pls) "" "_non" '(0 0) "_non" '(0 0)) ;;原位拷贝
  65.         (entdel e)
  66.         (sl:erase ss1) ;删除
  67.       )
  68.     )
  69.   )
  70. )
  71. ;;动态块ss 改为普通快-------
  72. (defun DynBlk2blk (ss / lst n obj name blkdef blkref cnt)
  73.   (setq cnt 0)
  74.   (repeat (setq n (sslength ss))  
  75.     (setq obj (en2obj (ssname ss (setq n (1- n)))))
  76.     (if (and
  77.           (vlax-property-available-p obj 'isdynamicblock)
  78.           (eq :vlax-true (vla-get-isdynamicblock obj))
  79.         )
  80.       (progn
  81.         (setq lst nil cnt (1+ cnt))
  82.         (vlax-for a (vla-item *BLKS* (vla-get-name obj))
  83.           (setq lst (cons a lst))
  84.         )
  85.         (setq blkdef
  86.           (vla-add *BLKS* (vlax-3d-point '(0 0 0)) "*U")
  87.         )
  88.         (vla-CopyObjects
  89.           *AcDocument*
  90.           (vlax-make-variant
  91.             (vlax-safearray-fill
  92.               (vlax-make-safearray
  93.                 vlax-vbobject
  94.                 (cons 0 (1- (length lst)))
  95.               )
  96.               lst
  97.             )
  98.           )
  99.           blkdef
  100.         )
  101.         (setq name (vla-get-name blkdef))
  102.         (setq blkref
  103.           (vla-InsertBlock
  104.             (vlax-get-property *AcDocument*
  105.               (if (= 1 (getvar 'CVPORT))
  106.                 'PaperSpace
  107.                 'ModelSpace
  108.               )
  109.             )
  110.             (vla-get-InsertionPoint obj)
  111.             Name
  112.             (vla-get-XScaleFactor obj)
  113.             (vla-get-YScaleFactor obj)
  114.             (vla-get-ZScaleFactor obj)
  115.             (vla-get-Rotation obj)
  116.           )
  117.         )
  118.         (vla-put-layer blkref (vla-get-layer obj))
  119.         (vla-delete obj)
  120.       )
  121.     )
  122.   )
  123.   (princ (strcat (slmsg "\n ***共修改 " "\n ***э " "\n ***Co modification ") (itoa cnt) (slmsg " 个动态块***" " 笆篈遏***" " Num Dynamic blocks***")))
  124.   (princ)
  125. )

评分

参与人数 2明经币 +2 收起 理由
USER2128 + 1 赞一个!
tranque + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2024-7-27 21:51:49 来自手机 | 显示全部楼层
镶嵌块能不能一起给炸了?如果不行还是棋差一招

点评

对,哪只不过是,其中一环。  发表于 2024-7-27 22:11
发表于 2024-7-27 23:48:10 | 显示全部楼层
jh3030912 发表于 2024-7-27 21:51
镶嵌块能不能一起给炸了?如果不行还是棋差一招

可以单独使用吗?
发表于 2024-7-28 21:33:59 | 显示全部楼层
不要耍“炸”,CAD转PDF,PDF再转CAD+OCR,玩事大吉。
 楼主| 发表于 2024-7-29 05:31:46 | 显示全部楼层
GEGEYANG88 发表于 2024-7-28 21:33
不要耍“炸”,CAD转PDF,PDF再转CAD+OCR,玩事大吉。

如果变换后,原来的线类,文字,还保持完整,是可以的,因为还要进行深化设计。
但目前,关于PDF和CAD之间,恐怕并没有这么完美的存在。
扫描变矢量呢,目前,连扫描仪都难以见到了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-29 04:23 , Processed in 0.170269 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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