明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 10219|回复: 13

多重插入块的炸开问题?

[复制链接]
发表于 2007-4-22 10:39:00 | 显示全部楼层 |阅读模式

很多个cad文件,被别人加了密,每个cad文件都生成了很多个多重插入块,在论坛找了个xxi的程序,可以炸开多重插入块,但是,文件太多,块也太多,不能一个一个炸,而且,每个多重插入块执行一下xxi命令之后,变成了块参照,我需要再对它执行一次explode命令,

希望高人指点一下,我对lisp程序不是很懂,我的思路是这样的:

1.找到多重插入块集合.

2.遍历集合,对每个块执行xxi命令,

3.对执行了xxi命令的再执行explode命令....

谢谢

附:xxi函数如下

;| (xxi) = 分解多重插入块 v1-------lxx.2005.4.
|;
(defun c:xxi (/ a ent elst el nm pt xsc ysc zsc ang xi yi xd yd i ii eli)
  (setq a (car(entsel)));;块.
  (setq ent (entget a)
 elst '(100 66 0 2 10 41 42 43 50 210 330 8 -3)
 el   (vl-remove-if-not '(lambda(x)(member (car x) elst)) ent)
 el   (mapcar '(lambda(x)
   (if (equal x '(100 . "AcDbInsertBlock")) '(100 . "AcDbBlockReference") x))
               el
      )
  )
  (mapcar '(lambda(x y)(set x (cdr(assoc y ent))))
   '(nm pt  xsc ysc zsc ang xi  yi  xd  yd)
   '(2  10  41  42  43  50  70  71  44  45)
  );;返回实例"*U1" (0.0 0.0 0.0) 1.0 1.0 1.0 0.0 2 2 0.0 0.0)
  (vl-cmdf ".ucs" "_ob" a)
  (cond
    ((and (equal xd 0. 1e-4)(equal yd 0. 1e-4))(entmake el))
    ((not(= 0 xi yi))
     (setq i 0 ii 0)
     (repeat yi
       (repeat xi
  (entmake(subst (cons 10 (trans (list (* i xd)(* ii yd) 0.) 1 0))(assoc 10 el)el))
  (setq i (1+ i))
       )
       (setq i 0 ii (1+ ii))
     )
    )
    (T nil)
  )
  (entdel a)
  (vl-cmdf ".ucs" "p")
  (princ)
)
 
(defun c:tt2 (/ a ent elst el nm pt xsc ysc zsc ang xi yi xd yd i ii eli)
  (setq a (car(entsel)));;块.
  (setq ent (entget a)
 elst '(100 66 0 2 10 41 42 43 50 210 330 8 -3)
 el   (vl-remove-if-not '(lambda(x)(member (car x) elst)) ent)
 el   (mapcar '(lambda(x)
   (if (equal x '(100 . "AcDbInsertBlock")) '(100 . "AcDbBlockReference") x))
               el
      )
  )
  (mapcar '(lambda(x y)(set x (cdr(assoc y ent))))
   '(nm pt  xsc ysc zsc ang xi  yi  xd  yd)
   '(2  10  41  42  43  50  70  71  44  45)
  );;返回实例"*U1" (0.0 0.0 0.0) 1.0 1.0 1.0 0.0 2 2 0.0 0.0)
  ;(vl-cmdf ".ucs" "_ob" a)
  (cond
    ((and (equal xd 0. 1e-4)(equal yd 0. 1e-4))(entmake el))
    ((not(= 0 xi yi))
     (setq i 0 ii 0)
     (repeat yi
       (repeat xi
  (entmake(subst (cons 10 (trans(list (* i xd)(* ii yd) 0.) a 0))(assoc 10 el)el))
  (setq i (1+ i))
       )
       (setq i 0 ii (1+ ii))
     )
    )
    (T nil)
  )
  (entdel a)
  ;(vl-cmdf ".ucs" "p")
  (princ)
)
;| dxf =帮助:insert实体(包含minsert插入的块实体)
组码 说明
100 子类标记 (AcDbBlockReference)
66  可变属性跟随标志(可选;默认值 = 0);如果属性跟随标志的值为 1,则跟随
    插入的将是一系列属性图元,并以一个 seqend 图元终止
