xiaobowa 发表于 2007-4-22 10:39

多重插入块的炸开问题?

<p>很多个cad文件,被别人加了密,每个cad文件都生成了很多个多重插入块,在论坛找了个xxi的程序,可以炸开多重插入块,但是,文件太多,块也太多,不能一个一个炸,而且,每个多重插入块执行一下xxi命令之后,变成了块参照,我需要再对它执行一次explode命令,</p><p>希望高人指点一下,我对lisp程序不是很懂,我的思路是这样的:</p><p>1.找到多重插入块集合.</p><p>2.遍历集合,对每个块执行xxi命令,</p><p>3.对执行了xxi命令的再执行explode命令....</p><p>谢谢</p><p></p><p>附:xxi函数如下</p><p>;| (xxi) = 分解多重插入块 v1-------lxx.2005.4.<br/>|;<br/>(defun c:xxi (/ a ent elst el nm pt xsc ysc zsc ang xi yi xd yd i ii eli)<br/>&nbsp; (setq a (car(entsel)));;块.<br/>&nbsp; (setq ent (entget a)<br/>&nbsp;elst '(100 66 0 2 10 41 42 43 50 210 330 8 -3)<br/>&nbsp;el&nbsp;&nbsp; (vl-remove-if-not '(lambda(x)(member (car x) elst)) ent)<br/>&nbsp;el&nbsp;&nbsp; (mapcar '(lambda(x)<br/>&nbsp;&nbsp;&nbsp;(if (equal x '(100 . "AcDbInsertBlock")) '(100 . "AcDbBlockReference") x))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; el<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>&nbsp; (mapcar '(lambda(x y)(set x (cdr(assoc y ent))))<br/>&nbsp;&nbsp; '(nm pt&nbsp; xsc ysc zsc ang xi&nbsp; yi&nbsp; xd&nbsp; yd)<br/>&nbsp;&nbsp; '(2&nbsp; 10&nbsp; 41&nbsp; 42&nbsp; 43&nbsp; 50&nbsp; 70&nbsp; 71&nbsp; 44&nbsp; 45)<br/>&nbsp; );;返回实例:("*U1" (0.0 0.0 0.0) 1.0 1.0 1.0 0.0 2 2 0.0 0.0)<br/>&nbsp; (vl-cmdf ".ucs" "_ob" a)<br/>&nbsp; (cond<br/>&nbsp;&nbsp;&nbsp; ((and (equal xd 0. 1e-4)(equal yd 0. 1e-4))(entmake el))<br/>&nbsp;&nbsp;&nbsp; ((not(= 0 xi yi))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq i 0 ii 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (repeat yi<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (repeat xi<br/>&nbsp; (entmake(subst (cons 10 (trans (list (* i xd)(* ii yd) 0.) 1 0))(assoc 10 el)el))<br/>&nbsp; (setq i (1+ i))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq i 0 ii (1+ ii))<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; (T nil)<br/>&nbsp; )<br/>&nbsp; (entdel a)<br/>&nbsp; (vl-cmdf ".ucs" "p")<br/>&nbsp; (princ)<br/>)<br/>&nbsp; <br/>(defun c:tt2 (/ a ent elst el nm pt xsc ysc zsc ang xi yi xd yd i ii eli)<br/>&nbsp; (setq a (car(entsel)));;块.<br/>&nbsp; (setq ent (entget a)<br/>&nbsp;elst '(100 66 0 2 10 41 42 43 50 210 330 8 -3)<br/>&nbsp;el&nbsp;&nbsp; (vl-remove-if-not '(lambda(x)(member (car x) elst)) ent)<br/>&nbsp;el&nbsp;&nbsp; (mapcar '(lambda(x)<br/>&nbsp;&nbsp;&nbsp;(if (equal x '(100 . "AcDbInsertBlock")) '(100 . "AcDbBlockReference") x))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; el<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>&nbsp; (mapcar '(lambda(x y)(set x (cdr(assoc y ent))))<br/>&nbsp;&nbsp; '(nm pt&nbsp; xsc ysc zsc ang xi&nbsp; yi&nbsp; xd&nbsp; yd)<br/>&nbsp;&nbsp; '(2&nbsp; 10&nbsp; 41&nbsp; 42&nbsp; 43&nbsp; 50&nbsp; 70&nbsp; 71&nbsp; 44&nbsp; 45)<br/>&nbsp; );;返回实例:("*U1" (0.0 0.0 0.0) 1.0 1.0 1.0 0.0 2 2 0.0 0.0)<br/>&nbsp; ;(vl-cmdf ".ucs" "_ob" a)<br/>&nbsp; (cond<br/>&nbsp;&nbsp;&nbsp; ((and (equal xd 0. 1e-4)(equal yd 0. 1e-4))(entmake el))<br/>&nbsp;&nbsp;&nbsp; ((not(= 0 xi yi))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq i 0 ii 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (repeat yi<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (repeat xi<br/>&nbsp; (entmake(subst (cons 10 (trans(list (* i xd)(* ii yd) 0.) a 0))(assoc 10 el)el))<br/>&nbsp; (setq i (1+ i))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq i 0 ii (1+ ii))<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; (T nil)<br/>&nbsp; )<br/>&nbsp; (entdel a)<br/>&nbsp; ;(vl-cmdf ".ucs" "p")<br/>&nbsp; (princ)<br/>)<br/>;| dxf =帮助:insert实体(包含minsert插入的块实体)<br/>组码 说明 <br/>100 子类标记 (AcDbBlockReference) <br/>66&nbsp; 可变属性跟随标志(可选;默认值 = 0);如果属性跟随标志的值为 1,则跟随<br/>&nbsp;&nbsp;&nbsp; 插入的将是一系列属性图元,并以一个 seqend 图元终止 <br/>2&nbsp;&nbsp; 块名 <br/>10&nbsp; 插入点(在 OCS 中)DXF:X 值;APP:三维点 <br/>20, 30&nbsp; DXF:插入点的 Y 值和 Z 值(在 OCS 中) <br/>41&nbsp; X 缩放比例(可选;默认值 = 1) <br/>42&nbsp; Y 缩放比例(可选;默认值 = 1) <br/>43&nbsp; Z 缩放比例(可选;默认值 = 1) <br/>50&nbsp; 旋转角度(可选;默认值 = 0) <br/>70&nbsp; 列计数(可选;默认值 = 1) <br/>71&nbsp; 行计数(可选;默认值 = 1) <br/>44&nbsp; 列间距(可选;默认值 = 0) <br/>45 行间距(可选;默认值 = 0) <br/>210 拉伸方向(可选;默认值 = 0, 0, 1)&nbsp; DXF:X 值;APP:三维矢量 <br/>220, 230&nbsp;&nbsp; DXF:拉伸方向的 Y 值和 Z 值(可选) <br/>|;</p><p></p>

烟盒迷唇 发表于 2023-5-19 09:12

我来优化一下caoyin版主的代码吧{:1_1:}

jkop 发表于 2024-5-9 10:59

有时候碰到厂商传的图纸就会碰到匿名、不可分解的块,很需要这个程序,测试符合需求,感谢分享。

xiaobowa 发表于 2007-4-22 10:44

对每个块执行 xxi命令,这句话怎么写?

caoyin 发表于 2007-4-22 13:44

;;这是俺以前的程序,不知道对你有用否?
;;分解任意块,(对套嵌块,多重插入块有效)
;;by---caoyin
(defun c:exblk (/ lt:ss->list exblk-exobject ss)
;(lt:error-init '(("cmdecho" 0) 1 nil "分解块: EXBLK "))
(defun lt:ss->list (ss)
    (vl-remove-if-not '(lambda (x) (= (type x) 'ename)) (mapcar 'cadr (ssnamex ss)))
)
(defun exblk-exobject (ss / enlst en ent lt:cmd-explode)
    (setq enlst (lt:ss->list ss))
    (while enlst
      (setq en (car enlst) ent (entget en))
      (entmake (list '(0 . "INSERT")
                     '(100 . "AcDbEntity")
                     '(100 . "AcDbBlockReference")
                     (assoc 2 ent)
                     (assoc 10 ent)
                     (assoc 41 ent)
                     (assoc 42 ent)
                     (assoc 43 ent)
                     (assoc 50 ent)
               )
      )
      (defun lt:cmd-explode (en del / bak)
      (if (= (type en) 'ename) (setq en (vlax-ename->vla-object en)))
      (setq bak (vl-catch-all-apply 'vla-explode (list en)))
      (if (vl-catch-all-error-p bak)
          nil
          (progn (if (= del T) (vla-delete en)) T)
      )
      )
      (lt:cmd-explode (entlast) T)
   ;(vl-cmdf "_.explode" "_l")
      (entdel en)
      (setq enlst (append (vl-remove en enlst)
                        (lt:ss=>list (ssget "_p" '((0 . "INSERT"))))
                  )
      )
    )
)
(princ "\n选择要分解的块...")
(setq ss (ssget '((0 . "INSERT"))))
(if ss (exblk-exobject ss))
;(lt:error-restore)
)

szhtct 发表于 2010-7-12 12:32

caoyin发表于2007-4-22 13:44:00static/image/common/back.gif以下内容为程序代码:;;这是俺以前的程序,不知道对你有用否? ;;分解任意块,(对套嵌块,多重插入块有效) ;;by---caoyin (defun c:exblk (/ lt:ss->list exblk-exobject 谢谢曹荫老师~~~

cqy 发表于 2011-3-29 22:02

谢谢caoyin老师!

sweetsea 发表于 2011-7-17 19:43

感谢老师的无私分享!

461045462 发表于 2011-7-18 08:44

回复 caoyin 的帖子

谢谢caoyin 斑竹
收藏了,下来看看学习学习。
谢谢

443971181 发表于 2011-11-16 15:01

谢谢您!caoyin老师!

zazhz123 发表于 2013-8-19 15:14

版主分享了好东西。

迹扬 发表于 2015-4-12 19:12

caoyin 发表于 2007-4-22 13:44 static/image/common/back.gif


caoyin版主的程序很OK,我这里结果都是正常的,目的能达到。
普通块可以炸开、不允许分解的块也能炸开、匿名块也可以、多重插入块也可以,功能上没的说。
不过有点小问题:
1、第26行lt:ss=>list是不是应该改成lt:ss->list?
2、有未赋值的现象:; 错误: 参数类型错误: lselsetp nil。

版主是否可以辛苦一下,在完善完善呢?
页: [1] 2
查看完整版本: 多重插入块的炸开问题?