2   块名
10  插入点(在 OCS 中)DXF:X 值;APP:三维点
20, 30  DXF:插入点的 Y 值和 Z 值(在 OCS 中)
41  X 缩放比例(可选;默认值 = 1)
42  Y 缩放比例(可选;默认值 = 1)
43  Z 缩放比例(可选;默认值 = 1)
50  旋转角度(可选;默认值 = 0)
70  列计数(可选;默认值 = 1)
71  行计数(可选;默认值 = 1)
44  列间距(可选;默认值 = 0)
45 行间距(可选;默认值 = 0)
210 拉伸方向(可选;默认值 = 0, 0, 1)  DXF:X 值;APP:三维矢量
220, 230   DXF:拉伸方向的 Y 值和 Z 值(可选)
|;

发表于 2023-5-19 09:12:34 | 显示全部楼层
我来优化一下caoyin版主的代码吧

本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
zhangcan0515 + 1

查看全部评分

回复 支持 2 反对 0

使用道具 举报

发表于 2024-5-9 10:59:22 | 显示全部楼层
有时候碰到厂商传的图纸就会碰到匿名、不可分解的块,很需要这个程序,测试符合需求,感谢分享。
 楼主| 发表于 2007-4-22 10:44:00 | 显示全部楼层
对每个块执行 xxi命令,这句话怎么写?
发表于 2007-4-22 13:44:00 | 显示全部楼层
  1. ;;这是俺以前的程序,不知道对你有用否?
  2. ;;分解任意块,(对套嵌块,多重插入块有效)
  3. ;;by---caoyin
  4. (defun c:exblk (/ lt:ss->list exblk-exobject ss)
  5. ;(lt:error-init '(("cmdecho" 0) 1 nil "分解块: EXBLK "))
  6.   (defun lt:ss->list (ss)
  7.     (vl-remove-if-not '(lambda (x) (= (type x) 'ename)) (mapcar 'cadr (ssnamex ss)))
  8.   )
  9.   (defun exblk-exobject (ss / enlst en ent lt:cmd-explode)
  10.     (setq enlst (lt:ss->list ss))
  11.     (while enlst
  12.       (setq en (car enlst) ent (entget en))
  13.       (entmake (list '(0 . "INSERT")
  14.                      '(100 . "AcDbEntity")
  15.                      '(100 . "AcDbBlockReference")
  16.                      (assoc 2 ent)
  17.                      (assoc 10 ent)
  18.                      (assoc 41 ent)
  19.                      (assoc 42 ent)
  20.                      (assoc 43 ent)
  21.                      (assoc 50 ent)
  22.                )
  23.       )
  24.       (defun lt:cmd-explode (en del / bak)
  25.         (if (= (type en) 'ename) (setq en (vlax-ename->vla-object en)))
  26.         (setq bak (vl-catch-all-apply 'vla-explode (list en)))
  27.         (if (vl-catch-all-error-p bak)
  28.           nil
  29.           (progn (if (= del T) (vla-delete en)) T)
  30.         )
  31.       )
  32.       (lt:cmd-explode (entlast) T)
  33.      ;(vl-cmdf "_.explode" "_l")
  34.       (entdel en)
  35.       (setq enlst (append (vl-remove en enlst)
  36.                           (lt:ss=>list (ssget "_p" '((0 . "INSERT"))))
  37.                   )
  38.       )
  39.     )
  40.   )
  41.   (princ "\n选择要分解的块...")
  42.   (setq ss (ssget '((0 . "INSERT"))))
  43.   (if ss (exblk-exobject ss))
  44. ;(lt:error-restore)
  45. )
发表于 2010-7-12 12:32:00 | 显示全部楼层
caoyin发表于2007-4-22 13:44:00以下内容为程序代码:;;这是俺以前的程序,不知道对你有用否? ;;分解任意块,(对套嵌块,多重插入块有效) ;;by---caoyin (defun c:exblk (/ lt:ss->list exblk-exobject
  1. 谢谢曹荫老师~~~
复制代码
发表于 2011-3-29 22:02:57 | 显示全部楼层
谢谢caoyin老师!
发表于 2011-7-17 19:43:37 | 显示全部楼层
感谢老师的无私分享!
发表于 2011-7-18 08:44:33 | 显示全部楼层
回复 caoyin 的帖子

谢谢caoyin 斑竹
收藏了,下来看看学习学习。
谢谢
发表于 2011-11-16 15:01:26 | 显示全部楼层
谢谢您!caoyin老师!
发表于 2013-8-19 15:14:44 | 显示全部楼层
版主分享了好东西。
发表于 2015-4-12 19:12:25 | 显示全部楼层
caoyin 发表于 2007-4-22 13:44

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

版主是否可以辛苦一下,在完善完善呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 08:38 , Processed in 0.186149 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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